xref: /linux/tools/testing/selftests/bpf/libarena/src/common.bpf.c (revision 367e6e4a8173d47b4c57181cdd9dcbfc291755f0)
1d5327480SEmil Tsalapatis // SPDX-License-Identifier: LGPL-2.1 OR BSD-2-Clause
2d5327480SEmil Tsalapatis /* Copyright (c) 2026 Meta Platforms, Inc. and affiliates. */
3d5327480SEmil Tsalapatis #include <libarena/common.h>
4cfc00618SEmil Tsalapatis #include <libarena/asan.h>
586426a28SEmil Tsalapatis #include <libarena/buddy.h>
6cfc00618SEmil Tsalapatis 
7d5327480SEmil Tsalapatis const volatile u32 zero = 0;
8d5327480SEmil Tsalapatis 
9b9b23fe1SEmil Tsalapatis struct buddy __arena buddy;
1086426a28SEmil Tsalapatis 
11d5327480SEmil Tsalapatis int arena_fls(__u64 word)
12d5327480SEmil Tsalapatis {
13d5327480SEmil Tsalapatis 	if (!word)
14d5327480SEmil Tsalapatis 		return 0;
15d5327480SEmil Tsalapatis 
16d5327480SEmil Tsalapatis 	return 64 - __builtin_clzll(word);
17d5327480SEmil Tsalapatis }
18d5327480SEmil Tsalapatis 
19d5327480SEmil Tsalapatis SEC("syscall")
20d5327480SEmil Tsalapatis __weak int arena_get_info(struct arena_get_info_args *args)
21d5327480SEmil Tsalapatis {
22d5327480SEmil Tsalapatis 	args->arena_base = arena_base(&arena);
23d5327480SEmil Tsalapatis 
24d5327480SEmil Tsalapatis 	return 0;
25d5327480SEmil Tsalapatis }
26d5327480SEmil Tsalapatis 
27d5327480SEmil Tsalapatis SEC("syscall")
28d5327480SEmil Tsalapatis __weak int arena_alloc_reserve(struct arena_alloc_reserve_args *args)
29d5327480SEmil Tsalapatis {
30d5327480SEmil Tsalapatis 	return bpf_arena_reserve_pages(&arena, NULL, args->nr_pages);
31d5327480SEmil Tsalapatis }
32d5327480SEmil Tsalapatis 
3386426a28SEmil Tsalapatis SEC("syscall")
3486426a28SEmil Tsalapatis __weak int arena_buddy_reset(void)
3586426a28SEmil Tsalapatis {
3686426a28SEmil Tsalapatis 	buddy_destroy(&buddy);
3786426a28SEmil Tsalapatis 
3886426a28SEmil Tsalapatis 	return buddy_init(&buddy);
3986426a28SEmil Tsalapatis }
4086426a28SEmil Tsalapatis 
41*367e6e4aSEmil Tsalapatis __weak void __arena *arena_malloc(size_t size)
4286426a28SEmil Tsalapatis {
43*367e6e4aSEmil Tsalapatis 	return buddy_alloc(&buddy, size);
4486426a28SEmil Tsalapatis }
4586426a28SEmil Tsalapatis 
46b9b23fe1SEmil Tsalapatis __weak void arena_free(void __arena *ptr)
4786426a28SEmil Tsalapatis {
48b9b23fe1SEmil Tsalapatis 	buddy_free(&buddy, ptr);
4986426a28SEmil Tsalapatis }
5086426a28SEmil Tsalapatis 
5186426a28SEmil Tsalapatis 
52d5327480SEmil Tsalapatis char _license[] SEC("license") = "GPL";
53