119f12431SEmil Tsalapatis // SPDX-License-Identifier: GPL-2.0 219f12431SEmil Tsalapatis /* Copyright (c) 2025 Meta Platforms, Inc. and affiliates. */ 319f12431SEmil Tsalapatis 419f12431SEmil Tsalapatis #define BPF_NO_KFUNC_PROTOTYPES 519f12431SEmil Tsalapatis #include <vmlinux.h> 619f12431SEmil Tsalapatis #include <bpf/bpf_helpers.h> 719f12431SEmil Tsalapatis #include <bpf/bpf_tracing.h> 819f12431SEmil Tsalapatis #include "bpf_experimental.h" 919f12431SEmil Tsalapatis #include "bpf_arena_common.h" 1019f12431SEmil Tsalapatis #include "bpf_misc.h" 1119f12431SEmil Tsalapatis 12*951d7901SYonghong Song #define ARENA_PAGES (1UL<< (32 - __builtin_ffs(__PAGE_SIZE) + 1)) 1319f12431SEmil Tsalapatis #define GLOBAL_PAGES (16) 1419f12431SEmil Tsalapatis 1519f12431SEmil Tsalapatis struct { 1619f12431SEmil Tsalapatis __uint(type, BPF_MAP_TYPE_ARENA); 1719f12431SEmil Tsalapatis __uint(map_flags, BPF_F_MMAPABLE); 1819f12431SEmil Tsalapatis __uint(max_entries, ARENA_PAGES); 1919f12431SEmil Tsalapatis #ifdef __TARGET_ARCH_arm64 2019f12431SEmil Tsalapatis __ulong(map_extra, (1ull << 32) | (~0u - __PAGE_SIZE * ARENA_PAGES + 1)); 2119f12431SEmil Tsalapatis #else 2219f12431SEmil Tsalapatis __ulong(map_extra, (1ull << 44) | (~0u - __PAGE_SIZE * ARENA_PAGES + 1)); 2319f12431SEmil Tsalapatis #endif 2419f12431SEmil Tsalapatis } arena SEC(".maps"); 2519f12431SEmil Tsalapatis 2619f12431SEmil Tsalapatis /* 2719f12431SEmil Tsalapatis * Global data, to be placed at the end of the arena. 2819f12431SEmil Tsalapatis */ 2919f12431SEmil Tsalapatis volatile char __arena global_data[GLOBAL_PAGES][PAGE_SIZE]; 3019f12431SEmil Tsalapatis 3119f12431SEmil Tsalapatis SEC("syscall") 3219f12431SEmil Tsalapatis __success __retval(0) 3319f12431SEmil Tsalapatis int check_reserve1(void *ctx) 3419f12431SEmil Tsalapatis { 3519f12431SEmil Tsalapatis #if defined(__BPF_FEATURE_ADDR_SPACE_CAST) 3619f12431SEmil Tsalapatis const u8 magic = 0x5a; 3719f12431SEmil Tsalapatis __u8 __arena *guard, *globals; 3819f12431SEmil Tsalapatis volatile char __arena *ptr; 3919f12431SEmil Tsalapatis int i; 4019f12431SEmil Tsalapatis int ret; 4119f12431SEmil Tsalapatis 4219f12431SEmil Tsalapatis guard = (void __arena *)arena_base(&arena); 4319f12431SEmil Tsalapatis globals = (void __arena *)(arena_base(&arena) + (ARENA_PAGES - GLOBAL_PAGES) * PAGE_SIZE); 4419f12431SEmil Tsalapatis 4519f12431SEmil Tsalapatis /* Reserve the region we've offset the globals by. */ 4619f12431SEmil Tsalapatis ret = bpf_arena_reserve_pages(&arena, guard, ARENA_PAGES - GLOBAL_PAGES); 4719f12431SEmil Tsalapatis if (ret) 4819f12431SEmil Tsalapatis return 1; 4919f12431SEmil Tsalapatis 5019f12431SEmil Tsalapatis /* Make sure the globals are in the expected offset. */ 5119f12431SEmil Tsalapatis ret = bpf_arena_reserve_pages(&arena, globals, 1); 5219f12431SEmil Tsalapatis if (!ret) 5319f12431SEmil Tsalapatis return 2; 5419f12431SEmil Tsalapatis 5519f12431SEmil Tsalapatis /* Verify globals are properly mapped in by libbpf. */ 5619f12431SEmil Tsalapatis for (i = 0; i < GLOBAL_PAGES; i++) { 5719f12431SEmil Tsalapatis ptr = &global_data[i][PAGE_SIZE / 2]; 5819f12431SEmil Tsalapatis 5919f12431SEmil Tsalapatis *ptr = magic; 6019f12431SEmil Tsalapatis if (*ptr != magic) 6119f12431SEmil Tsalapatis return i + 3; 6219f12431SEmil Tsalapatis } 6319f12431SEmil Tsalapatis #endif 6419f12431SEmil Tsalapatis return 0; 6519f12431SEmil Tsalapatis } 6619f12431SEmil Tsalapatis 6719f12431SEmil Tsalapatis /* 6819f12431SEmil Tsalapatis * Relocation check by reading directly into the global data w/o using symbols. 6919f12431SEmil Tsalapatis */ 7019f12431SEmil Tsalapatis SEC("syscall") 7119f12431SEmil Tsalapatis __success __retval(0) 7219f12431SEmil Tsalapatis int check_relocation(void *ctx) 7319f12431SEmil Tsalapatis { 7419f12431SEmil Tsalapatis #if defined(__BPF_FEATURE_ADDR_SPACE_CAST) 7519f12431SEmil Tsalapatis const u8 magic = 0xfa; 7619f12431SEmil Tsalapatis u8 __arena *ptr; 7719f12431SEmil Tsalapatis 7819f12431SEmil Tsalapatis global_data[GLOBAL_PAGES - 1][PAGE_SIZE / 2] = magic; 7919f12431SEmil Tsalapatis ptr = (u8 __arena *)((u64)(ARENA_PAGES * PAGE_SIZE - PAGE_SIZE / 2)); 8019f12431SEmil Tsalapatis if (*ptr != magic) 8119f12431SEmil Tsalapatis return 1; 8219f12431SEmil Tsalapatis 8319f12431SEmil Tsalapatis #endif 8419f12431SEmil Tsalapatis return 0; 8519f12431SEmil Tsalapatis } 8619f12431SEmil Tsalapatis 8719f12431SEmil Tsalapatis char _license[] SEC("license") = "GPL"; 88