Refactoring: event structures
[lttng-modules.git] / include / lttng / tracepoint-event-impl.h
CommitLineData
b7cdc182 1/* SPDX-License-Identifier: (GPL-2.0-only or LGPL-2.1-only)
9f36eaed 2 *
3b4aafcb 3 * lttng/tracepoint-event-impl.h
17baffe2
MD
4 *
5 * Copyright (C) 2009 Steven Rostedt <rostedt@goodmis.org>
f127e61e 6 * Copyright (C) 2009-2014 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
17baffe2 7 */
f127e61e 8
d28686c1 9#include <linux/uaccess.h>
d0dd2ecb 10#include <linux/debugfs.h>
f127e61e 11#include <linux/rculist.h>
43803cf2 12#include <asm/byteorder.h>
bf1a9179 13#include <linux/swab.h>
8d43abb7 14
263b6c88 15#include <wrapper/vmalloc.h> /* for wrapper_vmalloc_sync_mappings() */
24591303
MD
16#include <ringbuffer/frontend_types.h>
17#include <ringbuffer/backend.h>
8d43abb7 18#include <wrapper/rcu.h>
608416e1 19#include <wrapper/user_namespace.h>
2df37e95
MD
20#include <lttng/types.h>
21#include <lttng/probe-user.h>
22#include <lttng/events.h>
a67ba386 23#include <lttng/events-internal.h> /* TODO: remove this include after refactoring is done. */
2df37e95
MD
24#include <lttng/tracer-core.h>
25#include <lttng/tp-mempool.h>
40652b65 26
1d84e8e7
MD
27#define __LTTNG_NULL_STRING "(null)"
28
3b4aafcb
MD
29#undef PARAMS
30#define PARAMS(args...) args
31
40652b65 32/*
6db3d13b 33 * Macro declarations used for all stages.
40652b65
MD
34 */
35
76e4f017
MD
36/*
37 * LTTng name mapping macros. LTTng remaps some of the kernel events to
38 * enforce name-spacing.
39 */
3bc29f0a 40#undef LTTNG_TRACEPOINT_EVENT_MAP
f127e61e 41#define LTTNG_TRACEPOINT_EVENT_MAP(name, map, proto, args, fields) \
3bc29f0a 42 LTTNG_TRACEPOINT_EVENT_CLASS(map, \
76e4f017
MD
43 PARAMS(proto), \
44 PARAMS(args), \
f127e61e 45 PARAMS(fields)) \
3bc29f0a 46 LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(map, name, map, PARAMS(proto), PARAMS(args))
76e4f017 47
3bc29f0a 48#undef LTTNG_TRACEPOINT_EVENT_MAP_NOARGS
f127e61e 49#define LTTNG_TRACEPOINT_EVENT_MAP_NOARGS(name, map, fields) \
3bc29f0a 50 LTTNG_TRACEPOINT_EVENT_CLASS_NOARGS(map, \
f127e61e 51 PARAMS(fields)) \
3bc29f0a 52 LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS(map, name, map)
76e4f017 53
f127e61e 54#undef LTTNG_TRACEPOINT_EVENT_CODE_MAP
265822ae 55#define LTTNG_TRACEPOINT_EVENT_CODE_MAP(name, map, proto, args, _locvar, _code_pre, fields, _code_post) \
f127e61e
MD
56 LTTNG_TRACEPOINT_EVENT_CLASS_CODE(map, \
57 PARAMS(proto), \
58 PARAMS(args), \
59 PARAMS(_locvar), \
265822ae
MD
60 PARAMS(_code_pre), \
61 PARAMS(fields), \
62 PARAMS(_code_post)) \
f127e61e
MD
63 LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(map, name, map, PARAMS(proto), PARAMS(args))
64
3bc29f0a 65#undef LTTNG_TRACEPOINT_EVENT_CODE
265822ae 66#define LTTNG_TRACEPOINT_EVENT_CODE(name, proto, args, _locvar, _code_pre, fields, _code_post) \
f127e61e 67 LTTNG_TRACEPOINT_EVENT_CODE_MAP(name, name, \
7ca580f8
MD
68 PARAMS(proto), \
69 PARAMS(args), \
70 PARAMS(_locvar), \
265822ae
MD
71 PARAMS(_code_pre), \
72 PARAMS(fields), \
73 PARAMS(_code_post))
fcf7fa33 74
40652b65 75/*
3bc29f0a
MD
76 * LTTNG_TRACEPOINT_EVENT_CLASS can be used to add a generic function
77 * handlers for events. That is, if all events have the same parameters
78 * and just have distinct trace points. Each tracepoint can be defined
79 * with LTTNG_TRACEPOINT_EVENT_INSTANCE and that will map the
80 * LTTNG_TRACEPOINT_EVENT_CLASS to the tracepoint.
40652b65 81 *
3bc29f0a
MD
82 * LTTNG_TRACEPOINT_EVENT is a one to one mapping between tracepoint and
83 * template.
40652b65 84 */
6db3d13b 85
3bc29f0a 86#undef LTTNG_TRACEPOINT_EVENT
f127e61e 87#define LTTNG_TRACEPOINT_EVENT(name, proto, args, fields) \
3bc29f0a
MD
88 LTTNG_TRACEPOINT_EVENT_MAP(name, name, \
89 PARAMS(proto), \
90 PARAMS(args), \
f127e61e 91 PARAMS(fields))
40652b65 92
3bc29f0a 93#undef LTTNG_TRACEPOINT_EVENT_NOARGS
f127e61e
MD
94#define LTTNG_TRACEPOINT_EVENT_NOARGS(name, fields) \
95 LTTNG_TRACEPOINT_EVENT_MAP_NOARGS(name, name, PARAMS(fields))
76e4f017 96
3bc29f0a
MD
97#undef LTTNG_TRACEPOINT_EVENT_INSTANCE
98#define LTTNG_TRACEPOINT_EVENT_INSTANCE(template, name, proto, args) \
99 LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(template, name, name, PARAMS(proto), PARAMS(args))
76e4f017 100
3bc29f0a
MD
101#undef LTTNG_TRACEPOINT_EVENT_INSTANCE_NOARGS
102#define LTTNG_TRACEPOINT_EVENT_INSTANCE_NOARGS(template, name) \
103 LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS(template, name, name)
76e4f017 104
3bc29f0a 105#undef LTTNG_TRACEPOINT_EVENT_CLASS
f127e61e 106#define LTTNG_TRACEPOINT_EVENT_CLASS(_name, _proto, _args, _fields) \
3bc29f0a 107 LTTNG_TRACEPOINT_EVENT_CLASS_CODE(_name, PARAMS(_proto), PARAMS(_args), , , \
265822ae 108 PARAMS(_fields), )
7ca580f8 109
3bc29f0a 110#undef LTTNG_TRACEPOINT_EVENT_CLASS_NOARGS
f127e61e 111#define LTTNG_TRACEPOINT_EVENT_CLASS_NOARGS(_name, _fields) \
265822ae 112 LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS(_name, , , PARAMS(_fields), )
7ca580f8
MD
113
114
f62b389e 115/*
c099397a 116 * Stage 1 of the trace events.
f62b389e
MD
117 *
118 * Create dummy trace calls for each events, verifying that the LTTng module
3bc29f0a
MD
119 * instrumentation headers match the kernel arguments. Will be optimized
120 * out by the compiler.
f62b389e
MD
121 */
122
f127e61e 123/* Reset all macros within TRACEPOINT_EVENT */
3b4aafcb 124#include <lttng/events-reset.h>
f62b389e
MD
125
126#undef TP_PROTO
f127e61e 127#define TP_PROTO(...) __VA_ARGS__
f62b389e
MD
128
129#undef TP_ARGS
f127e61e 130#define TP_ARGS(...) __VA_ARGS__
f62b389e 131
3bc29f0a
MD
132#undef LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP
133#define LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(_template, _name, _map, _proto, _args) \
7eb827f2 134void trace_##_name(_proto);
f62b389e 135
3bc29f0a
MD
136#undef LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS
137#define LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS(_template, _name, _map) \
cb1aa0c7 138void trace_##_name(void);
f7bdf4db 139
f62b389e
MD
140#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
141
d0558de2
MD
142/*
143 * Stage 1.1 of the trace events.
144 *
145 * Create dummy trace prototypes for each event class, and for each used
146 * template. This will allow checking whether the prototypes from the
147 * class and the instance using the class actually match.
148 */
149
3b4aafcb 150#include <lttng/events-reset.h> /* Reset all macros within TRACE_EVENT */
d0558de2
MD
151
152#undef TP_PROTO
153#define TP_PROTO(...) __VA_ARGS__
154
155#undef TP_ARGS
156#define TP_ARGS(...) __VA_ARGS__
157
158#undef LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP
159#define LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(_template, _name, _map, _proto, _args) \
160void __event_template_proto___##_template(_proto);
161
162#undef LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS
163#define LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS(_template, _name, _map) \
164void __event_template_proto___##_template(void);
165
166#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE
265822ae 167#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE(_name, _proto, _args, _locvar, _code_pre, _fields, _code_post) \
d0558de2
MD
168void __event_template_proto___##_name(_proto);
169
170#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS
265822ae 171#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS(_name, _locvar, _code_pre, _fields, _code_post) \
d0558de2
MD
172void __event_template_proto___##_name(void);
173
174#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
175
7fad9b39
FD
176/*
177 * Stage 1.2 of the trace event_notifier.
178 *
179 * Create dummy trace prototypes for each event class, and for each used
180 * template. This will allow checking whether the prototypes from the
181 * class and the instance using the class actually match.
182 */
183
184#include <lttng/events-reset.h> /* Reset all macros within TRACE_EVENT */
185
186#undef TP_PROTO
187#define TP_PROTO(...) __VA_ARGS__
188
189#undef TP_ARGS
190#define TP_ARGS(...) __VA_ARGS__
191
192#undef LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP
193#define LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(_template, _name, _map, _proto, _args) \
194void __event_notifier_template_proto___##_template(_proto);
195
196#undef LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS
197#define LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS(_template, _name, _map) \
198void __event_notifier_template_proto___##_template(void);
199
200#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE
201#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE(_name, _proto, _args, _locvar, _code_pre, _fields, _code_post) \
202void __event_notifier_template_proto___##_name(_proto);
203
204#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS
205#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS(_name, _locvar, _code_pre, _fields, _code_post) \
206void __event_notifier_template_proto___##_name(void);
207
208#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
209
210
141ddf28
MD
211/*
212 * Stage 1.2 of tracepoint event generation
213 *
214 * Unfolding the enums
215 */
3b4aafcb 216#include <lttng/events-reset.h> /* Reset all macros within TRACE_EVENT */
141ddf28
MD
217
218/* Enumeration entry (single value) */
219#undef ctf_enum_value
220#define ctf_enum_value(_string, _value) \
437d5aa5 221 lttng_kernel_static_enum_entry_value(_string, _value)
141ddf28
MD
222
223/* Enumeration entry (range) */
224#undef ctf_enum_range
225#define ctf_enum_range(_string, _range_start, _range_end) \
437d5aa5 226 lttng_kernel_static_enum_entry_range(_string, _range_start, _range_end)
141ddf28 227
08ad1061
PP
228/* Enumeration entry (automatic value; follows the rules of CTF) */
229#undef ctf_enum_auto
437d5aa5
MD
230#define ctf_enum_auto(_string) \
231 lttng_kernel_static_enum_entry_auto(_string)
08ad1061 232
141ddf28
MD
233#undef TP_ENUM_VALUES
234#define TP_ENUM_VALUES(...) \
235 __VA_ARGS__
236
237#undef LTTNG_TRACEPOINT_ENUM
238#define LTTNG_TRACEPOINT_ENUM(_name, _values) \
437d5aa5 239 static const struct lttng_kernel_enum_entry *__enum_values__##_name[] = { \
141ddf28
MD
240 _values \
241 };
242
243#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
244
6db3d13b 245/*
c099397a 246 * Stage 2 of the trace events.
6db3d13b
MD
247 *
248 * Create event field type metadata section.
249 * Each event produce an array of fields.
250 */
251
f127e61e 252/* Reset all macros within TRACEPOINT_EVENT */
3b4aafcb
MD
253#include <lttng/events-reset.h>
254#include <lttng/events-write.h>
255#include <lttng/events-nowrite.h>
6db3d13b 256
f127e61e 257#undef _ctf_integer_ext
437d5aa5
MD
258#define _ctf_integer_ext(_type, _item, _src, _byte_order, _base, _user, _nowrite) \
259 lttng_kernel_static_event_field(#_item, \
260 lttng_kernel_static_type_integer_from_type(_type, _byte_order, _base), \
261 _nowrite, _user, 0),
40652b65 262
f127e61e 263#undef _ctf_array_encoded
ceabb767
MD
264#define _ctf_array_encoded(_type, _item, _src, _length, \
265 _encoding, _byte_order, _elem_type_base, _user, _nowrite) \
437d5aa5
MD
266 lttng_kernel_static_event_field(#_item, \
267 lttng_kernel_static_type_array(_length, \
268 lttng_kernel_static_type_integer_from_type(_type, _byte_order, _elem_type_base), \
269 0, \
270 _encoding), \
271 _nowrite, _user, 0),
40652b65 272
43803cf2
MD
273#undef _ctf_array_bitfield
274#define _ctf_array_bitfield(_type, _item, _src, _length, _user, _nowrite) \
437d5aa5
MD
275 lttng_kernel_static_event_field(#_item, \
276 lttng_kernel_static_type_array((_length) * sizeof(_type) * CHAR_BIT, \
277 lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN, 10), \
278 lttng_alignof(_type), \
279 none), \
280 _nowrite, _user, 0),
43803cf2 281
f127e61e
MD
282#undef _ctf_sequence_encoded
283#define _ctf_sequence_encoded(_type, _item, _src, \
284 _length_type, _src_length, _encoding, \
ceabb767 285 _byte_order, _elem_type_base, _user, _nowrite) \
437d5aa5
MD
286 lttng_kernel_static_event_field("_" #_item "_length", \
287 lttng_kernel_static_type_integer_from_type(_length_type, __BYTE_ORDER, 10), \
288 _nowrite, 0, 1), \
289 lttng_kernel_static_event_field(#_item, \
290 lttng_kernel_static_type_sequence("_" #_item "_length", \
291 lttng_kernel_static_type_integer_from_type(_type, _byte_order, _elem_type_base), \
292 0, \
293 _encoding), \
294 _nowrite, _user, 0),
43803cf2
MD
295
296#undef _ctf_sequence_bitfield
297#define _ctf_sequence_bitfield(_type, _item, _src, \
298 _length_type, _src_length, \
299 _user, _nowrite) \
437d5aa5
MD
300 lttng_kernel_static_event_field("_" #_item "_length", \
301 lttng_kernel_static_type_integer_from_type(_length_type, __BYTE_ORDER, 10), \
302 _nowrite, 0, 1), \
303 lttng_kernel_static_event_field(#_item, \
304 lttng_kernel_static_type_sequence("_" #_item "_length", \
305 lttng_kernel_static_type_integer(1, 1, 0, __LITTLE_ENDIAN, 10), \
306 lttng_alignof(_type), \
307 none), \
308 _nowrite, _user, 0),
40652b65 309
f127e61e
MD
310#undef _ctf_string
311#define _ctf_string(_item, _src, _user, _nowrite) \
437d5aa5
MD
312 lttng_kernel_static_event_field(#_item, \
313 lttng_kernel_static_type_string(UTF8), \
314 _nowrite, _user, 0),
315
316#undef _ctf_unused
317#define _ctf_unused(_src)
1d12cebd 318
141ddf28
MD
319#undef _ctf_enum
320#define _ctf_enum(_name, _type, _item, _src, _user, _nowrite) \
437d5aa5
MD
321 lttng_kernel_static_event_field(#_item, \
322 lttng_kernel_static_type_enum(&__enum_##_name, \
323 lttng_kernel_static_type_integer_from_type(_type, __BYTE_ORDER, 10)), \
324 _nowrite, _user, 0),
f64dd4be
MD
325
326#undef ctf_custom_field
327#define ctf_custom_field(_type, _item, _code) \
437d5aa5 328 lttng_kernel_static_event_field(#_item, PARAMS(_type), 0, 0, 1),
f64dd4be
MD
329
330#undef ctf_custom_type
331#define ctf_custom_type(...) __VA_ARGS__
332
f127e61e
MD
333#undef TP_FIELDS
334#define TP_FIELDS(...) __VA_ARGS__ /* Only one used in this phase */
1d12cebd 335
3bc29f0a 336#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS
265822ae 337#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS(_name, _locvar, _code_pre, _fields, _code_post) \
437d5aa5 338 static const struct lttng_kernel_event_field *__event_fields___##_name[] = { \
f127e61e 339 _fields \
299338c8
MD
340 };
341
3bc29f0a 342#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE
265822ae
MD
343#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE(_name, _proto, _args, _locvar, _code_pre, _fields, _code_post) \
344 LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS(_name, _locvar, _code_pre, PARAMS(_fields), _code_post)
f7bdf4db 345
141ddf28
MD
346#undef LTTNG_TRACEPOINT_ENUM
347#define LTTNG_TRACEPOINT_ENUM(_name, _values) \
d96a4a7a 348 static const struct lttng_kernel_enum_desc __enum_##_name = { \
141ddf28
MD
349 .name = #_name, \
350 .entries = __enum_values__##_name, \
351 .nr_entries = ARRAY_SIZE(__enum_values__##_name), \
352 };
353
437d5aa5 354#define LTTNG_CREATE_FIELD_METADATA
299338c8 355#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
437d5aa5 356#undef LTTNG_CREATE_FIELD_METADATA
299338c8 357
19c57fbf 358/*
c099397a 359 * Stage 3 of the trace events.
19c57fbf
MD
360 *
361 * Create probe callback prototypes.
362 */
363
f127e61e 364/* Reset all macros within TRACEPOINT_EVENT */
3b4aafcb 365#include <lttng/events-reset.h>
19c57fbf
MD
366
367#undef TP_PROTO
f127e61e 368#define TP_PROTO(...) __VA_ARGS__
19c57fbf 369
3bc29f0a 370#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE
265822ae 371#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE(_name, _proto, _args, _locvar, _code_pre, _fields, _code_post) \
19c57fbf
MD
372static void __event_probe__##_name(void *__data, _proto);
373
3bc29f0a 374#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS
265822ae 375#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS(_name, _locvar, _code_pre, _fields, _code_post) \
f7bdf4db
MD
376static void __event_probe__##_name(void *__data);
377
19c57fbf
MD
378#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
379
7fad9b39
FD
380/*
381 * Stage 3.1 of the trace event_notifiers.
382 *
383 * Create event_notifier probe callback prototypes.
384 */
385
386/* Reset all macros within TRACEPOINT_EVENT */
387#include <lttng/events-reset.h>
388
389#undef TP_PROTO
390#define TP_PROTO(...) __VA_ARGS__
391
392#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE
393#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE(_name, _proto, _args, _locvar, _code_pre, _fields, _code_post) \
394static void __event_notifier_probe__##_name(void *__data, _proto);
395
396#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS
397#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS(_name, _locvar, _code_pre, _fields, _code_post) \
398static void __event_notifier_probe__##_name(void *__data);
399
400#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
401
f7bdf4db
MD
402/*
403 * Stage 4 of the trace events.
404 *
40652b65
MD
405 * Create static inline function that calculates event size.
406 */
407
f127e61e 408/* Reset all macros within TRACEPOINT_EVENT */
3b4aafcb
MD
409#include <lttng/events-reset.h>
410#include <lttng/events-write.h>
6db3d13b 411
f127e61e
MD
412#undef _ctf_integer_ext
413#define _ctf_integer_ext(_type, _item, _src, _byte_order, _base, _user, _nowrite) \
a90917c3 414 __event_len += lib_ring_buffer_align(__event_len, lttng_alignof(_type)); \
0d1d4002 415 __event_len += sizeof(_type);
6db3d13b 416
f127e61e 417#undef _ctf_array_encoded
3834b99f 418#define _ctf_array_encoded(_type, _item, _src, _length, _encoding, _byte_order, _base, _user, _nowrite) \
a90917c3 419 __event_len += lib_ring_buffer_align(__event_len, lttng_alignof(_type)); \
0d1d4002 420 __event_len += sizeof(_type) * (_length);
6db3d13b 421
43803cf2
MD
422#undef _ctf_array_bitfield
423#define _ctf_array_bitfield(_type, _item, _src, _length, _user, _nowrite) \
3834b99f 424 _ctf_array_encoded(_type, _item, _src, _length, none, __LITTLE_ENDIAN, 0, _user, _nowrite)
43803cf2 425
f127e61e
MD
426#undef _ctf_sequence_encoded
427#define _ctf_sequence_encoded(_type, _item, _src, _length_type, \
57ede728 428 _src_length, _encoding, _byte_order, _base, _user, _nowrite) \
f127e61e
MD
429 __event_len += lib_ring_buffer_align(__event_len, lttng_alignof(_length_type)); \
430 __event_len += sizeof(_length_type); \
a90917c3 431 __event_len += lib_ring_buffer_align(__event_len, lttng_alignof(_type)); \
114667d5
MD
432 { \
433 size_t __seqlen = (_src_length); \
434 \
435 if (unlikely(++this_cpu_ptr(&lttng_dynamic_len_stack)->offset >= LTTNG_DYNAMIC_LEN_STACK_SIZE)) \
436 goto error; \
437 barrier(); /* reserve before use. */ \
438 this_cpu_ptr(&lttng_dynamic_len_stack)->stack[this_cpu_ptr(&lttng_dynamic_len_stack)->offset - 1] = __seqlen; \
439 __event_len += sizeof(_type) * __seqlen; \
440 }
6db3d13b 441
43803cf2
MD
442#undef _ctf_sequence_bitfield
443#define _ctf_sequence_bitfield(_type, _item, _src, \
444 _length_type, _src_length, \
445 _user, _nowrite) \
446 _ctf_sequence_encoded(_type, _item, _src, _length_type, _src_length, \
447 none, __LITTLE_ENDIAN, 10, _user, _nowrite)
448
d0255731 449/*
f127e61e 450 * ctf_user_string includes \0. If returns 0, it faulted, so we set size to
786b8312 451 * 1 (\0 only).
d0255731 452 */
f127e61e
MD
453#undef _ctf_string
454#define _ctf_string(_item, _src, _user, _nowrite) \
114667d5
MD
455 if (unlikely(++this_cpu_ptr(&lttng_dynamic_len_stack)->offset >= LTTNG_DYNAMIC_LEN_STACK_SIZE)) \
456 goto error; \
457 barrier(); /* reserve before use. */ \
458 if (_user) { \
459 __event_len += this_cpu_ptr(&lttng_dynamic_len_stack)->stack[this_cpu_ptr(&lttng_dynamic_len_stack)->offset - 1] = \
96d0248a 460 max_t(size_t, lttng_strlen_user_inatomic(_src), 1); \
114667d5
MD
461 } else { \
462 __event_len += this_cpu_ptr(&lttng_dynamic_len_stack)->stack[this_cpu_ptr(&lttng_dynamic_len_stack)->offset - 1] = \
1d84e8e7 463 strlen((_src) ? (_src) : __LTTNG_NULL_STRING) + 1; \
114667d5 464 }
c6e3f225 465
141ddf28
MD
466#undef _ctf_enum
467#define _ctf_enum(_name, _type, _item, _src, _user, _nowrite) \
468 _ctf_integer_ext(_type, _item, _src, __BYTE_ORDER, 10, _user, _nowrite)
469
f64dd4be
MD
470#undef ctf_align
471#define ctf_align(_type) \
472 __event_len += lib_ring_buffer_align(__event_len, lttng_alignof(_type));
473
474#undef ctf_custom_field
475#define ctf_custom_field(_type, _item, _code) \
476 { \
477 _code \
478 }
479
480#undef ctf_custom_code
481#define ctf_custom_code(...) __VA_ARGS__
482
0d1d4002 483#undef TP_PROTO
f127e61e 484#define TP_PROTO(...) __VA_ARGS__
6db3d13b 485
f127e61e
MD
486#undef TP_FIELDS
487#define TP_FIELDS(...) __VA_ARGS__
6db3d13b 488
7ca580f8
MD
489#undef TP_locvar
490#define TP_locvar(...) __VA_ARGS__
491
3bc29f0a 492#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE
265822ae 493#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE(_name, _proto, _args, _locvar, _code_pre, _fields, _code_post) \
114667d5 494static inline ssize_t __event_get_size__##_name(void *__tp_locvar, _proto) \
0d1d4002
MD
495{ \
496 size_t __event_len = 0; \
d3de7f14 497 unsigned int __dynamic_len_idx __attribute__((unused)) = 0; \
7ca580f8 498 struct { _locvar } *tp_locvar __attribute__((unused)) = __tp_locvar; \
d3de7f14 499 \
f127e61e 500 _fields \
d3de7f14 501 return __event_len; \
114667d5
MD
502 \
503error: \
504 __attribute__((unused)); \
505 return -1; \
d3de7f14
MD
506}
507
3bc29f0a 508#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS
265822ae 509#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS(_name, _locvar, _code_pre, _fields, _code_post) \
114667d5 510static inline ssize_t __event_get_size__##_name(void *__tp_locvar) \
d3de7f14
MD
511{ \
512 size_t __event_len = 0; \
513 unsigned int __dynamic_len_idx __attribute__((unused)) = 0; \
7ca580f8 514 struct { _locvar } *tp_locvar __attribute__((unused)) = __tp_locvar; \
0d1d4002 515 \
f127e61e 516 _fields \
0d1d4002 517 return __event_len; \
114667d5
MD
518 \
519error: \
520 __attribute__((unused)); \
521 return -1; \
6db3d13b 522}
40652b65
MD
523
524#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
525
f127e61e 526
40652b65 527/*
f127e61e 528 * Stage 4.1 of tracepoint event generation.
e763dbf5 529 *
f127e61e
MD
530 * Create static inline function that layout the filter stack data.
531 * We make both write and nowrite data available to the filter.
e763dbf5
MD
532 */
533
f127e61e 534/* Reset all macros within TRACEPOINT_EVENT */
3b4aafcb
MD
535#include <lttng/events-reset.h>
536#include <lttng/events-write.h>
537#include <lttng/events-nowrite.h>
f127e61e
MD
538
539#undef _ctf_integer_ext_fetched
540#define _ctf_integer_ext_fetched(_type, _item, _src, _byte_order, _base, _nowrite) \
541 if (lttng_is_signed_type(_type)) { \
542 int64_t __ctf_tmp_int64; \
543 switch (sizeof(_type)) { \
544 case 1: \
545 { \
546 union { _type t; int8_t v; } __tmp = { (_type) (_src) }; \
547 __ctf_tmp_int64 = (int64_t) __tmp.v; \
548 break; \
549 } \
550 case 2: \
551 { \
552 union { _type t; int16_t v; } __tmp = { (_type) (_src) }; \
bf1a9179
MD
553 if (_byte_order != __BYTE_ORDER) \
554 __swab16s(&__tmp.v); \
f127e61e
MD
555 __ctf_tmp_int64 = (int64_t) __tmp.v; \
556 break; \
557 } \
558 case 4: \
559 { \
560 union { _type t; int32_t v; } __tmp = { (_type) (_src) }; \
bf1a9179
MD
561 if (_byte_order != __BYTE_ORDER) \
562 __swab32s(&__tmp.v); \
f127e61e
MD
563 __ctf_tmp_int64 = (int64_t) __tmp.v; \
564 break; \
565 } \
566 case 8: \
567 { \
568 union { _type t; int64_t v; } __tmp = { (_type) (_src) }; \
bf1a9179
MD
569 if (_byte_order != __BYTE_ORDER) \
570 __swab64s(&__tmp.v); \
f127e61e
MD
571 __ctf_tmp_int64 = (int64_t) __tmp.v; \
572 break; \
573 } \
574 default: \
575 BUG_ON(1); \
576 }; \
577 memcpy(__stack_data, &__ctf_tmp_int64, sizeof(int64_t)); \
578 } else { \
579 uint64_t __ctf_tmp_uint64; \
580 switch (sizeof(_type)) { \
581 case 1: \
582 { \
583 union { _type t; uint8_t v; } __tmp = { (_type) (_src) }; \
584 __ctf_tmp_uint64 = (uint64_t) __tmp.v; \
585 break; \
586 } \
587 case 2: \
588 { \
589 union { _type t; uint16_t v; } __tmp = { (_type) (_src) }; \
bf1a9179
MD
590 if (_byte_order != __BYTE_ORDER) \
591 __swab16s(&__tmp.v); \
f127e61e
MD
592 __ctf_tmp_uint64 = (uint64_t) __tmp.v; \
593 break; \
594 } \
595 case 4: \
596 { \
597 union { _type t; uint32_t v; } __tmp = { (_type) (_src) }; \
bf1a9179
MD
598 if (_byte_order != __BYTE_ORDER) \
599 __swab32s(&__tmp.v); \
f127e61e
MD
600 __ctf_tmp_uint64 = (uint64_t) __tmp.v; \
601 break; \
602 } \
603 case 8: \
604 { \
605 union { _type t; uint64_t v; } __tmp = { (_type) (_src) }; \
bf1a9179
MD
606 if (_byte_order != __BYTE_ORDER) \
607 __swab64s(&__tmp.v); \
f127e61e
MD
608 __ctf_tmp_uint64 = (uint64_t) __tmp.v; \
609 break; \
610 } \
611 default: \
612 BUG_ON(1); \
613 }; \
614 memcpy(__stack_data, &__ctf_tmp_uint64, sizeof(uint64_t)); \
615 } \
616 __stack_data += sizeof(int64_t);
617
618#undef _ctf_integer_ext_isuser0
619#define _ctf_integer_ext_isuser0(_type, _item, _src, _byte_order, _base, _nowrite) \
620 _ctf_integer_ext_fetched(_type, _item, _src, _byte_order, _base, _nowrite)
621
622#undef _ctf_integer_ext_isuser1
623#define _ctf_integer_ext_isuser1(_type, _item, _user_src, _byte_order, _base, _nowrite) \
3c8ebbc8
MD
624{ \
625 union { \
626 char __array[sizeof(_user_src)]; \
627 __typeof__(_user_src) __v; \
628 } __tmp_fetch; \
629 if (lib_ring_buffer_copy_from_user_check_nofault(__tmp_fetch.__array, \
630 &(_user_src), sizeof(_user_src))) \
631 memset(__tmp_fetch.__array, 0, sizeof(__tmp_fetch.__array)); \
632 _ctf_integer_ext_fetched(_type, _item, __tmp_fetch.__v, _byte_order, _base, _nowrite) \
f127e61e 633}
e763dbf5 634
f127e61e
MD
635#undef _ctf_integer_ext
636#define _ctf_integer_ext(_type, _item, _user_src, _byte_order, _base, _user, _nowrite) \
637 _ctf_integer_ext_isuser##_user(_type, _item, _user_src, _byte_order, _base, _nowrite)
638
639#undef _ctf_array_encoded
3834b99f 640#define _ctf_array_encoded(_type, _item, _src, _length, _encoding, _byte_order, _base, _user, _nowrite) \
f127e61e
MD
641 { \
642 unsigned long __ctf_tmp_ulong = (unsigned long) (_length); \
643 const void *__ctf_tmp_ptr = (_src); \
644 memcpy(__stack_data, &__ctf_tmp_ulong, sizeof(unsigned long)); \
645 __stack_data += sizeof(unsigned long); \
6b272cda
MD
646 memcpy(__stack_data, &__ctf_tmp_ptr, sizeof(void *)); \
647 __stack_data += sizeof(void *); \
f127e61e
MD
648 }
649
43803cf2
MD
650#undef _ctf_array_bitfield
651#define _ctf_array_bitfield(_type, _item, _src, _length, _user, _nowrite) \
3834b99f 652 _ctf_array_encoded(_type, _item, _src, _length, none, __LITTLE_ENDIAN, 0, _user, _nowrite)
43803cf2 653
f127e61e
MD
654#undef _ctf_sequence_encoded
655#define _ctf_sequence_encoded(_type, _item, _src, _length_type, \
57ede728 656 _src_length, _encoding, _byte_order, _base, _user, _nowrite) \
f127e61e
MD
657 { \
658 unsigned long __ctf_tmp_ulong = (unsigned long) (_src_length); \
659 const void *__ctf_tmp_ptr = (_src); \
660 memcpy(__stack_data, &__ctf_tmp_ulong, sizeof(unsigned long)); \
661 __stack_data += sizeof(unsigned long); \
6b272cda
MD
662 memcpy(__stack_data, &__ctf_tmp_ptr, sizeof(void *)); \
663 __stack_data += sizeof(void *); \
f127e61e
MD
664 }
665
43803cf2
MD
666#undef _ctf_sequence_bitfield
667#define _ctf_sequence_bitfield(_type, _item, _src, \
668 _length_type, _src_length, \
669 _user, _nowrite) \
670 _ctf_sequence_encoded(_type, _item, _src, _length_type, _src_length, \
671 none, __LITTLE_ENDIAN, 10, _user, _nowrite)
672
f127e61e
MD
673#undef _ctf_string
674#define _ctf_string(_item, _src, _user, _nowrite) \
675 { \
1d84e8e7
MD
676 const void *__ctf_tmp_ptr = \
677 ((_src) ? (_src) : __LTTNG_NULL_STRING); \
6b272cda
MD
678 memcpy(__stack_data, &__ctf_tmp_ptr, sizeof(void *)); \
679 __stack_data += sizeof(void *); \
f127e61e 680 }
c6e3f225 681
141ddf28
MD
682#undef _ctf_enum
683#define _ctf_enum(_name, _type, _item, _src, _user, _nowrite) \
684 _ctf_integer_ext(_type, _item, _src, __BYTE_ORDER, 10, _user, _nowrite)
685
e763dbf5 686#undef TP_PROTO
f127e61e 687#define TP_PROTO(...) __VA_ARGS__
e763dbf5 688
f127e61e
MD
689#undef TP_FIELDS
690#define TP_FIELDS(...) __VA_ARGS__
e763dbf5 691
7ca580f8
MD
692#undef TP_locvar
693#define TP_locvar(...) __VA_ARGS__
694
f127e61e 695#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS
265822ae 696#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS(_name, _locvar, _code_pre, _fields, _code_post) \
f127e61e 697static inline \
99d223ad 698void __event_prepare_interpreter_stack__##_name(char *__stack_data, \
f127e61e 699 void *__tp_locvar) \
e763dbf5 700{ \
7ca580f8
MD
701 struct { _locvar } *tp_locvar __attribute__((unused)) = __tp_locvar; \
702 \
f127e61e 703 _fields \
e763dbf5
MD
704}
705
f127e61e 706#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE
265822ae 707#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE(_name, _proto, _args, _locvar, _code_pre, _fields, _code_post) \
f127e61e 708static inline \
99d223ad 709void __event_prepare_interpreter_stack__##_name(char *__stack_data, \
f127e61e 710 void *__tp_locvar, _proto) \
d3de7f14 711{ \
7ca580f8
MD
712 struct { _locvar } *tp_locvar __attribute__((unused)) = __tp_locvar; \
713 \
f127e61e 714 _fields \
d3de7f14
MD
715}
716
e763dbf5
MD
717#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
718
e763dbf5 719/*
f127e61e 720 * Stage 5 of the trace events.
40652b65 721 *
f127e61e 722 * Create static inline function that calculates event payload alignment.
3c4ffab9
MD
723 */
724
f127e61e 725/* Reset all macros within TRACEPOINT_EVENT */
3b4aafcb
MD
726#include <lttng/events-reset.h>
727#include <lttng/events-write.h>
3c4ffab9 728
f127e61e
MD
729#undef _ctf_integer_ext
730#define _ctf_integer_ext(_type, _item, _src, _byte_order, _base, _user, _nowrite) \
731 __event_align = max_t(size_t, __event_align, lttng_alignof(_type));
3c4ffab9 732
f127e61e 733#undef _ctf_array_encoded
3834b99f 734#define _ctf_array_encoded(_type, _item, _src, _length, _encoding, _byte_order, _base, _user, _nowrite) \
f127e61e 735 __event_align = max_t(size_t, __event_align, lttng_alignof(_type));
3c4ffab9 736
43803cf2
MD
737#undef _ctf_array_bitfield
738#define _ctf_array_bitfield(_type, _item, _src, _length, _user, _nowrite) \
3834b99f 739 _ctf_array_encoded(_type, _item, _src, _length, none, __LITTLE_ENDIAN, 0, _user, _nowrite)
43803cf2 740
f127e61e
MD
741#undef _ctf_sequence_encoded
742#define _ctf_sequence_encoded(_type, _item, _src, _length_type, \
57ede728 743 _src_length, _encoding, _byte_order, _base, _user, _nowrite) \
f127e61e
MD
744 __event_align = max_t(size_t, __event_align, lttng_alignof(_length_type)); \
745 __event_align = max_t(size_t, __event_align, lttng_alignof(_type));
64c796d8 746
43803cf2
MD
747#undef _ctf_sequence_bitfield
748#define _ctf_sequence_bitfield(_type, _item, _src, \
749 _length_type, _src_length, \
750 _user, _nowrite) \
751 _ctf_sequence_encoded(_type, _item, _src, _length_type, _src_length, \
752 none, __LITTLE_ENDIAN, 10, _user, _nowrite)
753
f127e61e
MD
754#undef _ctf_string
755#define _ctf_string(_item, _src, _user, _nowrite)
64c796d8 756
141ddf28
MD
757#undef _ctf_enum
758#define _ctf_enum(_name, _type, _item, _src, _user, _nowrite) \
759 _ctf_integer_ext(_type, _item, _src, __BYTE_ORDER, 10, _user, _nowrite)
760
f64dd4be
MD
761#undef ctf_align
762#define ctf_align(_type) \
763 __event_align = max_t(size_t, __event_align, lttng_alignof(_type));
764
f127e61e
MD
765#undef TP_PROTO
766#define TP_PROTO(...) __VA_ARGS__
84da5206 767
f127e61e
MD
768#undef TP_FIELDS
769#define TP_FIELDS(...) __VA_ARGS__
c6e3f225 770
f127e61e
MD
771#undef TP_locvar
772#define TP_locvar(...) __VA_ARGS__
3c4ffab9 773
f64dd4be
MD
774#undef ctf_custom_field
775#define ctf_custom_field(_type, _item, _code) _code
776
777#undef ctf_custom_code
778#define ctf_custom_code(...) \
779 { \
780 __VA_ARGS__ \
781 }
782
f127e61e 783#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE
265822ae 784#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE(_name, _proto, _args, _locvar, _code_pre, _fields, _code_post) \
f127e61e
MD
785static inline size_t __event_get_align__##_name(void *__tp_locvar, _proto) \
786{ \
787 size_t __event_align = 1; \
788 struct { _locvar } *tp_locvar __attribute__((unused)) = __tp_locvar; \
789 \
790 _fields \
791 return __event_align; \
792}
3c4ffab9 793
3bc29f0a 794#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS
265822ae 795#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS(_name, _locvar, _code_pre, _fields, _code_post) \
f127e61e
MD
796static inline size_t __event_get_align__##_name(void *__tp_locvar) \
797{ \
798 size_t __event_align = 1; \
799 struct { _locvar } *tp_locvar __attribute__((unused)) = __tp_locvar; \
800 \
801 _fields \
802 return __event_align; \
803}
d3de7f14 804
3c4ffab9
MD
805#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
806
3c4ffab9 807/*
f127e61e 808 * Stage 6 of tracepoint event generation.
e763dbf5 809 *
f127e61e
MD
810 * Create the probe function. This function calls event size calculation
811 * and writes event data into the buffer.
40652b65
MD
812 */
813
f127e61e 814/* Reset all macros within TRACEPOINT_EVENT */
3b4aafcb
MD
815#include <lttng/events-reset.h>
816#include <lttng/events-write.h>
c6e3f225 817
f127e61e
MD
818#undef _ctf_integer_ext_fetched
819#define _ctf_integer_ext_fetched(_type, _item, _src, _byte_order, _base, _nowrite) \
e763dbf5 820 { \
f127e61e
MD
821 _type __tmp = _src; \
822 lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(__tmp));\
aaa4004a 823 __chan->ops->event_write(&__ctx, &__tmp, sizeof(__tmp));\
f127e61e
MD
824 }
825
826#undef _ctf_integer_ext_isuser0
827#define _ctf_integer_ext_isuser0(_type, _item, _src, _byte_order, _base, _nowrite) \
828 _ctf_integer_ext_fetched(_type, _item, _src, _byte_order, _base, _nowrite)
829
830#undef _ctf_integer_ext_isuser1
831#define _ctf_integer_ext_isuser1(_type, _item, _user_src, _byte_order, _base, _nowrite) \
832{ \
3c8ebbc8
MD
833 union { \
834 char __array[sizeof(_user_src)]; \
835 __typeof__(_user_src) __v; \
836 } __tmp_fetch; \
837 if (lib_ring_buffer_copy_from_user_check_nofault(__tmp_fetch.__array, \
838 &(_user_src), sizeof(_user_src))) \
839 memset(__tmp_fetch.__array, 0, sizeof(__tmp_fetch.__array)); \
840 _ctf_integer_ext_fetched(_type, _item, __tmp_fetch.__v, _byte_order, _base, _nowrite) \
f127e61e
MD
841}
842
843#undef _ctf_integer_ext
844#define _ctf_integer_ext(_type, _item, _user_src, _byte_order, _base, _user, _nowrite) \
845 _ctf_integer_ext_isuser##_user(_type, _item, _user_src, _byte_order, _base, _nowrite)
846
847#undef _ctf_array_encoded
3834b99f 848#define _ctf_array_encoded(_type, _item, _src, _length, _encoding, _byte_order, _base, _user, _nowrite) \
f127e61e
MD
849 lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(_type)); \
850 if (_user) { \
851 __chan->ops->event_write_from_user(&__ctx, _src, sizeof(_type) * (_length)); \
852 } else { \
853 __chan->ops->event_write(&__ctx, _src, sizeof(_type) * (_length)); \
854 }
855
43803cf2
MD
856#if (__BYTE_ORDER == __LITTLE_ENDIAN)
857#undef _ctf_array_bitfield
858#define _ctf_array_bitfield(_type, _item, _src, _length, _user, _nowrite) \
859 lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(_type)); \
860 if (_user) { \
861 __chan->ops->event_write_from_user(&__ctx, _src, sizeof(_type) * (_length)); \
862 } else { \
863 __chan->ops->event_write(&__ctx, _src, sizeof(_type) * (_length)); \
864 }
865#else /* #if (__BYTE_ORDER == __LITTLE_ENDIAN) */
866/*
867 * For big endian, we need to byteswap into little endian.
868 */
869#undef _ctf_array_bitfield
870#define _ctf_array_bitfield(_type, _item, _src, _length, _user, _nowrite) \
871 lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(_type)); \
872 { \
873 size_t _i; \
874 \
875 for (_i = 0; _i < (_length); _i++) { \
876 _type _tmp; \
877 \
878 if (_user) { \
879 if (get_user(_tmp, (_type *) _src + _i)) \
880 _tmp = 0; \
881 } else { \
882 _tmp = ((_type *) _src)[_i]; \
883 } \
884 switch (sizeof(_type)) { \
885 case 1: \
886 break; \
887 case 2: \
888 _tmp = cpu_to_le16(_tmp); \
889 break; \
890 case 4: \
891 _tmp = cpu_to_le32(_tmp); \
892 break; \
893 case 8: \
894 _tmp = cpu_to_le64(_tmp); \
895 break; \
896 default: \
897 BUG_ON(1); \
898 } \
899 __chan->ops->event_write(&__ctx, &_tmp, sizeof(_type)); \
900 } \
901 }
902#endif /* #else #if (__BYTE_ORDER == __LITTLE_ENDIAN) */
903
f127e61e
MD
904#undef _ctf_sequence_encoded
905#define _ctf_sequence_encoded(_type, _item, _src, _length_type, \
57ede728 906 _src_length, _encoding, _byte_order, _base, _user, _nowrite) \
84da5206 907 { \
114667d5 908 _length_type __tmpl = this_cpu_ptr(&lttng_dynamic_len_stack)->stack[__dynamic_len_idx]; \
f127e61e
MD
909 lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(_length_type));\
910 __chan->ops->event_write(&__ctx, &__tmpl, sizeof(_length_type));\
84da5206 911 } \
f127e61e
MD
912 lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(_type)); \
913 if (_user) { \
914 __chan->ops->event_write_from_user(&__ctx, _src, \
915 sizeof(_type) * __get_dynamic_len(dest)); \
916 } else { \
917 __chan->ops->event_write(&__ctx, _src, \
918 sizeof(_type) * __get_dynamic_len(dest)); \
919 }
920
43803cf2
MD
921#if (__BYTE_ORDER == __LITTLE_ENDIAN)
922#undef _ctf_sequence_bitfield
923#define _ctf_sequence_bitfield(_type, _item, _src, \
924 _length_type, _src_length, \
925 _user, _nowrite) \
926 { \
114667d5 927 _length_type __tmpl = this_cpu_ptr(&lttng_dynamic_len_stack)->stack[__dynamic_len_idx] * sizeof(_type) * CHAR_BIT; \
43803cf2
MD
928 lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(_length_type));\
929 __chan->ops->event_write(&__ctx, &__tmpl, sizeof(_length_type));\
930 } \
931 lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(_type)); \
932 if (_user) { \
933 __chan->ops->event_write_from_user(&__ctx, _src, \
934 sizeof(_type) * __get_dynamic_len(dest)); \
935 } else { \
936 __chan->ops->event_write(&__ctx, _src, \
937 sizeof(_type) * __get_dynamic_len(dest)); \
938 }
939#else /* #if (__BYTE_ORDER == __LITTLE_ENDIAN) */
940/*
941 * For big endian, we need to byteswap into little endian.
942 */
943#undef _ctf_sequence_bitfield
944#define _ctf_sequence_bitfield(_type, _item, _src, \
945 _length_type, _src_length, \
946 _user, _nowrite) \
947 { \
114667d5 948 _length_type __tmpl = this_cpu_ptr(&lttng_dynamic_len_stack)->stack[__dynamic_len_idx] * sizeof(_type) * CHAR_BIT; \
43803cf2
MD
949 lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(_length_type));\
950 __chan->ops->event_write(&__ctx, &__tmpl, sizeof(_length_type));\
951 } \
952 lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(_type)); \
953 { \
954 size_t _i, _length; \
955 \
956 _length = __get_dynamic_len(dest); \
957 for (_i = 0; _i < _length; _i++) { \
958 _type _tmp; \
959 \
960 if (_user) { \
961 if (get_user(_tmp, (_type *) _src + _i)) \
962 _tmp = 0; \
963 } else { \
964 _tmp = ((_type *) _src)[_i]; \
965 } \
966 switch (sizeof(_type)) { \
967 case 1: \
968 break; \
969 case 2: \
970 _tmp = cpu_to_le16(_tmp); \
971 break; \
972 case 4: \
973 _tmp = cpu_to_le32(_tmp); \
974 break; \
975 case 8: \
976 _tmp = cpu_to_le64(_tmp); \
977 break; \
978 default: \
979 BUG_ON(1); \
980 } \
981 __chan->ops->event_write(&__ctx, &_tmp, sizeof(_type)); \
982 } \
983 }
984#endif /* #else #if (__BYTE_ORDER == __LITTLE_ENDIAN) */
985
f127e61e
MD
986#undef _ctf_string
987#define _ctf_string(_item, _src, _user, _nowrite) \
f127e61e 988 if (_user) { \
1d84e8e7 989 lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(*(_src))); \
f127e61e
MD
990 __chan->ops->event_strcpy_from_user(&__ctx, _src, \
991 __get_dynamic_len(dest)); \
992 } else { \
1d84e8e7
MD
993 const char *__ctf_tmp_string = \
994 ((_src) ? (_src) : __LTTNG_NULL_STRING); \
995 lib_ring_buffer_align_ctx(&__ctx, \
996 lttng_alignof(*__ctf_tmp_string)); \
997 __chan->ops->event_strcpy(&__ctx, __ctf_tmp_string, \
f127e61e
MD
998 __get_dynamic_len(dest)); \
999 }
e763dbf5 1000
141ddf28
MD
1001#undef _ctf_enum
1002#define _ctf_enum(_name, _type, _item, _src, _user, _nowrite) \
1003 _ctf_integer_ext(_type, _item, _src, __BYTE_ORDER, 10, _user, _nowrite)
f64dd4be
MD
1004
1005#undef ctf_align
1006#define ctf_align(_type) \
1007 lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(_type));
1008
1009#undef ctf_custom_field
1010#define ctf_custom_field(_type, _item, _code) _code
1011
1012#undef ctf_custom_code
1013#define ctf_custom_code(...) \
1014 { \
1015 __VA_ARGS__ \
1016 }
1017
e763dbf5 1018/* Beware: this get len actually consumes the len value */
f127e61e 1019#undef __get_dynamic_len
114667d5 1020#define __get_dynamic_len(field) this_cpu_ptr(&lttng_dynamic_len_stack)->stack[__dynamic_len_idx++]
e763dbf5
MD
1021
1022#undef TP_PROTO
f127e61e 1023#define TP_PROTO(...) __VA_ARGS__
e763dbf5
MD
1024
1025#undef TP_ARGS
f127e61e 1026#define TP_ARGS(...) __VA_ARGS__
e763dbf5 1027
f127e61e
MD
1028#undef TP_FIELDS
1029#define TP_FIELDS(...) __VA_ARGS__
e763dbf5 1030
7ca580f8
MD
1031#undef TP_locvar
1032#define TP_locvar(...) __VA_ARGS__
1033
265822ae
MD
1034#undef TP_code_pre
1035#define TP_code_pre(...) __VA_ARGS__
1036
1037#undef TP_code_post
1038#define TP_code_post(...) __VA_ARGS__
7ca580f8 1039
c337ddc2
MD
1040/*
1041 * For state dump, check that "session" argument (mandatory) matches the
1042 * session this event belongs to. Ensures that we write state dump data only
1043 * into the started session, not into all sessions.
1044 */
1045#ifdef TP_SESSION_CHECK
1046#define _TP_SESSION_CHECK(session, csession) (session == csession)
1047#else /* TP_SESSION_CHECK */
1048#define _TP_SESSION_CHECK(session, csession) 1
1049#endif /* TP_SESSION_CHECK */
1050
f9771d39 1051/*
f127e61e
MD
1052 * Using twice size for filter stack data to hold size and pointer for
1053 * each field (worse case). For integers, max size required is 64-bit.
1054 * Same for double-precision floats. Those fit within
1055 * 2*sizeof(unsigned long) for all supported architectures.
1056 * Perform UNION (||) of filter runtime list.
f9771d39 1057 */
3bc29f0a 1058#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE
265822ae 1059#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE(_name, _proto, _args, _locvar, _code_pre, _fields, _code_post) \
e763dbf5
MD
1060static void __event_probe__##_name(void *__data, _proto) \
1061{ \
7ca580f8 1062 struct probe_local_vars { _locvar }; \
a67ba386 1063 struct lttng_kernel_event_recorder *__event_recorder = __data; \
7fad9b39 1064 struct lttng_probe_ctx __lttng_probe_ctx = { \
a67ba386 1065 .event = __event_recorder, \
7fad9b39 1066 .event_notifier = NULL, \
ccecf3fb 1067 .interruptible = !irqs_disabled(), \
79150a49 1068 }; \
a67ba386 1069 struct lttng_channel *__chan = __event_recorder->chan; \
e0130fab 1070 struct lttng_session *__session = __chan->session; \
aaa4004a 1071 struct lib_ring_buffer_ctx __ctx; \
114667d5
MD
1072 ssize_t __event_len; \
1073 size_t __event_align; \
ec0a7fba 1074 size_t __orig_dynamic_len_offset, __dynamic_len_idx __attribute__((unused)); \
f127e61e 1075 union { \
114667d5 1076 size_t __dynamic_len_removed[ARRAY_SIZE(__event_fields___##_name)]; \
f127e61e
MD
1077 char __filter_stack_data[2 * sizeof(unsigned long) * ARRAY_SIZE(__event_fields___##_name)]; \
1078 } __stackvar; \
e763dbf5 1079 int __ret; \
7ca580f8
MD
1080 struct probe_local_vars __tp_locvar; \
1081 struct probe_local_vars *tp_locvar __attribute__((unused)) = \
1082 &__tp_locvar; \
d1f652f8 1083 struct lttng_id_tracker_rcu *__lf; \
e763dbf5 1084 \
e0130fab 1085 if (!_TP_SESSION_CHECK(session, __session)) \
c337ddc2 1086 return; \
585e5dcc 1087 if (unlikely(!LTTNG_READ_ONCE(__session->active))) \
e64957da 1088 return; \
585e5dcc 1089 if (unlikely(!LTTNG_READ_ONCE(__chan->enabled))) \
e64957da 1090 return; \
a67ba386 1091 if (unlikely(!LTTNG_READ_ONCE(__event_recorder->parent.enabled))) \
52fc2e1f 1092 return; \
d1f652f8
MD
1093 __lf = lttng_rcu_dereference(__session->pid_tracker.p); \
1094 if (__lf && likely(!lttng_id_tracker_lookup(__lf, current->tgid))) \
1095 return; \
1096 __lf = lttng_rcu_dereference(__session->vpid_tracker.p); \
1097 if (__lf && likely(!lttng_id_tracker_lookup(__lf, task_tgid_vnr(current)))) \
1098 return; \
1099 __lf = lttng_rcu_dereference(__session->uid_tracker.p); \
1100 if (__lf && likely(!lttng_id_tracker_lookup(__lf, \
608416e1 1101 lttng_current_uid()))) \
d1f652f8
MD
1102 return; \
1103 __lf = lttng_rcu_dereference(__session->vuid_tracker.p); \
1104 if (__lf && likely(!lttng_id_tracker_lookup(__lf, \
608416e1 1105 lttng_current_vuid()))) \
d1f652f8
MD
1106 return; \
1107 __lf = lttng_rcu_dereference(__session->gid_tracker.p); \
1108 if (__lf && likely(!lttng_id_tracker_lookup(__lf, \
608416e1 1109 lttng_current_gid()))) \
d1f652f8
MD
1110 return; \
1111 __lf = lttng_rcu_dereference(__session->vgid_tracker.p); \
1112 if (__lf && likely(!lttng_id_tracker_lookup(__lf, \
608416e1 1113 lttng_current_vgid()))) \
e0130fab 1114 return; \
114667d5
MD
1115 __orig_dynamic_len_offset = this_cpu_ptr(&lttng_dynamic_len_stack)->offset; \
1116 __dynamic_len_idx = __orig_dynamic_len_offset; \
265822ae 1117 _code_pre \
a67ba386 1118 if (unlikely(!list_empty(&__event_recorder->priv->parent.filter_bytecode_runtime_head))) { \
f127e61e 1119 struct lttng_bytecode_runtime *bc_runtime; \
a67ba386 1120 int __filter_record = __event_recorder->priv->parent.has_enablers_without_filter_bytecode; \
f127e61e 1121 \
99d223ad 1122 __event_prepare_interpreter_stack__##_name(__stackvar.__filter_stack_data, \
f127e61e 1123 tp_locvar, _args); \
a67ba386 1124 lttng_list_for_each_entry_rcu(bc_runtime, &__event_recorder->priv->parent.filter_bytecode_runtime_head, node) { \
3d650c7b 1125 if (unlikely(bc_runtime->interpreter_funcs.filter(bc_runtime, &__lttng_probe_ctx, \
80c2a69a 1126 __stackvar.__filter_stack_data) & LTTNG_INTERPRETER_RECORD_FLAG)) { \
f127e61e 1127 __filter_record = 1; \
8904bcfa
FD
1128 break; \
1129 } \
f127e61e
MD
1130 } \
1131 if (likely(!__filter_record)) \
265822ae 1132 goto __post; \
f127e61e 1133 } \
114667d5
MD
1134 __event_len = __event_get_size__##_name(tp_locvar, _args); \
1135 if (unlikely(__event_len < 0)) { \
1136 lib_ring_buffer_lost_event_too_big(__chan->chan); \
1137 goto __post; \
1138 } \
7ca580f8 1139 __event_align = __event_get_align__##_name(tp_locvar, _args); \
79150a49 1140 lib_ring_buffer_ctx_init(&__ctx, __chan->chan, &__lttng_probe_ctx, __event_len, \
e763dbf5 1141 __event_align, -1); \
a67ba386 1142 __ret = __chan->ops->event_reserve(&__ctx, __event_recorder->priv->id); \
e763dbf5 1143 if (__ret < 0) \
265822ae 1144 goto __post; \
f127e61e 1145 _fields \
aaa4004a 1146 __chan->ops->event_commit(&__ctx); \
265822ae
MD
1147__post: \
1148 _code_post \
114667d5
MD
1149 barrier(); /* use before un-reserve. */ \
1150 this_cpu_ptr(&lttng_dynamic_len_stack)->offset = __orig_dynamic_len_offset; \
265822ae 1151 return; \
e763dbf5
MD
1152}
1153
3bc29f0a 1154#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS
265822ae 1155#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS(_name, _locvar, _code_pre, _fields, _code_post) \
f7bdf4db
MD
1156static void __event_probe__##_name(void *__data) \
1157{ \
7ca580f8 1158 struct probe_local_vars { _locvar }; \
a67ba386 1159 struct lttng_kernel_event_recorder *__event_recorder = __data; \
7fad9b39 1160 struct lttng_probe_ctx __lttng_probe_ctx = { \
a67ba386 1161 .event = __event_recorder, \
7fad9b39 1162 .event_notifier = NULL, \
ccecf3fb 1163 .interruptible = !irqs_disabled(), \
79150a49 1164 }; \
a67ba386 1165 struct lttng_channel *__chan = __event_recorder->chan; \
e0130fab 1166 struct lttng_session *__session = __chan->session; \
f7bdf4db 1167 struct lib_ring_buffer_ctx __ctx; \
114667d5
MD
1168 ssize_t __event_len; \
1169 size_t __event_align; \
ec0a7fba 1170 size_t __orig_dynamic_len_offset, __dynamic_len_idx __attribute__((unused)); \
f127e61e 1171 union { \
114667d5 1172 size_t __dynamic_len_removed[ARRAY_SIZE(__event_fields___##_name)]; \
f127e61e
MD
1173 char __filter_stack_data[2 * sizeof(unsigned long) * ARRAY_SIZE(__event_fields___##_name)]; \
1174 } __stackvar; \
f7bdf4db 1175 int __ret; \
7ca580f8
MD
1176 struct probe_local_vars __tp_locvar; \
1177 struct probe_local_vars *tp_locvar __attribute__((unused)) = \
1178 &__tp_locvar; \
d1f652f8 1179 struct lttng_id_tracker_rcu *__lf; \
f7bdf4db 1180 \
e0130fab 1181 if (!_TP_SESSION_CHECK(session, __session)) \
c337ddc2 1182 return; \
585e5dcc 1183 if (unlikely(!LTTNG_READ_ONCE(__session->active))) \
f7bdf4db 1184 return; \
585e5dcc 1185 if (unlikely(!LTTNG_READ_ONCE(__chan->enabled))) \
f7bdf4db 1186 return; \
a67ba386 1187 if (unlikely(!LTTNG_READ_ONCE(__event_recorder->parent.enabled))) \
f7bdf4db 1188 return; \
d1f652f8
MD
1189 __lf = lttng_rcu_dereference(__session->pid_tracker.p); \
1190 if (__lf && likely(!lttng_id_tracker_lookup(__lf, current->tgid))) \
1191 return; \
1192 __lf = lttng_rcu_dereference(__session->vpid_tracker.p); \
1193 if (__lf && likely(!lttng_id_tracker_lookup(__lf, task_tgid_vnr(current)))) \
1194 return; \
1195 __lf = lttng_rcu_dereference(__session->uid_tracker.p); \
1196 if (__lf && likely(!lttng_id_tracker_lookup(__lf, \
608416e1 1197 lttng_current_uid()))) \
d1f652f8
MD
1198 return; \
1199 __lf = lttng_rcu_dereference(__session->vuid_tracker.p); \
1200 if (__lf && likely(!lttng_id_tracker_lookup(__lf, \
608416e1 1201 lttng_current_vuid()))) \
d1f652f8
MD
1202 return; \
1203 __lf = lttng_rcu_dereference(__session->gid_tracker.p); \
1204 if (__lf && likely(!lttng_id_tracker_lookup(__lf, \
608416e1 1205 lttng_current_gid()))) \
d1f652f8
MD
1206 return; \
1207 __lf = lttng_rcu_dereference(__session->vgid_tracker.p); \
1208 if (__lf && likely(!lttng_id_tracker_lookup(__lf, \
608416e1 1209 lttng_current_vgid()))) \
e0130fab 1210 return; \
114667d5
MD
1211 __orig_dynamic_len_offset = this_cpu_ptr(&lttng_dynamic_len_stack)->offset; \
1212 __dynamic_len_idx = __orig_dynamic_len_offset; \
265822ae 1213 _code_pre \
a67ba386 1214 if (unlikely(!list_empty(&__event_recorder->priv->parent.filter_bytecode_runtime_head))) { \
f127e61e 1215 struct lttng_bytecode_runtime *bc_runtime; \
a67ba386 1216 int __filter_record = __event_recorder->priv->parent.has_enablers_without_filter_bytecode; \
f127e61e 1217 \
99d223ad 1218 __event_prepare_interpreter_stack__##_name(__stackvar.__filter_stack_data, \
f127e61e 1219 tp_locvar); \
a67ba386 1220 lttng_list_for_each_entry_rcu(bc_runtime, &__event_recorder->priv->parent.filter_bytecode_runtime_head, node) { \
3d650c7b 1221 if (unlikely(bc_runtime->interpreter_funcs.filter(bc_runtime, &__lttng_probe_ctx, \
80c2a69a 1222 __stackvar.__filter_stack_data) & LTTNG_INTERPRETER_RECORD_FLAG)) { \
f127e61e 1223 __filter_record = 1; \
8904bcfa
FD
1224 break; \
1225 } \
f127e61e
MD
1226 } \
1227 if (likely(!__filter_record)) \
265822ae 1228 goto __post; \
f127e61e 1229 } \
114667d5
MD
1230 __event_len = __event_get_size__##_name(tp_locvar); \
1231 if (unlikely(__event_len < 0)) { \
1232 lib_ring_buffer_lost_event_too_big(__chan->chan); \
1233 goto __post; \
1234 } \
7ca580f8 1235 __event_align = __event_get_align__##_name(tp_locvar); \
79150a49 1236 lib_ring_buffer_ctx_init(&__ctx, __chan->chan, &__lttng_probe_ctx, __event_len, \
f7bdf4db 1237 __event_align, -1); \
a67ba386 1238 __ret = __chan->ops->event_reserve(&__ctx, __event_recorder->priv->id); \
f7bdf4db 1239 if (__ret < 0) \
265822ae 1240 goto __post; \
f127e61e 1241 _fields \
f7bdf4db 1242 __chan->ops->event_commit(&__ctx); \
265822ae
MD
1243__post: \
1244 _code_post \
114667d5
MD
1245 barrier(); /* use before un-reserve. */ \
1246 this_cpu_ptr(&lttng_dynamic_len_stack)->offset = __orig_dynamic_len_offset; \
265822ae 1247 return; \
f7bdf4db
MD
1248}
1249
e763dbf5
MD
1250#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
1251
f127e61e
MD
1252#undef __get_dynamic_len
1253
7fad9b39
FD
1254/*
1255 * Stage 6.1 of tracepoint generation: generate event notifier probes
1256 *
1257 * Create the probe function. This function evaluates the filter bytecode and
1258 * queue a notification to be sent to userspace.
1259 */
1260
1261#include <lttng/events-reset.h> /* Reset all macros within LTTNG_TRACEPOINT_EVENT */
1262
1263#undef TP_PROTO
1264#define TP_PROTO(...) __VA_ARGS__
1265
1266#undef TP_ARGS
1267#define TP_ARGS(...) __VA_ARGS__
1268
1269#undef TP_FIELDS
1270#define TP_FIELDS(...) __VA_ARGS__
1271
1272#undef TP_locvar
1273#define TP_locvar(...) __VA_ARGS__
1274
1275#undef TP_code_pre
1276#define TP_code_pre(...) __VA_ARGS__
1277
1278#undef TP_code_post
1279#define TP_code_post(...) __VA_ARGS__
1280
1281/*
1282 * Using twice size for filter stack data to hold size and pointer for
1283 * each field (worse case). For integers, max size required is 64-bit.
1284 * Same for double-precision floats. Those fit within
1285 * 2*sizeof(unsigned long) for all supported architectures.
1286 * Perform UNION (||) of filter runtime list.
1287 */
1288#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE
1289#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE(_name, _proto, _args, _locvar, _code_pre, _fields, _code_post) \
1290static void __event_notifier_probe__##_name(void *__data, _proto) \
1291{ \
1292 struct probe_local_vars { _locvar }; \
a67ba386 1293 struct lttng_kernel_event_notifier *__event_notifier = __data; \
7fad9b39
FD
1294 struct lttng_probe_ctx __lttng_probe_ctx = { \
1295 .event = NULL, \
1296 .event_notifier = __event_notifier, \
1297 .interruptible = !irqs_disabled(), \
1298 }; \
1299 union { \
1300 size_t __dynamic_len_removed[ARRAY_SIZE(__event_fields___##_name)]; \
99d223ad 1301 char __interpreter_stack_data[2 * sizeof(unsigned long) * ARRAY_SIZE(__event_fields___##_name)]; \
7fad9b39
FD
1302 } __stackvar; \
1303 struct probe_local_vars __tp_locvar; \
1304 struct probe_local_vars *tp_locvar __attribute__((unused)) = \
1305 &__tp_locvar; \
a67ba386 1306 struct lttng_kernel_notification_ctx __notif_ctx; \
c3eddb2e 1307 bool __interpreter_stack_prepared = false; \
7fad9b39 1308 \
a67ba386 1309 if (unlikely(!READ_ONCE(__event_notifier->parent.enabled))) \
7fad9b39
FD
1310 return; \
1311 _code_pre \
a67ba386 1312 if (unlikely(!list_empty(&__event_notifier->priv->parent.filter_bytecode_runtime_head))) { \
99d223ad 1313 struct lttng_bytecode_runtime *bc_runtime; \
a67ba386 1314 int __filter_record = __event_notifier->priv->parent.has_enablers_without_filter_bytecode; \
99d223ad
FD
1315 \
1316 __event_prepare_interpreter_stack__##_name(__stackvar.__interpreter_stack_data, \
1317 tp_locvar, _args); \
c3eddb2e 1318 __interpreter_stack_prepared = true; \
a67ba386 1319 lttng_list_for_each_entry_rcu(bc_runtime, &__event_notifier->priv->parent.filter_bytecode_runtime_head, node) { \
99d223ad
FD
1320 if (unlikely(bc_runtime->interpreter_funcs.filter(bc_runtime, &__lttng_probe_ctx, \
1321 __stackvar.__interpreter_stack_data) & LTTNG_INTERPRETER_RECORD_FLAG)) \
7fad9b39
FD
1322 __filter_record = 1; \
1323 } \
1324 if (likely(!__filter_record)) \
1325 goto __post; \
1326 } \
1327 \
c3eddb2e
MD
1328 __notif_ctx.eval_capture = LTTNG_READ_ONCE(__event_notifier->eval_capture); \
1329 if (unlikely(!__interpreter_stack_prepared && __notif_ctx.eval_capture)) \
99d223ad
FD
1330 __event_prepare_interpreter_stack__##_name( \
1331 __stackvar.__interpreter_stack_data, \
1332 tp_locvar, _args); \
1333 \
a67ba386 1334 __event_notifier->notification_send(__event_notifier, \
99d223ad 1335 &__lttng_probe_ctx, \
c3eddb2e
MD
1336 __stackvar.__interpreter_stack_data, \
1337 &__notif_ctx); \
99d223ad 1338 \
7fad9b39
FD
1339__post: \
1340 _code_post \
1341 return; \
1342}
1343
1344#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS
1345#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS(_name, _locvar, _code_pre, _fields, _code_post) \
1346static void __event_notifier_probe__##_name(void *__data) \
1347{ \
1348 struct probe_local_vars { _locvar }; \
a67ba386 1349 struct lttng_kernel_event_notifier *__event_notifier = __data; \
7fad9b39
FD
1350 struct lttng_probe_ctx __lttng_probe_ctx = { \
1351 .event = NULL, \
1352 .event_notifier = __event_notifier, \
1353 .interruptible = !irqs_disabled(), \
1354 }; \
1355 union { \
1356 size_t __dynamic_len_removed[ARRAY_SIZE(__event_fields___##_name)]; \
99d223ad 1357 char __interpreter_stack_data[2 * sizeof(unsigned long) * ARRAY_SIZE(__event_fields___##_name)]; \
7fad9b39
FD
1358 } __stackvar; \
1359 struct probe_local_vars __tp_locvar; \
1360 struct probe_local_vars *tp_locvar __attribute__((unused)) = \
1361 &__tp_locvar; \
a67ba386 1362 struct lttng_kernel_notification_ctx __notif_ctx; \
c3eddb2e 1363 bool __interpreter_stack_prepared = false; \
7fad9b39 1364 \
a67ba386 1365 if (unlikely(!READ_ONCE(__event_notifier->parent.enabled))) \
7fad9b39
FD
1366 return; \
1367 _code_pre \
a67ba386 1368 if (unlikely(!list_empty(&__event_notifier->priv->parent.filter_bytecode_runtime_head))) { \
99d223ad 1369 struct lttng_bytecode_runtime *bc_runtime; \
a67ba386 1370 int __filter_record = __event_notifier->priv->parent.has_enablers_without_filter_bytecode; \
99d223ad
FD
1371 \
1372 __event_prepare_interpreter_stack__##_name(__stackvar.__interpreter_stack_data, \
1373 tp_locvar); \
c3eddb2e 1374 __interpreter_stack_prepared = true; \
a67ba386 1375 lttng_list_for_each_entry_rcu(bc_runtime, &__event_notifier->priv->parent.filter_bytecode_runtime_head, node) { \
99d223ad
FD
1376 if (unlikely(bc_runtime->interpreter_funcs.filter(bc_runtime, &__lttng_probe_ctx, \
1377 __stackvar.__interpreter_stack_data) & LTTNG_INTERPRETER_RECORD_FLAG)) \
7fad9b39
FD
1378 __filter_record = 1; \
1379 } \
1380 if (likely(!__filter_record)) \
1381 goto __post; \
1382 } \
1383 \
c3eddb2e
MD
1384 __notif_ctx.eval_capture = LTTNG_READ_ONCE(__event_notifier->eval_capture); \
1385 if (unlikely(!__interpreter_stack_prepared && __notif_ctx.eval_capture)) \
99d223ad
FD
1386 __event_prepare_interpreter_stack__##_name( \
1387 __stackvar.__interpreter_stack_data, \
1388 tp_locvar); \
1389 \
a67ba386 1390 __event_notifier->notification_send(__event_notifier, \
99d223ad 1391 &__lttng_probe_ctx, \
c3eddb2e
MD
1392 __stackvar.__interpreter_stack_data, \
1393 &__notif_ctx); \
7fad9b39
FD
1394__post: \
1395 _code_post \
1396 return; \
1397}
1398
1399#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
f127e61e
MD
1400/*
1401 * Stage 7 of the trace events.
1402 *
1403 * Create event descriptions.
1404 */
1405
1406/* Named field types must be defined in lttng-types.h */
1407
3b4aafcb 1408#include <lttng/events-reset.h> /* Reset all macros within LTTNG_TRACEPOINT_EVENT */
f127e61e
MD
1409
1410#ifndef TP_PROBE_CB
1411#define TP_PROBE_CB(_template) &__event_probe__##_template
1412#endif
1413
7fad9b39
FD
1414#ifndef TP_EVENT_NOTIFIER_PROBE_CB
1415#define TP_EVENT_NOTIFIER_PROBE_CB(_template) &__event_notifier_probe__##_template
1416#endif
1417
f127e61e
MD
1418#undef LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS
1419#define LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS(_template, _name, _map) \
437d5aa5
MD
1420static const struct lttng_kernel_event_desc __event_desc___##_map = { \
1421 .event_name = #_map, \
1422 .event_kname = #_name, \
1423 .probe_callback = (void *) TP_PROBE_CB(_template), \
f127e61e 1424 .fields = __event_fields___##_template, \
f127e61e
MD
1425 .nr_fields = ARRAY_SIZE(__event_fields___##_template), \
1426 .owner = THIS_MODULE, \
437d5aa5 1427 .event_notifier_callback = (void *) TP_EVENT_NOTIFIER_PROBE_CB(_template), \
f127e61e
MD
1428};
1429
1430#undef LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP
1431#define LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(_template, _name, _map, _proto, _args) \
1432 LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS(_template, _name, _map)
1433
1434#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
1435
1436/*
1437 * Stage 8 of the trace events.
1438 *
1439 * Create an array of event description pointers.
1440 */
1441
3b4aafcb 1442#include <lttng/events-reset.h> /* Reset all macros within LTTNG_TRACEPOINT_EVENT */
f127e61e
MD
1443
1444#undef LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS
1445#define LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS(_template, _name, _map) \
1446 &__event_desc___##_map,
1447
1448#undef LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP
1449#define LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(_template, _name, _map, _proto, _args) \
1450 LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS(_template, _name, _map)
1451
1452#define TP_ID1(_token, _system) _token##_system
1453#define TP_ID(_token, _system) TP_ID1(_token, _system)
1454
437d5aa5 1455static const struct lttng_kernel_event_desc *TP_ID(__event_desc___, TRACE_SYSTEM)[] = {
f127e61e
MD
1456#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
1457};
1458
1459#undef TP_ID1
1460#undef TP_ID
1461
1462/*
1463 * Stage 9 of the trace events.
1464 *
1465 * Create a toplevel descriptor for the whole probe.
1466 */
1467
1468#define TP_ID1(_token, _system) _token##_system
1469#define TP_ID(_token, _system) TP_ID1(_token, _system)
1470
1471/* non-const because list head will be modified when registered. */
437d5aa5
MD
1472static __used struct lttng_kernel_probe_desc TP_ID(__probe_desc___, TRACE_SYSTEM) = {
1473 .provider_name = __stringify(TRACE_SYSTEM),
f127e61e
MD
1474 .event_desc = TP_ID(__event_desc___, TRACE_SYSTEM),
1475 .nr_events = ARRAY_SIZE(TP_ID(__event_desc___, TRACE_SYSTEM)),
1476 .head = { NULL, NULL },
1477 .lazy_init_head = { NULL, NULL },
1478 .lazy = 0,
1479};
1480
1481#undef TP_ID1
1482#undef TP_ID
1483
3afe7aac 1484/*
c099397a 1485 * Stage 10 of the trace events.
3afe7aac
MD
1486 *
1487 * Register/unregister probes at module load/unload.
1488 */
1489
3b4aafcb 1490#include <lttng/events-reset.h> /* Reset all macros within LTTNG_TRACEPOINT_EVENT */
3afe7aac
MD
1491
1492#define TP_ID1(_token, _system) _token##_system
1493#define TP_ID(_token, _system) TP_ID1(_token, _system)
1494#define module_init_eval1(_token, _system) module_init(_token##_system)
1495#define module_init_eval(_token, _system) module_init_eval1(_token, _system)
1496#define module_exit_eval1(_token, _system) module_exit(_token##_system)
1497#define module_exit_eval(_token, _system) module_exit_eval1(_token, _system)
1498
2655f9ad 1499#ifndef TP_MODULE_NOINIT
3afe7aac
MD
1500static int TP_ID(__lttng_events_init__, TRACE_SYSTEM)(void)
1501{
263b6c88 1502 wrapper_vmalloc_sync_mappings();
a90917c3 1503 return lttng_probe_register(&TP_ID(__probe_desc___, TRACE_SYSTEM));
3afe7aac
MD
1504}
1505
3afe7aac
MD
1506static void TP_ID(__lttng_events_exit__, TRACE_SYSTEM)(void)
1507{
a90917c3 1508 lttng_probe_unregister(&TP_ID(__probe_desc___, TRACE_SYSTEM));
3afe7aac
MD
1509}
1510
2655f9ad
MD
1511#ifndef TP_MODULE_NOAUTOLOAD
1512module_init_eval(__lttng_events_init__, TRACE_SYSTEM);
3afe7aac 1513module_exit_eval(__lttng_events_exit__, TRACE_SYSTEM);
259b6cb3 1514#endif
3afe7aac 1515
2655f9ad
MD
1516#endif
1517
3afe7aac
MD
1518#undef module_init_eval
1519#undef module_exit_eval
1520#undef TP_ID1
1521#undef TP_ID
177b3692
MD
1522
1523#undef TP_PROTO
1524#undef TP_ARGS
This page took 0.171919 seconds and 4 git commands to generate.