/* * Stage 2 of the trace events. * * Override the macros in to include the following: * * enum print_line_t * ftrace_raw_output_(struct trace_iterator *iter, int flags) * { * struct trace_seq *s = &iter->seq; * struct ftrace_raw_ *field; <-- defined in stage 1 * struct trace_entry *entry; * int ret; * * entry = iter->ent; * * if (entry->type != event_.id) { * WARN_ON_ONCE(1); * return TRACE_TYPE_UNHANDLED; * } * * field = (typeof(field))entry; * * ret = trace_seq_printf(s, "\n"); * if (!ret) * return TRACE_TYPE_PARTIAL_LINE; * * return TRACE_TYPE_HANDLED; * } * * This is the method used to print the raw event to the trace * output format. Note, this is not needed if the data is read * in binary. */ #undef __entry #define __entry field #undef TP_printk #define TP_printk(fmt, args...) fmt "\n", args #undef TRACE_EVENT #define TRACE_EVENT(call, proto, args, tstruct, assign, print) \ enum print_line_t \ ftrace_raw_output_##call(struct trace_iterator *iter, int flags) \ { \ struct trace_seq *s = &iter->seq; \ struct ftrace_raw_##call *field; \ struct trace_entry *entry; \ int ret; \ \ entry = iter->ent; \ \ if (entry->type != event_##call.id) { \ WARN_ON_ONCE(1); \ return TRACE_TYPE_UNHANDLED; \ } \ \ field = (typeof(field))entry; \ \ ret = trace_seq_printf(s, #call ": " print); \ if (!ret) \ return TRACE_TYPE_PARTIAL_LINE; \ \ return TRACE_TYPE_HANDLED; \ } #include /* * Setup the showing format of trace point. * * int * ftrace_format_##call(struct trace_seq *s) * { * struct ftrace_raw_##call field; * int ret; * * ret = trace_seq_printf(s, #type " " #item ";" * " offset:%u; size:%u;\n", * offsetof(struct ftrace_raw_##call, item), * sizeof(field.type)); * * } */ #undef TP_STRUCT__entry #define TP_STRUCT__entry(args...) args #undef __field #define __field(type, item) \ ret = trace_seq_printf(s, "\tfield:" #type " " #item ";\t" \ "offset:%u;\tsize:%u;\n", \ (unsigned int)offsetof(typeof(field), item), \ (unsigned int)sizeof(field.item)); \ if (!ret) \ return 0; #undef __array #define __array(type, item, len) \ ret = trace_seq_printf(s, "\tfield:" #type " " #item "[" #len "];\t" \ "offset:%u;\tsize:%u;\n", \ (unsigned int)offsetof(typeof(field), item), \ (unsigned int)sizeof(field.item)); \ if (!ret) \ return 0; #undef __entry #define __entry "REC" #undef TP_printk #define TP_printk(fmt, args...) "%s, %s\n", #fmt, #args #undef TP_fast_assign #define TP_fast_assign(args...) args #undef TRACE_EVENT #define TRACE_EVENT(call, proto, args, tstruct, func, print) \ static int \ ftrace_format_##call(struct trace_seq *s) \ { \ struct ftrace_raw_##call field; \ int ret; \ \ tstruct; \ \ trace_seq_printf(s, "\nprint fmt: " print); \ \ return ret; \ } #include