]>
Commit | Line | Data |
---|---|---|
770cb243 SR |
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 | ||
da4d0302 SR |
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 | |
e1112b4d | 33 | #define TRACE_FIELD_SPECIAL(type_item, item, len, cmd) \ |
da4d0302 SR |
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; | |
770cb243 SR |
40 | |
41 | #undef TRACE_FIELD_ZERO_CHAR | |
156b5f17 | 42 | #define TRACE_FIELD_ZERO_CHAR(item) \ |
1bbe2a83 | 43 | ret = trace_seq_printf(s, "\tfield:char " #item ";\t" \ |
156b5f17 SR |
44 | "offset:%u;\tsize:0;\n", \ |
45 | (unsigned int)offsetof(typeof(field), item)); \ | |
46 | if (!ret) \ | |
770cb243 SR |
47 | return 0; |
48 | ||
49 | ||
2939b046 SR |
50 | #undef TP_RAW_FMT |
51 | #define TP_RAW_FMT(args...) args | |
770cb243 SR |
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 | ||
2939b046 SR |
81 | #undef TP_CMD |
82 | #define TP_CMD(cmd...) cmd | |
770cb243 SR |
83 | |
84 | #undef TRACE_ENTRY | |
85 | #define TRACE_ENTRY entry | |
86 | ||
87 | #undef TRACE_FIELD_SPECIAL | |
e1112b4d | 88 | #define TRACE_FIELD_SPECIAL(type_item, item, len, cmd) \ |
770cb243 SR |
89 | cmd; |
90 | ||
91 | #undef TRACE_EVENT_FORMAT | |
92 | #define TRACE_EVENT_FORMAT(call, proto, args, fmt, tstruct, tpfmt) \ | |
e1112b4d TZ |
93 | int ftrace_define_fields_##call(void); \ |
94 | static int ftrace_raw_init_event_##call(void); \ | |
770cb243 | 95 | \ |
e1112b4d | 96 | struct ftrace_event_call __used \ |
770cb243 SR |
97 | __attribute__((__aligned__(4))) \ |
98 | __attribute__((section("_ftrace_events"))) event_##call = { \ | |
ef18012b | 99 | .name = #call, \ |
770cb243 SR |
100 | .id = proto, \ |
101 | .system = __stringify(TRACE_SYSTEM), \ | |
e1112b4d | 102 | .raw_init = ftrace_raw_init_event_##call, \ |
770cb243 | 103 | .show_format = ftrace_format_##call, \ |
e1112b4d TZ |
104 | .define_fields = ftrace_define_fields_##call, \ |
105 | }; \ | |
106 | static int ftrace_raw_init_event_##call(void) \ | |
107 | { \ | |
108 | INIT_LIST_HEAD(&event_##call.fields); \ | |
109 | return 0; \ | |
110 | } \ | |
111 | ||
112 | #include "trace_event_types.h" | |
113 | ||
114 | #undef TRACE_FIELD | |
115 | #define TRACE_FIELD(type, item, assign) \ | |
116 | ret = trace_define_field(event_call, #type, #item, \ | |
117 | offsetof(typeof(field), item), \ | |
118 | sizeof(field.item)); \ | |
119 | if (ret) \ | |
120 | return ret; | |
121 | ||
122 | #undef TRACE_FIELD_SPECIAL | |
123 | #define TRACE_FIELD_SPECIAL(type, item, len, cmd) \ | |
124 | ret = trace_define_field(event_call, #type "[" #len "]", #item, \ | |
125 | offsetof(typeof(field), item), \ | |
126 | sizeof(field.item)); \ | |
127 | if (ret) \ | |
128 | return ret; | |
129 | ||
130 | #undef TRACE_FIELD_ZERO_CHAR | |
131 | #define TRACE_FIELD_ZERO_CHAR(item) | |
132 | ||
133 | #undef TRACE_EVENT_FORMAT | |
134 | #define TRACE_EVENT_FORMAT(call, proto, args, fmt, tstruct, tpfmt) \ | |
135 | int \ | |
136 | ftrace_define_fields_##call(void) \ | |
137 | { \ | |
138 | struct ftrace_event_call *event_call = &event_##call; \ | |
139 | struct args field; \ | |
140 | int ret; \ | |
141 | \ | |
142 | __common_field(unsigned char, type); \ | |
143 | __common_field(unsigned char, flags); \ | |
144 | __common_field(unsigned char, preempt_count); \ | |
145 | __common_field(int, pid); \ | |
146 | __common_field(int, tgid); \ | |
147 | \ | |
148 | tstruct; \ | |
149 | \ | |
150 | return ret; \ | |
770cb243 | 151 | } |
e1112b4d | 152 | |
770cb243 | 153 | #include "trace_event_types.h" |