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
9char _license[] SEC("license") = "GPL";
10
11struct {
12	char in[256];
13	char out[256];
14} data = {};
15
16struct 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
29struct 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
41SEC("raw_tracepoint/sys_enter")
42int 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