xref: /linux/tools/testing/selftests/bpf/progs/verifier_arena_globals1.c (revision c17ee635fd3a482b2ad2bf5e269755c2eae5f25e)
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