132 lines
3.1 KiB
C
132 lines
3.1 KiB
C
/*
|
|
* Stage 2 of the trace events.
|
|
*
|
|
* Override the macros in <trace/trace_event_types.h> to include the following:
|
|
*
|
|
* 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; <-- defined in stage 1
|
|
* 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, <TP_printk> "\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 <trace/trace_event_types.h>
|
|
|
|
/*
|
|
* 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 <trace/trace_event_types.h>
|