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) * 52167ae72SSteven Rostedt (Red Hat) * Override the macros in <trace/trace_events.h> to include the following: 62167ae72SSteven Rostedt (Red Hat) * 7a7237765SSteven Rostedt (Red Hat) * struct trace_event_raw_<call> { 82167ae72SSteven Rostedt (Red Hat) * struct trace_entry ent; 92167ae72SSteven Rostedt (Red Hat) * <type> <item>; 102167ae72SSteven Rostedt (Red Hat) * <type2> <item2>[<len>]; 112167ae72SSteven Rostedt (Red Hat) * [...] 122167ae72SSteven Rostedt (Red Hat) * }; 132167ae72SSteven Rostedt (Red Hat) * 142167ae72SSteven Rostedt (Red Hat) * The <type> <item> is created by the __field(type, item) macro or 152167ae72SSteven Rostedt (Red Hat) * the __array(type2, item2, len) macro. 162167ae72SSteven Rostedt (Red Hat) * We simply do "type item;", and that will create the fields 172167ae72SSteven Rostedt (Red Hat) * in the structure. 182167ae72SSteven Rostedt (Red Hat) */ 192167ae72SSteven Rostedt (Red Hat) 20af658dcaSSteven Rostedt (Red Hat) #include <linux/trace_events.h> 212167ae72SSteven Rostedt (Red Hat) 222167ae72SSteven Rostedt (Red Hat) #ifndef TRACE_SYSTEM_VAR 232167ae72SSteven Rostedt (Red Hat) #define TRACE_SYSTEM_VAR TRACE_SYSTEM 242167ae72SSteven Rostedt (Red Hat) #endif 252167ae72SSteven Rostedt (Red Hat) 262167ae72SSteven Rostedt (Red Hat) #define __app__(x, y) str__##x##y 272167ae72SSteven Rostedt (Red Hat) #define __app(x, y) __app__(x, y) 282167ae72SSteven Rostedt (Red Hat) 292167ae72SSteven Rostedt (Red Hat) #define TRACE_SYSTEM_STRING __app(TRACE_SYSTEM_VAR,__trace_system_name) 302167ae72SSteven Rostedt (Red Hat) 312167ae72SSteven Rostedt (Red Hat) #define TRACE_MAKE_SYSTEM_STR() \ 322167ae72SSteven Rostedt (Red Hat) static const char TRACE_SYSTEM_STRING[] = \ 332167ae72SSteven Rostedt (Red Hat) __stringify(TRACE_SYSTEM) 342167ae72SSteven Rostedt (Red Hat) 352167ae72SSteven Rostedt (Red Hat) TRACE_MAKE_SYSTEM_STR(); 362167ae72SSteven Rostedt (Red Hat) 372167ae72SSteven Rostedt (Red Hat) #undef TRACE_DEFINE_ENUM 382167ae72SSteven Rostedt (Red Hat) #define TRACE_DEFINE_ENUM(a) \ 3900f4b652SJeremy Linton static struct trace_eval_map __used __initdata \ 402167ae72SSteven Rostedt (Red Hat) __##TRACE_SYSTEM##_##a = \ 412167ae72SSteven Rostedt (Red Hat) { \ 422167ae72SSteven Rostedt (Red Hat) .system = TRACE_SYSTEM_STRING, \ 4300f4b652SJeremy Linton .eval_string = #a, \ 4400f4b652SJeremy Linton .eval_value = a \ 452167ae72SSteven Rostedt (Red Hat) }; \ 4600f4b652SJeremy Linton static struct trace_eval_map __used \ 4702fd7f68SJeremy Linton __attribute__((section("_ftrace_eval_map"))) \ 482167ae72SSteven Rostedt (Red Hat) *TRACE_SYSTEM##_##a = &__##TRACE_SYSTEM##_##a 492167ae72SSteven Rostedt (Red Hat) 504f0dfd76SJeremy Linton #undef TRACE_DEFINE_SIZEOF 514f0dfd76SJeremy Linton #define TRACE_DEFINE_SIZEOF(a) \ 524f0dfd76SJeremy Linton static struct trace_eval_map __used __initdata \ 534f0dfd76SJeremy Linton __##TRACE_SYSTEM##_##a = \ 544f0dfd76SJeremy Linton { \ 554f0dfd76SJeremy Linton .system = TRACE_SYSTEM_STRING, \ 564f0dfd76SJeremy Linton .eval_string = "sizeof(" #a ")", \ 574f0dfd76SJeremy Linton .eval_value = sizeof(a) \ 584f0dfd76SJeremy Linton }; \ 594f0dfd76SJeremy Linton static struct trace_eval_map __used \ 604f0dfd76SJeremy Linton __attribute__((section("_ftrace_eval_map"))) \ 614f0dfd76SJeremy Linton *TRACE_SYSTEM##_##a = &__##TRACE_SYSTEM##_##a 624f0dfd76SJeremy Linton 632167ae72SSteven Rostedt (Red Hat) /* 642167ae72SSteven Rostedt (Red Hat) * DECLARE_EVENT_CLASS can be used to add a generic function 652167ae72SSteven Rostedt (Red Hat) * handlers for events. That is, if all events have the same 662167ae72SSteven Rostedt (Red Hat) * parameters and just have distinct trace points. 672167ae72SSteven Rostedt (Red Hat) * Each tracepoint can be defined with DEFINE_EVENT and that 682167ae72SSteven Rostedt (Red Hat) * will map the DECLARE_EVENT_CLASS to the tracepoint. 692167ae72SSteven Rostedt (Red Hat) * 702167ae72SSteven Rostedt (Red Hat) * TRACE_EVENT is a one to one mapping between tracepoint and template. 712167ae72SSteven Rostedt (Red Hat) */ 722167ae72SSteven Rostedt (Red Hat) #undef TRACE_EVENT 732167ae72SSteven Rostedt (Red Hat) #define TRACE_EVENT(name, proto, args, tstruct, assign, print) \ 742167ae72SSteven Rostedt (Red Hat) DECLARE_EVENT_CLASS(name, \ 752167ae72SSteven Rostedt (Red Hat) PARAMS(proto), \ 762167ae72SSteven Rostedt (Red Hat) PARAMS(args), \ 772167ae72SSteven Rostedt (Red Hat) PARAMS(tstruct), \ 782167ae72SSteven Rostedt (Red Hat) PARAMS(assign), \ 792167ae72SSteven Rostedt (Red Hat) PARAMS(print)); \ 802167ae72SSteven Rostedt (Red Hat) DEFINE_EVENT(name, name, PARAMS(proto), PARAMS(args)); 812167ae72SSteven Rostedt (Red Hat) 822167ae72SSteven Rostedt (Red Hat) 832167ae72SSteven Rostedt (Red Hat) #undef __field 842167ae72SSteven Rostedt (Red Hat) #define __field(type, item) type item; 852167ae72SSteven Rostedt (Red Hat) 862167ae72SSteven Rostedt (Red Hat) #undef __field_ext 872167ae72SSteven Rostedt (Red Hat) #define __field_ext(type, item, filter_type) type item; 882167ae72SSteven Rostedt (Red Hat) 892167ae72SSteven Rostedt (Red Hat) #undef __field_struct 902167ae72SSteven Rostedt (Red Hat) #define __field_struct(type, item) type item; 912167ae72SSteven Rostedt (Red Hat) 922167ae72SSteven Rostedt (Red Hat) #undef __field_struct_ext 932167ae72SSteven Rostedt (Red Hat) #define __field_struct_ext(type, item, filter_type) type item; 942167ae72SSteven Rostedt (Red Hat) 952167ae72SSteven Rostedt (Red Hat) #undef __array 962167ae72SSteven Rostedt (Red Hat) #define __array(type, item, len) type item[len]; 972167ae72SSteven Rostedt (Red Hat) 982167ae72SSteven Rostedt (Red Hat) #undef __dynamic_array 992167ae72SSteven Rostedt (Red Hat) #define __dynamic_array(type, item, len) u32 __data_loc_##item; 1002167ae72SSteven Rostedt (Red Hat) 1012167ae72SSteven Rostedt (Red Hat) #undef __string 1022167ae72SSteven Rostedt (Red Hat) #define __string(item, src) __dynamic_array(char, item, -1) 1032167ae72SSteven Rostedt (Red Hat) 1042167ae72SSteven Rostedt (Red Hat) #undef __bitmask 1052167ae72SSteven Rostedt (Red Hat) #define __bitmask(item, nr_bits) __dynamic_array(char, item, -1) 1062167ae72SSteven Rostedt (Red Hat) 1072167ae72SSteven Rostedt (Red Hat) #undef TP_STRUCT__entry 1082167ae72SSteven Rostedt (Red Hat) #define TP_STRUCT__entry(args...) args 1092167ae72SSteven Rostedt (Red Hat) 1102167ae72SSteven Rostedt (Red Hat) #undef DECLARE_EVENT_CLASS 1112167ae72SSteven Rostedt (Red Hat) #define DECLARE_EVENT_CLASS(name, proto, args, tstruct, assign, print) \ 112a7237765SSteven Rostedt (Red Hat) struct trace_event_raw_##name { \ 1132167ae72SSteven Rostedt (Red Hat) struct trace_entry ent; \ 1142167ae72SSteven Rostedt (Red Hat) tstruct \ 1152167ae72SSteven Rostedt (Red Hat) char __data[0]; \ 1162167ae72SSteven Rostedt (Red Hat) }; \ 1172167ae72SSteven Rostedt (Red Hat) \ 1182425bcb9SSteven Rostedt (Red Hat) static struct trace_event_class event_class_##name; 1192167ae72SSteven Rostedt (Red Hat) 1202167ae72SSteven Rostedt (Red Hat) #undef DEFINE_EVENT 1212167ae72SSteven Rostedt (Red Hat) #define DEFINE_EVENT(template, name, proto, args) \ 1222425bcb9SSteven Rostedt (Red Hat) static struct trace_event_call __used \ 1232167ae72SSteven Rostedt (Red Hat) __attribute__((__aligned__(4))) event_##name 1242167ae72SSteven Rostedt (Red Hat) 1252167ae72SSteven Rostedt (Red Hat) #undef DEFINE_EVENT_FN 1262167ae72SSteven Rostedt (Red Hat) #define DEFINE_EVENT_FN(template, name, proto, args, reg, unreg) \ 1272167ae72SSteven Rostedt (Red Hat) DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) 1282167ae72SSteven Rostedt (Red Hat) 1292167ae72SSteven Rostedt (Red Hat) #undef DEFINE_EVENT_PRINT 1302167ae72SSteven Rostedt (Red Hat) #define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ 1312167ae72SSteven Rostedt (Red Hat) DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) 1322167ae72SSteven Rostedt (Red Hat) 1332167ae72SSteven Rostedt (Red Hat) /* Callbacks are meaningless to ftrace. */ 1342167ae72SSteven Rostedt (Red Hat) #undef TRACE_EVENT_FN 1352167ae72SSteven Rostedt (Red Hat) #define TRACE_EVENT_FN(name, proto, args, tstruct, \ 1362167ae72SSteven Rostedt (Red Hat) assign, print, reg, unreg) \ 1372167ae72SSteven Rostedt (Red Hat) TRACE_EVENT(name, PARAMS(proto), PARAMS(args), \ 1382167ae72SSteven Rostedt (Red Hat) PARAMS(tstruct), PARAMS(assign), PARAMS(print)) \ 1392167ae72SSteven Rostedt (Red Hat) 1402701121bSDenis Kirjanov #undef TRACE_EVENT_FN_COND 1412701121bSDenis Kirjanov #define TRACE_EVENT_FN_COND(name, proto, args, cond, tstruct, \ 1422701121bSDenis Kirjanov assign, print, reg, unreg) \ 1432701121bSDenis Kirjanov TRACE_EVENT_CONDITION(name, PARAMS(proto), PARAMS(args), PARAMS(cond), \ 1442701121bSDenis Kirjanov PARAMS(tstruct), PARAMS(assign), PARAMS(print)) \ 1452701121bSDenis Kirjanov 1462167ae72SSteven Rostedt (Red Hat) #undef TRACE_EVENT_FLAGS 1472167ae72SSteven Rostedt (Red Hat) #define TRACE_EVENT_FLAGS(name, value) \ 1482167ae72SSteven Rostedt (Red Hat) __TRACE_EVENT_FLAGS(name, value) 1492167ae72SSteven Rostedt (Red Hat) 1502167ae72SSteven Rostedt (Red Hat) #undef TRACE_EVENT_PERF_PERM 1512167ae72SSteven Rostedt (Red Hat) #define TRACE_EVENT_PERF_PERM(name, expr...) \ 1522167ae72SSteven Rostedt (Red Hat) __TRACE_EVENT_PERF_PERM(name, expr) 1532167ae72SSteven Rostedt (Red Hat) 1542167ae72SSteven Rostedt (Red Hat) #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 1552167ae72SSteven Rostedt (Red Hat) 1562167ae72SSteven Rostedt (Red Hat) /* 1572167ae72SSteven Rostedt (Red Hat) * Stage 2 of the trace events. 1582167ae72SSteven Rostedt (Red Hat) * 1592167ae72SSteven Rostedt (Red Hat) * Include the following: 1602167ae72SSteven Rostedt (Red Hat) * 16162323a14SSteven Rostedt (Red Hat) * struct trace_event_data_offsets_<call> { 1622167ae72SSteven Rostedt (Red Hat) * u32 <item1>; 1632167ae72SSteven Rostedt (Red Hat) * u32 <item2>; 1642167ae72SSteven Rostedt (Red Hat) * [...] 1652167ae72SSteven Rostedt (Red Hat) * }; 1662167ae72SSteven Rostedt (Red Hat) * 1672167ae72SSteven Rostedt (Red Hat) * The __dynamic_array() macro will create each u32 <item>, this is 1682167ae72SSteven Rostedt (Red Hat) * to keep the offset of each array from the beginning of the event. 1692167ae72SSteven Rostedt (Red Hat) * The size of an array is also encoded, in the higher 16 bits of <item>. 1702167ae72SSteven Rostedt (Red Hat) */ 1712167ae72SSteven Rostedt (Red Hat) 1722167ae72SSteven Rostedt (Red Hat) #undef TRACE_DEFINE_ENUM 1732167ae72SSteven Rostedt (Red Hat) #define TRACE_DEFINE_ENUM(a) 1742167ae72SSteven Rostedt (Red Hat) 1754f0dfd76SJeremy Linton #undef TRACE_DEFINE_SIZEOF 1764f0dfd76SJeremy Linton #define TRACE_DEFINE_SIZEOF(a) 1774f0dfd76SJeremy Linton 1782167ae72SSteven Rostedt (Red Hat) #undef __field 1792167ae72SSteven Rostedt (Red Hat) #define __field(type, item) 1802167ae72SSteven Rostedt (Red Hat) 1812167ae72SSteven Rostedt (Red Hat) #undef __field_ext 1822167ae72SSteven Rostedt (Red Hat) #define __field_ext(type, item, filter_type) 1832167ae72SSteven Rostedt (Red Hat) 1842167ae72SSteven Rostedt (Red Hat) #undef __field_struct 1852167ae72SSteven Rostedt (Red Hat) #define __field_struct(type, item) 1862167ae72SSteven Rostedt (Red Hat) 1872167ae72SSteven Rostedt (Red Hat) #undef __field_struct_ext 1882167ae72SSteven Rostedt (Red Hat) #define __field_struct_ext(type, item, filter_type) 1892167ae72SSteven Rostedt (Red Hat) 1902167ae72SSteven Rostedt (Red Hat) #undef __array 1912167ae72SSteven Rostedt (Red Hat) #define __array(type, item, len) 1922167ae72SSteven Rostedt (Red Hat) 1932167ae72SSteven Rostedt (Red Hat) #undef __dynamic_array 1942167ae72SSteven Rostedt (Red Hat) #define __dynamic_array(type, item, len) u32 item; 1952167ae72SSteven Rostedt (Red Hat) 1962167ae72SSteven Rostedt (Red Hat) #undef __string 1972167ae72SSteven Rostedt (Red Hat) #define __string(item, src) __dynamic_array(char, item, -1) 1982167ae72SSteven Rostedt (Red Hat) 1992167ae72SSteven Rostedt (Red Hat) #undef __bitmask 2002167ae72SSteven Rostedt (Red Hat) #define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1) 2012167ae72SSteven Rostedt (Red Hat) 2022167ae72SSteven Rostedt (Red Hat) #undef DECLARE_EVENT_CLASS 2032167ae72SSteven Rostedt (Red Hat) #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 20462323a14SSteven Rostedt (Red Hat) struct trace_event_data_offsets_##call { \ 2052167ae72SSteven Rostedt (Red Hat) tstruct; \ 2062167ae72SSteven Rostedt (Red Hat) }; 2072167ae72SSteven Rostedt (Red Hat) 2082167ae72SSteven Rostedt (Red Hat) #undef DEFINE_EVENT 2092167ae72SSteven Rostedt (Red Hat) #define DEFINE_EVENT(template, name, proto, args) 2102167ae72SSteven Rostedt (Red Hat) 2112167ae72SSteven Rostedt (Red Hat) #undef DEFINE_EVENT_PRINT 2122167ae72SSteven Rostedt (Red Hat) #define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ 2132167ae72SSteven Rostedt (Red Hat) DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) 2142167ae72SSteven Rostedt (Red Hat) 2152167ae72SSteven Rostedt (Red Hat) #undef TRACE_EVENT_FLAGS 2162167ae72SSteven Rostedt (Red Hat) #define TRACE_EVENT_FLAGS(event, flag) 2172167ae72SSteven Rostedt (Red Hat) 2182167ae72SSteven Rostedt (Red Hat) #undef TRACE_EVENT_PERF_PERM 2192167ae72SSteven Rostedt (Red Hat) #define TRACE_EVENT_PERF_PERM(event, expr...) 2202167ae72SSteven Rostedt (Red Hat) 2212167ae72SSteven Rostedt (Red Hat) #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 2222167ae72SSteven Rostedt (Red Hat) 2232167ae72SSteven Rostedt (Red Hat) /* 2242167ae72SSteven Rostedt (Red Hat) * Stage 3 of the trace events. 2252167ae72SSteven Rostedt (Red Hat) * 2262167ae72SSteven Rostedt (Red Hat) * Override the macros in <trace/trace_events.h> to include the following: 2272167ae72SSteven Rostedt (Red Hat) * 2282167ae72SSteven Rostedt (Red Hat) * enum print_line_t 229892c505aSSteven Rostedt (Red Hat) * trace_raw_output_<call>(struct trace_iterator *iter, int flags) 2302167ae72SSteven Rostedt (Red Hat) * { 2312167ae72SSteven Rostedt (Red Hat) * struct trace_seq *s = &iter->seq; 232a7237765SSteven Rostedt (Red Hat) * struct trace_event_raw_<call> *field; <-- defined in stage 1 2332167ae72SSteven Rostedt (Red Hat) * struct trace_entry *entry; 2342167ae72SSteven Rostedt (Red Hat) * struct trace_seq *p = &iter->tmp_seq; 2352167ae72SSteven Rostedt (Red Hat) * int ret; 2362167ae72SSteven Rostedt (Red Hat) * 2372167ae72SSteven Rostedt (Red Hat) * entry = iter->ent; 2382167ae72SSteven Rostedt (Red Hat) * 2392167ae72SSteven Rostedt (Red Hat) * if (entry->type != event_<call>->event.type) { 2402167ae72SSteven Rostedt (Red Hat) * WARN_ON_ONCE(1); 2412167ae72SSteven Rostedt (Red Hat) * return TRACE_TYPE_UNHANDLED; 2422167ae72SSteven Rostedt (Red Hat) * } 2432167ae72SSteven Rostedt (Red Hat) * 2442167ae72SSteven Rostedt (Red Hat) * field = (typeof(field))entry; 2452167ae72SSteven Rostedt (Red Hat) * 2462167ae72SSteven Rostedt (Red Hat) * trace_seq_init(p); 2472167ae72SSteven Rostedt (Red Hat) * ret = trace_seq_printf(s, "%s: ", <call>); 2482167ae72SSteven Rostedt (Red Hat) * if (ret) 2492167ae72SSteven Rostedt (Red Hat) * ret = trace_seq_printf(s, <TP_printk> "\n"); 2502167ae72SSteven Rostedt (Red Hat) * if (!ret) 2512167ae72SSteven Rostedt (Red Hat) * return TRACE_TYPE_PARTIAL_LINE; 2522167ae72SSteven Rostedt (Red Hat) * 2532167ae72SSteven Rostedt (Red Hat) * return TRACE_TYPE_HANDLED; 2542167ae72SSteven Rostedt (Red Hat) * } 2552167ae72SSteven Rostedt (Red Hat) * 2562167ae72SSteven Rostedt (Red Hat) * This is the method used to print the raw event to the trace 2572167ae72SSteven Rostedt (Red Hat) * output format. Note, this is not needed if the data is read 2582167ae72SSteven Rostedt (Red Hat) * in binary. 2592167ae72SSteven Rostedt (Red Hat) */ 2602167ae72SSteven Rostedt (Red Hat) 2612167ae72SSteven Rostedt (Red Hat) #undef __entry 2622167ae72SSteven Rostedt (Red Hat) #define __entry field 2632167ae72SSteven Rostedt (Red Hat) 2642167ae72SSteven Rostedt (Red Hat) #undef TP_printk 2652167ae72SSteven Rostedt (Red Hat) #define TP_printk(fmt, args...) fmt "\n", args 2662167ae72SSteven Rostedt (Red Hat) 2672167ae72SSteven Rostedt (Red Hat) #undef __get_dynamic_array 2682167ae72SSteven Rostedt (Red Hat) #define __get_dynamic_array(field) \ 2692167ae72SSteven Rostedt (Red Hat) ((void *)__entry + (__entry->__data_loc_##field & 0xffff)) 2702167ae72SSteven Rostedt (Red Hat) 2712167ae72SSteven Rostedt (Red Hat) #undef __get_dynamic_array_len 2722167ae72SSteven Rostedt (Red Hat) #define __get_dynamic_array_len(field) \ 2732167ae72SSteven Rostedt (Red Hat) ((__entry->__data_loc_##field >> 16) & 0xffff) 2742167ae72SSteven Rostedt (Red Hat) 2752167ae72SSteven Rostedt (Red Hat) #undef __get_str 276934de5f2SDaniel Bristot de Oliveira #define __get_str(field) ((char *)__get_dynamic_array(field)) 2772167ae72SSteven Rostedt (Red Hat) 2782167ae72SSteven Rostedt (Red Hat) #undef __get_bitmask 2792167ae72SSteven Rostedt (Red Hat) #define __get_bitmask(field) \ 2802167ae72SSteven Rostedt (Red Hat) ({ \ 2812167ae72SSteven Rostedt (Red Hat) void *__bitmask = __get_dynamic_array(field); \ 2822167ae72SSteven Rostedt (Red Hat) unsigned int __bitmask_size; \ 2832167ae72SSteven Rostedt (Red Hat) __bitmask_size = __get_dynamic_array_len(field); \ 284645df987SSteven Rostedt (Red Hat) trace_print_bitmask_seq(p, __bitmask, __bitmask_size); \ 2852167ae72SSteven Rostedt (Red Hat) }) 2862167ae72SSteven Rostedt (Red Hat) 2872167ae72SSteven Rostedt (Red Hat) #undef __print_flags 2882167ae72SSteven Rostedt (Red Hat) #define __print_flags(flag, delim, flag_array...) \ 2892167ae72SSteven Rostedt (Red Hat) ({ \ 2902167ae72SSteven Rostedt (Red Hat) static const struct trace_print_flags __flags[] = \ 2912167ae72SSteven Rostedt (Red Hat) { flag_array, { -1, NULL }}; \ 292645df987SSteven Rostedt (Red Hat) trace_print_flags_seq(p, delim, flag, __flags); \ 2932167ae72SSteven Rostedt (Red Hat) }) 2942167ae72SSteven Rostedt (Red Hat) 2952167ae72SSteven Rostedt (Red Hat) #undef __print_symbolic 2962167ae72SSteven Rostedt (Red Hat) #define __print_symbolic(value, symbol_array...) \ 2972167ae72SSteven Rostedt (Red Hat) ({ \ 2982167ae72SSteven Rostedt (Red Hat) static const struct trace_print_flags symbols[] = \ 2992167ae72SSteven Rostedt (Red Hat) { symbol_array, { -1, NULL }}; \ 300645df987SSteven Rostedt (Red Hat) trace_print_symbols_seq(p, value, symbols); \ 3012167ae72SSteven Rostedt (Red Hat) }) 3022167ae72SSteven Rostedt (Red Hat) 303d3213e8fSRoss Zwisler #undef __print_flags_u64 3042167ae72SSteven Rostedt (Red Hat) #undef __print_symbolic_u64 3052167ae72SSteven Rostedt (Red Hat) #if BITS_PER_LONG == 32 306d3213e8fSRoss Zwisler #define __print_flags_u64(flag, delim, flag_array...) \ 307d3213e8fSRoss Zwisler ({ \ 308d3213e8fSRoss Zwisler static const struct trace_print_flags_u64 __flags[] = \ 309d3213e8fSRoss Zwisler { flag_array, { -1, NULL } }; \ 310d3213e8fSRoss Zwisler trace_print_flags_seq_u64(p, delim, flag, __flags); \ 311d3213e8fSRoss Zwisler }) 312d3213e8fSRoss Zwisler 3132167ae72SSteven Rostedt (Red Hat) #define __print_symbolic_u64(value, symbol_array...) \ 3142167ae72SSteven Rostedt (Red Hat) ({ \ 3152167ae72SSteven Rostedt (Red Hat) static const struct trace_print_flags_u64 symbols[] = \ 3162167ae72SSteven Rostedt (Red Hat) { symbol_array, { -1, NULL } }; \ 317645df987SSteven Rostedt (Red Hat) trace_print_symbols_seq_u64(p, value, symbols); \ 3182167ae72SSteven Rostedt (Red Hat) }) 3192167ae72SSteven Rostedt (Red Hat) #else 320d3213e8fSRoss Zwisler #define __print_flags_u64(flag, delim, flag_array...) \ 321d3213e8fSRoss Zwisler __print_flags(flag, delim, flag_array) 322d3213e8fSRoss Zwisler 3232167ae72SSteven Rostedt (Red Hat) #define __print_symbolic_u64(value, symbol_array...) \ 3242167ae72SSteven Rostedt (Red Hat) __print_symbolic(value, symbol_array) 3252167ae72SSteven Rostedt (Red Hat) #endif 3262167ae72SSteven Rostedt (Red Hat) 3272167ae72SSteven Rostedt (Red Hat) #undef __print_hex 3282acae0d5SDaniel Borkmann #define __print_hex(buf, buf_len) \ 3293898fac1SDaniel Borkmann trace_print_hex_seq(p, buf, buf_len, false) 3302acae0d5SDaniel Borkmann 3312acae0d5SDaniel Borkmann #undef __print_hex_str 3322acae0d5SDaniel Borkmann #define __print_hex_str(buf, buf_len) \ 3333898fac1SDaniel Borkmann trace_print_hex_seq(p, buf, buf_len, true) 3342167ae72SSteven Rostedt (Red Hat) 3352167ae72SSteven Rostedt (Red Hat) #undef __print_array 3362167ae72SSteven Rostedt (Red Hat) #define __print_array(array, count, el_size) \ 3372167ae72SSteven Rostedt (Red Hat) ({ \ 3382167ae72SSteven Rostedt (Red Hat) BUILD_BUG_ON(el_size != 1 && el_size != 2 && \ 3392167ae72SSteven Rostedt (Red Hat) el_size != 4 && el_size != 8); \ 340645df987SSteven Rostedt (Red Hat) trace_print_array_seq(p, array, count, el_size); \ 3412167ae72SSteven Rostedt (Red Hat) }) 3422167ae72SSteven Rostedt (Red Hat) 343ef56e047SPiotr Maziarz #undef __print_hex_dump 344ef56e047SPiotr Maziarz #define __print_hex_dump(prefix_str, prefix_type, \ 345ef56e047SPiotr Maziarz rowsize, groupsize, buf, len, ascii) \ 346ef56e047SPiotr Maziarz trace_print_hex_dump_seq(p, prefix_str, prefix_type, \ 347ef56e047SPiotr Maziarz rowsize, groupsize, buf, len, ascii) 348ef56e047SPiotr Maziarz 3492167ae72SSteven Rostedt (Red Hat) #undef DECLARE_EVENT_CLASS 3502167ae72SSteven Rostedt (Red Hat) #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 3512167ae72SSteven Rostedt (Red Hat) static notrace enum print_line_t \ 352892c505aSSteven Rostedt (Red Hat) trace_raw_output_##call(struct trace_iterator *iter, int flags, \ 3532167ae72SSteven Rostedt (Red Hat) struct trace_event *trace_event) \ 3542167ae72SSteven Rostedt (Red Hat) { \ 3552167ae72SSteven Rostedt (Red Hat) struct trace_seq *s = &iter->seq; \ 3562167ae72SSteven Rostedt (Red Hat) struct trace_seq __maybe_unused *p = &iter->tmp_seq; \ 357a7237765SSteven Rostedt (Red Hat) struct trace_event_raw_##call *field; \ 3582167ae72SSteven Rostedt (Red Hat) int ret; \ 3592167ae72SSteven Rostedt (Red Hat) \ 3602167ae72SSteven Rostedt (Red Hat) field = (typeof(field))iter->ent; \ 3612167ae72SSteven Rostedt (Red Hat) \ 362892c505aSSteven Rostedt (Red Hat) ret = trace_raw_output_prep(iter, trace_event); \ 3632167ae72SSteven Rostedt (Red Hat) if (ret != TRACE_TYPE_HANDLED) \ 3642167ae72SSteven Rostedt (Red Hat) return ret; \ 3652167ae72SSteven Rostedt (Red Hat) \ 3662167ae72SSteven Rostedt (Red Hat) trace_seq_printf(s, print); \ 3672167ae72SSteven Rostedt (Red Hat) \ 3682167ae72SSteven Rostedt (Red Hat) return trace_handle_return(s); \ 3692167ae72SSteven Rostedt (Red Hat) } \ 3703ad017baSSteven Rostedt (Red Hat) static struct trace_event_functions trace_event_type_funcs_##call = { \ 371892c505aSSteven Rostedt (Red Hat) .trace = trace_raw_output_##call, \ 3722167ae72SSteven Rostedt (Red Hat) }; 3732167ae72SSteven Rostedt (Red Hat) 3742167ae72SSteven Rostedt (Red Hat) #undef DEFINE_EVENT_PRINT 3752167ae72SSteven Rostedt (Red Hat) #define DEFINE_EVENT_PRINT(template, call, proto, args, print) \ 3762167ae72SSteven Rostedt (Red Hat) static notrace enum print_line_t \ 377892c505aSSteven Rostedt (Red Hat) trace_raw_output_##call(struct trace_iterator *iter, int flags, \ 3782167ae72SSteven Rostedt (Red Hat) struct trace_event *event) \ 3792167ae72SSteven Rostedt (Red Hat) { \ 380a7237765SSteven Rostedt (Red Hat) struct trace_event_raw_##template *field; \ 3812167ae72SSteven Rostedt (Red Hat) struct trace_entry *entry; \ 3822167ae72SSteven Rostedt (Red Hat) struct trace_seq *p = &iter->tmp_seq; \ 3832167ae72SSteven Rostedt (Red Hat) \ 3842167ae72SSteven Rostedt (Red Hat) entry = iter->ent; \ 3852167ae72SSteven Rostedt (Red Hat) \ 3862167ae72SSteven Rostedt (Red Hat) if (entry->type != event_##call.event.type) { \ 3872167ae72SSteven Rostedt (Red Hat) WARN_ON_ONCE(1); \ 3882167ae72SSteven Rostedt (Red Hat) return TRACE_TYPE_UNHANDLED; \ 3892167ae72SSteven Rostedt (Red Hat) } \ 3902167ae72SSteven Rostedt (Red Hat) \ 3912167ae72SSteven Rostedt (Red Hat) field = (typeof(field))entry; \ 3922167ae72SSteven Rostedt (Red Hat) \ 3932167ae72SSteven Rostedt (Red Hat) trace_seq_init(p); \ 394892c505aSSteven Rostedt (Red Hat) return trace_output_call(iter, #call, print); \ 3952167ae72SSteven Rostedt (Red Hat) } \ 3963ad017baSSteven Rostedt (Red Hat) static struct trace_event_functions trace_event_type_funcs_##call = { \ 397892c505aSSteven Rostedt (Red Hat) .trace = trace_raw_output_##call, \ 3982167ae72SSteven Rostedt (Red Hat) }; 3992167ae72SSteven Rostedt (Red Hat) 4002167ae72SSteven Rostedt (Red Hat) #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 4012167ae72SSteven Rostedt (Red Hat) 4022167ae72SSteven Rostedt (Red Hat) #undef __field_ext 4032167ae72SSteven Rostedt (Red Hat) #define __field_ext(type, item, filter_type) \ 4042167ae72SSteven Rostedt (Red Hat) ret = trace_define_field(event_call, #type, #item, \ 4052167ae72SSteven Rostedt (Red Hat) offsetof(typeof(field), item), \ 4062167ae72SSteven Rostedt (Red Hat) sizeof(field.item), \ 4072167ae72SSteven Rostedt (Red Hat) is_signed_type(type), filter_type); \ 4082167ae72SSteven Rostedt (Red Hat) if (ret) \ 4092167ae72SSteven Rostedt (Red Hat) return ret; 4102167ae72SSteven Rostedt (Red Hat) 4112167ae72SSteven Rostedt (Red Hat) #undef __field_struct_ext 4122167ae72SSteven Rostedt (Red Hat) #define __field_struct_ext(type, item, filter_type) \ 4132167ae72SSteven Rostedt (Red Hat) ret = trace_define_field(event_call, #type, #item, \ 4142167ae72SSteven Rostedt (Red Hat) offsetof(typeof(field), item), \ 4152167ae72SSteven Rostedt (Red Hat) sizeof(field.item), \ 4162167ae72SSteven Rostedt (Red Hat) 0, filter_type); \ 4172167ae72SSteven Rostedt (Red Hat) if (ret) \ 4182167ae72SSteven Rostedt (Red Hat) return ret; 4192167ae72SSteven Rostedt (Red Hat) 4202167ae72SSteven Rostedt (Red Hat) #undef __field 4212167ae72SSteven Rostedt (Red Hat) #define __field(type, item) __field_ext(type, item, FILTER_OTHER) 4222167ae72SSteven Rostedt (Red Hat) 4232167ae72SSteven Rostedt (Red Hat) #undef __field_struct 4242167ae72SSteven Rostedt (Red Hat) #define __field_struct(type, item) __field_struct_ext(type, item, FILTER_OTHER) 4252167ae72SSteven Rostedt (Red Hat) 4262167ae72SSteven Rostedt (Red Hat) #undef __array 4272167ae72SSteven Rostedt (Red Hat) #define __array(type, item, len) \ 4282167ae72SSteven Rostedt (Red Hat) do { \ 4292167ae72SSteven Rostedt (Red Hat) char *type_str = #type"["__stringify(len)"]"; \ 4302167ae72SSteven Rostedt (Red Hat) BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \ 4314a0772cfSSteven Rostedt (VMware) BUILD_BUG_ON(len <= 0); \ 4322167ae72SSteven Rostedt (Red Hat) ret = trace_define_field(event_call, type_str, #item, \ 4332167ae72SSteven Rostedt (Red Hat) offsetof(typeof(field), item), \ 4342167ae72SSteven Rostedt (Red Hat) sizeof(field.item), \ 4352167ae72SSteven Rostedt (Red Hat) is_signed_type(type), FILTER_OTHER); \ 4362167ae72SSteven Rostedt (Red Hat) if (ret) \ 4372167ae72SSteven Rostedt (Red Hat) return ret; \ 4382167ae72SSteven Rostedt (Red Hat) } while (0); 4392167ae72SSteven Rostedt (Red Hat) 4402167ae72SSteven Rostedt (Red Hat) #undef __dynamic_array 4412167ae72SSteven Rostedt (Red Hat) #define __dynamic_array(type, item, len) \ 4422167ae72SSteven Rostedt (Red Hat) ret = trace_define_field(event_call, "__data_loc " #type "[]", #item, \ 4432167ae72SSteven Rostedt (Red Hat) offsetof(typeof(field), __data_loc_##item), \ 4442167ae72SSteven Rostedt (Red Hat) sizeof(field.__data_loc_##item), \ 4452167ae72SSteven Rostedt (Red Hat) is_signed_type(type), FILTER_OTHER); 4462167ae72SSteven Rostedt (Red Hat) 4472167ae72SSteven Rostedt (Red Hat) #undef __string 4482167ae72SSteven Rostedt (Red Hat) #define __string(item, src) __dynamic_array(char, item, -1) 4492167ae72SSteven Rostedt (Red Hat) 4502167ae72SSteven Rostedt (Red Hat) #undef __bitmask 4512167ae72SSteven Rostedt (Red Hat) #define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1) 4522167ae72SSteven Rostedt (Red Hat) 4532167ae72SSteven Rostedt (Red Hat) #undef DECLARE_EVENT_CLASS 4542167ae72SSteven Rostedt (Red Hat) #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, func, print) \ 4552167ae72SSteven Rostedt (Red Hat) static int notrace __init \ 45633d0f35eSSteven Rostedt (Red Hat) trace_event_define_fields_##call(struct trace_event_call *event_call) \ 4572167ae72SSteven Rostedt (Red Hat) { \ 458a7237765SSteven Rostedt (Red Hat) struct trace_event_raw_##call field; \ 4592167ae72SSteven Rostedt (Red Hat) int ret; \ 4602167ae72SSteven Rostedt (Red Hat) \ 4612167ae72SSteven Rostedt (Red Hat) tstruct; \ 4622167ae72SSteven Rostedt (Red Hat) \ 4632167ae72SSteven Rostedt (Red Hat) return ret; \ 4642167ae72SSteven Rostedt (Red Hat) } 4652167ae72SSteven Rostedt (Red Hat) 4662167ae72SSteven Rostedt (Red Hat) #undef DEFINE_EVENT 4672167ae72SSteven Rostedt (Red Hat) #define DEFINE_EVENT(template, name, proto, args) 4682167ae72SSteven Rostedt (Red Hat) 4692167ae72SSteven Rostedt (Red Hat) #undef DEFINE_EVENT_PRINT 4702167ae72SSteven Rostedt (Red Hat) #define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ 4712167ae72SSteven Rostedt (Red Hat) DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) 4722167ae72SSteven Rostedt (Red Hat) 4732167ae72SSteven Rostedt (Red Hat) #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 4742167ae72SSteven Rostedt (Red Hat) 4752167ae72SSteven Rostedt (Red Hat) /* 4762167ae72SSteven Rostedt (Red Hat) * remember the offset of each array from the beginning of the event. 4772167ae72SSteven Rostedt (Red Hat) */ 4782167ae72SSteven Rostedt (Red Hat) 4792167ae72SSteven Rostedt (Red Hat) #undef __entry 4802167ae72SSteven Rostedt (Red Hat) #define __entry entry 4812167ae72SSteven Rostedt (Red Hat) 4822167ae72SSteven Rostedt (Red Hat) #undef __field 4832167ae72SSteven Rostedt (Red Hat) #define __field(type, item) 4842167ae72SSteven Rostedt (Red Hat) 4852167ae72SSteven Rostedt (Red Hat) #undef __field_ext 4862167ae72SSteven Rostedt (Red Hat) #define __field_ext(type, item, filter_type) 4872167ae72SSteven Rostedt (Red Hat) 4882167ae72SSteven Rostedt (Red Hat) #undef __field_struct 4892167ae72SSteven Rostedt (Red Hat) #define __field_struct(type, item) 4902167ae72SSteven Rostedt (Red Hat) 4912167ae72SSteven Rostedt (Red Hat) #undef __field_struct_ext 4922167ae72SSteven Rostedt (Red Hat) #define __field_struct_ext(type, item, filter_type) 4932167ae72SSteven Rostedt (Red Hat) 4942167ae72SSteven Rostedt (Red Hat) #undef __array 4952167ae72SSteven Rostedt (Red Hat) #define __array(type, item, len) 4962167ae72SSteven Rostedt (Red Hat) 4972167ae72SSteven Rostedt (Red Hat) #undef __dynamic_array 4982167ae72SSteven Rostedt (Red Hat) #define __dynamic_array(type, item, len) \ 4992167ae72SSteven Rostedt (Red Hat) __item_length = (len) * sizeof(type); \ 5002167ae72SSteven Rostedt (Red Hat) __data_offsets->item = __data_size + \ 5012167ae72SSteven Rostedt (Red Hat) offsetof(typeof(*entry), __data); \ 5022167ae72SSteven Rostedt (Red Hat) __data_offsets->item |= __item_length << 16; \ 5032167ae72SSteven Rostedt (Red Hat) __data_size += __item_length; 5042167ae72SSteven Rostedt (Red Hat) 5052167ae72SSteven Rostedt (Red Hat) #undef __string 5062167ae72SSteven Rostedt (Red Hat) #define __string(item, src) __dynamic_array(char, item, \ 5072167ae72SSteven Rostedt (Red Hat) strlen((src) ? (const char *)(src) : "(null)") + 1) 5082167ae72SSteven Rostedt (Red Hat) 5092167ae72SSteven Rostedt (Red Hat) /* 5102167ae72SSteven Rostedt (Red Hat) * __bitmask_size_in_bytes_raw is the number of bytes needed to hold 5112167ae72SSteven Rostedt (Red Hat) * num_possible_cpus(). 5122167ae72SSteven Rostedt (Red Hat) */ 5132167ae72SSteven Rostedt (Red Hat) #define __bitmask_size_in_bytes_raw(nr_bits) \ 5142167ae72SSteven Rostedt (Red Hat) (((nr_bits) + 7) / 8) 5152167ae72SSteven Rostedt (Red Hat) 5162167ae72SSteven Rostedt (Red Hat) #define __bitmask_size_in_longs(nr_bits) \ 5172167ae72SSteven Rostedt (Red Hat) ((__bitmask_size_in_bytes_raw(nr_bits) + \ 5182167ae72SSteven Rostedt (Red Hat) ((BITS_PER_LONG / 8) - 1)) / (BITS_PER_LONG / 8)) 5192167ae72SSteven Rostedt (Red Hat) 5202167ae72SSteven Rostedt (Red Hat) /* 5212167ae72SSteven Rostedt (Red Hat) * __bitmask_size_in_bytes is the number of bytes needed to hold 5222167ae72SSteven Rostedt (Red Hat) * num_possible_cpus() padded out to the nearest long. This is what 5232167ae72SSteven Rostedt (Red Hat) * is saved in the buffer, just to be consistent. 5242167ae72SSteven Rostedt (Red Hat) */ 5252167ae72SSteven Rostedt (Red Hat) #define __bitmask_size_in_bytes(nr_bits) \ 5262167ae72SSteven Rostedt (Red Hat) (__bitmask_size_in_longs(nr_bits) * (BITS_PER_LONG / 8)) 5272167ae72SSteven Rostedt (Red Hat) 5282167ae72SSteven Rostedt (Red Hat) #undef __bitmask 5292167ae72SSteven Rostedt (Red Hat) #define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, \ 5302167ae72SSteven Rostedt (Red Hat) __bitmask_size_in_longs(nr_bits)) 5312167ae72SSteven Rostedt (Red Hat) 5322167ae72SSteven Rostedt (Red Hat) #undef DECLARE_EVENT_CLASS 5332167ae72SSteven Rostedt (Red Hat) #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 534d0ee8f4aSSteven Rostedt (Red Hat) static inline notrace int trace_event_get_offsets_##call( \ 53562323a14SSteven Rostedt (Red Hat) struct trace_event_data_offsets_##call *__data_offsets, proto) \ 5362167ae72SSteven Rostedt (Red Hat) { \ 5372167ae72SSteven Rostedt (Red Hat) int __data_size = 0; \ 5382167ae72SSteven Rostedt (Red Hat) int __maybe_unused __item_length; \ 539a7237765SSteven Rostedt (Red Hat) struct trace_event_raw_##call __maybe_unused *entry; \ 5402167ae72SSteven Rostedt (Red Hat) \ 5412167ae72SSteven Rostedt (Red Hat) tstruct; \ 5422167ae72SSteven Rostedt (Red Hat) \ 5432167ae72SSteven Rostedt (Red Hat) return __data_size; \ 5442167ae72SSteven Rostedt (Red Hat) } 5452167ae72SSteven Rostedt (Red Hat) 5462167ae72SSteven Rostedt (Red Hat) #undef DEFINE_EVENT 5472167ae72SSteven Rostedt (Red Hat) #define DEFINE_EVENT(template, name, proto, args) 5482167ae72SSteven Rostedt (Red Hat) 5492167ae72SSteven Rostedt (Red Hat) #undef DEFINE_EVENT_PRINT 5502167ae72SSteven Rostedt (Red Hat) #define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ 5512167ae72SSteven Rostedt (Red Hat) DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) 5522167ae72SSteven Rostedt (Red Hat) 5532167ae72SSteven Rostedt (Red Hat) #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 5542167ae72SSteven Rostedt (Red Hat) 55546ac5182SSteven Rostedt (Red Hat) /* 55646ac5182SSteven Rostedt (Red Hat) * Stage 4 of the trace events. 55746ac5182SSteven Rostedt (Red Hat) * 55846ac5182SSteven Rostedt (Red Hat) * Override the macros in <trace/trace_events.h> to include the following: 55946ac5182SSteven Rostedt (Red Hat) * 56046ac5182SSteven Rostedt (Red Hat) * For those macros defined with TRACE_EVENT: 56146ac5182SSteven Rostedt (Red Hat) * 56246ac5182SSteven Rostedt (Red Hat) * static struct trace_event_call event_<call>; 56346ac5182SSteven Rostedt (Red Hat) * 56446ac5182SSteven Rostedt (Red Hat) * static void trace_event_raw_event_<call>(void *__data, proto) 56546ac5182SSteven Rostedt (Red Hat) * { 56646ac5182SSteven Rostedt (Red Hat) * struct trace_event_file *trace_file = __data; 56746ac5182SSteven Rostedt (Red Hat) * struct trace_event_call *event_call = trace_file->event_call; 56846ac5182SSteven Rostedt (Red Hat) * struct trace_event_data_offsets_<call> __maybe_unused __data_offsets; 56946ac5182SSteven Rostedt (Red Hat) * unsigned long eflags = trace_file->flags; 57046ac5182SSteven Rostedt (Red Hat) * enum event_trigger_type __tt = ETT_NONE; 57146ac5182SSteven Rostedt (Red Hat) * struct ring_buffer_event *event; 57246ac5182SSteven Rostedt (Red Hat) * struct trace_event_raw_<call> *entry; <-- defined in stage 1 57313292494SSteven Rostedt (VMware) * struct trace_buffer *buffer; 57446ac5182SSteven Rostedt (Red Hat) * unsigned long irq_flags; 57546ac5182SSteven Rostedt (Red Hat) * int __data_size; 57646ac5182SSteven Rostedt (Red Hat) * int pc; 57746ac5182SSteven Rostedt (Red Hat) * 57846ac5182SSteven Rostedt (Red Hat) * if (!(eflags & EVENT_FILE_FL_TRIGGER_COND)) { 57946ac5182SSteven Rostedt (Red Hat) * if (eflags & EVENT_FILE_FL_TRIGGER_MODE) 58046ac5182SSteven Rostedt (Red Hat) * event_triggers_call(trace_file, NULL); 58146ac5182SSteven Rostedt (Red Hat) * if (eflags & EVENT_FILE_FL_SOFT_DISABLED) 58246ac5182SSteven Rostedt (Red Hat) * return; 58346ac5182SSteven Rostedt (Red Hat) * } 58446ac5182SSteven Rostedt (Red Hat) * 58546ac5182SSteven Rostedt (Red Hat) * local_save_flags(irq_flags); 58646ac5182SSteven Rostedt (Red Hat) * pc = preempt_count(); 58746ac5182SSteven Rostedt (Red Hat) * 58846ac5182SSteven Rostedt (Red Hat) * __data_size = trace_event_get_offsets_<call>(&__data_offsets, args); 58946ac5182SSteven Rostedt (Red Hat) * 59046ac5182SSteven Rostedt (Red Hat) * event = trace_event_buffer_lock_reserve(&buffer, trace_file, 59146ac5182SSteven Rostedt (Red Hat) * event_<call>->event.type, 59246ac5182SSteven Rostedt (Red Hat) * sizeof(*entry) + __data_size, 59346ac5182SSteven Rostedt (Red Hat) * irq_flags, pc); 59446ac5182SSteven Rostedt (Red Hat) * if (!event) 59546ac5182SSteven Rostedt (Red Hat) * return; 59646ac5182SSteven Rostedt (Red Hat) * entry = ring_buffer_event_data(event); 59746ac5182SSteven Rostedt (Red Hat) * 59846ac5182SSteven Rostedt (Red Hat) * { <assign>; } <-- Here we assign the entries by the __field and 59946ac5182SSteven Rostedt (Red Hat) * __array macros. 60046ac5182SSteven Rostedt (Red Hat) * 60146ac5182SSteven Rostedt (Red Hat) * if (eflags & EVENT_FILE_FL_TRIGGER_COND) 60246ac5182SSteven Rostedt (Red Hat) * __tt = event_triggers_call(trace_file, entry); 60346ac5182SSteven Rostedt (Red Hat) * 60446ac5182SSteven Rostedt (Red Hat) * if (test_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, 60546ac5182SSteven Rostedt (Red Hat) * &trace_file->flags)) 60646ac5182SSteven Rostedt (Red Hat) * ring_buffer_discard_commit(buffer, event); 60746ac5182SSteven Rostedt (Red Hat) * else if (!filter_check_discard(trace_file, entry, buffer, event)) 60846ac5182SSteven Rostedt (Red Hat) * trace_buffer_unlock_commit(buffer, event, irq_flags, pc); 60946ac5182SSteven Rostedt (Red Hat) * 61046ac5182SSteven Rostedt (Red Hat) * if (__tt) 61146ac5182SSteven Rostedt (Red Hat) * event_triggers_post_call(trace_file, __tt); 61246ac5182SSteven Rostedt (Red Hat) * } 61346ac5182SSteven Rostedt (Red Hat) * 61446ac5182SSteven Rostedt (Red Hat) * static struct trace_event ftrace_event_type_<call> = { 61546ac5182SSteven Rostedt (Red Hat) * .trace = trace_raw_output_<call>, <-- stage 2 61646ac5182SSteven Rostedt (Red Hat) * }; 61746ac5182SSteven Rostedt (Red Hat) * 61846ac5182SSteven Rostedt (Red Hat) * static char print_fmt_<call>[] = <TP_printk>; 61946ac5182SSteven Rostedt (Red Hat) * 62046ac5182SSteven Rostedt (Red Hat) * static struct trace_event_class __used event_class_<template> = { 62146ac5182SSteven Rostedt (Red Hat) * .system = "<system>", 62246ac5182SSteven Rostedt (Red Hat) * .define_fields = trace_event_define_fields_<call>, 62346ac5182SSteven Rostedt (Red Hat) * .fields = LIST_HEAD_INIT(event_class_##call.fields), 62446ac5182SSteven Rostedt (Red Hat) * .raw_init = trace_event_raw_init, 62546ac5182SSteven Rostedt (Red Hat) * .probe = trace_event_raw_event_##call, 62646ac5182SSteven Rostedt (Red Hat) * .reg = trace_event_reg, 62746ac5182SSteven Rostedt (Red Hat) * }; 62846ac5182SSteven Rostedt (Red Hat) * 62946ac5182SSteven Rostedt (Red Hat) * static struct trace_event_call event_<call> = { 63046ac5182SSteven Rostedt (Red Hat) * .class = event_class_<template>, 63146ac5182SSteven Rostedt (Red Hat) * { 63246ac5182SSteven Rostedt (Red Hat) * .tp = &__tracepoint_<call>, 63346ac5182SSteven Rostedt (Red Hat) * }, 63446ac5182SSteven Rostedt (Red Hat) * .event = &ftrace_event_type_<call>, 63546ac5182SSteven Rostedt (Red Hat) * .print_fmt = print_fmt_<call>, 63646ac5182SSteven Rostedt (Red Hat) * .flags = TRACE_EVENT_FL_TRACEPOINT, 63746ac5182SSteven Rostedt (Red Hat) * }; 63846ac5182SSteven Rostedt (Red Hat) * // its only safe to use pointers when doing linker tricks to 63946ac5182SSteven Rostedt (Red Hat) * // create an array. 64046ac5182SSteven Rostedt (Red Hat) * static struct trace_event_call __used 64146ac5182SSteven Rostedt (Red Hat) * __attribute__((section("_ftrace_events"))) *__event_<call> = &event_<call>; 64246ac5182SSteven Rostedt (Red Hat) * 64346ac5182SSteven Rostedt (Red Hat) */ 64446ac5182SSteven Rostedt (Red Hat) 64546ac5182SSteven Rostedt (Red Hat) #ifdef CONFIG_PERF_EVENTS 64646ac5182SSteven Rostedt (Red Hat) 64746ac5182SSteven Rostedt (Red Hat) #define _TRACE_PERF_PROTO(call, proto) \ 64846ac5182SSteven Rostedt (Red Hat) static notrace void \ 64946ac5182SSteven Rostedt (Red Hat) perf_trace_##call(void *__data, proto); 65046ac5182SSteven Rostedt (Red Hat) 65146ac5182SSteven Rostedt (Red Hat) #define _TRACE_PERF_INIT(call) \ 65246ac5182SSteven Rostedt (Red Hat) .perf_probe = perf_trace_##call, 65346ac5182SSteven Rostedt (Red Hat) 65446ac5182SSteven Rostedt (Red Hat) #else 65546ac5182SSteven Rostedt (Red Hat) #define _TRACE_PERF_PROTO(call, proto) 65646ac5182SSteven Rostedt (Red Hat) #define _TRACE_PERF_INIT(call) 65746ac5182SSteven Rostedt (Red Hat) #endif /* CONFIG_PERF_EVENTS */ 65846ac5182SSteven Rostedt (Red Hat) 65946ac5182SSteven Rostedt (Red Hat) #undef __entry 66046ac5182SSteven Rostedt (Red Hat) #define __entry entry 66146ac5182SSteven Rostedt (Red Hat) 66246ac5182SSteven Rostedt (Red Hat) #undef __field 66346ac5182SSteven Rostedt (Red Hat) #define __field(type, item) 66446ac5182SSteven Rostedt (Red Hat) 66546ac5182SSteven Rostedt (Red Hat) #undef __field_struct 66646ac5182SSteven Rostedt (Red Hat) #define __field_struct(type, item) 66746ac5182SSteven Rostedt (Red Hat) 66846ac5182SSteven Rostedt (Red Hat) #undef __array 66946ac5182SSteven Rostedt (Red Hat) #define __array(type, item, len) 67046ac5182SSteven Rostedt (Red Hat) 67146ac5182SSteven Rostedt (Red Hat) #undef __dynamic_array 67246ac5182SSteven Rostedt (Red Hat) #define __dynamic_array(type, item, len) \ 67346ac5182SSteven Rostedt (Red Hat) __entry->__data_loc_##item = __data_offsets.item; 67446ac5182SSteven Rostedt (Red Hat) 67546ac5182SSteven Rostedt (Red Hat) #undef __string 67646ac5182SSteven Rostedt (Red Hat) #define __string(item, src) __dynamic_array(char, item, -1) 67746ac5182SSteven Rostedt (Red Hat) 67846ac5182SSteven Rostedt (Red Hat) #undef __assign_str 67946ac5182SSteven Rostedt (Red Hat) #define __assign_str(dst, src) \ 68046ac5182SSteven Rostedt (Red Hat) strcpy(__get_str(dst), (src) ? (const char *)(src) : "(null)"); 68146ac5182SSteven Rostedt (Red Hat) 68246ac5182SSteven Rostedt (Red Hat) #undef __bitmask 68346ac5182SSteven Rostedt (Red Hat) #define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1) 68446ac5182SSteven Rostedt (Red Hat) 68546ac5182SSteven Rostedt (Red Hat) #undef __get_bitmask 68646ac5182SSteven Rostedt (Red Hat) #define __get_bitmask(field) (char *)__get_dynamic_array(field) 68746ac5182SSteven Rostedt (Red Hat) 68846ac5182SSteven Rostedt (Red Hat) #undef __assign_bitmask 68946ac5182SSteven Rostedt (Red Hat) #define __assign_bitmask(dst, src, nr_bits) \ 69046ac5182SSteven Rostedt (Red Hat) memcpy(__get_bitmask(dst), (src), __bitmask_size_in_bytes(nr_bits)) 69146ac5182SSteven Rostedt (Red Hat) 69246ac5182SSteven Rostedt (Red Hat) #undef TP_fast_assign 69346ac5182SSteven Rostedt (Red Hat) #define TP_fast_assign(args...) args 69446ac5182SSteven Rostedt (Red Hat) 69546ac5182SSteven Rostedt (Red Hat) #undef __perf_count 69646ac5182SSteven Rostedt (Red Hat) #define __perf_count(c) (c) 69746ac5182SSteven Rostedt (Red Hat) 69846ac5182SSteven Rostedt (Red Hat) #undef __perf_task 69946ac5182SSteven Rostedt (Red Hat) #define __perf_task(t) (t) 70046ac5182SSteven Rostedt (Red Hat) 70146ac5182SSteven Rostedt (Red Hat) #undef DECLARE_EVENT_CLASS 70246ac5182SSteven Rostedt (Red Hat) #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 70346ac5182SSteven Rostedt (Red Hat) \ 70446ac5182SSteven Rostedt (Red Hat) static notrace void \ 70546ac5182SSteven Rostedt (Red Hat) trace_event_raw_event_##call(void *__data, proto) \ 70646ac5182SSteven Rostedt (Red Hat) { \ 70746ac5182SSteven Rostedt (Red Hat) struct trace_event_file *trace_file = __data; \ 70846ac5182SSteven Rostedt (Red Hat) struct trace_event_data_offsets_##call __maybe_unused __data_offsets;\ 70946ac5182SSteven Rostedt (Red Hat) struct trace_event_buffer fbuffer; \ 71046ac5182SSteven Rostedt (Red Hat) struct trace_event_raw_##call *entry; \ 71146ac5182SSteven Rostedt (Red Hat) int __data_size; \ 71246ac5182SSteven Rostedt (Red Hat) \ 71346ac5182SSteven Rostedt (Red Hat) if (trace_trigger_soft_disabled(trace_file)) \ 71446ac5182SSteven Rostedt (Red Hat) return; \ 71546ac5182SSteven Rostedt (Red Hat) \ 71646ac5182SSteven Rostedt (Red Hat) __data_size = trace_event_get_offsets_##call(&__data_offsets, args); \ 71746ac5182SSteven Rostedt (Red Hat) \ 71846ac5182SSteven Rostedt (Red Hat) entry = trace_event_buffer_reserve(&fbuffer, trace_file, \ 71946ac5182SSteven Rostedt (Red Hat) sizeof(*entry) + __data_size); \ 72046ac5182SSteven Rostedt (Red Hat) \ 72146ac5182SSteven Rostedt (Red Hat) if (!entry) \ 72246ac5182SSteven Rostedt (Red Hat) return; \ 72346ac5182SSteven Rostedt (Red Hat) \ 72446ac5182SSteven Rostedt (Red Hat) tstruct \ 72546ac5182SSteven Rostedt (Red Hat) \ 72646ac5182SSteven Rostedt (Red Hat) { assign; } \ 72746ac5182SSteven Rostedt (Red Hat) \ 72846ac5182SSteven Rostedt (Red Hat) trace_event_buffer_commit(&fbuffer); \ 72946ac5182SSteven Rostedt (Red Hat) } 73046ac5182SSteven Rostedt (Red Hat) /* 73146ac5182SSteven Rostedt (Red Hat) * The ftrace_test_probe is compiled out, it is only here as a build time check 73246ac5182SSteven Rostedt (Red Hat) * to make sure that if the tracepoint handling changes, the ftrace probe will 73346ac5182SSteven Rostedt (Red Hat) * fail to compile unless it too is updated. 73446ac5182SSteven Rostedt (Red Hat) */ 73546ac5182SSteven Rostedt (Red Hat) 73646ac5182SSteven Rostedt (Red Hat) #undef DEFINE_EVENT 73746ac5182SSteven Rostedt (Red Hat) #define DEFINE_EVENT(template, call, proto, args) \ 73846ac5182SSteven Rostedt (Red Hat) static inline void ftrace_test_probe_##call(void) \ 73946ac5182SSteven Rostedt (Red Hat) { \ 74046ac5182SSteven Rostedt (Red Hat) check_trace_callback_type_##call(trace_event_raw_event_##template); \ 74146ac5182SSteven Rostedt (Red Hat) } 74246ac5182SSteven Rostedt (Red Hat) 74346ac5182SSteven Rostedt (Red Hat) #undef DEFINE_EVENT_PRINT 74446ac5182SSteven Rostedt (Red Hat) #define DEFINE_EVENT_PRINT(template, name, proto, args, print) 74546ac5182SSteven Rostedt (Red Hat) 74646ac5182SSteven Rostedt (Red Hat) #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 74746ac5182SSteven Rostedt (Red Hat) 74846ac5182SSteven Rostedt (Red Hat) #undef __entry 74946ac5182SSteven Rostedt (Red Hat) #define __entry REC 75046ac5182SSteven Rostedt (Red Hat) 75146ac5182SSteven Rostedt (Red Hat) #undef __print_flags 75246ac5182SSteven Rostedt (Red Hat) #undef __print_symbolic 75346ac5182SSteven Rostedt (Red Hat) #undef __print_hex 7542acae0d5SDaniel Borkmann #undef __print_hex_str 75546ac5182SSteven Rostedt (Red Hat) #undef __get_dynamic_array 75646ac5182SSteven Rostedt (Red Hat) #undef __get_dynamic_array_len 75746ac5182SSteven Rostedt (Red Hat) #undef __get_str 75846ac5182SSteven Rostedt (Red Hat) #undef __get_bitmask 75946ac5182SSteven Rostedt (Red Hat) #undef __print_array 76002a65a0bSPiotr Maziarz #undef __print_hex_dump 76146ac5182SSteven Rostedt (Red Hat) 76246ac5182SSteven Rostedt (Red Hat) #undef TP_printk 76346ac5182SSteven Rostedt (Red Hat) #define TP_printk(fmt, args...) "\"" fmt "\", " __stringify(args) 76446ac5182SSteven Rostedt (Red Hat) 76546ac5182SSteven Rostedt (Red Hat) #undef DECLARE_EVENT_CLASS 76646ac5182SSteven Rostedt (Red Hat) #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 76746ac5182SSteven Rostedt (Red Hat) _TRACE_PERF_PROTO(call, PARAMS(proto)); \ 76846ac5182SSteven Rostedt (Red Hat) static char print_fmt_##call[] = print; \ 76946ac5182SSteven Rostedt (Red Hat) static struct trace_event_class __used __refdata event_class_##call = { \ 77046ac5182SSteven Rostedt (Red Hat) .system = TRACE_SYSTEM_STRING, \ 77146ac5182SSteven Rostedt (Red Hat) .define_fields = trace_event_define_fields_##call, \ 77246ac5182SSteven Rostedt (Red Hat) .fields = LIST_HEAD_INIT(event_class_##call.fields),\ 77346ac5182SSteven Rostedt (Red Hat) .raw_init = trace_event_raw_init, \ 77446ac5182SSteven Rostedt (Red Hat) .probe = trace_event_raw_event_##call, \ 77546ac5182SSteven Rostedt (Red Hat) .reg = trace_event_reg, \ 77646ac5182SSteven Rostedt (Red Hat) _TRACE_PERF_INIT(call) \ 77746ac5182SSteven Rostedt (Red Hat) }; 77846ac5182SSteven Rostedt (Red Hat) 77946ac5182SSteven Rostedt (Red Hat) #undef DEFINE_EVENT 78046ac5182SSteven Rostedt (Red Hat) #define DEFINE_EVENT(template, call, proto, args) \ 78146ac5182SSteven Rostedt (Red Hat) \ 78246ac5182SSteven Rostedt (Red Hat) static struct trace_event_call __used event_##call = { \ 78346ac5182SSteven Rostedt (Red Hat) .class = &event_class_##template, \ 78446ac5182SSteven Rostedt (Red Hat) { \ 78546ac5182SSteven Rostedt (Red Hat) .tp = &__tracepoint_##call, \ 78646ac5182SSteven Rostedt (Red Hat) }, \ 78746ac5182SSteven Rostedt (Red Hat) .event.funcs = &trace_event_type_funcs_##template, \ 78846ac5182SSteven Rostedt (Red Hat) .print_fmt = print_fmt_##template, \ 78946ac5182SSteven Rostedt (Red Hat) .flags = TRACE_EVENT_FL_TRACEPOINT, \ 79046ac5182SSteven Rostedt (Red Hat) }; \ 79146ac5182SSteven Rostedt (Red Hat) static struct trace_event_call __used \ 79246ac5182SSteven Rostedt (Red Hat) __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call 79346ac5182SSteven Rostedt (Red Hat) 79446ac5182SSteven Rostedt (Red Hat) #undef DEFINE_EVENT_PRINT 79546ac5182SSteven Rostedt (Red Hat) #define DEFINE_EVENT_PRINT(template, call, proto, args, print) \ 79646ac5182SSteven Rostedt (Red Hat) \ 79746ac5182SSteven Rostedt (Red Hat) static char print_fmt_##call[] = print; \ 79846ac5182SSteven Rostedt (Red Hat) \ 79946ac5182SSteven Rostedt (Red Hat) static struct trace_event_call __used event_##call = { \ 80046ac5182SSteven Rostedt (Red Hat) .class = &event_class_##template, \ 80146ac5182SSteven Rostedt (Red Hat) { \ 80246ac5182SSteven Rostedt (Red Hat) .tp = &__tracepoint_##call, \ 80346ac5182SSteven Rostedt (Red Hat) }, \ 80446ac5182SSteven Rostedt (Red Hat) .event.funcs = &trace_event_type_funcs_##call, \ 80546ac5182SSteven Rostedt (Red Hat) .print_fmt = print_fmt_##call, \ 80646ac5182SSteven Rostedt (Red Hat) .flags = TRACE_EVENT_FL_TRACEPOINT, \ 80746ac5182SSteven Rostedt (Red Hat) }; \ 80846ac5182SSteven Rostedt (Red Hat) static struct trace_event_call __used \ 80946ac5182SSteven Rostedt (Red Hat) __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call 81046ac5182SSteven Rostedt (Red Hat) 81146ac5182SSteven Rostedt (Red Hat) #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 812