1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#include <linux/trace_events.h>
20
21#ifndef TRACE_SYSTEM_VAR
22#define TRACE_SYSTEM_VAR TRACE_SYSTEM
23#endif
24
25#define __app__(x, y) str__##x##y
26#define __app(x, y) __app__(x, y)
27
28#define TRACE_SYSTEM_STRING __app(TRACE_SYSTEM_VAR,__trace_system_name)
29
30#define TRACE_MAKE_SYSTEM_STR() \
31 static const char TRACE_SYSTEM_STRING[] = \
32 __stringify(TRACE_SYSTEM)
33
34TRACE_MAKE_SYSTEM_STR();
35
36#undef TRACE_DEFINE_ENUM
37#define TRACE_DEFINE_ENUM(a) \
38 static struct trace_enum_map __used __initdata \
39 __##TRACE_SYSTEM##_##a = \
40 { \
41 .system = TRACE_SYSTEM_STRING, \
42 .enum_string = #a, \
43 .enum_value = a \
44 }; \
45 static struct trace_enum_map __used \
46 __attribute__((section("_ftrace_enum_map"))) \
47 *TRACE_SYSTEM##_##a = &__##TRACE_SYSTEM##_##a
48
49
50
51
52
53
54
55
56
57
58#undef TRACE_EVENT
59#define TRACE_EVENT(name, proto, args, tstruct, assign, print) \
60 DECLARE_EVENT_CLASS(name, \
61 PARAMS(proto), \
62 PARAMS(args), \
63 PARAMS(tstruct), \
64 PARAMS(assign), \
65 PARAMS(print)); \
66 DEFINE_EVENT(name, name, PARAMS(proto), PARAMS(args));
67
68
69#undef __field
70#define __field(type, item) type item;
71
72#undef __field_ext
73#define __field_ext(type, item, filter_type) type item;
74
75#undef __field_struct
76#define __field_struct(type, item) type item;
77
78#undef __field_struct_ext
79#define __field_struct_ext(type, item, filter_type) type item;
80
81#undef __array
82#define __array(type, item, len) type item[len];
83
84#undef __dynamic_array
85#define __dynamic_array(type, item, len) u32 __data_loc_##item;
86
87#undef __string
88#define __string(item, src) __dynamic_array(char, item, -1)
89
90#undef __bitmask
91#define __bitmask(item, nr_bits) __dynamic_array(char, item, -1)
92
93#undef TP_STRUCT__entry
94#define TP_STRUCT__entry(args...) args
95
96#undef DECLARE_EVENT_CLASS
97#define DECLARE_EVENT_CLASS(name, proto, args, tstruct, assign, print) \
98 struct trace_event_raw_##name { \
99 struct trace_entry ent; \
100 tstruct \
101 char __data[0]; \
102 }; \
103 \
104 static struct trace_event_class event_class_##name;
105
106#undef DEFINE_EVENT
107#define DEFINE_EVENT(template, name, proto, args) \
108 static struct trace_event_call __used \
109 __attribute__((__aligned__(4))) event_##name
110
111#undef DEFINE_EVENT_FN
112#define DEFINE_EVENT_FN(template, name, proto, args, reg, unreg) \
113 DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args))
114
115#undef DEFINE_EVENT_PRINT
116#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \
117 DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args))
118
119
120#undef TRACE_EVENT_FN
121#define TRACE_EVENT_FN(name, proto, args, tstruct, \
122 assign, print, reg, unreg) \
123 TRACE_EVENT(name, PARAMS(proto), PARAMS(args), \
124 PARAMS(tstruct), PARAMS(assign), PARAMS(print)) \
125
126#undef TRACE_EVENT_FN_COND
127#define TRACE_EVENT_FN_COND(name, proto, args, cond, tstruct, \
128 assign, print, reg, unreg) \
129 TRACE_EVENT_CONDITION(name, PARAMS(proto), PARAMS(args), PARAMS(cond), \
130 PARAMS(tstruct), PARAMS(assign), PARAMS(print)) \
131
132#undef TRACE_EVENT_FLAGS
133#define TRACE_EVENT_FLAGS(name, value) \
134 __TRACE_EVENT_FLAGS(name, value)
135
136#undef TRACE_EVENT_PERF_PERM
137#define TRACE_EVENT_PERF_PERM(name, expr...) \
138 __TRACE_EVENT_PERF_PERM(name, expr)
139
140#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158#undef TRACE_DEFINE_ENUM
159#define TRACE_DEFINE_ENUM(a)
160
161#undef __field
162#define __field(type, item)
163
164#undef __field_ext
165#define __field_ext(type, item, filter_type)
166
167#undef __field_struct
168#define __field_struct(type, item)
169
170#undef __field_struct_ext
171#define __field_struct_ext(type, item, filter_type)
172
173#undef __array
174#define __array(type, item, len)
175
176#undef __dynamic_array
177#define __dynamic_array(type, item, len) u32 item;
178
179#undef __string
180#define __string(item, src) __dynamic_array(char, item, -1)
181
182#undef __bitmask
183#define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1)
184
185#undef DECLARE_EVENT_CLASS
186#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \
187 struct trace_event_data_offsets_##call { \
188 tstruct; \
189 };
190
191#undef DEFINE_EVENT
192#define DEFINE_EVENT(template, name, proto, args)
193
194#undef DEFINE_EVENT_PRINT
195#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \
196 DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args))
197
198#undef TRACE_EVENT_FLAGS
199#define TRACE_EVENT_FLAGS(event, flag)
200
201#undef TRACE_EVENT_PERF_PERM
202#define TRACE_EVENT_PERF_PERM(event, expr...)
203
204#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244#undef __entry
245#define __entry field
246
247#undef TP_printk
248#define TP_printk(fmt, args...) fmt "\n", args
249
250#undef __get_dynamic_array
251#define __get_dynamic_array(field) \
252 ((void *)__entry + (__entry->__data_loc_##field & 0xffff))
253
254#undef __get_dynamic_array_len
255#define __get_dynamic_array_len(field) \
256 ((__entry->__data_loc_##field >> 16) & 0xffff)
257
258#undef __get_str
259#define __get_str(field) (char *)__get_dynamic_array(field)
260
261#undef __get_bitmask
262#define __get_bitmask(field) \
263 ({ \
264 void *__bitmask = __get_dynamic_array(field); \
265 unsigned int __bitmask_size; \
266 __bitmask_size = __get_dynamic_array_len(field); \
267 trace_print_bitmask_seq(p, __bitmask, __bitmask_size); \
268 })
269
270#undef __print_flags
271#define __print_flags(flag, delim, flag_array...) \
272 ({ \
273 static const struct trace_print_flags __flags[] = \
274 { flag_array, { -1, NULL }}; \
275 trace_print_flags_seq(p, delim, flag, __flags); \
276 })
277
278#undef __print_symbolic
279#define __print_symbolic(value, symbol_array...) \
280 ({ \
281 static const struct trace_print_flags symbols[] = \
282 { symbol_array, { -1, NULL }}; \
283 trace_print_symbols_seq(p, value, symbols); \
284 })
285
286#undef __print_symbolic_u64
287#if BITS_PER_LONG == 32
288#define __print_symbolic_u64(value, symbol_array...) \
289 ({ \
290 static const struct trace_print_flags_u64 symbols[] = \
291 { symbol_array, { -1, NULL } }; \
292 trace_print_symbols_seq_u64(p, value, symbols); \
293 })
294#else
295#define __print_symbolic_u64(value, symbol_array...) \
296 __print_symbolic(value, symbol_array)
297#endif
298
299#undef __print_hex
300#define __print_hex(buf, buf_len) trace_print_hex_seq(p, buf, buf_len)
301
302#undef __print_array
303#define __print_array(array, count, el_size) \
304 ({ \
305 BUILD_BUG_ON(el_size != 1 && el_size != 2 && \
306 el_size != 4 && el_size != 8); \
307 trace_print_array_seq(p, array, count, el_size); \
308 })
309
310#undef DECLARE_EVENT_CLASS
311#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \
312static notrace enum print_line_t \
313trace_raw_output_##call(struct trace_iterator *iter, int flags, \
314 struct trace_event *trace_event) \
315{ \
316 struct trace_seq *s = &iter->seq; \
317 struct trace_seq __maybe_unused *p = &iter->tmp_seq; \
318 struct trace_event_raw_##call *field; \
319 int ret; \
320 \
321 field = (typeof(field))iter->ent; \
322 \
323 ret = trace_raw_output_prep(iter, trace_event); \
324 if (ret != TRACE_TYPE_HANDLED) \
325 return ret; \
326 \
327 trace_seq_printf(s, print); \
328 \
329 return trace_handle_return(s); \
330} \
331static struct trace_event_functions trace_event_type_funcs_##call = { \
332 .trace = trace_raw_output_##call, \
333};
334
335#undef DEFINE_EVENT_PRINT
336#define DEFINE_EVENT_PRINT(template, call, proto, args, print) \
337static notrace enum print_line_t \
338trace_raw_output_##call(struct trace_iterator *iter, int flags, \
339 struct trace_event *event) \
340{ \
341 struct trace_event_raw_##template *field; \
342 struct trace_entry *entry; \
343 struct trace_seq *p = &iter->tmp_seq; \
344 \
345 entry = iter->ent; \
346 \
347 if (entry->type != event_##call.event.type) { \
348 WARN_ON_ONCE(1); \
349 return TRACE_TYPE_UNHANDLED; \
350 } \
351 \
352 field = (typeof(field))entry; \
353 \
354 trace_seq_init(p); \
355 return trace_output_call(iter, #call, print); \
356} \
357static struct trace_event_functions trace_event_type_funcs_##call = { \
358 .trace = trace_raw_output_##call, \
359};
360
361#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
362
363#undef __field_ext
364#define __field_ext(type, item, filter_type) \
365 ret = trace_define_field(event_call, #type, #item, \
366 offsetof(typeof(field), item), \
367 sizeof(field.item), \
368 is_signed_type(type), filter_type); \
369 if (ret) \
370 return ret;
371
372#undef __field_struct_ext
373#define __field_struct_ext(type, item, filter_type) \
374 ret = trace_define_field(event_call, #type, #item, \
375 offsetof(typeof(field), item), \
376 sizeof(field.item), \
377 0, filter_type); \
378 if (ret) \
379 return ret;
380
381#undef __field
382#define __field(type, item) __field_ext(type, item, FILTER_OTHER)
383
384#undef __field_struct
385#define __field_struct(type, item) __field_struct_ext(type, item, FILTER_OTHER)
386
387#undef __array
388#define __array(type, item, len) \
389 do { \
390 char *type_str = #type"["__stringify(len)"]"; \
391 BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \
392 ret = trace_define_field(event_call, type_str, #item, \
393 offsetof(typeof(field), item), \
394 sizeof(field.item), \
395 is_signed_type(type), FILTER_OTHER); \
396 if (ret) \
397 return ret; \
398 } while (0);
399
400#undef __dynamic_array
401#define __dynamic_array(type, item, len) \
402 ret = trace_define_field(event_call, "__data_loc " #type "[]", #item, \
403 offsetof(typeof(field), __data_loc_##item), \
404 sizeof(field.__data_loc_##item), \
405 is_signed_type(type), FILTER_OTHER);
406
407#undef __string
408#define __string(item, src) __dynamic_array(char, item, -1)
409
410#undef __bitmask
411#define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1)
412
413#undef DECLARE_EVENT_CLASS
414#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, func, print) \
415static int notrace __init \
416trace_event_define_fields_##call(struct trace_event_call *event_call) \
417{ \
418 struct trace_event_raw_##call field; \
419 int ret; \
420 \
421 tstruct; \
422 \
423 return ret; \
424}
425
426#undef DEFINE_EVENT
427#define DEFINE_EVENT(template, name, proto, args)
428
429#undef DEFINE_EVENT_PRINT
430#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \
431 DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args))
432
433#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
434
435
436
437
438
439#undef __entry
440#define __entry entry
441
442#undef __field
443#define __field(type, item)
444
445#undef __field_ext
446#define __field_ext(type, item, filter_type)
447
448#undef __field_struct
449#define __field_struct(type, item)
450
451#undef __field_struct_ext
452#define __field_struct_ext(type, item, filter_type)
453
454#undef __array
455#define __array(type, item, len)
456
457#undef __dynamic_array
458#define __dynamic_array(type, item, len) \
459 __item_length = (len) * sizeof(type); \
460 __data_offsets->item = __data_size + \
461 offsetof(typeof(*entry), __data); \
462 __data_offsets->item |= __item_length << 16; \
463 __data_size += __item_length;
464
465#undef __string
466#define __string(item, src) __dynamic_array(char, item, \
467 strlen((src) ? (const char *)(src) : "(null)") + 1)
468
469
470
471
472
473#define __bitmask_size_in_bytes_raw(nr_bits) \
474 (((nr_bits) + 7) / 8)
475
476#define __bitmask_size_in_longs(nr_bits) \
477 ((__bitmask_size_in_bytes_raw(nr_bits) + \
478 ((BITS_PER_LONG / 8) - 1)) / (BITS_PER_LONG / 8))
479
480
481
482
483
484
485#define __bitmask_size_in_bytes(nr_bits) \
486 (__bitmask_size_in_longs(nr_bits) * (BITS_PER_LONG / 8))
487
488#undef __bitmask
489#define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, \
490 __bitmask_size_in_longs(nr_bits))
491
492#undef DECLARE_EVENT_CLASS
493#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \
494static inline notrace int trace_event_get_offsets_##call( \
495 struct trace_event_data_offsets_##call *__data_offsets, proto) \
496{ \
497 int __data_size = 0; \
498 int __maybe_unused __item_length; \
499 struct trace_event_raw_##call __maybe_unused *entry; \
500 \
501 tstruct; \
502 \
503 return __data_size; \
504}
505
506#undef DEFINE_EVENT
507#define DEFINE_EVENT(template, name, proto, args)
508
509#undef DEFINE_EVENT_PRINT
510#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \
511 DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args))
512
513#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605#ifdef CONFIG_PERF_EVENTS
606
607#define _TRACE_PERF_PROTO(call, proto) \
608 static notrace void \
609 perf_trace_##call(void *__data, proto);
610
611#define _TRACE_PERF_INIT(call) \
612 .perf_probe = perf_trace_##call,
613
614#else
615#define _TRACE_PERF_PROTO(call, proto)
616#define _TRACE_PERF_INIT(call)
617#endif
618
619#undef __entry
620#define __entry entry
621
622#undef __field
623#define __field(type, item)
624
625#undef __field_struct
626#define __field_struct(type, item)
627
628#undef __array
629#define __array(type, item, len)
630
631#undef __dynamic_array
632#define __dynamic_array(type, item, len) \
633 __entry->__data_loc_##item = __data_offsets.item;
634
635#undef __string
636#define __string(item, src) __dynamic_array(char, item, -1)
637
638#undef __assign_str
639#define __assign_str(dst, src) \
640 strcpy(__get_str(dst), (src) ? (const char *)(src) : "(null)");
641
642#undef __bitmask
643#define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1)
644
645#undef __get_bitmask
646#define __get_bitmask(field) (char *)__get_dynamic_array(field)
647
648#undef __assign_bitmask
649#define __assign_bitmask(dst, src, nr_bits) \
650 memcpy(__get_bitmask(dst), (src), __bitmask_size_in_bytes(nr_bits))
651
652#undef TP_fast_assign
653#define TP_fast_assign(args...) args
654
655#undef __perf_addr
656#define __perf_addr(a) (a)
657
658#undef __perf_count
659#define __perf_count(c) (c)
660
661#undef __perf_task
662#define __perf_task(t) (t)
663
664#undef DECLARE_EVENT_CLASS
665#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \
666 \
667static notrace void \
668trace_event_raw_event_##call(void *__data, proto) \
669{ \
670 struct trace_event_file *trace_file = __data; \
671 struct trace_event_data_offsets_##call __maybe_unused __data_offsets;\
672 struct trace_event_buffer fbuffer; \
673 struct trace_event_raw_##call *entry; \
674 int __data_size; \
675 \
676 if (trace_trigger_soft_disabled(trace_file)) \
677 return; \
678 \
679 __data_size = trace_event_get_offsets_##call(&__data_offsets, args); \
680 \
681 entry = trace_event_buffer_reserve(&fbuffer, trace_file, \
682 sizeof(*entry) + __data_size); \
683 \
684 if (!entry) \
685 return; \
686 \
687 tstruct \
688 \
689 { assign; } \
690 \
691 trace_event_buffer_commit(&fbuffer); \
692}
693
694
695
696
697
698
699#undef DEFINE_EVENT
700#define DEFINE_EVENT(template, call, proto, args) \
701static inline void ftrace_test_probe_##call(void) \
702{ \
703 check_trace_callback_type_##call(trace_event_raw_event_##template); \
704}
705
706#undef DEFINE_EVENT_PRINT
707#define DEFINE_EVENT_PRINT(template, name, proto, args, print)
708
709#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
710
711#undef __entry
712#define __entry REC
713
714#undef __print_flags
715#undef __print_symbolic
716#undef __print_hex
717#undef __get_dynamic_array
718#undef __get_dynamic_array_len
719#undef __get_str
720#undef __get_bitmask
721#undef __print_array
722
723#undef TP_printk
724#define TP_printk(fmt, args...) "\"" fmt "\", " __stringify(args)
725
726#undef DECLARE_EVENT_CLASS
727#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \
728_TRACE_PERF_PROTO(call, PARAMS(proto)); \
729static char print_fmt_##call[] = print; \
730static struct trace_event_class __used __refdata event_class_##call = { \
731 .system = TRACE_SYSTEM_STRING, \
732 .define_fields = trace_event_define_fields_##call, \
733 .fields = LIST_HEAD_INIT(event_class_##call.fields),\
734 .raw_init = trace_event_raw_init, \
735 .probe = trace_event_raw_event_##call, \
736 .reg = trace_event_reg, \
737 _TRACE_PERF_INIT(call) \
738};
739
740#undef DEFINE_EVENT
741#define DEFINE_EVENT(template, call, proto, args) \
742 \
743static struct trace_event_call __used event_##call = { \
744 .class = &event_class_##template, \
745 { \
746 .tp = &__tracepoint_##call, \
747 }, \
748 .event.funcs = &trace_event_type_funcs_##template, \
749 .print_fmt = print_fmt_##template, \
750 .flags = TRACE_EVENT_FL_TRACEPOINT, \
751}; \
752static struct trace_event_call __used \
753__attribute__((section("_ftrace_events"))) *__event_##call = &event_##call
754
755#undef DEFINE_EVENT_PRINT
756#define DEFINE_EVENT_PRINT(template, call, proto, args, print) \
757 \
758static char print_fmt_##call[] = print; \
759 \
760static struct trace_event_call __used event_##call = { \
761 .class = &event_class_##template, \
762 { \
763 .tp = &__tracepoint_##call, \
764 }, \
765 .event.funcs = &trace_event_type_funcs_##call, \
766 .print_fmt = print_fmt_##call, \
767 .flags = TRACE_EVENT_FL_TRACEPOINT, \
768}; \
769static struct trace_event_call __used \
770__attribute__((section("_ftrace_events"))) *__event_##call = &event_##call
771
772#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
773