1002d3afcSAndrii Nakryiko // SPDX-License-Identifier: GPL-2.0
2002d3afcSAndrii Nakryiko // Copyright (c) 2019 Facebook
3002d3afcSAndrii Nakryiko 
4002d3afcSAndrii Nakryiko #include <linux/bpf.h>
5002d3afcSAndrii Nakryiko #include <stdint.h>
63e689141SToke Høiland-Jørgensen #include <bpf/bpf_helpers.h>
73e689141SToke Høiland-Jørgensen #include <bpf/bpf_core_read.h>
8002d3afcSAndrii Nakryiko 
9002d3afcSAndrii Nakryiko char _license[] SEC("license") = "GPL";
10002d3afcSAndrii Nakryiko 
11393cdfbeSAndrii Nakryiko struct {
12002d3afcSAndrii Nakryiko 	char in[256];
13002d3afcSAndrii Nakryiko 	char out[256];
14393cdfbeSAndrii Nakryiko } data = {};
15002d3afcSAndrii Nakryiko 
16002d3afcSAndrii Nakryiko struct core_reloc_flavors {
17002d3afcSAndrii Nakryiko 	int a;
18002d3afcSAndrii Nakryiko 	int b;
19002d3afcSAndrii Nakryiko 	int c;
20002d3afcSAndrii Nakryiko };
21002d3afcSAndrii Nakryiko 
22002d3afcSAndrii Nakryiko /* local flavor with reversed layout */
23002d3afcSAndrii Nakryiko struct core_reloc_flavors___reversed {
24002d3afcSAndrii Nakryiko 	int c;
25002d3afcSAndrii Nakryiko 	int b;
26002d3afcSAndrii Nakryiko 	int a;
27002d3afcSAndrii Nakryiko };
28002d3afcSAndrii Nakryiko 
29002d3afcSAndrii Nakryiko /* local flavor with nested/overlapping layout */
30002d3afcSAndrii Nakryiko struct core_reloc_flavors___weird {
31002d3afcSAndrii Nakryiko 	struct {
32002d3afcSAndrii Nakryiko 		int b;
33002d3afcSAndrii Nakryiko 	};
34002d3afcSAndrii Nakryiko 	/* a and c overlap in local flavor, but this should still work
35002d3afcSAndrii Nakryiko 	 * correctly with target original flavor
36002d3afcSAndrii Nakryiko 	 */
37002d3afcSAndrii Nakryiko 	union {
38002d3afcSAndrii Nakryiko 		int a;
39002d3afcSAndrii Nakryiko 		int c;
40002d3afcSAndrii Nakryiko 	};
41002d3afcSAndrii Nakryiko };
42002d3afcSAndrii Nakryiko 
43694731e8SAndrii Nakryiko #define CORE_READ(dst, src) bpf_core_read(dst, sizeof(*(dst)), src)
44694731e8SAndrii Nakryiko 
45002d3afcSAndrii Nakryiko SEC("raw_tracepoint/sys_enter")
test_core_flavors(void * ctx)46002d3afcSAndrii Nakryiko int test_core_flavors(void *ctx)
47002d3afcSAndrii Nakryiko {
48002d3afcSAndrii Nakryiko 	struct core_reloc_flavors *in_orig = (void *)&data.in;
49002d3afcSAndrii Nakryiko 	struct core_reloc_flavors___reversed *in_rev = (void *)&data.in;
50002d3afcSAndrii Nakryiko 	struct core_reloc_flavors___weird *in_weird = (void *)&data.in;
51002d3afcSAndrii Nakryiko 	struct core_reloc_flavors *out = (void *)&data.out;
52002d3afcSAndrii Nakryiko 
53002d3afcSAndrii Nakryiko 	/* read a using weird layout */
54694731e8SAndrii Nakryiko 	if (CORE_READ(&out->a, &in_weird->a))
55002d3afcSAndrii Nakryiko 		return 1;
56002d3afcSAndrii Nakryiko 	/* read b using reversed layout */
57694731e8SAndrii Nakryiko 	if (CORE_READ(&out->b, &in_rev->b))
58002d3afcSAndrii Nakryiko 		return 1;
59002d3afcSAndrii Nakryiko 	/* read c using original layout */
60694731e8SAndrii Nakryiko 	if (CORE_READ(&out->c, &in_orig->c))
61002d3afcSAndrii Nakryiko 		return 1;
62002d3afcSAndrii Nakryiko 
63002d3afcSAndrii Nakryiko 	return 0;
64002d3afcSAndrii Nakryiko }
65002d3afcSAndrii Nakryiko 
66