]>
Commit | Line | Data |
---|---|---|
bb730b58 | 1 | // SPDX-License-Identifier: GPL-2.0 |
0a1c49db SR |
2 | /* |
3 | * This file defines the trace event structures that go into the ring | |
4 | * buffer directly. They are created via macros so that changes for them | |
5 | * appear in the format file. Using macros will automate this process. | |
6 | * | |
7 | * The macro used to create a ftrace data structure is: | |
8 | * | |
9 | * FTRACE_ENTRY( name, struct_name, id, structure, print ) | |
10 | * | |
11 | * @name: the name used the event name, as well as the name of | |
12 | * the directory that holds the format file. | |
13 | * | |
14 | * @struct_name: the name of the structure that is created. | |
15 | * | |
16 | * @id: The event identifier that is used to detect what event | |
17 | * this is from the ring buffer. | |
18 | * | |
19 | * @structure: the structure layout | |
20 | * | |
21 | * - __field( type, item ) | |
22 | * This is equivalent to declaring | |
23 | * type item; | |
24 | * in the structure. | |
25 | * - __array( type, item, size ) | |
26 | * This is equivalent to declaring | |
27 | * type item[size]; | |
28 | * in the structure. | |
29 | * | |
d7315094 | 30 | * * for structures within structures, the format of the internal |
25985edc | 31 | * structure is laid out. This allows the internal structure |
d7315094 SR |
32 | * to be deciphered for the format file. Although these macros |
33 | * may become out of sync with the internal structure, they | |
34 | * will create a compile error if it happens. Since the | |
35 | * internel structures are just tracing helpers, this is not | |
36 | * an issue. | |
37 | * | |
38 | * When an internal structure is used, it should use: | |
39 | * | |
40 | * __field_struct( type, item ) | |
41 | * | |
42 | * instead of __field. This will prevent it from being shown in | |
43 | * the output file. The fields in the structure should use. | |
44 | * | |
45 | * __field_desc( type, container, item ) | |
46 | * __array_desc( type, container, item, len ) | |
47 | * | |
48 | * type, item and len are the same as __field and __array, but | |
49 | * container is added. This is the name of the item in | |
50 | * __field_struct that this is describing. | |
51 | * | |
52 | * | |
0a1c49db SR |
53 | * @print: the print format shown to users in the format file. |
54 | */ | |
55 | ||
56 | /* | |
b595076a | 57 | * Function trace entry - function address and parent function address: |
0a1c49db | 58 | */ |
ced39002 | 59 | FTRACE_ENTRY_REG(function, ftrace_entry, |
0a1c49db SR |
60 | |
61 | TRACE_FN, | |
62 | ||
63 | F_STRUCT( | |
64 | __field( unsigned long, ip ) | |
65 | __field( unsigned long, parent_ip ) | |
66 | ), | |
67 | ||
85acbb21 CD |
68 | F_printk(" %ps <-- %ps", |
69 | (void *)__entry->ip, (void *)__entry->parent_ip), | |
ced39002 | 70 | |
02aa3162 JO |
71 | FILTER_TRACE_FN, |
72 | ||
ced39002 | 73 | perf_ftrace_event_register |
0a1c49db SR |
74 | ); |
75 | ||
76 | /* Function call entry */ | |
a4a551b8 | 77 | FTRACE_ENTRY_PACKED(funcgraph_entry, ftrace_graph_ent_entry, |
0a1c49db SR |
78 | |
79 | TRACE_GRAPH_ENT, | |
80 | ||
81 | F_STRUCT( | |
d7315094 SR |
82 | __field_struct( struct ftrace_graph_ent, graph_ent ) |
83 | __field_desc( unsigned long, graph_ent, func ) | |
84 | __field_desc( int, graph_ent, depth ) | |
0a1c49db SR |
85 | ), |
86 | ||
85acbb21 | 87 | F_printk("--> %ps (%d)", (void *)__entry->func, __entry->depth), |
02aa3162 JO |
88 | |
89 | FILTER_OTHER | |
0a1c49db SR |
90 | ); |
91 | ||
92 | /* Function return entry */ | |
a4a551b8 | 93 | FTRACE_ENTRY_PACKED(funcgraph_exit, ftrace_graph_ret_entry, |
0a1c49db SR |
94 | |
95 | TRACE_GRAPH_RET, | |
96 | ||
97 | F_STRUCT( | |
d7315094 SR |
98 | __field_struct( struct ftrace_graph_ret, ret ) |
99 | __field_desc( unsigned long, ret, func ) | |
100 | __field_desc( unsigned long long, ret, calltime) | |
101 | __field_desc( unsigned long long, ret, rettime ) | |
102 | __field_desc( unsigned long, ret, overrun ) | |
103 | __field_desc( int, ret, depth ) | |
0a1c49db SR |
104 | ), |
105 | ||
85acbb21 CD |
106 | F_printk("<-- %ps (%d) (start: %llx end: %llx) over: %d", |
107 | (void *)__entry->func, __entry->depth, | |
c16de8fd | 108 | __entry->calltime, __entry->rettime, |
02aa3162 JO |
109 | __entry->depth), |
110 | ||
111 | FILTER_OTHER | |
0a1c49db SR |
112 | ); |
113 | ||
114 | /* | |
115 | * Context switch trace entry - which task (and prio) we switched from/to: | |
116 | * | |
117 | * This is used for both wakeup and context switches. We only want | |
118 | * to create one structure, but we need two outputs for it. | |
119 | */ | |
120 | #define FTRACE_CTX_FIELDS \ | |
121 | __field( unsigned int, prev_pid ) \ | |
140e4f2d DS |
122 | __field( unsigned int, next_pid ) \ |
123 | __field( unsigned int, next_cpu ) \ | |
0a1c49db SR |
124 | __field( unsigned char, prev_prio ) \ |
125 | __field( unsigned char, prev_state ) \ | |
0a1c49db | 126 | __field( unsigned char, next_prio ) \ |
140e4f2d | 127 | __field( unsigned char, next_state ) |
0a1c49db | 128 | |
0a1c49db SR |
129 | FTRACE_ENTRY(context_switch, ctx_switch_entry, |
130 | ||
131 | TRACE_CTX, | |
132 | ||
133 | F_STRUCT( | |
134 | FTRACE_CTX_FIELDS | |
135 | ), | |
136 | ||
c16de8fd | 137 | F_printk("%u:%u:%u ==> %u:%u:%u [%03u]", |
0a1c49db SR |
138 | __entry->prev_pid, __entry->prev_prio, __entry->prev_state, |
139 | __entry->next_pid, __entry->next_prio, __entry->next_state, | |
02aa3162 JO |
140 | __entry->next_cpu), |
141 | ||
142 | FILTER_OTHER | |
0a1c49db SR |
143 | ); |
144 | ||
145 | /* | |
146 | * FTRACE_ENTRY_DUP only creates the format file, it will not | |
147 | * create another structure. | |
148 | */ | |
149 | FTRACE_ENTRY_DUP(wakeup, ctx_switch_entry, | |
150 | ||
151 | TRACE_WAKE, | |
152 | ||
153 | F_STRUCT( | |
154 | FTRACE_CTX_FIELDS | |
155 | ), | |
156 | ||
157 | F_printk("%u:%u:%u ==+ %u:%u:%u [%03u]", | |
158 | __entry->prev_pid, __entry->prev_prio, __entry->prev_state, | |
159 | __entry->next_pid, __entry->next_prio, __entry->next_state, | |
02aa3162 JO |
160 | __entry->next_cpu), |
161 | ||
162 | FILTER_OTHER | |
0a1c49db SR |
163 | ); |
164 | ||
0a1c49db SR |
165 | /* |
166 | * Stack-trace entry: | |
167 | */ | |
168 | ||
169 | #define FTRACE_STACK_ENTRIES 8 | |
170 | ||
171 | FTRACE_ENTRY(kernel_stack, stack_entry, | |
172 | ||
173 | TRACE_STACK, | |
174 | ||
175 | F_STRUCT( | |
4a9bd3f1 SR |
176 | __field( int, size ) |
177 | __dynamic_array(unsigned long, caller ) | |
0a1c49db SR |
178 | ), |
179 | ||
85acbb21 CD |
180 | F_printk("\t=> %ps\n\t=> %ps\n\t=> %ps\n" |
181 | "\t=> %ps\n\t=> %ps\n\t=> %ps\n" | |
182 | "\t=> %ps\n\t=> %ps\n", | |
183 | (void *)__entry->caller[0], (void *)__entry->caller[1], | |
184 | (void *)__entry->caller[2], (void *)__entry->caller[3], | |
185 | (void *)__entry->caller[4], (void *)__entry->caller[5], | |
186 | (void *)__entry->caller[6], (void *)__entry->caller[7]), | |
02aa3162 JO |
187 | |
188 | FILTER_OTHER | |
0a1c49db SR |
189 | ); |
190 | ||
191 | FTRACE_ENTRY(user_stack, userstack_entry, | |
192 | ||
193 | TRACE_USER_STACK, | |
194 | ||
195 | F_STRUCT( | |
196 | __field( unsigned int, tgid ) | |
197 | __array( unsigned long, caller, FTRACE_STACK_ENTRIES ) | |
198 | ), | |
199 | ||
85acbb21 CD |
200 | F_printk("\t=> %ps\n\t=> %ps\n\t=> %ps\n" |
201 | "\t=> %ps\n\t=> %ps\n\t=> %ps\n" | |
202 | "\t=> %ps\n\t=> %ps\n", | |
203 | (void *)__entry->caller[0], (void *)__entry->caller[1], | |
204 | (void *)__entry->caller[2], (void *)__entry->caller[3], | |
205 | (void *)__entry->caller[4], (void *)__entry->caller[5], | |
206 | (void *)__entry->caller[6], (void *)__entry->caller[7]), | |
02aa3162 JO |
207 | |
208 | FILTER_OTHER | |
0a1c49db SR |
209 | ); |
210 | ||
211 | /* | |
212 | * trace_printk entry: | |
213 | */ | |
214 | FTRACE_ENTRY(bprint, bprint_entry, | |
215 | ||
216 | TRACE_BPRINT, | |
217 | ||
218 | F_STRUCT( | |
219 | __field( unsigned long, ip ) | |
220 | __field( const char *, fmt ) | |
221 | __dynamic_array( u32, buf ) | |
222 | ), | |
223 | ||
bbedb179 | 224 | F_printk("%ps: %s", |
09ae7234 | 225 | (void *)__entry->ip, __entry->fmt), |
02aa3162 JO |
226 | |
227 | FILTER_OTHER | |
0a1c49db SR |
228 | ); |
229 | ||
3dd80953 | 230 | FTRACE_ENTRY_REG(print, print_entry, |
0a1c49db SR |
231 | |
232 | TRACE_PRINT, | |
233 | ||
234 | F_STRUCT( | |
235 | __field( unsigned long, ip ) | |
236 | __dynamic_array( char, buf ) | |
237 | ), | |
238 | ||
bbedb179 | 239 | F_printk("%ps: %s", |
09ae7234 SRRH |
240 | (void *)__entry->ip, __entry->buf), |
241 | ||
3dd80953 SRV |
242 | FILTER_OTHER, |
243 | ||
244 | ftrace_event_register | |
09ae7234 SRRH |
245 | ); |
246 | ||
fa32e855 SR |
247 | FTRACE_ENTRY(raw_data, raw_data_entry, |
248 | ||
249 | TRACE_RAW_DATA, | |
250 | ||
251 | F_STRUCT( | |
252 | __field( unsigned int, id ) | |
253 | __dynamic_array( char, buf ) | |
254 | ), | |
255 | ||
256 | F_printk("id:%04x %08x", | |
257 | __entry->id, (int)__entry->buf[0]), | |
258 | ||
259 | FILTER_OTHER | |
260 | ); | |
261 | ||
09ae7234 SRRH |
262 | FTRACE_ENTRY(bputs, bputs_entry, |
263 | ||
264 | TRACE_BPUTS, | |
265 | ||
266 | F_STRUCT( | |
267 | __field( unsigned long, ip ) | |
268 | __field( const char *, str ) | |
269 | ), | |
270 | ||
bbedb179 | 271 | F_printk("%ps: %s", |
09ae7234 | 272 | (void *)__entry->ip, __entry->str), |
02aa3162 JO |
273 | |
274 | FILTER_OTHER | |
0a1c49db SR |
275 | ); |
276 | ||
277 | FTRACE_ENTRY(mmiotrace_rw, trace_mmiotrace_rw, | |
278 | ||
279 | TRACE_MMIO_RW, | |
280 | ||
281 | F_STRUCT( | |
d7315094 SR |
282 | __field_struct( struct mmiotrace_rw, rw ) |
283 | __field_desc( resource_size_t, rw, phys ) | |
284 | __field_desc( unsigned long, rw, value ) | |
285 | __field_desc( unsigned long, rw, pc ) | |
286 | __field_desc( int, rw, map_id ) | |
287 | __field_desc( unsigned char, rw, opcode ) | |
288 | __field_desc( unsigned char, rw, width ) | |
0a1c49db SR |
289 | ), |
290 | ||
c16de8fd LZ |
291 | F_printk("%lx %lx %lx %d %x %x", |
292 | (unsigned long)__entry->phys, __entry->value, __entry->pc, | |
02aa3162 JO |
293 | __entry->map_id, __entry->opcode, __entry->width), |
294 | ||
295 | FILTER_OTHER | |
0a1c49db SR |
296 | ); |
297 | ||
298 | FTRACE_ENTRY(mmiotrace_map, trace_mmiotrace_map, | |
299 | ||
300 | TRACE_MMIO_MAP, | |
301 | ||
302 | F_STRUCT( | |
d7315094 SR |
303 | __field_struct( struct mmiotrace_map, map ) |
304 | __field_desc( resource_size_t, map, phys ) | |
305 | __field_desc( unsigned long, map, virt ) | |
306 | __field_desc( unsigned long, map, len ) | |
307 | __field_desc( int, map, map_id ) | |
308 | __field_desc( unsigned char, map, opcode ) | |
0a1c49db SR |
309 | ), |
310 | ||
c16de8fd LZ |
311 | F_printk("%lx %lx %lx %d %x", |
312 | (unsigned long)__entry->phys, __entry->virt, __entry->len, | |
02aa3162 JO |
313 | __entry->map_id, __entry->opcode), |
314 | ||
315 | FILTER_OTHER | |
0a1c49db SR |
316 | ); |
317 | ||
0a1c49db SR |
318 | |
319 | #define TRACE_FUNC_SIZE 30 | |
320 | #define TRACE_FILE_SIZE 20 | |
321 | ||
322 | FTRACE_ENTRY(branch, trace_branch, | |
323 | ||
324 | TRACE_BRANCH, | |
325 | ||
326 | F_STRUCT( | |
327 | __field( unsigned int, line ) | |
328 | __array( char, func, TRACE_FUNC_SIZE+1 ) | |
329 | __array( char, file, TRACE_FILE_SIZE+1 ) | |
330 | __field( char, correct ) | |
068f530b | 331 | __field( char, constant ) |
0a1c49db SR |
332 | ), |
333 | ||
068f530b | 334 | F_printk("%u:%s:%s (%u)%s", |
0a1c49db | 335 | __entry->line, |
068f530b SRV |
336 | __entry->func, __entry->file, __entry->correct, |
337 | __entry->constant ? " CONSTANT" : ""), | |
02aa3162 JO |
338 | |
339 | FILTER_OTHER | |
0a1c49db SR |
340 | ); |
341 | ||
e7c15cd8 SRRH |
342 | |
343 | FTRACE_ENTRY(hwlat, hwlat_entry, | |
344 | ||
345 | TRACE_HWLAT, | |
346 | ||
347 | F_STRUCT( | |
348 | __field( u64, duration ) | |
349 | __field( u64, outer_duration ) | |
7b2c8625 | 350 | __field( u64, nmi_total_ts ) |
51aad0ae DD |
351 | __field_struct( struct timespec64, timestamp ) |
352 | __field_desc( s64, timestamp, tv_sec ) | |
e7c15cd8 | 353 | __field_desc( long, timestamp, tv_nsec ) |
7b2c8625 | 354 | __field( unsigned int, nmi_count ) |
e7c15cd8 SRRH |
355 | __field( unsigned int, seqnum ) |
356 | ), | |
357 | ||
9a0fd675 | 358 | F_printk("cnt:%u\tts:%010llu.%010lu\tinner:%llu\touter:%llu\tnmi-ts:%llu\tnmi-count:%u\n", |
e7c15cd8 SRRH |
359 | __entry->seqnum, |
360 | __entry->tv_sec, | |
361 | __entry->tv_nsec, | |
362 | __entry->duration, | |
7b2c8625 SRRH |
363 | __entry->outer_duration, |
364 | __entry->nmi_total_ts, | |
365 | __entry->nmi_count), | |
e7c15cd8 SRRH |
366 | |
367 | FILTER_OTHER | |
368 | ); |