162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/* Copyright (c) 2019 Facebook */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#include <stdbool.h>
562306a36Sopenharmony_ci#include <linux/bpf.h>
662306a36Sopenharmony_ci#include <bpf/bpf_helpers.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#define __read_mostly SEC(".data.read_mostly")
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cistruct s {
1162306a36Sopenharmony_ci	int a;
1262306a36Sopenharmony_ci	long long b;
1362306a36Sopenharmony_ci} __attribute__((packed));
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci/* .data section */
1662306a36Sopenharmony_ciint in1 = -1;
1762306a36Sopenharmony_cilong long in2 = -1;
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci/* .bss section */
2062306a36Sopenharmony_cichar in3 = '\0';
2162306a36Sopenharmony_cilong long in4 __attribute__((aligned(64))) = 0;
2262306a36Sopenharmony_cistruct s in5 = {};
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci/* .rodata section */
2562306a36Sopenharmony_ciconst volatile struct {
2662306a36Sopenharmony_ci	const int in6;
2762306a36Sopenharmony_ci} in = {};
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci/* .data section */
3062306a36Sopenharmony_ciint out1 = -1;
3162306a36Sopenharmony_cilong long out2 = -1;
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci/* .bss section */
3462306a36Sopenharmony_cichar out3 = 0;
3562306a36Sopenharmony_cilong long out4 = 0;
3662306a36Sopenharmony_ciint out6 = 0;
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ciextern bool CONFIG_BPF_SYSCALL __kconfig;
3962306a36Sopenharmony_ciextern int LINUX_KERNEL_VERSION __kconfig;
4062306a36Sopenharmony_cibool bpf_syscall = 0;
4162306a36Sopenharmony_ciint kern_ver = 0;
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_cistruct s out5 = {};
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ciconst volatile int in_dynarr_sz SEC(".rodata.dyn");
4762306a36Sopenharmony_ciconst volatile int in_dynarr[4] SEC(".rodata.dyn") = { -1, -2, -3, -4 };
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ciint out_dynarr[4] SEC(".data.dyn") = { 1, 2, 3, 4 };
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ciint read_mostly_var __read_mostly;
5262306a36Sopenharmony_ciint out_mostly_var;
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_cichar huge_arr[16 * 1024 * 1024];
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci/* non-mmapable custom .data section */
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_cistruct my_value { int x, y, z; };
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci__hidden int zero_key SEC(".data.non_mmapable");
6162306a36Sopenharmony_cistatic struct my_value zero_value SEC(".data.non_mmapable");
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_cistruct {
6462306a36Sopenharmony_ci	__uint(type, BPF_MAP_TYPE_ARRAY);
6562306a36Sopenharmony_ci	__type(key, int);
6662306a36Sopenharmony_ci	__type(value, struct my_value);
6762306a36Sopenharmony_ci	__uint(max_entries, 1);
6862306a36Sopenharmony_ci} my_map SEC(".maps");
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ciSEC("raw_tp/sys_enter")
7162306a36Sopenharmony_ciint handler(const void *ctx)
7262306a36Sopenharmony_ci{
7362306a36Sopenharmony_ci	int i;
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci	out1 = in1;
7662306a36Sopenharmony_ci	out2 = in2;
7762306a36Sopenharmony_ci	out3 = in3;
7862306a36Sopenharmony_ci	out4 = in4;
7962306a36Sopenharmony_ci	out5 = in5;
8062306a36Sopenharmony_ci	out6 = in.in6;
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci	bpf_syscall = CONFIG_BPF_SYSCALL;
8362306a36Sopenharmony_ci	kern_ver = LINUX_KERNEL_VERSION;
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci	for (i = 0; i < in_dynarr_sz; i++)
8662306a36Sopenharmony_ci		out_dynarr[i] = in_dynarr[i];
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci	out_mostly_var = read_mostly_var;
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci	huge_arr[sizeof(huge_arr) - 1] = 123;
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci	/* make sure zero_key and zero_value are not optimized out */
9362306a36Sopenharmony_ci	bpf_map_update_elem(&my_map, &zero_key, &zero_value, BPF_ANY);
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci	return 0;
9662306a36Sopenharmony_ci}
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_cichar _license[] SEC("license") = "GPL";
99