155714Skris// SPDX-License-Identifier: GPL-2.0
255714Skris/* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */
3194206Ssimon#include <vmlinux.h>
455714Skris#include <bpf/bpf_helpers.h>
555714Skris#include <bpf/bpf_tracing.h>
655714Skris#include <bpf/bpf_core_read.h>
755714Skris#include "bpf_experimental.h"
855714Skris
955714Skrisstruct {
10280304Sjkim	__uint(type, BPF_MAP_TYPE_ARENA);
1155714Skris	__uint(map_flags, BPF_F_MMAPABLE);
1255714Skris	__uint(max_entries, 100); /* number of pages */
1355714Skris} arena SEC(".maps");
1455714Skris
1555714Skris#include "bpf_arena_htab.h"
1655714Skris
1755714Skrisvoid __arena *htab_for_user;
1855714Skrisbool skip = false;
1955714Skris
2055714Skrisint zero = 0;
2155714Skris
2255714SkrisSEC("syscall")
2355714Skrisint arena_htab_llvm(void *ctx)
2455714Skris{
2555714Skris#if defined(__BPF_FEATURE_ADDR_SPACE_CAST) || defined(BPF_ARENA_FORCE_ASM)
2655714Skris	struct htab __arena *htab;
2755714Skris	__u64 i;
2855714Skris
2955714Skris	htab = bpf_alloc(sizeof(*htab));
3055714Skris	cast_kern(htab);
3155714Skris	htab_init(htab);
3255714Skris
3355714Skris	/* first run. No old elems in the table */
3455714Skris	for (i = zero; i < 1000; i++)
3555714Skris		htab_update_elem(htab, i, i);
3655714Skris
3755714Skris	/* should replace all elems with new ones */
3855714Skris	for (i = zero; i < 1000; i++)
3955714Skris		htab_update_elem(htab, i, i);
4055714Skris	cast_user(htab);
4155714Skris	htab_for_user = htab;
4255714Skris#else
4355714Skris	skip = true;
4455714Skris#endif
4555714Skris	return 0;
4655714Skris}
4755714Skris
4855714Skrischar _license[] SEC("license") = "GPL";
4955714Skris