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