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