Branch data Line data Source code
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 : : #undef TRACE_SYSTEM
19 : : #define TRACE_SYSTEM ftrace
20 : :
21 : : /*
22 : : * The FTRACE_ENTRY_REG macro allows ftrace entry to define register
23 : : * function and thus become accesible via perf.
24 : : */
25 : : #undef FTRACE_ENTRY_REG
26 : : #define FTRACE_ENTRY_REG(name, struct_name, id, tstruct, print, \
27 : : filter, regfn) \
28 : : FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print), \
29 : : filter)
30 : :
31 : : /* not needed for this file */
32 : : #undef __field_struct
33 : : #define __field_struct(type, item)
34 : :
35 : : #undef __field
36 : : #define __field(type, item) type item;
37 : :
38 : : #undef __field_desc
39 : : #define __field_desc(type, container, item) type item;
40 : :
41 : : #undef __array
42 : : #define __array(type, item, size) type item[size];
43 : :
44 : : #undef __array_desc
45 : : #define __array_desc(type, container, item, size) type item[size];
46 : :
47 : : #undef __dynamic_array
48 : : #define __dynamic_array(type, item) type item[];
49 : :
50 : : #undef F_STRUCT
51 : : #define F_STRUCT(args...) args
52 : :
53 : : #undef F_printk
54 : : #define F_printk(fmt, args...) fmt, args
55 : :
56 : : #undef FTRACE_ENTRY
57 : : #define FTRACE_ENTRY(name, struct_name, id, tstruct, print, filter) \
58 : : struct ____ftrace_##name { \
59 : : tstruct \
60 : : }; \
61 : : static void __always_unused ____ftrace_check_##name(void) \
62 : : { \
63 : : struct ____ftrace_##name *__entry = NULL; \
64 : : \
65 : : /* force compile-time check on F_printk() */ \
66 : : printk(print); \
67 : : }
68 : :
69 : : #undef FTRACE_ENTRY_DUP
70 : : #define FTRACE_ENTRY_DUP(name, struct_name, id, tstruct, print, filter) \
71 : : FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print), \
72 : : filter)
73 : :
74 : : #include "trace_entries.h"
75 : :
76 : : #undef __field
77 : : #define __field(type, item) \
78 : : ret = trace_define_field(event_call, #type, #item, \
79 : : offsetof(typeof(field), item), \
80 : : sizeof(field.item), \
81 : : is_signed_type(type), filter_type); \
82 : : if (ret) \
83 : : return ret;
84 : :
85 : : #undef __field_desc
86 : : #define __field_desc(type, container, item) \
87 : : ret = trace_define_field(event_call, #type, #item, \
88 : : offsetof(typeof(field), \
89 : : container.item), \
90 : : sizeof(field.container.item), \
91 : : is_signed_type(type), filter_type); \
92 : : if (ret) \
93 : : return ret;
94 : :
95 : : #undef __array
96 : : #define __array(type, item, len) \
97 : : do { \
98 : : char *type_str = #type"["__stringify(len)"]"; \
99 : : BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \
100 : : ret = trace_define_field(event_call, type_str, #item, \
101 : : offsetof(typeof(field), item), \
102 : : sizeof(field.item), \
103 : : is_signed_type(type), filter_type); \
104 : : if (ret) \
105 : : return ret; \
106 : : } while (0);
107 : :
108 : : #undef __array_desc
109 : : #define __array_desc(type, container, item, len) \
110 : : BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \
111 : : ret = trace_define_field(event_call, #type "[" #len "]", #item, \
112 : : offsetof(typeof(field), \
113 : : container.item), \
114 : : sizeof(field.container.item), \
115 : : is_signed_type(type), filter_type); \
116 : : if (ret) \
117 : : return ret;
118 : :
119 : : #undef __dynamic_array
120 : : #define __dynamic_array(type, item) \
121 : : ret = trace_define_field(event_call, #type, #item, \
122 : : offsetof(typeof(field), item), \
123 : : 0, is_signed_type(type), filter_type);\
124 : : if (ret) \
125 : : return ret;
126 : :
127 : : #undef FTRACE_ENTRY
128 : : #define FTRACE_ENTRY(name, struct_name, id, tstruct, print, filter) \
129 : : static int __init \
130 : : ftrace_define_fields_##name(struct ftrace_event_call *event_call) \
131 : : { \
132 : : struct struct_name field; \
133 : : int ret; \
134 : : int filter_type = filter; \
135 : : \
136 : : tstruct; \
137 : : \
138 : : return ret; \
139 : : }
140 : :
141 : : #include "trace_entries.h"
142 : :
143 : : #undef __entry
144 : : #define __entry REC
145 : :
146 : : #undef __field
147 : : #define __field(type, item)
148 : :
149 : : #undef __field_desc
150 : : #define __field_desc(type, container, item)
151 : :
152 : : #undef __array
153 : : #define __array(type, item, len)
154 : :
155 : : #undef __array_desc
156 : : #define __array_desc(type, container, item, len)
157 : :
158 : : #undef __dynamic_array
159 : : #define __dynamic_array(type, item)
160 : :
161 : : #undef F_printk
162 : : #define F_printk(fmt, args...) __stringify(fmt) ", " __stringify(args)
163 : :
164 : : #undef FTRACE_ENTRY_REG
165 : : #define FTRACE_ENTRY_REG(call, struct_name, etype, tstruct, print, filter,\
166 : : regfn) \
167 : : \
168 : : struct ftrace_event_class __refdata event_class_ftrace_##call = { \
169 : : .system = __stringify(TRACE_SYSTEM), \
170 : : .define_fields = ftrace_define_fields_##call, \
171 : : .fields = LIST_HEAD_INIT(event_class_ftrace_##call.fields),\
172 : : .reg = regfn, \
173 : : }; \
174 : : \
175 : : struct ftrace_event_call __used event_##call = { \
176 : : .name = #call, \
177 : : .event.type = etype, \
178 : : .class = &event_class_ftrace_##call, \
179 : : .print_fmt = print, \
180 : : .flags = TRACE_EVENT_FL_IGNORE_ENABLE | TRACE_EVENT_FL_USE_CALL_FILTER, \
181 : : }; \
182 : : struct ftrace_event_call __used \
183 : : __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call;
184 : :
185 : : #undef FTRACE_ENTRY
186 : : #define FTRACE_ENTRY(call, struct_name, etype, tstruct, print, filter) \
187 : : FTRACE_ENTRY_REG(call, struct_name, etype, \
188 : : PARAMS(tstruct), PARAMS(print), filter, NULL)
189 : :
190 : 0 : int ftrace_event_is_function(struct ftrace_event_call *call)
191 : : {
192 : 0 : return call == &event_function;
193 : : }
194 : :
195 : : #include "trace_entries.h"
|