1770cb243SSteven Rostedt /* 2770cb243SSteven Rostedt * trace_export.c - export basic ftrace utilities to user space 3770cb243SSteven Rostedt * 4770cb243SSteven Rostedt * Copyright (C) 2009 Steven Rostedt <srostedt@redhat.com> 5770cb243SSteven Rostedt */ 6770cb243SSteven Rostedt #include <linux/stringify.h> 7770cb243SSteven Rostedt #include <linux/kallsyms.h> 8770cb243SSteven Rostedt #include <linux/seq_file.h> 9770cb243SSteven Rostedt #include <linux/debugfs.h> 10770cb243SSteven Rostedt #include <linux/uaccess.h> 11770cb243SSteven Rostedt #include <linux/ftrace.h> 12770cb243SSteven Rostedt #include <linux/module.h> 13770cb243SSteven Rostedt #include <linux/init.h> 14770cb243SSteven Rostedt #include <linux/fs.h> 15770cb243SSteven Rostedt 16770cb243SSteven Rostedt #include "trace_output.h" 17770cb243SSteven Rostedt 18770cb243SSteven Rostedt #include "trace_format.h" 19770cb243SSteven Rostedt 20770cb243SSteven Rostedt #undef TRACE_FIELD_ZERO_CHAR 21770cb243SSteven Rostedt #define TRACE_FIELD_ZERO_CHAR(item) \ 22770cb243SSteven Rostedt ret = trace_seq_printf(s, "\tfield: char " #item ";\t" \ 23156b5f17SSteven Rostedt "offset:%u;\tsize:0;\n", \ 24156b5f17SSteven Rostedt (unsigned int)offsetof(typeof(field), item)); \ 25770cb243SSteven Rostedt if (!ret) \ 26770cb243SSteven Rostedt return 0; 27770cb243SSteven Rostedt 28770cb243SSteven Rostedt 292939b046SSteven Rostedt #undef TP_RAW_FMT 302939b046SSteven Rostedt #define TP_RAW_FMT(args...) args 31770cb243SSteven Rostedt 32770cb243SSteven Rostedt #undef TRACE_EVENT_FORMAT 33770cb243SSteven Rostedt #define TRACE_EVENT_FORMAT(call, proto, args, fmt, tstruct, tpfmt) \ 34770cb243SSteven Rostedt static int \ 35770cb243SSteven Rostedt ftrace_format_##call(struct trace_seq *s) \ 36770cb243SSteven Rostedt { \ 37770cb243SSteven Rostedt struct args field; \ 38770cb243SSteven Rostedt int ret; \ 39770cb243SSteven Rostedt \ 40770cb243SSteven Rostedt tstruct; \ 41770cb243SSteven Rostedt \ 42770cb243SSteven Rostedt trace_seq_printf(s, "\nprint fmt: \"%s\"\n", tpfmt); \ 43770cb243SSteven Rostedt \ 44770cb243SSteven Rostedt return ret; \ 45770cb243SSteven Rostedt } 46770cb243SSteven Rostedt 47770cb243SSteven Rostedt #include "trace_event_types.h" 48770cb243SSteven Rostedt 49770cb243SSteven Rostedt #undef TRACE_ZERO_CHAR 50770cb243SSteven Rostedt #define TRACE_ZERO_CHAR(arg) 51770cb243SSteven Rostedt 52770cb243SSteven Rostedt #undef TRACE_FIELD 53770cb243SSteven Rostedt #define TRACE_FIELD(type, item, assign)\ 54770cb243SSteven Rostedt entry->item = assign; 55770cb243SSteven Rostedt 56770cb243SSteven Rostedt #undef TRACE_FIELD 57770cb243SSteven Rostedt #define TRACE_FIELD(type, item, assign)\ 58770cb243SSteven Rostedt entry->item = assign; 59770cb243SSteven Rostedt 602939b046SSteven Rostedt #undef TP_CMD 612939b046SSteven Rostedt #define TP_CMD(cmd...) cmd 62770cb243SSteven Rostedt 63770cb243SSteven Rostedt #undef TRACE_ENTRY 64770cb243SSteven Rostedt #define TRACE_ENTRY entry 65770cb243SSteven Rostedt 66770cb243SSteven Rostedt #undef TRACE_FIELD_SPECIAL 67770cb243SSteven Rostedt #define TRACE_FIELD_SPECIAL(type_item, item, cmd) \ 68770cb243SSteven Rostedt cmd; 69770cb243SSteven Rostedt 70770cb243SSteven Rostedt #undef TRACE_EVENT_FORMAT 71770cb243SSteven Rostedt #define TRACE_EVENT_FORMAT(call, proto, args, fmt, tstruct, tpfmt) \ 72770cb243SSteven Rostedt \ 73770cb243SSteven Rostedt static struct ftrace_event_call __used \ 74770cb243SSteven Rostedt __attribute__((__aligned__(4))) \ 75770cb243SSteven Rostedt __attribute__((section("_ftrace_events"))) event_##call = { \ 76770cb243SSteven Rostedt .name = #call, \ 77770cb243SSteven Rostedt .id = proto, \ 78770cb243SSteven Rostedt .system = __stringify(TRACE_SYSTEM), \ 79770cb243SSteven Rostedt .show_format = ftrace_format_##call, \ 80770cb243SSteven Rostedt } 81770cb243SSteven Rostedt #include "trace_event_types.h" 82