diff options
Diffstat (limited to 'kernel/trace/trace_export.c')
-rw-r--r-- | kernel/trace/trace_export.c | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/kernel/trace/trace_export.c b/kernel/trace/trace_export.c new file mode 100644 index 00000000000..07a22c33ebf --- /dev/null +++ b/kernel/trace/trace_export.c | |||
@@ -0,0 +1,102 @@ | |||
1 | /* | ||
2 | * trace_export.c - export basic ftrace utilities to user space | ||
3 | * | ||
4 | * Copyright (C) 2009 Steven Rostedt <srostedt@redhat.com> | ||
5 | */ | ||
6 | #include <linux/stringify.h> | ||
7 | #include <linux/kallsyms.h> | ||
8 | #include <linux/seq_file.h> | ||
9 | #include <linux/debugfs.h> | ||
10 | #include <linux/uaccess.h> | ||
11 | #include <linux/ftrace.h> | ||
12 | #include <linux/module.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/fs.h> | ||
15 | |||
16 | #include "trace_output.h" | ||
17 | |||
18 | |||
19 | #undef TRACE_STRUCT | ||
20 | #define TRACE_STRUCT(args...) args | ||
21 | |||
22 | #undef TRACE_FIELD | ||
23 | #define TRACE_FIELD(type, item, assign) \ | ||
24 | ret = trace_seq_printf(s, "\tfield:" #type " " #item ";\t" \ | ||
25 | "offset:%u;\tsize:%u;\n", \ | ||
26 | (unsigned int)offsetof(typeof(field), item), \ | ||
27 | (unsigned int)sizeof(field.item)); \ | ||
28 | if (!ret) \ | ||
29 | return 0; | ||
30 | |||
31 | |||
32 | #undef TRACE_FIELD_SPECIAL | ||
33 | #define TRACE_FIELD_SPECIAL(type_item, item, cmd) \ | ||
34 | ret = trace_seq_printf(s, "\tfield special:" #type_item ";\t" \ | ||
35 | "offset:%u;\tsize:%u;\n", \ | ||
36 | (unsigned int)offsetof(typeof(field), item), \ | ||
37 | (unsigned int)sizeof(field.item)); \ | ||
38 | if (!ret) \ | ||
39 | return 0; | ||
40 | |||
41 | #undef TRACE_FIELD_ZERO_CHAR | ||
42 | #define TRACE_FIELD_ZERO_CHAR(item) \ | ||
43 | ret = trace_seq_printf(s, "\tfield:char " #item ";\t" \ | ||
44 | "offset:%u;\tsize:0;\n", \ | ||
45 | (unsigned int)offsetof(typeof(field), item)); \ | ||
46 | if (!ret) \ | ||
47 | return 0; | ||
48 | |||
49 | |||
50 | #undef TP_RAW_FMT | ||
51 | #define TP_RAW_FMT(args...) args | ||
52 | |||
53 | #undef TRACE_EVENT_FORMAT | ||
54 | #define TRACE_EVENT_FORMAT(call, proto, args, fmt, tstruct, tpfmt) \ | ||
55 | static int \ | ||
56 | ftrace_format_##call(struct trace_seq *s) \ | ||
57 | { \ | ||
58 | struct args field; \ | ||
59 | int ret; \ | ||
60 | \ | ||
61 | tstruct; \ | ||
62 | \ | ||
63 | trace_seq_printf(s, "\nprint fmt: \"%s\"\n", tpfmt); \ | ||
64 | \ | ||
65 | return ret; \ | ||
66 | } | ||
67 | |||
68 | #include "trace_event_types.h" | ||
69 | |||
70 | #undef TRACE_ZERO_CHAR | ||
71 | #define TRACE_ZERO_CHAR(arg) | ||
72 | |||
73 | #undef TRACE_FIELD | ||
74 | #define TRACE_FIELD(type, item, assign)\ | ||
75 | entry->item = assign; | ||
76 | |||
77 | #undef TRACE_FIELD | ||
78 | #define TRACE_FIELD(type, item, assign)\ | ||
79 | entry->item = assign; | ||
80 | |||
81 | #undef TP_CMD | ||
82 | #define TP_CMD(cmd...) cmd | ||
83 | |||
84 | #undef TRACE_ENTRY | ||
85 | #define TRACE_ENTRY entry | ||
86 | |||
87 | #undef TRACE_FIELD_SPECIAL | ||
88 | #define TRACE_FIELD_SPECIAL(type_item, item, cmd) \ | ||
89 | cmd; | ||
90 | |||
91 | #undef TRACE_EVENT_FORMAT | ||
92 | #define TRACE_EVENT_FORMAT(call, proto, args, fmt, tstruct, tpfmt) \ | ||
93 | \ | ||
94 | static struct ftrace_event_call __used \ | ||
95 | __attribute__((__aligned__(4))) \ | ||
96 | __attribute__((section("_ftrace_events"))) event_##call = { \ | ||
97 | .name = #call, \ | ||
98 | .id = proto, \ | ||
99 | .system = __stringify(TRACE_SYSTEM), \ | ||
100 | .show_format = ftrace_format_##call, \ | ||
101 | } | ||
102 | #include "trace_event_types.h" | ||