Commit | Line | Data |
---|---|---|
c4f6699d AS |
1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | ||
3 | #undef TRACE_SYSTEM_VAR | |
4 | ||
5 | #ifdef CONFIG_BPF_EVENTS | |
6 | ||
dc513fd5 | 7 | #include "stages/stage6_event_callback.h" |
d07c9ad6 | 8 | |
c4f6699d AS |
9 | #undef __perf_count |
10 | #define __perf_count(c) (c) | |
11 | ||
12 | #undef __perf_task | |
13 | #define __perf_task(t) (t) | |
14 | ||
b229baa3 AS |
15 | #include <linux/args.h> |
16 | ||
c4f6699d AS |
17 | /* cast any integer, pointer, or small struct to u64 */ |
18 | #define UINTTYPE(size) \ | |
19 | __typeof__(__builtin_choose_expr(size == 1, (u8)1, \ | |
20 | __builtin_choose_expr(size == 2, (u16)2, \ | |
21 | __builtin_choose_expr(size == 4, (u32)3, \ | |
22 | __builtin_choose_expr(size == 8, (u64)4, \ | |
23 | (void)5))))) | |
24 | #define __CAST_TO_U64(x) ({ \ | |
25 | typeof(x) __src = (x); \ | |
26 | UINTTYPE(sizeof(x)) __dst; \ | |
27 | memcpy(&__dst, &__src, sizeof(__dst)); \ | |
28 | (u64)__dst; }) | |
29 | ||
30 | #define __CAST1(a,...) __CAST_TO_U64(a) | |
31 | #define __CAST2(a,...) __CAST_TO_U64(a), __CAST1(__VA_ARGS__) | |
32 | #define __CAST3(a,...) __CAST_TO_U64(a), __CAST2(__VA_ARGS__) | |
33 | #define __CAST4(a,...) __CAST_TO_U64(a), __CAST3(__VA_ARGS__) | |
34 | #define __CAST5(a,...) __CAST_TO_U64(a), __CAST4(__VA_ARGS__) | |
35 | #define __CAST6(a,...) __CAST_TO_U64(a), __CAST5(__VA_ARGS__) | |
36 | #define __CAST7(a,...) __CAST_TO_U64(a), __CAST6(__VA_ARGS__) | |
37 | #define __CAST8(a,...) __CAST_TO_U64(a), __CAST7(__VA_ARGS__) | |
38 | #define __CAST9(a,...) __CAST_TO_U64(a), __CAST8(__VA_ARGS__) | |
39 | #define __CAST10(a,...) __CAST_TO_U64(a), __CAST9(__VA_ARGS__) | |
40 | #define __CAST11(a,...) __CAST_TO_U64(a), __CAST10(__VA_ARGS__) | |
41 | #define __CAST12(a,...) __CAST_TO_U64(a), __CAST11(__VA_ARGS__) | |
42 | /* tracepoints with more than 12 arguments will hit build error */ | |
43 | #define CAST_TO_U64(...) CONCATENATE(__CAST, COUNT_ARGS(__VA_ARGS__))(__VA_ARGS__) | |
44 | ||
6939f4ef | 45 | #define __BPF_DECLARE_TRACE(call, proto, args) \ |
c4f6699d AS |
46 | static notrace void \ |
47 | __bpf_trace_##call(void *__data, proto) \ | |
48 | { \ | |
49 | struct bpf_prog *prog = __data; \ | |
50 | CONCATENATE(bpf_trace_run, COUNT_ARGS(args))(prog, CAST_TO_U64(args)); \ | |
51 | } | |
52 | ||
6939f4ef QY |
53 | #undef DECLARE_EVENT_CLASS |
54 | #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ | |
55 | __BPF_DECLARE_TRACE(call, PARAMS(proto), PARAMS(args)) | |
56 | ||
c4f6699d AS |
57 | /* |
58 | * This part is compiled out, it is only here as a build time check | |
59 | * to make sure that if the tracepoint handling changes, the | |
60 | * bpf probe will fail to compile unless it too is updated. | |
61 | */ | |
9df1c28b | 62 | #define __DEFINE_EVENT(template, call, proto, args, size) \ |
c4f6699d AS |
63 | static inline void bpf_test_probe_##call(void) \ |
64 | { \ | |
65 | check_trace_callback_type_##call(__bpf_trace_##template); \ | |
66 | } \ | |
e8c423fb | 67 | typedef void (*btf_trace_##call)(void *__data, proto); \ |
441420a1 AN |
68 | static union { \ |
69 | struct bpf_raw_event_map event; \ | |
70 | btf_trace_##call handler; \ | |
71 | } __bpf_trace_tp_map_##call __used \ | |
33def849 | 72 | __section("__bpf_raw_tp_map") = { \ |
441420a1 AN |
73 | .event = { \ |
74 | .tp = &__tracepoint_##call, \ | |
75 | .bpf_func = __bpf_trace_##template, \ | |
76 | .num_args = COUNT_ARGS(args), \ | |
77 | .writable_size = size, \ | |
78 | }, \ | |
c4f6699d AS |
79 | }; |
80 | ||
9df1c28b MM |
81 | #define FIRST(x, ...) x |
82 | ||
65223741 | 83 | #define __CHECK_WRITABLE_BUF_SIZE(call, proto, args, size) \ |
9df1c28b MM |
84 | static inline void bpf_test_buffer_##call(void) \ |
85 | { \ | |
86 | /* BUILD_BUG_ON() is ignored if the code is completely eliminated, but \ | |
87 | * BUILD_BUG_ON_ZERO() uses a different mechanism that is not \ | |
88 | * dead-code-eliminated. \ | |
89 | */ \ | |
90 | FIRST(proto); \ | |
91 | (void)BUILD_BUG_ON_ZERO(size != sizeof(*FIRST(args))); \ | |
65223741 HT |
92 | } |
93 | ||
94 | #undef DEFINE_EVENT_WRITABLE | |
95 | #define DEFINE_EVENT_WRITABLE(template, call, proto, args, size) \ | |
96 | __CHECK_WRITABLE_BUF_SIZE(call, PARAMS(proto), PARAMS(args), size) \ | |
97 | __DEFINE_EVENT(template, call, PARAMS(proto), PARAMS(args), size) | |
9df1c28b MM |
98 | |
99 | #undef DEFINE_EVENT | |
100 | #define DEFINE_EVENT(template, call, proto, args) \ | |
101 | __DEFINE_EVENT(template, call, PARAMS(proto), PARAMS(args), 0) | |
c4f6699d AS |
102 | |
103 | #undef DEFINE_EVENT_PRINT | |
104 | #define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ | |
105 | DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) | |
106 | ||
6939f4ef QY |
107 | #undef DECLARE_TRACE |
108 | #define DECLARE_TRACE(call, proto, args) \ | |
109 | __BPF_DECLARE_TRACE(call, PARAMS(proto), PARAMS(args)) \ | |
110 | __DEFINE_EVENT(call, call, PARAMS(proto), PARAMS(args), 0) | |
111 | ||
65223741 HT |
112 | #undef DECLARE_TRACE_WRITABLE |
113 | #define DECLARE_TRACE_WRITABLE(call, proto, args, size) \ | |
114 | __CHECK_WRITABLE_BUF_SIZE(call, PARAMS(proto), PARAMS(args), size) \ | |
115 | __BPF_DECLARE_TRACE(call, PARAMS(proto), PARAMS(args)) \ | |
116 | __DEFINE_EVENT(call, call, PARAMS(proto), PARAMS(args), size) | |
117 | ||
c4f6699d | 118 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) |
9df1c28b | 119 | |
65223741 | 120 | #undef DECLARE_TRACE_WRITABLE |
9df1c28b | 121 | #undef DEFINE_EVENT_WRITABLE |
65223741 | 122 | #undef __CHECK_WRITABLE_BUF_SIZE |
9df1c28b MM |
123 | #undef __DEFINE_EVENT |
124 | #undef FIRST | |
125 | ||
c4f6699d | 126 | #endif /* CONFIG_BPF_EVENTS */ |