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