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