xref: /linux/tools/testing/selftests/bpf/prog_tests/libarena_asan.c (revision 554e4eb9e4b75358f73733e2be7a59aaf4b7875e)
1 // SPDX-License-Identifier: LGPL-2.1 OR BSD-2-Clause
2 /* Copyright (c) 2026 Meta Platforms, Inc. and affiliates. */
3 #include <test_progs.h>
4 
5 #ifdef HAS_BPF_ARENA_ASAN
6 #include <unistd.h>
7 
8 #include <libarena/common.h>
9 #include <libarena/asan.h>
10 #include <libarena/buddy.h>
11 #include <libarena/userspace.h>
12 
13 #include "libarena/libarena_asan.skel.h"
14 
15 static void run_libarena_asan_test(struct libarena_asan *skel,
16 		struct bpf_program *prog, const char *name)
17 {
18 	int ret;
19 
20 	if (!strstr(name, "test_buddy")) {
21 		ret = libarena_run_prog(bpf_program__fd(skel->progs.arena_buddy_reset));
22 		if (!ASSERT_OK(ret, "arena_buddy_reset"))
23 			return;
24 	}
25 
26 	ret = libarena_run_prog(bpf_program__fd(prog));
27 	ASSERT_OK(ret, name);
28 
29 	verify_test_stderr(skel->obj, prog);
30 }
31 
32 static void run_test(void)
33 {
34 	struct arena_alloc_reserve_args args;
35 	struct libarena_asan *skel;
36 	struct bpf_program *prog;
37 	int ret;
38 
39 	skel = libarena_asan__open_and_load();
40 	if (!ASSERT_OK_PTR(skel, "open_and_load"))
41 		return;
42 
43 	ret = libarena_asan__attach(skel);
44 	if (!ASSERT_OK(ret, "attach"))
45 		goto out;
46 
47 	args.nr_pages = ARENA_RESERVE_PAGES_DFL;
48 
49 	ret = libarena_run_prog_args(bpf_program__fd(skel->progs.arena_alloc_reserve),
50 			&args, sizeof(args));
51 	if (!ASSERT_OK(ret, "arena_alloc_reserve"))
52 		goto out;
53 
54 	ret = libarena_asan_init(
55 		bpf_program__fd(skel->progs.arena_get_info),
56 		bpf_program__fd(skel->progs.asan_init),
57 		(1ULL << 32) / sysconf(_SC_PAGESIZE));
58 	if (!ASSERT_OK(ret, "libarena_asan_init"))
59 		goto out;
60 
61 	bpf_object__for_each_program(prog, skel->obj) {
62 		const char *name = bpf_program__name(prog);
63 
64 		if (!libarena_is_asan_test_prog(name))
65 			continue;
66 
67 		if (!test__start_subtest(name))
68 			continue;
69 
70 		run_libarena_asan_test(skel, prog, name);
71 	}
72 
73 out:
74 	libarena_asan__destroy(skel);
75 }
76 
77 #endif /* HAS_BPF_ARENA_ASAN */
78 
79 /*
80  * Run the test depending on whether LLVM can compile arena ASAN
81  * programs.
82  */
83 void test_libarena_asan(void)
84 {
85 #ifdef HAS_BPF_ARENA_ASAN
86 	run_test();
87 #else
88 	test__skip();
89 #endif
90 
91 	return;
92 }
93 
94