1197448eaSAndrii Nakryiko // SPDX-License-Identifier: GPL-2.0
2197448eaSAndrii Nakryiko /* Copyright (c) 2019 Facebook */
3197448eaSAndrii Nakryiko 
4330a73a7SAndrii Nakryiko #include <stdbool.h>
5197448eaSAndrii Nakryiko #include <linux/bpf.h>
63e689141SToke Høiland-Jørgensen #include <bpf/bpf_helpers.h>
7197448eaSAndrii Nakryiko 
830c5bd96SAndrii Nakryiko #define __read_mostly SEC(".data.read_mostly")
930c5bd96SAndrii Nakryiko 
10197448eaSAndrii Nakryiko struct s {
11197448eaSAndrii Nakryiko 	int a;
12197448eaSAndrii Nakryiko 	long long b;
13197448eaSAndrii Nakryiko } __attribute__((packed));
14197448eaSAndrii Nakryiko 
15caf62492SAndrii Nakryiko /* .data section */
16caf62492SAndrii Nakryiko int in1 = -1;
17caf62492SAndrii Nakryiko long long in2 = -1;
18caf62492SAndrii Nakryiko 
19caf62492SAndrii Nakryiko /* .bss section */
20197448eaSAndrii Nakryiko char in3 = '\0';
21197448eaSAndrii Nakryiko long long in4 __attribute__((aligned(64))) = 0;
22197448eaSAndrii Nakryiko struct s in5 = {};
23197448eaSAndrii Nakryiko 
24caf62492SAndrii Nakryiko /* .rodata section */
250b20933dSAndrii Nakryiko const volatile struct {
260b20933dSAndrii Nakryiko 	const int in6;
270b20933dSAndrii Nakryiko } in = {};
28caf62492SAndrii Nakryiko 
29caf62492SAndrii Nakryiko /* .data section */
30caf62492SAndrii Nakryiko int out1 = -1;
31caf62492SAndrii Nakryiko long long out2 = -1;
32caf62492SAndrii Nakryiko 
33caf62492SAndrii Nakryiko /* .bss section */
34197448eaSAndrii Nakryiko char out3 = 0;
35197448eaSAndrii Nakryiko long long out4 = 0;
36caf62492SAndrii Nakryiko int out6 = 0;
37197448eaSAndrii Nakryiko 
3881bfdd08SAndrii Nakryiko extern bool CONFIG_BPF_SYSCALL __kconfig;
3981bfdd08SAndrii Nakryiko extern int LINUX_KERNEL_VERSION __kconfig;
40330a73a7SAndrii Nakryiko bool bpf_syscall = 0;
41330a73a7SAndrii Nakryiko int kern_ver = 0;
42197448eaSAndrii Nakryiko 
43256eab48SAndrii Nakryiko struct s out5 = {};
44256eab48SAndrii Nakryiko 
4530c5bd96SAndrii Nakryiko 
4630c5bd96SAndrii Nakryiko const volatile int in_dynarr_sz SEC(".rodata.dyn");
4730c5bd96SAndrii Nakryiko const volatile int in_dynarr[4] SEC(".rodata.dyn") = { -1, -2, -3, -4 };
4830c5bd96SAndrii Nakryiko 
4930c5bd96SAndrii Nakryiko int out_dynarr[4] SEC(".data.dyn") = { 1, 2, 3, 4 };
5030c5bd96SAndrii Nakryiko 
5130c5bd96SAndrii Nakryiko int read_mostly_var __read_mostly;
5230c5bd96SAndrii Nakryiko int out_mostly_var;
5330c5bd96SAndrii Nakryiko 
5424316461SAndrii Nakryiko char huge_arr[16 * 1024 * 1024];
5524316461SAndrii Nakryiko 
56*2f968e9fSAndrii Nakryiko /* non-mmapable custom .data section */
57*2f968e9fSAndrii Nakryiko 
58*2f968e9fSAndrii Nakryiko struct my_value { int x, y, z; };
59*2f968e9fSAndrii Nakryiko 
60*2f968e9fSAndrii Nakryiko __hidden int zero_key SEC(".data.non_mmapable");
61*2f968e9fSAndrii Nakryiko static struct my_value zero_value SEC(".data.non_mmapable");
62*2f968e9fSAndrii Nakryiko 
63*2f968e9fSAndrii Nakryiko struct {
64*2f968e9fSAndrii Nakryiko 	__uint(type, BPF_MAP_TYPE_ARRAY);
65*2f968e9fSAndrii Nakryiko 	__type(key, int);
66*2f968e9fSAndrii Nakryiko 	__type(value, struct my_value);
67*2f968e9fSAndrii Nakryiko 	__uint(max_entries, 1);
68*2f968e9fSAndrii Nakryiko } my_map SEC(".maps");
69*2f968e9fSAndrii Nakryiko 
70197448eaSAndrii Nakryiko SEC("raw_tp/sys_enter")
handler(const void * ctx)71197448eaSAndrii Nakryiko int handler(const void *ctx)
72197448eaSAndrii Nakryiko {
7330c5bd96SAndrii Nakryiko 	int i;
7430c5bd96SAndrii Nakryiko 
75197448eaSAndrii Nakryiko 	out1 = in1;
76197448eaSAndrii Nakryiko 	out2 = in2;
77197448eaSAndrii Nakryiko 	out3 = in3;
78197448eaSAndrii Nakryiko 	out4 = in4;
79197448eaSAndrii Nakryiko 	out5 = in5;
800b20933dSAndrii Nakryiko 	out6 = in.in6;
81330a73a7SAndrii Nakryiko 
82330a73a7SAndrii Nakryiko 	bpf_syscall = CONFIG_BPF_SYSCALL;
83330a73a7SAndrii Nakryiko 	kern_ver = LINUX_KERNEL_VERSION;
84330a73a7SAndrii Nakryiko 
8530c5bd96SAndrii Nakryiko 	for (i = 0; i < in_dynarr_sz; i++)
8630c5bd96SAndrii Nakryiko 		out_dynarr[i] = in_dynarr[i];
8730c5bd96SAndrii Nakryiko 
8830c5bd96SAndrii Nakryiko 	out_mostly_var = read_mostly_var;
8930c5bd96SAndrii Nakryiko 
9024316461SAndrii Nakryiko 	huge_arr[sizeof(huge_arr) - 1] = 123;
9124316461SAndrii Nakryiko 
92*2f968e9fSAndrii Nakryiko 	/* make sure zero_key and zero_value are not optimized out */
93*2f968e9fSAndrii Nakryiko 	bpf_map_update_elem(&my_map, &zero_key, &zero_value, BPF_ANY);
94*2f968e9fSAndrii Nakryiko 
95197448eaSAndrii Nakryiko 	return 0;
96197448eaSAndrii Nakryiko }
97197448eaSAndrii Nakryiko 
98197448eaSAndrii Nakryiko char _license[] SEC("license") = "GPL";
99