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