diff options
| author | David S. Miller <davem@davemloft.net> | 2017-08-15 23:23:23 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2017-08-15 23:23:23 -0400 |
| commit | 463910e2dff580e4e9a678af710b4818b5189691 (patch) | |
| tree | 21b4e53cdbec7e5a537ddfc1598fbf17deae57e2 /kernel/trace | |
| parent | 22cb7a3ac380ecaab6837670963813599b123a53 (diff) | |
| parent | 510c8a899caf095cb13d09d203573deef15db2fe (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Diffstat (limited to 'kernel/trace')
| -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 = { |
