// SPDX-License-Identifier: GPL-2.0 /* Copyright (c) 2026 Meta Platforms, Inc. and affiliates. */ /* * Verify the JIT-emitted rebase sequences for __arena and __arena__nullable * kfunc arguments. The capture kfuncs take the argument without * dereferencing it, so these tests pin only the emitted code. */ #define BPF_NO_KFUNC_PROTOTYPES #include #include #include "bpf_misc.h" #include "bpf_experimental.h" #include #include "../test_kmods/bpf_testmod_kfunc.h" struct { __uint(type, BPF_MAP_TYPE_ARENA); __uint(map_flags, BPF_F_MMAPABLE); __uint(max_entries, 1); } arena SEC(".maps"); /* volatile to force the scalar reloads below */ volatile u64 stash; #if defined(__BPF_FEATURE_ADDR_SPACE_CAST) SEC("syscall") __arch_x86_64 __jited("...") __jited(" movl %edi, %edi") __jited(" addq %r12, %rdi") __jited("...") __jited(" callq {{.*}}") __arch_arm64 __jited("...") __jited(" add x0, x28, w0, uxtw") __jited(" {{(bl|mov) .*}}") __success int arena_arg_jit_rebase(void *ctx) { stash = (u64)bpf_arena_alloc_pages(&arena, NULL, 1, NUMA_NO_NODE, 0); bpf_kfunc_arena_cap_test((u64 *)stash); return 0; } SEC("syscall") __arch_x86_64 __jited("...") __jited(" movl %edi, %edi") __jited(" testl %edi, %edi") __jited(" je L0") __jited(" addq %r12, %rdi") __jited("L0: callq {{.*}}") __arch_arm64 __jited("...") __jited(" mov w0, w0") __jited(" cbz w0, L0") __jited(" add x0, x28, w0, uxtw") __jited("L0: {{.*}}") __success int arena_arg_jit_nullable(void *ctx) { stash = (u64)bpf_arena_alloc_pages(&arena, NULL, 1, NUMA_NO_NODE, 0); bpf_kfunc_arena_cap_nullable_test((u64 *)stash); return 0; } SEC("syscall") __arch_x86_64 __jited("...") __jited(" movl %edi, %edi") __jited(" addq %r12, %rdi") __jited(" movl %esi, %esi") __jited(" addq %r12, %rsi") __jited(" movl %edx, %edx") __jited(" addq %r12, %rdx") __jited(" movl %ecx, %ecx") __jited(" addq %r12, %rcx") __jited(" movl %r8d, %r8d") __jited(" testl %r8d, %r8d") __jited(" je L0") __jited(" addq %r12, %r8") __jited("L0: callq {{.*}}") __arch_arm64 __jited("...") __jited(" add x0, x28, w0, uxtw") __jited(" add x1, x28, w1, uxtw") __jited(" add x2, x28, w2, uxtw") __jited(" add x3, x28, w3, uxtw") __jited(" mov w4, w4") __jited(" cbz w4, L0") __jited(" add x4, x28, w4, uxtw") __jited("L0: {{.*}}") __success int arena_arg_jit_args5(void *ctx) { u64 __arena *val; val = bpf_arena_alloc_pages(&arena, NULL, 1, NUMA_NO_NODE, 0); if (!val) return 1; val[0] = 1; val[1] = 2; val[2] = 4; val[3] = 8; val[4] = 16; bpf_kfunc_arena_args5_test((u64 *)&val[0], (u64 *)&val[1], (u64 *)&val[2], (u64 *)&val[3], (u64 *)&val[4]); return 0; } #endif /* __BPF_FEATURE_ADDR_SPACE_CAST */ char _license[] SEC("license") = "GPL";