1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 22167ae72SSteven Rostedt (Red Hat) /* 32167ae72SSteven Rostedt (Red Hat) * Stage 1 of the trace events. 42167ae72SSteven Rostedt (Red Hat) * 5eba12ab7SHou Pengyang * Override the macros in the event tracepoint header <trace/events/XXX.h> 6eba12ab7SHou Pengyang * to include the following: 72167ae72SSteven Rostedt (Red Hat) * 8a7237765SSteven Rostedt (Red Hat) * struct trace_event_raw_<call> { 92167ae72SSteven Rostedt (Red Hat) * struct trace_entry ent; 102167ae72SSteven Rostedt (Red Hat) * <type> <item>; 112167ae72SSteven Rostedt (Red Hat) * <type2> <item2>[<len>]; 122167ae72SSteven Rostedt (Red Hat) * [...] 132167ae72SSteven Rostedt (Red Hat) * }; 142167ae72SSteven Rostedt (Red Hat) * 152167ae72SSteven Rostedt (Red Hat) * The <type> <item> is created by the __field(type, item) macro or 162167ae72SSteven Rostedt (Red Hat) * the __array(type2, item2, len) macro. 172167ae72SSteven Rostedt (Red Hat) * We simply do "type item;", and that will create the fields 182167ae72SSteven Rostedt (Red Hat) * in the structure. 192167ae72SSteven Rostedt (Red Hat) */ 202167ae72SSteven Rostedt (Red Hat) 21af658dcaSSteven Rostedt (Red Hat) #include <linux/trace_events.h> 222167ae72SSteven Rostedt (Red Hat) 232167ae72SSteven Rostedt (Red Hat) #ifndef TRACE_SYSTEM_VAR 242167ae72SSteven Rostedt (Red Hat) #define TRACE_SYSTEM_VAR TRACE_SYSTEM 252167ae72SSteven Rostedt (Red Hat) #endif 262167ae72SSteven Rostedt (Red Hat) 27af6b9668SSteven Rostedt (Google) #include "stages/init.h" 284f0dfd76SJeremy Linton 292167ae72SSteven Rostedt (Red Hat) /* 302167ae72SSteven Rostedt (Red Hat) * DECLARE_EVENT_CLASS can be used to add a generic function 312167ae72SSteven Rostedt (Red Hat) * handlers for events. That is, if all events have the same 322167ae72SSteven Rostedt (Red Hat) * parameters and just have distinct trace points. 332167ae72SSteven Rostedt (Red Hat) * Each tracepoint can be defined with DEFINE_EVENT and that 342167ae72SSteven Rostedt (Red Hat) * will map the DECLARE_EVENT_CLASS to the tracepoint. 352167ae72SSteven Rostedt (Red Hat) * 362167ae72SSteven Rostedt (Red Hat) * TRACE_EVENT is a one to one mapping between tracepoint and template. 372167ae72SSteven Rostedt (Red Hat) */ 382167ae72SSteven Rostedt (Red Hat) #undef TRACE_EVENT 392167ae72SSteven Rostedt (Red Hat) #define TRACE_EVENT(name, proto, args, tstruct, assign, print) \ 402167ae72SSteven Rostedt (Red Hat) DECLARE_EVENT_CLASS(name, \ 412167ae72SSteven Rostedt (Red Hat) PARAMS(proto), \ 422167ae72SSteven Rostedt (Red Hat) PARAMS(args), \ 432167ae72SSteven Rostedt (Red Hat) PARAMS(tstruct), \ 442167ae72SSteven Rostedt (Red Hat) PARAMS(assign), \ 452167ae72SSteven Rostedt (Red Hat) PARAMS(print)); \ 462167ae72SSteven Rostedt (Red Hat) DEFINE_EVENT(name, name, PARAMS(proto), PARAMS(args)); 472167ae72SSteven Rostedt (Red Hat) 4884055411SSteven Rostedt (Google) #include "stages/stage1_struct_define.h" 492167ae72SSteven Rostedt (Red Hat) 502167ae72SSteven Rostedt (Red Hat) #undef DECLARE_EVENT_CLASS 512167ae72SSteven Rostedt (Red Hat) #define DECLARE_EVENT_CLASS(name, proto, args, tstruct, assign, print) \ 52a7237765SSteven Rostedt (Red Hat) struct trace_event_raw_##name { \ 532167ae72SSteven Rostedt (Red Hat) struct trace_entry ent; \ 542167ae72SSteven Rostedt (Red Hat) tstruct \ 55c6d777acSKees Cook char __data[]; \ 562167ae72SSteven Rostedt (Red Hat) }; \ 572167ae72SSteven Rostedt (Red Hat) \ 582425bcb9SSteven Rostedt (Red Hat) static struct trace_event_class event_class_##name; 592167ae72SSteven Rostedt (Red Hat) 602167ae72SSteven Rostedt (Red Hat) #undef DEFINE_EVENT 612167ae72SSteven Rostedt (Red Hat) #define DEFINE_EVENT(template, name, proto, args) \ 622425bcb9SSteven Rostedt (Red Hat) static struct trace_event_call __used \ 632167ae72SSteven Rostedt (Red Hat) __attribute__((__aligned__(4))) event_##name 642167ae72SSteven Rostedt (Red Hat) 652167ae72SSteven Rostedt (Red Hat) #undef DEFINE_EVENT_FN 662167ae72SSteven Rostedt (Red Hat) #define DEFINE_EVENT_FN(template, name, proto, args, reg, unreg) \ 672167ae72SSteven Rostedt (Red Hat) DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) 682167ae72SSteven Rostedt (Red Hat) 692167ae72SSteven Rostedt (Red Hat) #undef DEFINE_EVENT_PRINT 702167ae72SSteven Rostedt (Red Hat) #define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ 712167ae72SSteven Rostedt (Red Hat) DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) 722167ae72SSteven Rostedt (Red Hat) 732167ae72SSteven Rostedt (Red Hat) /* Callbacks are meaningless to ftrace. */ 742167ae72SSteven Rostedt (Red Hat) #undef TRACE_EVENT_FN 752167ae72SSteven Rostedt (Red Hat) #define TRACE_EVENT_FN(name, proto, args, tstruct, \ 762167ae72SSteven Rostedt (Red Hat) assign, print, reg, unreg) \ 772167ae72SSteven Rostedt (Red Hat) TRACE_EVENT(name, PARAMS(proto), PARAMS(args), \ 782167ae72SSteven Rostedt (Red Hat) PARAMS(tstruct), PARAMS(assign), PARAMS(print)) \ 792167ae72SSteven Rostedt (Red Hat) 802701121bSDenis Kirjanov #undef TRACE_EVENT_FN_COND 812701121bSDenis Kirjanov #define TRACE_EVENT_FN_COND(name, proto, args, cond, tstruct, \ 822701121bSDenis Kirjanov assign, print, reg, unreg) \ 832701121bSDenis Kirjanov TRACE_EVENT_CONDITION(name, PARAMS(proto), PARAMS(args), PARAMS(cond), \ 842701121bSDenis Kirjanov PARAMS(tstruct), PARAMS(assign), PARAMS(print)) \ 852701121bSDenis Kirjanov 862167ae72SSteven Rostedt (Red Hat) #undef TRACE_EVENT_FLAGS 872167ae72SSteven Rostedt (Red Hat) #define TRACE_EVENT_FLAGS(name, value) \ 882167ae72SSteven Rostedt (Red Hat) __TRACE_EVENT_FLAGS(name, value) 892167ae72SSteven Rostedt (Red Hat) 902167ae72SSteven Rostedt (Red Hat) #undef TRACE_EVENT_PERF_PERM 912167ae72SSteven Rostedt (Red Hat) #define TRACE_EVENT_PERF_PERM(name, expr...) \ 922167ae72SSteven Rostedt (Red Hat) __TRACE_EVENT_PERF_PERM(name, expr) 932167ae72SSteven Rostedt (Red Hat) 942167ae72SSteven Rostedt (Red Hat) #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 952167ae72SSteven Rostedt (Red Hat) 962167ae72SSteven Rostedt (Red Hat) /* 972167ae72SSteven Rostedt (Red Hat) * Stage 2 of the trace events. 982167ae72SSteven Rostedt (Red Hat) * 992167ae72SSteven Rostedt (Red Hat) * Include the following: 1002167ae72SSteven Rostedt (Red Hat) * 10162323a14SSteven Rostedt (Red Hat) * struct trace_event_data_offsets_<call> { 1022167ae72SSteven Rostedt (Red Hat) * u32 <item1>; 1032167ae72SSteven Rostedt (Red Hat) * u32 <item2>; 1042167ae72SSteven Rostedt (Red Hat) * [...] 1052167ae72SSteven Rostedt (Red Hat) * }; 1062167ae72SSteven Rostedt (Red Hat) * 1072167ae72SSteven Rostedt (Red Hat) * The __dynamic_array() macro will create each u32 <item>, this is 1082167ae72SSteven Rostedt (Red Hat) * to keep the offset of each array from the beginning of the event. 1092167ae72SSteven Rostedt (Red Hat) * The size of an array is also encoded, in the higher 16 bits of <item>. 1102167ae72SSteven Rostedt (Red Hat) */ 1112167ae72SSteven Rostedt (Red Hat) 11284055411SSteven Rostedt (Google) #include "stages/stage2_data_offsets.h" 1132167ae72SSteven Rostedt (Red Hat) 1142167ae72SSteven Rostedt (Red Hat) #undef DECLARE_EVENT_CLASS 1152167ae72SSteven Rostedt (Red Hat) #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 11662323a14SSteven Rostedt (Red Hat) struct trace_event_data_offsets_##call { \ 1172167ae72SSteven Rostedt (Red Hat) tstruct; \ 1182167ae72SSteven Rostedt (Red Hat) }; 1192167ae72SSteven Rostedt (Red Hat) 1202167ae72SSteven Rostedt (Red Hat) #undef DEFINE_EVENT 1212167ae72SSteven Rostedt (Red Hat) #define DEFINE_EVENT(template, name, proto, args) 1222167ae72SSteven Rostedt (Red Hat) 1232167ae72SSteven Rostedt (Red Hat) #undef DEFINE_EVENT_PRINT 12461df16fcSWei Yang #define DEFINE_EVENT_PRINT(template, name, proto, args, print) 1252167ae72SSteven Rostedt (Red Hat) 1262167ae72SSteven Rostedt (Red Hat) #undef TRACE_EVENT_FLAGS 1272167ae72SSteven Rostedt (Red Hat) #define TRACE_EVENT_FLAGS(event, flag) 1282167ae72SSteven Rostedt (Red Hat) 1292167ae72SSteven Rostedt (Red Hat) #undef TRACE_EVENT_PERF_PERM 1302167ae72SSteven Rostedt (Red Hat) #define TRACE_EVENT_PERF_PERM(event, expr...) 1312167ae72SSteven Rostedt (Red Hat) 1322167ae72SSteven Rostedt (Red Hat) #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 1332167ae72SSteven Rostedt (Red Hat) 1342167ae72SSteven Rostedt (Red Hat) /* 1352167ae72SSteven Rostedt (Red Hat) * Stage 3 of the trace events. 1362167ae72SSteven Rostedt (Red Hat) * 137eba12ab7SHou Pengyang * Override the macros in the event tracepoint header <trace/events/XXX.h> 138eba12ab7SHou Pengyang * to include the following: 1392167ae72SSteven Rostedt (Red Hat) * 1402167ae72SSteven Rostedt (Red Hat) * enum print_line_t 141892c505aSSteven Rostedt (Red Hat) * trace_raw_output_<call>(struct trace_iterator *iter, int flags) 1422167ae72SSteven Rostedt (Red Hat) * { 1432167ae72SSteven Rostedt (Red Hat) * struct trace_seq *s = &iter->seq; 144a7237765SSteven Rostedt (Red Hat) * struct trace_event_raw_<call> *field; <-- defined in stage 1 1452167ae72SSteven Rostedt (Red Hat) * struct trace_seq *p = &iter->tmp_seq; 1461600cbcfSMasami Hiramatsu * 1471600cbcfSMasami Hiramatsu * -------(for event)------- 1481600cbcfSMasami Hiramatsu * 1491600cbcfSMasami Hiramatsu * struct trace_entry *entry; 1502167ae72SSteven Rostedt (Red Hat) * 1512167ae72SSteven Rostedt (Red Hat) * entry = iter->ent; 1522167ae72SSteven Rostedt (Red Hat) * 1532167ae72SSteven Rostedt (Red Hat) * if (entry->type != event_<call>->event.type) { 1542167ae72SSteven Rostedt (Red Hat) * WARN_ON_ONCE(1); 1552167ae72SSteven Rostedt (Red Hat) * return TRACE_TYPE_UNHANDLED; 1562167ae72SSteven Rostedt (Red Hat) * } 1572167ae72SSteven Rostedt (Red Hat) * 1582167ae72SSteven Rostedt (Red Hat) * field = (typeof(field))entry; 1592167ae72SSteven Rostedt (Red Hat) * 1602167ae72SSteven Rostedt (Red Hat) * trace_seq_init(p); 1611600cbcfSMasami Hiramatsu * return trace_output_call(iter, <call>, <TP_printk> "\n"); 1622167ae72SSteven Rostedt (Red Hat) * 1631600cbcfSMasami Hiramatsu * ------(or, for event class)------ 1641600cbcfSMasami Hiramatsu * 1651600cbcfSMasami Hiramatsu * int ret; 1661600cbcfSMasami Hiramatsu * 1671600cbcfSMasami Hiramatsu * field = (typeof(field))iter->ent; 1681600cbcfSMasami Hiramatsu * 1691600cbcfSMasami Hiramatsu * ret = trace_raw_output_prep(iter, trace_event); 1701600cbcfSMasami Hiramatsu * if (ret != TRACE_TYPE_HANDLED) 1711600cbcfSMasami Hiramatsu * return ret; 1721600cbcfSMasami Hiramatsu * 1731600cbcfSMasami Hiramatsu * trace_event_printf(iter, <TP_printk> "\n"); 1741600cbcfSMasami Hiramatsu * 1751600cbcfSMasami Hiramatsu * return trace_handle_return(s); 1761600cbcfSMasami Hiramatsu * ------- 1772167ae72SSteven Rostedt (Red Hat) * } 1782167ae72SSteven Rostedt (Red Hat) * 1792167ae72SSteven Rostedt (Red Hat) * This is the method used to print the raw event to the trace 1802167ae72SSteven Rostedt (Red Hat) * output format. Note, this is not needed if the data is read 1812167ae72SSteven Rostedt (Red Hat) * in binary. 1822167ae72SSteven Rostedt (Red Hat) */ 1832167ae72SSteven Rostedt (Red Hat) 18484055411SSteven Rostedt (Google) #include "stages/stage3_trace_output.h" 18562de4f29SSteven Rostedt 1862167ae72SSteven Rostedt (Red Hat) #undef DECLARE_EVENT_CLASS 1872167ae72SSteven Rostedt (Red Hat) #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 1882167ae72SSteven Rostedt (Red Hat) static notrace enum print_line_t \ 189892c505aSSteven Rostedt (Red Hat) trace_raw_output_##call(struct trace_iterator *iter, int flags, \ 1902167ae72SSteven Rostedt (Red Hat) struct trace_event *trace_event) \ 1912167ae72SSteven Rostedt (Red Hat) { \ 1922167ae72SSteven Rostedt (Red Hat) struct trace_seq *s = &iter->seq; \ 1932167ae72SSteven Rostedt (Red Hat) struct trace_seq __maybe_unused *p = &iter->tmp_seq; \ 194a7237765SSteven Rostedt (Red Hat) struct trace_event_raw_##call *field; \ 1952167ae72SSteven Rostedt (Red Hat) int ret; \ 1962167ae72SSteven Rostedt (Red Hat) \ 1972167ae72SSteven Rostedt (Red Hat) field = (typeof(field))iter->ent; \ 1982167ae72SSteven Rostedt (Red Hat) \ 199892c505aSSteven Rostedt (Red Hat) ret = trace_raw_output_prep(iter, trace_event); \ 2002167ae72SSteven Rostedt (Red Hat) if (ret != TRACE_TYPE_HANDLED) \ 2012167ae72SSteven Rostedt (Red Hat) return ret; \ 2022167ae72SSteven Rostedt (Red Hat) \ 203efbbdaa2SMasami Hiramatsu trace_event_printf(iter, print); \ 2042167ae72SSteven Rostedt (Red Hat) \ 2052167ae72SSteven Rostedt (Red Hat) return trace_handle_return(s); \ 2062167ae72SSteven Rostedt (Red Hat) } \ 2073ad017baSSteven Rostedt (Red Hat) static struct trace_event_functions trace_event_type_funcs_##call = { \ 208892c505aSSteven Rostedt (Red Hat) .trace = trace_raw_output_##call, \ 2092167ae72SSteven Rostedt (Red Hat) }; 2102167ae72SSteven Rostedt (Red Hat) 2112167ae72SSteven Rostedt (Red Hat) #undef DEFINE_EVENT_PRINT 2122167ae72SSteven Rostedt (Red Hat) #define DEFINE_EVENT_PRINT(template, call, proto, args, print) \ 2132167ae72SSteven Rostedt (Red Hat) static notrace enum print_line_t \ 214892c505aSSteven Rostedt (Red Hat) trace_raw_output_##call(struct trace_iterator *iter, int flags, \ 2152167ae72SSteven Rostedt (Red Hat) struct trace_event *event) \ 2162167ae72SSteven Rostedt (Red Hat) { \ 217a7237765SSteven Rostedt (Red Hat) struct trace_event_raw_##template *field; \ 2182167ae72SSteven Rostedt (Red Hat) struct trace_entry *entry; \ 2192167ae72SSteven Rostedt (Red Hat) struct trace_seq *p = &iter->tmp_seq; \ 2202167ae72SSteven Rostedt (Red Hat) \ 2212167ae72SSteven Rostedt (Red Hat) entry = iter->ent; \ 2222167ae72SSteven Rostedt (Red Hat) \ 2232167ae72SSteven Rostedt (Red Hat) if (entry->type != event_##call.event.type) { \ 2242167ae72SSteven Rostedt (Red Hat) WARN_ON_ONCE(1); \ 2252167ae72SSteven Rostedt (Red Hat) return TRACE_TYPE_UNHANDLED; \ 2262167ae72SSteven Rostedt (Red Hat) } \ 2272167ae72SSteven Rostedt (Red Hat) \ 2282167ae72SSteven Rostedt (Red Hat) field = (typeof(field))entry; \ 2292167ae72SSteven Rostedt (Red Hat) \ 2302167ae72SSteven Rostedt (Red Hat) trace_seq_init(p); \ 231892c505aSSteven Rostedt (Red Hat) return trace_output_call(iter, #call, print); \ 2322167ae72SSteven Rostedt (Red Hat) } \ 2333ad017baSSteven Rostedt (Red Hat) static struct trace_event_functions trace_event_type_funcs_##call = { \ 234892c505aSSteven Rostedt (Red Hat) .trace = trace_raw_output_##call, \ 2352167ae72SSteven Rostedt (Red Hat) }; 2362167ae72SSteven Rostedt (Red Hat) 2372167ae72SSteven Rostedt (Red Hat) #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 2382167ae72SSteven Rostedt (Red Hat) 23984055411SSteven Rostedt (Google) #include "stages/stage4_event_fields.h" 24055de2c0bSMasami Hiramatsu 2412167ae72SSteven Rostedt (Red Hat) #undef DECLARE_EVENT_CLASS 2422167ae72SSteven Rostedt (Red Hat) #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, func, print) \ 24304ae87a5SPeter Zijlstra static struct trace_event_fields trace_event_fields_##call[] = { \ 24404ae87a5SPeter Zijlstra tstruct \ 24504ae87a5SPeter Zijlstra {} }; 2462167ae72SSteven Rostedt (Red Hat) 2472167ae72SSteven Rostedt (Red Hat) #undef DEFINE_EVENT_PRINT 24861df16fcSWei Yang #define DEFINE_EVENT_PRINT(template, name, proto, args, print) 2492167ae72SSteven Rostedt (Red Hat) 2502167ae72SSteven Rostedt (Red Hat) #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 2512167ae72SSteven Rostedt (Red Hat) 25284055411SSteven Rostedt (Google) #include "stages/stage5_get_offsets.h" 25355de2c0bSMasami Hiramatsu 2542167ae72SSteven Rostedt (Red Hat) #undef DECLARE_EVENT_CLASS 2552167ae72SSteven Rostedt (Red Hat) #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 256d0ee8f4aSSteven Rostedt (Red Hat) static inline notrace int trace_event_get_offsets_##call( \ 25762323a14SSteven Rostedt (Red Hat) struct trace_event_data_offsets_##call *__data_offsets, proto) \ 2582167ae72SSteven Rostedt (Red Hat) { \ 2592167ae72SSteven Rostedt (Red Hat) int __data_size = 0; \ 2602167ae72SSteven Rostedt (Red Hat) int __maybe_unused __item_length; \ 261a7237765SSteven Rostedt (Red Hat) struct trace_event_raw_##call __maybe_unused *entry; \ 2622167ae72SSteven Rostedt (Red Hat) \ 2632167ae72SSteven Rostedt (Red Hat) tstruct; \ 2642167ae72SSteven Rostedt (Red Hat) \ 2652167ae72SSteven Rostedt (Red Hat) return __data_size; \ 2662167ae72SSteven Rostedt (Red Hat) } 2672167ae72SSteven Rostedt (Red Hat) 2682167ae72SSteven Rostedt (Red Hat) #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 2692167ae72SSteven Rostedt (Red Hat) 27046ac5182SSteven Rostedt (Red Hat) /* 27146ac5182SSteven Rostedt (Red Hat) * Stage 4 of the trace events. 27246ac5182SSteven Rostedt (Red Hat) * 273eba12ab7SHou Pengyang * Override the macros in the event tracepoint header <trace/events/XXX.h> 274eba12ab7SHou Pengyang * to include the following: 27546ac5182SSteven Rostedt (Red Hat) * 27646ac5182SSteven Rostedt (Red Hat) * For those macros defined with TRACE_EVENT: 27746ac5182SSteven Rostedt (Red Hat) * 27846ac5182SSteven Rostedt (Red Hat) * static struct trace_event_call event_<call>; 27946ac5182SSteven Rostedt (Red Hat) * 28046ac5182SSteven Rostedt (Red Hat) * static void trace_event_raw_event_<call>(void *__data, proto) 28146ac5182SSteven Rostedt (Red Hat) * { 28246ac5182SSteven Rostedt (Red Hat) * struct trace_event_file *trace_file = __data; 28346ac5182SSteven Rostedt (Red Hat) * struct trace_event_call *event_call = trace_file->event_call; 28446ac5182SSteven Rostedt (Red Hat) * struct trace_event_data_offsets_<call> __maybe_unused __data_offsets; 28546ac5182SSteven Rostedt (Red Hat) * unsigned long eflags = trace_file->flags; 28646ac5182SSteven Rostedt (Red Hat) * enum event_trigger_type __tt = ETT_NONE; 28746ac5182SSteven Rostedt (Red Hat) * struct ring_buffer_event *event; 28846ac5182SSteven Rostedt (Red Hat) * struct trace_event_raw_<call> *entry; <-- defined in stage 1 28913292494SSteven Rostedt (VMware) * struct trace_buffer *buffer; 29046ac5182SSteven Rostedt (Red Hat) * unsigned long irq_flags; 29146ac5182SSteven Rostedt (Red Hat) * int __data_size; 29246ac5182SSteven Rostedt (Red Hat) * int pc; 29346ac5182SSteven Rostedt (Red Hat) * 29446ac5182SSteven Rostedt (Red Hat) * if (!(eflags & EVENT_FILE_FL_TRIGGER_COND)) { 29546ac5182SSteven Rostedt (Red Hat) * if (eflags & EVENT_FILE_FL_TRIGGER_MODE) 29646ac5182SSteven Rostedt (Red Hat) * event_triggers_call(trace_file, NULL); 29746ac5182SSteven Rostedt (Red Hat) * if (eflags & EVENT_FILE_FL_SOFT_DISABLED) 29846ac5182SSteven Rostedt (Red Hat) * return; 29946ac5182SSteven Rostedt (Red Hat) * } 30046ac5182SSteven Rostedt (Red Hat) * 30146ac5182SSteven Rostedt (Red Hat) * local_save_flags(irq_flags); 30246ac5182SSteven Rostedt (Red Hat) * pc = preempt_count(); 30346ac5182SSteven Rostedt (Red Hat) * 30446ac5182SSteven Rostedt (Red Hat) * __data_size = trace_event_get_offsets_<call>(&__data_offsets, args); 30546ac5182SSteven Rostedt (Red Hat) * 30646ac5182SSteven Rostedt (Red Hat) * event = trace_event_buffer_lock_reserve(&buffer, trace_file, 30746ac5182SSteven Rostedt (Red Hat) * event_<call>->event.type, 30846ac5182SSteven Rostedt (Red Hat) * sizeof(*entry) + __data_size, 30946ac5182SSteven Rostedt (Red Hat) * irq_flags, pc); 31046ac5182SSteven Rostedt (Red Hat) * if (!event) 31146ac5182SSteven Rostedt (Red Hat) * return; 31246ac5182SSteven Rostedt (Red Hat) * entry = ring_buffer_event_data(event); 31346ac5182SSteven Rostedt (Red Hat) * 31446ac5182SSteven Rostedt (Red Hat) * { <assign>; } <-- Here we assign the entries by the __field and 31546ac5182SSteven Rostedt (Red Hat) * __array macros. 31646ac5182SSteven Rostedt (Red Hat) * 31746ac5182SSteven Rostedt (Red Hat) * if (eflags & EVENT_FILE_FL_TRIGGER_COND) 31846ac5182SSteven Rostedt (Red Hat) * __tt = event_triggers_call(trace_file, entry); 31946ac5182SSteven Rostedt (Red Hat) * 32046ac5182SSteven Rostedt (Red Hat) * if (test_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, 32146ac5182SSteven Rostedt (Red Hat) * &trace_file->flags)) 32246ac5182SSteven Rostedt (Red Hat) * ring_buffer_discard_commit(buffer, event); 32346ac5182SSteven Rostedt (Red Hat) * else if (!filter_check_discard(trace_file, entry, buffer, event)) 32446ac5182SSteven Rostedt (Red Hat) * trace_buffer_unlock_commit(buffer, event, irq_flags, pc); 32546ac5182SSteven Rostedt (Red Hat) * 32646ac5182SSteven Rostedt (Red Hat) * if (__tt) 32746ac5182SSteven Rostedt (Red Hat) * event_triggers_post_call(trace_file, __tt); 32846ac5182SSteven Rostedt (Red Hat) * } 32946ac5182SSteven Rostedt (Red Hat) * 33046ac5182SSteven Rostedt (Red Hat) * static struct trace_event ftrace_event_type_<call> = { 33146ac5182SSteven Rostedt (Red Hat) * .trace = trace_raw_output_<call>, <-- stage 2 33246ac5182SSteven Rostedt (Red Hat) * }; 33346ac5182SSteven Rostedt (Red Hat) * 33446ac5182SSteven Rostedt (Red Hat) * static char print_fmt_<call>[] = <TP_printk>; 33546ac5182SSteven Rostedt (Red Hat) * 33646ac5182SSteven Rostedt (Red Hat) * static struct trace_event_class __used event_class_<template> = { 33746ac5182SSteven Rostedt (Red Hat) * .system = "<system>", 33804ae87a5SPeter Zijlstra * .fields_array = trace_event_fields_<call>, 33946ac5182SSteven Rostedt (Red Hat) * .fields = LIST_HEAD_INIT(event_class_##call.fields), 34046ac5182SSteven Rostedt (Red Hat) * .raw_init = trace_event_raw_init, 34146ac5182SSteven Rostedt (Red Hat) * .probe = trace_event_raw_event_##call, 34246ac5182SSteven Rostedt (Red Hat) * .reg = trace_event_reg, 34346ac5182SSteven Rostedt (Red Hat) * }; 34446ac5182SSteven Rostedt (Red Hat) * 34546ac5182SSteven Rostedt (Red Hat) * static struct trace_event_call event_<call> = { 34646ac5182SSteven Rostedt (Red Hat) * .class = event_class_<template>, 34746ac5182SSteven Rostedt (Red Hat) * { 34846ac5182SSteven Rostedt (Red Hat) * .tp = &__tracepoint_<call>, 34946ac5182SSteven Rostedt (Red Hat) * }, 35046ac5182SSteven Rostedt (Red Hat) * .event = &ftrace_event_type_<call>, 35146ac5182SSteven Rostedt (Red Hat) * .print_fmt = print_fmt_<call>, 35246ac5182SSteven Rostedt (Red Hat) * .flags = TRACE_EVENT_FL_TRACEPOINT, 35346ac5182SSteven Rostedt (Red Hat) * }; 35446ac5182SSteven Rostedt (Red Hat) * // its only safe to use pointers when doing linker tricks to 35546ac5182SSteven Rostedt (Red Hat) * // create an array. 35646ac5182SSteven Rostedt (Red Hat) * static struct trace_event_call __used 35733def849SJoe Perches * __section("_ftrace_events") *__event_<call> = &event_<call>; 35846ac5182SSteven Rostedt (Red Hat) * 35946ac5182SSteven Rostedt (Red Hat) */ 36046ac5182SSteven Rostedt (Red Hat) 36146ac5182SSteven Rostedt (Red Hat) #ifdef CONFIG_PERF_EVENTS 36246ac5182SSteven Rostedt (Red Hat) 36346ac5182SSteven Rostedt (Red Hat) #define _TRACE_PERF_PROTO(call, proto) \ 36446ac5182SSteven Rostedt (Red Hat) static notrace void \ 36546ac5182SSteven Rostedt (Red Hat) perf_trace_##call(void *__data, proto); 36646ac5182SSteven Rostedt (Red Hat) 36746ac5182SSteven Rostedt (Red Hat) #define _TRACE_PERF_INIT(call) \ 36846ac5182SSteven Rostedt (Red Hat) .perf_probe = perf_trace_##call, 36946ac5182SSteven Rostedt (Red Hat) 37046ac5182SSteven Rostedt (Red Hat) #else 37146ac5182SSteven Rostedt (Red Hat) #define _TRACE_PERF_PROTO(call, proto) 37246ac5182SSteven Rostedt (Red Hat) #define _TRACE_PERF_INIT(call) 37346ac5182SSteven Rostedt (Red Hat) #endif /* CONFIG_PERF_EVENTS */ 37446ac5182SSteven Rostedt (Red Hat) 37584055411SSteven Rostedt (Google) #include "stages/stage6_event_callback.h" 37646ac5182SSteven Rostedt (Red Hat) 37746ac5182SSteven Rostedt (Red Hat) #undef DECLARE_EVENT_CLASS 37846ac5182SSteven Rostedt (Red Hat) #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 37946ac5182SSteven Rostedt (Red Hat) \ 38046ac5182SSteven Rostedt (Red Hat) static notrace void \ 38146ac5182SSteven Rostedt (Red Hat) trace_event_raw_event_##call(void *__data, proto) \ 38246ac5182SSteven Rostedt (Red Hat) { \ 38346ac5182SSteven Rostedt (Red Hat) struct trace_event_file *trace_file = __data; \ 38446ac5182SSteven Rostedt (Red Hat) struct trace_event_data_offsets_##call __maybe_unused __data_offsets;\ 38546ac5182SSteven Rostedt (Red Hat) struct trace_event_buffer fbuffer; \ 38646ac5182SSteven Rostedt (Red Hat) struct trace_event_raw_##call *entry; \ 38746ac5182SSteven Rostedt (Red Hat) int __data_size; \ 38846ac5182SSteven Rostedt (Red Hat) \ 38946ac5182SSteven Rostedt (Red Hat) if (trace_trigger_soft_disabled(trace_file)) \ 39046ac5182SSteven Rostedt (Red Hat) return; \ 39146ac5182SSteven Rostedt (Red Hat) \ 39246ac5182SSteven Rostedt (Red Hat) __data_size = trace_event_get_offsets_##call(&__data_offsets, args); \ 39346ac5182SSteven Rostedt (Red Hat) \ 39446ac5182SSteven Rostedt (Red Hat) entry = trace_event_buffer_reserve(&fbuffer, trace_file, \ 39546ac5182SSteven Rostedt (Red Hat) sizeof(*entry) + __data_size); \ 39646ac5182SSteven Rostedt (Red Hat) \ 39746ac5182SSteven Rostedt (Red Hat) if (!entry) \ 39846ac5182SSteven Rostedt (Red Hat) return; \ 39946ac5182SSteven Rostedt (Red Hat) \ 40046ac5182SSteven Rostedt (Red Hat) tstruct \ 40146ac5182SSteven Rostedt (Red Hat) \ 40246ac5182SSteven Rostedt (Red Hat) { assign; } \ 40346ac5182SSteven Rostedt (Red Hat) \ 40446ac5182SSteven Rostedt (Red Hat) trace_event_buffer_commit(&fbuffer); \ 40546ac5182SSteven Rostedt (Red Hat) } 40646ac5182SSteven Rostedt (Red Hat) /* 40746ac5182SSteven Rostedt (Red Hat) * The ftrace_test_probe is compiled out, it is only here as a build time check 40846ac5182SSteven Rostedt (Red Hat) * to make sure that if the tracepoint handling changes, the ftrace probe will 40946ac5182SSteven Rostedt (Red Hat) * fail to compile unless it too is updated. 41046ac5182SSteven Rostedt (Red Hat) */ 41146ac5182SSteven Rostedt (Red Hat) 41246ac5182SSteven Rostedt (Red Hat) #undef DEFINE_EVENT 41346ac5182SSteven Rostedt (Red Hat) #define DEFINE_EVENT(template, call, proto, args) \ 41446ac5182SSteven Rostedt (Red Hat) static inline void ftrace_test_probe_##call(void) \ 41546ac5182SSteven Rostedt (Red Hat) { \ 41646ac5182SSteven Rostedt (Red Hat) check_trace_callback_type_##call(trace_event_raw_event_##template); \ 41746ac5182SSteven Rostedt (Red Hat) } 41846ac5182SSteven Rostedt (Red Hat) 41946ac5182SSteven Rostedt (Red Hat) #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 42046ac5182SSteven Rostedt (Red Hat) 42184055411SSteven Rostedt (Google) #include "stages/stage7_class_define.h" 42246ac5182SSteven Rostedt (Red Hat) 42346ac5182SSteven Rostedt (Red Hat) #undef DECLARE_EVENT_CLASS 42446ac5182SSteven Rostedt (Red Hat) #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 42546ac5182SSteven Rostedt (Red Hat) _TRACE_PERF_PROTO(call, PARAMS(proto)); \ 42646ac5182SSteven Rostedt (Red Hat) static char print_fmt_##call[] = print; \ 42746ac5182SSteven Rostedt (Red Hat) static struct trace_event_class __used __refdata event_class_##call = { \ 42846ac5182SSteven Rostedt (Red Hat) .system = TRACE_SYSTEM_STRING, \ 42904ae87a5SPeter Zijlstra .fields_array = trace_event_fields_##call, \ 43046ac5182SSteven Rostedt (Red Hat) .fields = LIST_HEAD_INIT(event_class_##call.fields),\ 43146ac5182SSteven Rostedt (Red Hat) .raw_init = trace_event_raw_init, \ 43246ac5182SSteven Rostedt (Red Hat) .probe = trace_event_raw_event_##call, \ 43346ac5182SSteven Rostedt (Red Hat) .reg = trace_event_reg, \ 43446ac5182SSteven Rostedt (Red Hat) _TRACE_PERF_INIT(call) \ 43546ac5182SSteven Rostedt (Red Hat) }; 43646ac5182SSteven Rostedt (Red Hat) 43746ac5182SSteven Rostedt (Red Hat) #undef DEFINE_EVENT 43846ac5182SSteven Rostedt (Red Hat) #define DEFINE_EVENT(template, call, proto, args) \ 43946ac5182SSteven Rostedt (Red Hat) \ 44046ac5182SSteven Rostedt (Red Hat) static struct trace_event_call __used event_##call = { \ 44146ac5182SSteven Rostedt (Red Hat) .class = &event_class_##template, \ 44246ac5182SSteven Rostedt (Red Hat) { \ 44346ac5182SSteven Rostedt (Red Hat) .tp = &__tracepoint_##call, \ 44446ac5182SSteven Rostedt (Red Hat) }, \ 44546ac5182SSteven Rostedt (Red Hat) .event.funcs = &trace_event_type_funcs_##template, \ 44646ac5182SSteven Rostedt (Red Hat) .print_fmt = print_fmt_##template, \ 44746ac5182SSteven Rostedt (Red Hat) .flags = TRACE_EVENT_FL_TRACEPOINT, \ 44846ac5182SSteven Rostedt (Red Hat) }; \ 44946ac5182SSteven Rostedt (Red Hat) static struct trace_event_call __used \ 45033def849SJoe Perches __section("_ftrace_events") *__event_##call = &event_##call 45146ac5182SSteven Rostedt (Red Hat) 45246ac5182SSteven Rostedt (Red Hat) #undef DEFINE_EVENT_PRINT 45346ac5182SSteven Rostedt (Red Hat) #define DEFINE_EVENT_PRINT(template, call, proto, args, print) \ 45446ac5182SSteven Rostedt (Red Hat) \ 45546ac5182SSteven Rostedt (Red Hat) static char print_fmt_##call[] = print; \ 45646ac5182SSteven Rostedt (Red Hat) \ 45746ac5182SSteven Rostedt (Red Hat) static struct trace_event_call __used event_##call = { \ 45846ac5182SSteven Rostedt (Red Hat) .class = &event_class_##template, \ 45946ac5182SSteven Rostedt (Red Hat) { \ 46046ac5182SSteven Rostedt (Red Hat) .tp = &__tracepoint_##call, \ 46146ac5182SSteven Rostedt (Red Hat) }, \ 46246ac5182SSteven Rostedt (Red Hat) .event.funcs = &trace_event_type_funcs_##call, \ 46346ac5182SSteven Rostedt (Red Hat) .print_fmt = print_fmt_##call, \ 46446ac5182SSteven Rostedt (Red Hat) .flags = TRACE_EVENT_FL_TRACEPOINT, \ 46546ac5182SSteven Rostedt (Red Hat) }; \ 46646ac5182SSteven Rostedt (Red Hat) static struct trace_event_call __used \ 46733def849SJoe Perches __section("_ftrace_events") *__event_##call = &event_##call 46846ac5182SSteven Rostedt (Red Hat) 46946ac5182SSteven Rostedt (Red Hat) #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 470