// SPDX-License-Identifier: GPL-2.0 /* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */ #define BPF_NO_KFUNC_PROTOTYPES #include <vmlinux.h> #include <bpf/bpf_helpers.h> #include <bpf/bpf_tracing.h> #include <bpf/bpf_core_read.h> #include "bpf_experimental.h" struct { __uint(type, BPF_MAP_TYPE_ARENA); __uint(map_flags, BPF_F_MMAPABLE); __uint(max_entries, 100); /* number of pages */ } arena SEC(".maps"); #include "bpf_arena_htab.h" void __arena *htab_for_user; bool skip = false; int zero = 0; char __arena arr1[100000]; char arr2[1000]; SEC("syscall") int arena_htab_llvm(void *ctx) { #if defined(__BPF_FEATURE_ADDR_SPACE_CAST) || defined(BPF_ARENA_FORCE_ASM) struct htab __arena *htab; char __arena *arr = arr1; __u64 i; htab = bpf_alloc(sizeof(*htab)); cast_kern(htab); htab_init(htab); cast_kern(arr); /* first run. No old elems in the table */ for (i = zero; i < 100000 && can_loop; i++) { htab_update_elem(htab, i, i); arr[i] = i; } /* should replace some elems with new ones */ for (i = zero; i < 1000 && can_loop; i++) { htab_update_elem(htab, i, i); /* Access mem to make the verifier use bounded loop logic */ arr2[i] = i; } cast_user(htab); htab_for_user = htab; #else skip = true; #endif return 0; } char _license[] SEC("license") = "GPL";