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