Merge tag 'perf-urgent-2020-08-23' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / tools / testing / selftests / bpf / progs / test_core_reloc_existence.c
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(in->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(in->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(in->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(in->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(in->s))
73                 out->s_value = BPF_CORE_READ(in, s.x);
74         else
75                 out->s_value = 0xff000005u;
76
77         return 0;
78 }
79