xref: /linux/tools/testing/selftests/bpf/progs/verifier_arena_globals2.c (revision c17ee635fd3a482b2ad2bf5e269755c2eae5f25e)
1*19f12431SEmil Tsalapatis // SPDX-License-Identifier: GPL-2.0
2*19f12431SEmil Tsalapatis /* Copyright (c) 2025 Meta Platforms, Inc. and affiliates. */
3*19f12431SEmil Tsalapatis 
4*19f12431SEmil Tsalapatis #define BPF_NO_KFUNC_PROTOTYPES
5*19f12431SEmil Tsalapatis #include <vmlinux.h>
6*19f12431SEmil Tsalapatis #include <bpf/bpf_helpers.h>
7*19f12431SEmil Tsalapatis #include <bpf/bpf_tracing.h>
8*19f12431SEmil Tsalapatis #include "bpf_misc.h"
9*19f12431SEmil Tsalapatis #include "bpf_experimental.h"
10*19f12431SEmil Tsalapatis #include "bpf_arena_common.h"
11*19f12431SEmil Tsalapatis 
12*19f12431SEmil Tsalapatis #define ARENA_PAGES (32)
13*19f12431SEmil Tsalapatis 
14*19f12431SEmil Tsalapatis struct {
15*19f12431SEmil Tsalapatis 	__uint(type, BPF_MAP_TYPE_ARENA);
16*19f12431SEmil Tsalapatis 	__uint(map_flags, BPF_F_MMAPABLE);
17*19f12431SEmil Tsalapatis 	__uint(max_entries, ARENA_PAGES);
18*19f12431SEmil Tsalapatis #ifdef __TARGET_ARCH_arm64
19*19f12431SEmil Tsalapatis 	__ulong(map_extra, (1ull << 32) | (~0u - __PAGE_SIZE * ARENA_PAGES + 1));
20*19f12431SEmil Tsalapatis #else
21*19f12431SEmil Tsalapatis 	__ulong(map_extra, (1ull << 44) | (~0u - __PAGE_SIZE * ARENA_PAGES + 1));
22*19f12431SEmil Tsalapatis #endif
23*19f12431SEmil Tsalapatis } arena SEC(".maps");
24*19f12431SEmil Tsalapatis 
25*19f12431SEmil Tsalapatis /*
26*19f12431SEmil Tsalapatis  * Fill the entire arena with global data.
27*19f12431SEmil Tsalapatis  * The offset into the arena should be 0.
28*19f12431SEmil Tsalapatis  */
29*19f12431SEmil Tsalapatis char __arena global_data[ARENA_PAGES][PAGE_SIZE];
30*19f12431SEmil Tsalapatis 
31*19f12431SEmil Tsalapatis SEC("syscall")
32*19f12431SEmil Tsalapatis __success __retval(0)
33*19f12431SEmil Tsalapatis int check_reserve2(void *ctx)
34*19f12431SEmil Tsalapatis {
35*19f12431SEmil Tsalapatis #if defined(__BPF_FEATURE_ADDR_SPACE_CAST)
36*19f12431SEmil Tsalapatis 	void __arena *guard;
37*19f12431SEmil Tsalapatis 	int ret;
38*19f12431SEmil Tsalapatis 
39*19f12431SEmil Tsalapatis 	guard = (void __arena *)arena_base(&arena);
40*19f12431SEmil Tsalapatis 
41*19f12431SEmil Tsalapatis 	/* Make sure the data at offset 0 case is properly handled. */
42*19f12431SEmil Tsalapatis 	ret = bpf_arena_reserve_pages(&arena, guard, 1);
43*19f12431SEmil Tsalapatis 	if (!ret)
44*19f12431SEmil Tsalapatis 		return 1;
45*19f12431SEmil Tsalapatis #endif
46*19f12431SEmil Tsalapatis 	return 0;
47*19f12431SEmil Tsalapatis }
48*19f12431SEmil Tsalapatis 
49*19f12431SEmil Tsalapatis char _license[] SEC("license") = "GPL";
50