Merge commit 'tracing/core' into tracing/kprobes
[pandora-kernel.git] / kernel / trace / trace_export.c
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 extern void __bad_type_size(void);
23
24 #undef TRACE_FIELD
25 #define TRACE_FIELD(type, item, assign)                                 \
26         if (sizeof(type) != sizeof(field.item))                         \
27                 __bad_type_size();                                      \
28         ret = trace_seq_printf(s, "\tfield:" #type " " #item ";\t"      \
29                                "offset:%u;\tsize:%u;\n",                \
30                                (unsigned int)offsetof(typeof(field), item), \
31                                (unsigned int)sizeof(field.item));       \
32         if (!ret)                                                       \
33                 return 0;
34
35
36 #undef TRACE_FIELD_SPECIAL
37 #define TRACE_FIELD_SPECIAL(type_item, item, len, cmd)                  \
38         ret = trace_seq_printf(s, "\tfield special:" #type_item ";\t"   \
39                                "offset:%u;\tsize:%u;\n",                \
40                                (unsigned int)offsetof(typeof(field), item), \
41                                (unsigned int)sizeof(field.item));       \
42         if (!ret)                                                       \
43                 return 0;
44
45 #undef TRACE_FIELD_ZERO
46 #define TRACE_FIELD_ZERO(type, item)                                    \
47         ret = trace_seq_printf(s, "\tfield:" #type " " #item ";\t"      \
48                                "offset:%u;\tsize:0;\n",                 \
49                                (unsigned int)offsetof(typeof(field), item)); \
50         if (!ret)                                                       \
51                 return 0;
52
53 #undef TRACE_FIELD_SIGN
54 #define TRACE_FIELD_SIGN(type, item, assign, is_signed) \
55         TRACE_FIELD(type, item, assign)
56
57 #undef TP_RAW_FMT
58 #define TP_RAW_FMT(args...) args
59
60 #undef TRACE_EVENT_FORMAT
61 #define TRACE_EVENT_FORMAT(call, proto, args, fmt, tstruct, tpfmt)      \
62 static int                                                              \
63 ftrace_format_##call(struct ftrace_event_call *unused,                  \
64                       struct trace_seq *s)                              \
65 {                                                                       \
66         struct args field;                                              \
67         int ret;                                                        \
68                                                                         \
69         tstruct;                                                        \
70                                                                         \
71         trace_seq_printf(s, "\nprint fmt: \"%s\"\n", tpfmt);            \
72                                                                         \
73         return ret;                                                     \
74 }
75
76 #undef TRACE_EVENT_FORMAT_NOFILTER
77 #define TRACE_EVENT_FORMAT_NOFILTER(call, proto, args, fmt, tstruct,    \
78                                     tpfmt)                              \
79 static int                                                              \
80 ftrace_format_##call(struct ftrace_event_call *unused,                  \
81                       struct trace_seq *s)                              \
82 {                                                                       \
83         struct args field;                                              \
84         int ret;                                                        \
85                                                                         \
86         tstruct;                                                        \
87                                                                         \
88         trace_seq_printf(s, "\nprint fmt: \"%s\"\n", tpfmt);            \
89                                                                         \
90         return ret;                                                     \
91 }
92
93 #include "trace_event_types.h"
94
95 #undef TRACE_FIELD
96 #define TRACE_FIELD(type, item, assign)\
97         entry->item = assign;
98
99 #undef TRACE_FIELD
100 #define TRACE_FIELD(type, item, assign)\
101         entry->item = assign;
102
103 #undef TRACE_FIELD_SIGN
104 #define TRACE_FIELD_SIGN(type, item, assign, is_signed) \
105         TRACE_FIELD(type, item, assign)
106
107 #undef TRACE_FIELD_ZERO
108 #define TRACE_FIELD_ZERO(type, item)
109
110 #undef TP_CMD
111 #define TP_CMD(cmd...)  cmd
112
113 #undef TRACE_ENTRY
114 #define TRACE_ENTRY     entry
115
116 #undef TRACE_FIELD_SPECIAL
117 #define TRACE_FIELD_SPECIAL(type_item, item, len, cmd)  \
118         cmd;
119
120 static int ftrace_raw_init_event(struct ftrace_event_call *event_call)
121 {
122         INIT_LIST_HEAD(&event_call->fields);
123
124         return 0;
125 }
126
127 #undef TRACE_EVENT_FORMAT
128 #define TRACE_EVENT_FORMAT(call, proto, args, fmt, tstruct, tpfmt)      \
129 int ftrace_define_fields_##call(struct ftrace_event_call *event_call);  \
130                                                                         \
131 struct ftrace_event_call __used                                         \
132 __attribute__((__aligned__(4)))                                         \
133 __attribute__((section("_ftrace_events"))) event_##call = {             \
134         .name                   = #call,                                \
135         .id                     = proto,                                \
136         .system                 = __stringify(TRACE_SYSTEM),            \
137         .raw_init               = ftrace_raw_init_event,                \
138         .show_format            = ftrace_format_##call,                 \
139         .define_fields          = ftrace_define_fields_##call,          \
140 };                                                                      \
141
142 #undef TRACE_EVENT_FORMAT_NOFILTER
143 #define TRACE_EVENT_FORMAT_NOFILTER(call, proto, args, fmt, tstruct,    \
144                                     tpfmt)                              \
145                                                                         \
146 struct ftrace_event_call __used                                         \
147 __attribute__((__aligned__(4)))                                         \
148 __attribute__((section("_ftrace_events"))) event_##call = {             \
149         .name                   = #call,                                \
150         .id                     = proto,                                \
151         .system                 = __stringify(TRACE_SYSTEM),            \
152         .show_format            = ftrace_format_##call,                 \
153 };
154
155 #include "trace_event_types.h"
156
157 #undef TRACE_FIELD
158 #define TRACE_FIELD(type, item, assign)                                 \
159         ret = trace_define_field(event_call, #type, #item,              \
160                                  offsetof(typeof(field), item),         \
161                                  sizeof(field.item),                    \
162                                  is_signed_type(type), FILTER_OTHER);   \
163         if (ret)                                                        \
164                 return ret;
165
166 #undef TRACE_FIELD_SPECIAL
167 #define TRACE_FIELD_SPECIAL(type, item, len, cmd)                       \
168         ret = trace_define_field(event_call, #type "[" #len "]", #item, \
169                                  offsetof(typeof(field), item),         \
170                                  sizeof(field.item), 0, FILTER_OTHER);  \
171         if (ret)                                                        \
172                 return ret;
173
174 #undef TRACE_FIELD_SIGN
175 #define TRACE_FIELD_SIGN(type, item, assign, is_signed)                 \
176         ret = trace_define_field(event_call, #type, #item,              \
177                                  offsetof(typeof(field), item),         \
178                                  sizeof(field.item), is_signed,         \
179                                  FILTER_OTHER);                         \
180         if (ret)                                                        \
181                 return ret;
182
183 #undef TRACE_FIELD_ZERO
184 #define TRACE_FIELD_ZERO(type, item)
185
186 #undef TRACE_EVENT_FORMAT
187 #define TRACE_EVENT_FORMAT(call, proto, args, fmt, tstruct, tpfmt)      \
188 int                                                                     \
189 ftrace_define_fields_##call(struct ftrace_event_call *event_call)       \
190 {                                                                       \
191         struct args field;                                              \
192         int ret;                                                        \
193                                                                         \
194         ret = trace_define_common_fields(event_call);                   \
195         if (ret)                                                        \
196                 return ret;                                             \
197                                                                         \
198         tstruct;                                                        \
199                                                                         \
200         return ret;                                                     \
201 }
202
203 #undef TRACE_EVENT_FORMAT_NOFILTER
204 #define TRACE_EVENT_FORMAT_NOFILTER(call, proto, args, fmt, tstruct,    \
205                                     tpfmt)
206
207 #include "trace_event_types.h"