// SPDX-License-Identifier: GPL-2.0 // Copyright (c) 2020 Facebook #include <linux/bpf.h> #include <stdint.h> #include <stdbool.h> #include <bpf/bpf_helpers.h> #include <bpf/bpf_core_read.h> char _license[] SEC("license") = "GPL"; struct { char in[256]; char out[256]; bool skip; } data = {}; enum named_enum { NAMED_ENUM_VAL1 = 1, NAMED_ENUM_VAL2 = 2, NAMED_ENUM_VAL3 = 3, }; typedef enum { ANON_ENUM_VAL1 = 0x10, ANON_ENUM_VAL2 = 0x20, ANON_ENUM_VAL3 = 0x30, } anon_enum; struct core_reloc_enumval_output { bool named_val1_exists; bool named_val2_exists; bool named_val3_exists; bool anon_val1_exists; bool anon_val2_exists; bool anon_val3_exists; int named_val1; int named_val2; int anon_val1; int anon_val2; }; SEC("raw_tracepoint/sys_enter") int test_core_enumval(void *ctx) { #if __has_builtin(__builtin_preserve_enum_value) struct core_reloc_enumval_output *out = (void *)&data.out; enum named_enum named = 0; anon_enum anon = 0; out->named_val1_exists = bpf_core_enum_value_exists(named, NAMED_ENUM_VAL1); out->named_val2_exists = bpf_core_enum_value_exists(enum named_enum, NAMED_ENUM_VAL2); out->named_val3_exists = bpf_core_enum_value_exists(enum named_enum, NAMED_ENUM_VAL3); out->anon_val1_exists = bpf_core_enum_value_exists(anon, ANON_ENUM_VAL1); out->anon_val2_exists = bpf_core_enum_value_exists(anon_enum, ANON_ENUM_VAL2); out->anon_val3_exists = bpf_core_enum_value_exists(anon_enum, ANON_ENUM_VAL3); out->named_val1 = bpf_core_enum_value(named, NAMED_ENUM_VAL1); out->named_val2 = bpf_core_enum_value(named, NAMED_ENUM_VAL2); /* NAMED_ENUM_VAL3 value is optional */ out->anon_val1 = bpf_core_enum_value(anon, ANON_ENUM_VAL1); out->anon_val2 = bpf_core_enum_value(anon, ANON_ENUM_VAL2); /* ANON_ENUM_VAL3 value is optional */ #else data.skip = true; #endif return 0; }