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_mods_output { |
17 | int a, b, c, d, e, f, g, h; |
18 | }; |
19 | |
20 | typedef const int int_t; |
21 | typedef const char *char_ptr_t; |
22 | typedef const int arr_t[7]; |
23 | |
24 | struct core_reloc_mods_substruct { |
25 | int x; |
26 | int y; |
27 | }; |
28 | |
29 | typedef struct { |
30 | int x; |
31 | int y; |
32 | } core_reloc_mods_substruct_t; |
33 | |
34 | struct core_reloc_mods { |
35 | int a; |
36 | int_t b; |
37 | char *c; |
38 | char_ptr_t d; |
39 | int e[3]; |
40 | arr_t f; |
41 | struct core_reloc_mods_substruct g; |
42 | core_reloc_mods_substruct_t h; |
43 | }; |
44 | |
45 | #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ |
46 | #define CORE_READ(dst, src) bpf_core_read(dst, sizeof(*(dst)), src) |
47 | #else |
48 | #define CORE_READ(dst, src) ({ \ |
49 | int __sz = sizeof(*(dst)) < sizeof(*(src)) ? sizeof(*(dst)) : \ |
50 | sizeof(*(src)); \ |
51 | bpf_core_read((char *)(dst) + sizeof(*(dst)) - __sz, __sz, \ |
52 | (const char *)(src) + sizeof(*(src)) - __sz); \ |
53 | }) |
54 | #endif |
55 | |
56 | SEC("raw_tracepoint/sys_enter" ) |
57 | int test_core_mods(void *ctx) |
58 | { |
59 | struct core_reloc_mods *in = (void *)&data.in; |
60 | struct core_reloc_mods_output *out = (void *)&data.out; |
61 | |
62 | if (CORE_READ(&out->a, &in->a) || |
63 | CORE_READ(&out->b, &in->b) || |
64 | CORE_READ(&out->c, &in->c) || |
65 | CORE_READ(&out->d, &in->d) || |
66 | CORE_READ(&out->e, &in->e[2]) || |
67 | CORE_READ(&out->f, &in->f[1]) || |
68 | CORE_READ(&out->g, &in->g.x) || |
69 | CORE_READ(&out->h, &in->h.y)) |
70 | return 1; |
71 | |
72 | return 0; |
73 | } |
74 | |
75 | |