blob: 4cb29d84d73a3c33325f908865c09ad00fc94e1f [file] [log] [blame]
Steven Rostedt770cb242009-03-05 21:35:29 -05001/*
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
Steven Rostedt4e5292e2009-09-12 19:26:21 -040018#undef TRACE_SYSTEM
19#define TRACE_SYSTEM ftrace
Steven Rostedtda4d0302009-03-09 17:14:30 -040020
Steven Rostedt4e5292e2009-09-12 19:26:21 -040021/* not needed for this file */
22#undef __field_struct
23#define __field_struct(type, item)
Steven Rostedtda4d0302009-03-09 17:14:30 -040024
Steven Rostedt4e5292e2009-09-12 19:26:21 -040025#undef __field
26#define __field(type, item) \
Steven Rostedtda4d0302009-03-09 17:14:30 -040027 ret = trace_seq_printf(s, "\tfield:" #type " " #item ";\t" \
Steven Rostedt4e5292e2009-09-12 19:26:21 -040028 "offset:%zu;\tsize:%zu;\n", \
29 offsetof(typeof(field), item), \
30 sizeof(field.item)); \
Steven Rostedtda4d0302009-03-09 17:14:30 -040031 if (!ret) \
32 return 0;
33
Steven Rostedt4e5292e2009-09-12 19:26:21 -040034#undef __field_desc
35#define __field_desc(type, container, item) \
36 ret = trace_seq_printf(s, "\tfield:" #type " " #item ";\t" \
37 "offset:%zu;\tsize:%zu;\n", \
38 offsetof(typeof(field), container.item), \
39 sizeof(field.container.item)); \
Steven Rostedtda4d0302009-03-09 17:14:30 -040040 if (!ret) \
41 return 0;
Steven Rostedt770cb242009-03-05 21:35:29 -050042
Steven Rostedt4e5292e2009-09-12 19:26:21 -040043#undef __array
44#define __array(type, item, len) \
45 ret = trace_seq_printf(s, "\tfield:" #type " " #item "[" #len "];\t" \
46 "offset:%zu;\tsize:%zu;\n", \
47 offsetof(typeof(field), item), \
48 sizeof(field.item)); \
Steven Rostedt156b5f12009-03-06 10:50:53 -050049 if (!ret) \
Steven Rostedt770cb242009-03-05 21:35:29 -050050 return 0;
51
Steven Rostedt4e5292e2009-09-12 19:26:21 -040052#undef __array_desc
53#define __array_desc(type, container, item, len) \
54 ret = trace_seq_printf(s, "\tfield:" #type " " #item "[" #len "];\t" \
55 "offset:%zu;\tsize:%zu;\n", \
56 offsetof(typeof(field), container.item), \
57 sizeof(field.container.item)); \
58 if (!ret) \
59 return 0;
Steven Rostedt770cb242009-03-05 21:35:29 -050060
Steven Rostedt4e5292e2009-09-12 19:26:21 -040061#undef __dynamic_array
62#define __dynamic_array(type, item) \
63 ret = trace_seq_printf(s, "\tfield:" #type " " #item ";\t" \
64 "offset:%zu;\tsize:0;\n", \
65 offsetof(typeof(field), item)); \
66 if (!ret) \
67 return 0;
Steven Rostedt770cb242009-03-05 21:35:29 -050068
Steven Rostedt4e5292e2009-09-12 19:26:21 -040069#undef F_printk
70#define F_printk(fmt, args...) "%s, %s\n", #fmt, __stringify(args)
71
72#undef __entry
73#define __entry REC
74
75#undef FTRACE_ENTRY
76#define FTRACE_ENTRY(name, struct_name, id, tstruct, print) \
Steven Rostedt770cb242009-03-05 21:35:29 -050077static int \
Steven Rostedt4e5292e2009-09-12 19:26:21 -040078ftrace_format_##name(struct ftrace_event_call *unused, \
79 struct trace_seq *s) \
Steven Rostedt770cb242009-03-05 21:35:29 -050080{ \
Steven Rostedt4e5292e2009-09-12 19:26:21 -040081 struct struct_name field __attribute__((unused)); \
82 int ret = 0; \
Steven Rostedt770cb242009-03-05 21:35:29 -050083 \
84 tstruct; \
85 \
Steven Rostedt4e5292e2009-09-12 19:26:21 -040086 trace_seq_printf(s, "\nprint fmt: " print); \
Steven Rostedt770cb242009-03-05 21:35:29 -050087 \
88 return ret; \
89}
90
Steven Rostedt4e5292e2009-09-12 19:26:21 -040091#undef FTRACE_ENTRY_DUP
92#define FTRACE_ENTRY_DUP(name, struct_name, id, tstruct, print) \
93 FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print))
94
95#include "trace_entries.h"
96
97
98#undef __field
99#define __field(type, item) \
100 ret = trace_define_field(event_call, #type, #item, \
101 offsetof(typeof(field), item), \
102 sizeof(field.item), \
103 is_signed_type(type), FILTER_OTHER); \
104 if (ret) \
105 return ret;
106
107#undef __field_desc
108#define __field_desc(type, container, item) \
109 ret = trace_define_field(event_call, #type, #item, \
110 offsetof(typeof(field), \
111 container.item), \
112 sizeof(field.container.item), \
113 is_signed_type(type), FILTER_OTHER); \
114 if (ret) \
115 return ret;
116
117#undef __array
118#define __array(type, item, len) \
119 BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \
120 ret = trace_define_field(event_call, #type "[" #len "]", #item, \
121 offsetof(typeof(field), item), \
122 sizeof(field.item), 0, FILTER_OTHER); \
123 if (ret) \
124 return ret;
125
126#undef __array_desc
127#define __array_desc(type, container, item, len) \
128 BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \
129 ret = trace_define_field(event_call, #type "[" #len "]", #item, \
130 offsetof(typeof(field), \
131 container.item), \
132 sizeof(field.container.item), 0, \
133 FILTER_OTHER); \
134 if (ret) \
135 return ret;
136
137#undef __dynamic_array
138#define __dynamic_array(type, item)
139
140#undef FTRACE_ENTRY
141#define FTRACE_ENTRY(name, struct_name, id, tstruct, print) \
142int \
143ftrace_define_fields_##name(struct ftrace_event_call *event_call) \
Tom Zanussie45f2e22009-03-31 00:49:16 -0500144{ \
Steven Rostedt4e5292e2009-09-12 19:26:21 -0400145 struct struct_name field; \
Tom Zanussie45f2e22009-03-31 00:49:16 -0500146 int ret; \
147 \
Steven Rostedt4e5292e2009-09-12 19:26:21 -0400148 ret = trace_define_common_fields(event_call); \
149 if (ret) \
150 return ret; \
Tom Zanussie45f2e22009-03-31 00:49:16 -0500151 \
Steven Rostedt4e5292e2009-09-12 19:26:21 -0400152 tstruct; \
Tom Zanussie45f2e22009-03-31 00:49:16 -0500153 \
154 return ret; \
155}
156
Steven Rostedt4e5292e2009-09-12 19:26:21 -0400157#include "trace_entries.h"
158
159
160#undef __field
161#define __field(type, item)
162
163#undef __field_desc
164#define __field_desc(type, container, item)
165
166#undef __array
167#define __array(type, item, len)
168
169#undef __array_desc
170#define __array_desc(type, container, item, len)
171
172#undef __dynamic_array
173#define __dynamic_array(type, item)
174
Steven Rostedt770cb242009-03-05 21:35:29 -0500175
176#undef TRACE_ZERO_CHAR
177#define TRACE_ZERO_CHAR(arg)
178
179#undef TRACE_FIELD
180#define TRACE_FIELD(type, item, assign)\
181 entry->item = assign;
182
183#undef TRACE_FIELD
184#define TRACE_FIELD(type, item, assign)\
185 entry->item = assign;
186
Tom Zanussia118e4d2009-04-28 03:04:53 -0500187#undef TRACE_FIELD_SIGN
188#define TRACE_FIELD_SIGN(type, item, assign, is_signed) \
189 TRACE_FIELD(type, item, assign)
190
Steven Rostedt2939b042009-03-09 15:47:18 -0400191#undef TP_CMD
192#define TP_CMD(cmd...) cmd
Steven Rostedt770cb242009-03-05 21:35:29 -0500193
194#undef TRACE_ENTRY
195#define TRACE_ENTRY entry
196
197#undef TRACE_FIELD_SPECIAL
Tom Zanussie1112b42009-03-31 00:48:49 -0500198#define TRACE_FIELD_SPECIAL(type_item, item, len, cmd) \
Steven Rostedt770cb242009-03-05 21:35:29 -0500199 cmd;
200
Steven Rostedt4e5292e2009-09-12 19:26:21 -0400201#undef FTRACE_ENTRY
202#define FTRACE_ENTRY(call, struct_name, type, tstruct, print) \
Tom Zanussie1112b42009-03-31 00:48:49 -0500203static int ftrace_raw_init_event_##call(void); \
Steven Rostedt770cb242009-03-05 21:35:29 -0500204 \
Tom Zanussie1112b42009-03-31 00:48:49 -0500205struct ftrace_event_call __used \
Steven Rostedt770cb242009-03-05 21:35:29 -0500206__attribute__((__aligned__(4))) \
207__attribute__((section("_ftrace_events"))) event_##call = { \
Steven Rostedtef180122009-03-10 14:10:56 -0400208 .name = #call, \
Steven Rostedt4e5292e2009-09-12 19:26:21 -0400209 .id = type, \
Steven Rostedt770cb242009-03-05 21:35:29 -0500210 .system = __stringify(TRACE_SYSTEM), \
Tom Zanussie1112b42009-03-31 00:48:49 -0500211 .raw_init = ftrace_raw_init_event_##call, \
Steven Rostedt770cb242009-03-05 21:35:29 -0500212 .show_format = ftrace_format_##call, \
Tom Zanussie1112b42009-03-31 00:48:49 -0500213 .define_fields = ftrace_define_fields_##call, \
214}; \
215static int ftrace_raw_init_event_##call(void) \
216{ \
217 INIT_LIST_HEAD(&event_##call.fields); \
218 return 0; \
219} \
220
Steven Rostedt4e5292e2009-09-12 19:26:21 -0400221#include "trace_entries.h"