1 | // SPDX-License-Identifier: GPL-2.0 |
2 | // Copyright (c) 2020 Facebook |
3 | |
4 | #include <linux/bpf.h> |
5 | #include <stdint.h> |
6 | #include <stdbool.h> |
7 | #include <bpf/bpf_helpers.h> |
8 | #include <bpf/bpf_core_read.h> |
9 | |
10 | char _license[] SEC("license" ) = "GPL" ; |
11 | |
12 | struct { |
13 | char in[256]; |
14 | char out[256]; |
15 | bool skip; |
16 | } data = {}; |
17 | |
18 | enum named_enum { |
19 | NAMED_ENUM_VAL1 = 1, |
20 | NAMED_ENUM_VAL2 = 2, |
21 | NAMED_ENUM_VAL3 = 3, |
22 | }; |
23 | |
24 | typedef enum { |
25 | ANON_ENUM_VAL1 = 0x10, |
26 | ANON_ENUM_VAL2 = 0x20, |
27 | ANON_ENUM_VAL3 = 0x30, |
28 | } anon_enum; |
29 | |
30 | struct core_reloc_enumval_output { |
31 | bool named_val1_exists; |
32 | bool named_val2_exists; |
33 | bool named_val3_exists; |
34 | bool anon_val1_exists; |
35 | bool anon_val2_exists; |
36 | bool anon_val3_exists; |
37 | |
38 | int named_val1; |
39 | int named_val2; |
40 | int anon_val1; |
41 | int anon_val2; |
42 | }; |
43 | |
44 | SEC("raw_tracepoint/sys_enter" ) |
45 | int test_core_enumval(void *ctx) |
46 | { |
47 | #if __has_builtin(__builtin_preserve_enum_value) |
48 | struct core_reloc_enumval_output *out = (void *)&data.out; |
49 | enum named_enum named = 0; |
50 | anon_enum anon = 0; |
51 | |
52 | out->named_val1_exists = bpf_core_enum_value_exists(named, NAMED_ENUM_VAL1); |
53 | out->named_val2_exists = bpf_core_enum_value_exists(enum named_enum, NAMED_ENUM_VAL2); |
54 | out->named_val3_exists = bpf_core_enum_value_exists(enum named_enum, NAMED_ENUM_VAL3); |
55 | |
56 | out->anon_val1_exists = bpf_core_enum_value_exists(anon, ANON_ENUM_VAL1); |
57 | out->anon_val2_exists = bpf_core_enum_value_exists(anon_enum, ANON_ENUM_VAL2); |
58 | out->anon_val3_exists = bpf_core_enum_value_exists(anon_enum, ANON_ENUM_VAL3); |
59 | |
60 | out->named_val1 = bpf_core_enum_value(named, NAMED_ENUM_VAL1); |
61 | out->named_val2 = bpf_core_enum_value(named, NAMED_ENUM_VAL2); |
62 | /* NAMED_ENUM_VAL3 value is optional */ |
63 | |
64 | out->anon_val1 = bpf_core_enum_value(anon, ANON_ENUM_VAL1); |
65 | out->anon_val2 = bpf_core_enum_value(anon, ANON_ENUM_VAL2); |
66 | /* ANON_ENUM_VAL3 value is optional */ |
67 | #else |
68 | data.skip = true; |
69 | #endif |
70 | |
71 | return 0; |
72 | } |
73 | |