diff options
Diffstat (limited to 'kernel/trace/bpf_trace.c')
-rw-r--r-- | kernel/trace/bpf_trace.c | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index 37385193a608..dc498b605d5d 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c | |||
@@ -204,10 +204,36 @@ BPF_CALL_5(bpf_trace_printk, char *, fmt, u32, fmt_size, u64, arg1, | |||
204 | fmt_cnt++; | 204 | fmt_cnt++; |
205 | } | 205 | } |
206 | 206 | ||
207 | return __trace_printk(1/* fake ip will not be printed */, fmt, | 207 | /* Horrid workaround for getting va_list handling working with different |
208 | mod[0] == 2 ? arg1 : mod[0] == 1 ? (long) arg1 : (u32) arg1, | 208 | * argument type combinations generically for 32 and 64 bit archs. |
209 | mod[1] == 2 ? arg2 : mod[1] == 1 ? (long) arg2 : (u32) arg2, | 209 | */ |
210 | mod[2] == 2 ? arg3 : mod[2] == 1 ? (long) arg3 : (u32) arg3); | 210 | #define __BPF_TP_EMIT() __BPF_ARG3_TP() |
211 | #define __BPF_TP(...) \ | ||
212 | __trace_printk(1 /* Fake ip will not be printed. */, \ | ||
213 | fmt, ##__VA_ARGS__) | ||
214 | |||
215 | #define __BPF_ARG1_TP(...) \ | ||
216 | ((mod[0] == 2 || (mod[0] == 1 && __BITS_PER_LONG == 64)) \ | ||
217 | ? __BPF_TP(arg1, ##__VA_ARGS__) \ | ||
218 | : ((mod[0] == 1 || (mod[0] == 0 && __BITS_PER_LONG == 32)) \ | ||
219 | ? __BPF_TP((long)arg1, ##__VA_ARGS__) \ | ||
220 | : __BPF_TP((u32)arg1, ##__VA_ARGS__))) | ||
221 | |||
222 | #define __BPF_ARG2_TP(...) \ | ||
223 | ((mod[1] == 2 || (mod[1] == 1 && __BITS_PER_LONG == 64)) \ | ||
224 | ? __BPF_ARG1_TP(arg2, ##__VA_ARGS__) \ | ||
225 | : ((mod[1] == 1 || (mod[1] == 0 && __BITS_PER_LONG == 32)) \ | ||
226 | ? __BPF_ARG1_TP((long)arg2, ##__VA_ARGS__) \ | ||
227 | : __BPF_ARG1_TP((u32)arg2, ##__VA_ARGS__))) | ||
228 | |||
229 | #define __BPF_ARG3_TP(...) \ | ||
230 | ((mod[2] == 2 || (mod[2] == 1 && __BITS_PER_LONG == 64)) \ | ||
231 | ? __BPF_ARG2_TP(arg3, ##__VA_ARGS__) \ | ||
232 | : ((mod[2] == 1 || (mod[2] == 0 && __BITS_PER_LONG == 32)) \ | ||
233 | ? __BPF_ARG2_TP((long)arg3, ##__VA_ARGS__) \ | ||
234 | : __BPF_ARG2_TP((u32)arg3, ##__VA_ARGS__))) | ||
235 | |||
236 | return __BPF_TP_EMIT(); | ||
211 | } | 237 | } |
212 | 238 | ||
213 | static const struct bpf_func_proto bpf_trace_printk_proto = { | 239 | static const struct bpf_func_proto bpf_trace_printk_proto = { |