1c7566a69SAndrii Nakryiko // SPDX-License-Identifier: GPL-2.0
2c7566a69SAndrii Nakryiko // Copyright (c) 2019 Facebook
3c7566a69SAndrii Nakryiko 
4c7566a69SAndrii Nakryiko #include <linux/bpf.h>
5c7566a69SAndrii Nakryiko #include <stdint.h>
63e689141SToke Høiland-Jørgensen #include <bpf/bpf_helpers.h>
73e689141SToke Høiland-Jørgensen #include <bpf/bpf_core_read.h>
8c7566a69SAndrii Nakryiko 
9c7566a69SAndrii Nakryiko char _license[] SEC("license") = "GPL";
10c7566a69SAndrii Nakryiko 
11393cdfbeSAndrii Nakryiko struct {
12c7566a69SAndrii Nakryiko 	char in[256];
13c7566a69SAndrii Nakryiko 	char out[256];
14393cdfbeSAndrii Nakryiko } data = {};
15c7566a69SAndrii Nakryiko 
16c7566a69SAndrii Nakryiko struct core_reloc_existence_output {
17c7566a69SAndrii Nakryiko 	int a_exists;
18c7566a69SAndrii Nakryiko 	int a_value;
19c7566a69SAndrii Nakryiko 	int b_exists;
20c7566a69SAndrii Nakryiko 	int b_value;
21c7566a69SAndrii Nakryiko 	int c_exists;
22c7566a69SAndrii Nakryiko 	int c_value;
23c7566a69SAndrii Nakryiko 	int arr_exists;
24c7566a69SAndrii Nakryiko 	int arr_value;
25c7566a69SAndrii Nakryiko 	int s_exists;
26c7566a69SAndrii Nakryiko 	int s_value;
27c7566a69SAndrii Nakryiko };
28c7566a69SAndrii Nakryiko 
29c7566a69SAndrii Nakryiko struct core_reloc_existence {
30c7566a69SAndrii Nakryiko 	struct {
31c7566a69SAndrii Nakryiko 		int x;
32c7566a69SAndrii Nakryiko 	} s;
33c7566a69SAndrii Nakryiko 	int arr[1];
34c7566a69SAndrii Nakryiko 	int a;
35c7566a69SAndrii Nakryiko 	struct {
36c7566a69SAndrii Nakryiko 		int b;
37c7566a69SAndrii Nakryiko 	};
38c7566a69SAndrii Nakryiko 	int c;
39c7566a69SAndrii Nakryiko };
40c7566a69SAndrii Nakryiko 
41c7566a69SAndrii Nakryiko SEC("raw_tracepoint/sys_enter")
test_core_existence(void * ctx)42c7566a69SAndrii Nakryiko int test_core_existence(void *ctx)
43c7566a69SAndrii Nakryiko {
44c7566a69SAndrii Nakryiko 	struct core_reloc_existence *in = (void *)&data.in;
45c7566a69SAndrii Nakryiko 	struct core_reloc_existence_output *out = (void *)&data.out;
46c7566a69SAndrii Nakryiko 
47c7566a69SAndrii Nakryiko 	out->a_exists = bpf_core_field_exists(in->a);
48*2a4ca46bSAndrii Nakryiko 	if (bpf_core_field_exists(struct core_reloc_existence, a))
49c7566a69SAndrii Nakryiko 		out->a_value = BPF_CORE_READ(in, a);
50c7566a69SAndrii Nakryiko 	else
51c7566a69SAndrii Nakryiko 		out->a_value = 0xff000001u;
52c7566a69SAndrii Nakryiko 
53c7566a69SAndrii Nakryiko 	out->b_exists = bpf_core_field_exists(in->b);
54*2a4ca46bSAndrii Nakryiko 	if (bpf_core_field_exists(struct core_reloc_existence, b))
55c7566a69SAndrii Nakryiko 		out->b_value = BPF_CORE_READ(in, b);
56c7566a69SAndrii Nakryiko 	else
57c7566a69SAndrii Nakryiko 		out->b_value = 0xff000002u;
58c7566a69SAndrii Nakryiko 
59c7566a69SAndrii Nakryiko 	out->c_exists = bpf_core_field_exists(in->c);
60*2a4ca46bSAndrii Nakryiko 	if (bpf_core_field_exists(struct core_reloc_existence, c))
61c7566a69SAndrii Nakryiko 		out->c_value = BPF_CORE_READ(in, c);
62c7566a69SAndrii Nakryiko 	else
63c7566a69SAndrii Nakryiko 		out->c_value = 0xff000003u;
64c7566a69SAndrii Nakryiko 
65c7566a69SAndrii Nakryiko 	out->arr_exists = bpf_core_field_exists(in->arr);
66*2a4ca46bSAndrii Nakryiko 	if (bpf_core_field_exists(struct core_reloc_existence, arr))
67c7566a69SAndrii Nakryiko 		out->arr_value = BPF_CORE_READ(in, arr[0]);
68c7566a69SAndrii Nakryiko 	else
69c7566a69SAndrii Nakryiko 		out->arr_value = 0xff000004u;
70c7566a69SAndrii Nakryiko 
71c7566a69SAndrii Nakryiko 	out->s_exists = bpf_core_field_exists(in->s);
72*2a4ca46bSAndrii Nakryiko 	if (bpf_core_field_exists(struct core_reloc_existence, s))
73c7566a69SAndrii Nakryiko 		out->s_value = BPF_CORE_READ(in, s.x);
74c7566a69SAndrii Nakryiko 	else
75c7566a69SAndrii Nakryiko 		out->s_value = 0xff000005u;
76c7566a69SAndrii Nakryiko 
77c7566a69SAndrii Nakryiko 	return 0;
78c7566a69SAndrii Nakryiko }
79