Fix: __string() and tp_strcpy() should handle NULL pointers
[lttng-modules.git] / probes / lttng-events.h
CommitLineData
17baffe2
MD
1/*
2 * lttng-events.h
3 *
4 * Copyright (C) 2009 Steven Rostedt <rostedt@goodmis.org>
886d51a3 5 * Copyright (C) 2009-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
17baffe2 6 *
886d51a3
MD
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; only
10 * version 2.1 of the License.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17baffe2 20 */
d28686c1 21#include <linux/uaccess.h>
d0dd2ecb 22#include <linux/debugfs.h>
c0edae1d
MD
23#include "lttng.h"
24#include "lttng-types.h"
7b8ea3a5 25#include "lttng-probe-user.h"
b13f3ebe 26#include "../wrapper/vmalloc.h" /* for wrapper_vmalloc_sync_all() */
f3bc08c5 27#include "../wrapper/ringbuffer/frontend_types.h"
a90917c3
MD
28#include "../lttng-events.h"
29#include "../lttng-tracer-core.h"
40652b65 30
54f9f68d
MD
31#define __LTTNG_NULL_STRING "(null)"
32
40652b65 33/*
6db3d13b 34 * Macro declarations used for all stages.
40652b65
MD
35 */
36
76e4f017
MD
37/*
38 * LTTng name mapping macros. LTTng remaps some of the kernel events to
39 * enforce name-spacing.
40 */
3bc29f0a
MD
41#undef LTTNG_TRACEPOINT_EVENT_MAP
42#define LTTNG_TRACEPOINT_EVENT_MAP(name, map, proto, args, tstruct, assign, print) \
43 LTTNG_TRACEPOINT_EVENT_CLASS(map, \
76e4f017
MD
44 PARAMS(proto), \
45 PARAMS(args), \
46 PARAMS(tstruct), \
47 PARAMS(assign), \
48 PARAMS(print)) \
3bc29f0a 49 LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(map, name, map, PARAMS(proto), PARAMS(args))
76e4f017 50
3bc29f0a
MD
51#undef LTTNG_TRACEPOINT_EVENT_MAP_NOARGS
52#define LTTNG_TRACEPOINT_EVENT_MAP_NOARGS(name, map, tstruct, assign, print) \
53 LTTNG_TRACEPOINT_EVENT_CLASS_NOARGS(map, \
76e4f017
MD
54 PARAMS(tstruct), \
55 PARAMS(assign), \
56 PARAMS(print)) \
3bc29f0a 57 LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS(map, name, map)
76e4f017 58
3bc29f0a
MD
59#undef LTTNG_TRACEPOINT_EVENT_CODE
60#define LTTNG_TRACEPOINT_EVENT_CODE(name, proto, args, _locvar, _code, tstruct, assign, print) \
61 LTTNG_TRACEPOINT_EVENT_CLASS_CODE(name, \
7ca580f8
MD
62 PARAMS(proto), \
63 PARAMS(args), \
64 PARAMS(_locvar), \
65 PARAMS(_code), \
66 PARAMS(tstruct), \
67 PARAMS(assign), \
68 PARAMS(print)) \
3bc29f0a 69 LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(name, name, name, PARAMS(proto), PARAMS(args))
7ca580f8 70
3bc29f0a
MD
71
72#undef LTTNG_TRACEPOINT_EVENT_INSTANCE_PRINT_MAP
73#define LTTNG_TRACEPOINT_EVENT_INSTANCE_PRINT_MAP(template, name, map, proto, args, print) \
74 LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(template, name, map, PARAMS(proto), PARAMS(args))
76e4f017
MD
75
76/* Callbacks are meaningless to LTTng. */
3bc29f0a
MD
77#undef LTTNG_TRACEPOINT_EVENT_FN_MAP
78#define LTTNG_TRACEPOINT_EVENT_FN_MAP(name, map, proto, args, tstruct, \
76e4f017 79 assign, print, reg, unreg) \
3bc29f0a
MD
80 LTTNG_TRACEPOINT_EVENT_MAP(name, map, PARAMS(proto), PARAMS(args), \
81 PARAMS(tstruct), PARAMS(assign), PARAMS(print))
76e4f017 82
3bc29f0a
MD
83#undef LTTNG_TRACEPOINT_EVENT_CONDITION_MAP
84#define LTTNG_TRACEPOINT_EVENT_CONDITION_MAP(name, map, proto, args, cond, tstruct, assign, print) \
85 LTTNG_TRACEPOINT_EVENT_MAP(name, map, \
76e4f017
MD
86 PARAMS(proto), \
87 PARAMS(args), \
88 PARAMS(tstruct), \
89 PARAMS(assign), \
90 PARAMS(print))
91
fcf7fa33
MD
92#undef LTTNG_TRACEPOINT_EVENT_INSTANCE_CONDITION_MAP
93#define LTTNG_TRACEPOINT_EVENT_INSTANCE_CONDITION_MAP(template, name, map, proto, args, cond) \
94 LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(template, name, map, PARAMS(proto), PARAMS(args))
95
40652b65 96/*
3bc29f0a
MD
97 * LTTNG_TRACEPOINT_EVENT_CLASS can be used to add a generic function
98 * handlers for events. That is, if all events have the same parameters
99 * and just have distinct trace points. Each tracepoint can be defined
100 * with LTTNG_TRACEPOINT_EVENT_INSTANCE and that will map the
101 * LTTNG_TRACEPOINT_EVENT_CLASS to the tracepoint.
40652b65 102 *
3bc29f0a
MD
103 * LTTNG_TRACEPOINT_EVENT is a one to one mapping between tracepoint and
104 * template.
40652b65 105 */
6db3d13b 106
3bc29f0a
MD
107#undef LTTNG_TRACEPOINT_EVENT
108#define LTTNG_TRACEPOINT_EVENT(name, proto, args, tstruct, assign, print) \
109 LTTNG_TRACEPOINT_EVENT_MAP(name, name, \
110 PARAMS(proto), \
111 PARAMS(args), \
112 PARAMS(tstruct), \
113 PARAMS(assign), \
76e4f017 114 PARAMS(print))
40652b65 115
3bc29f0a
MD
116#undef LTTNG_TRACEPOINT_EVENT_NOARGS
117#define LTTNG_TRACEPOINT_EVENT_NOARGS(name, tstruct, assign, print) \
118 LTTNG_TRACEPOINT_EVENT_MAP_NOARGS(name, name, \
119 PARAMS(tstruct), \
120 PARAMS(assign), \
76e4f017 121 PARAMS(print))
f7bdf4db 122
3bc29f0a
MD
123#undef LTTNG_TRACEPOINT_EVENT_INSTANCE_PRINT
124#define LTTNG_TRACEPOINT_EVENT_INSTANCE_PRINT(template, name, proto, args, print) \
125 LTTNG_TRACEPOINT_EVENT_INSTANCE_PRINT_MAP(template, name, name, \
76e4f017 126 PARAMS(proto), PARAMS(args), PARAMS(print_))
6db3d13b 127
3bc29f0a
MD
128#undef LTTNG_TRACEPOINT_EVENT_FN
129#define LTTNG_TRACEPOINT_EVENT_FN(name, proto, args, tstruct, \
6db3d13b 130 assign, print, reg, unreg) \
3bc29f0a 131 LTTNG_TRACEPOINT_EVENT_FN_MAP(name, name, PARAMS(proto), PARAMS(args), \
76e4f017
MD
132 PARAMS(tstruct), PARAMS(assign), PARAMS(print), \
133 PARAMS(reg), PARAMS(unreg)) \
134
3bc29f0a
MD
135#undef LTTNG_TRACEPOINT_EVENT_INSTANCE
136#define LTTNG_TRACEPOINT_EVENT_INSTANCE(template, name, proto, args) \
137 LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(template, name, name, PARAMS(proto), PARAMS(args))
76e4f017 138
3bc29f0a
MD
139#undef LTTNG_TRACEPOINT_EVENT_INSTANCE_NOARGS
140#define LTTNG_TRACEPOINT_EVENT_INSTANCE_NOARGS(template, name) \
141 LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS(template, name, name)
76e4f017 142
3bc29f0a
MD
143#undef LTTNG_TRACEPOINT_EVENT_CONDITION
144#define LTTNG_TRACEPOINT_EVENT_CONDITION(name, proto, args, cond, tstruct, assign, print) \
145 LTTNG_TRACEPOINT_EVENT_CONDITION_MAP(name, name, \
76e4f017
MD
146 PARAMS(proto), \
147 PARAMS(args), \
148 PARAMS(cond), \
149 PARAMS(tstruct), \
150 PARAMS(assign), \
151 PARAMS(print))
6db3d13b 152
3bc29f0a
MD
153#undef LTTNG_TRACEPOINT_EVENT_CLASS
154#define LTTNG_TRACEPOINT_EVENT_CLASS(_name, _proto, _args, _tstruct, _assign, _print) \
155 LTTNG_TRACEPOINT_EVENT_CLASS_CODE(_name, PARAMS(_proto), PARAMS(_args), , , \
7ca580f8
MD
156 PARAMS(_tstruct), PARAMS(_assign), PARAMS(_print))
157
3bc29f0a
MD
158#undef LTTNG_TRACEPOINT_EVENT_CLASS_NOARGS
159#define LTTNG_TRACEPOINT_EVENT_CLASS_NOARGS(_name, _tstruct, _assign, _print) \
160 LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS(_name, , , PARAMS(_tstruct), \
7ca580f8
MD
161 PARAMS(_assign), PARAMS(_print))
162
163
f62b389e 164/*
c099397a 165 * Stage 1 of the trace events.
f62b389e
MD
166 *
167 * Create dummy trace calls for each events, verifying that the LTTng module
3bc29f0a
MD
168 * instrumentation headers match the kernel arguments. Will be optimized
169 * out by the compiler.
f62b389e
MD
170 */
171
172#include "lttng-events-reset.h" /* Reset all macros within TRACE_EVENT */
173
174#undef TP_PROTO
175#define TP_PROTO(args...) args
176
177#undef TP_ARGS
178#define TP_ARGS(args...) args
179
3bc29f0a
MD
180#undef LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP
181#define LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(_template, _name, _map, _proto, _args) \
7eb827f2 182void trace_##_name(_proto);
f62b389e 183
3bc29f0a
MD
184#undef LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS
185#define LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS(_template, _name, _map) \
03a98277 186void trace_##_name(void);
f7bdf4db 187
c782f1f3
MD
188#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
189
190/*
6633b022
MD
191 * Stage 1.1 of the trace events.
192 *
193 * Create dummy trace prototypes for each event class, and for each used
194 * template. This will allow checking whether the prototypes from the
195 * class and the instance using the class actually match.
196 */
197
198#include "lttng-events-reset.h" /* Reset all macros within TRACE_EVENT */
199
200#undef TP_PROTO
201#define TP_PROTO(args...) args
202
203#undef TP_ARGS
204#define TP_ARGS(args...) args
205
206#undef LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP
207#define LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(_template, _name, _map, _proto, _args) \
208void __event_template_proto___##_template(_proto);
209
210#undef LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS
211#define LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS(_template, _name, _map) \
212void __event_template_proto___##_template(void);
213
214#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE
215#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE(_name, _proto, _args, _locvar, _code, _tstruct, _assign, _print) \
216void __event_template_proto___##_name(_proto);
217
218#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS
219#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS(_name, _locvar, _code, _tstruct, _assign, _print) \
220void __event_template_proto___##_name(void);
221
f62b389e
MD
222#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
223
6db3d13b 224/*
c099397a 225 * Stage 2 of the trace events.
6db3d13b
MD
226 *
227 * Create event field type metadata section.
228 * Each event produce an array of fields.
229 */
230
231#include "lttng-events-reset.h" /* Reset all macros within TRACE_EVENT */
232
1d12cebd
MD
233/* Named field types must be defined in lttng-types.h */
234
d71e6471
MD
235#undef __field_full
236#define __field_full(_type, _item, _order, _base) \
c099397a
MD
237 { \
238 .name = #_item, \
d71e6471 239 .type = __type_integer(_type, _order, _base, none), \
c099397a 240 },
40652b65 241
d71e6471
MD
242#undef __field
243#define __field(_type, _item) \
244 __field_full(_type, _item, __BYTE_ORDER, 10)
245
40652b65 246#undef __field_ext
d71e6471
MD
247#define __field_ext(_type, _item, _filter_type) \
248 __field(_type, _item)
40652b65 249
6d20e0ae
MD
250#undef __field_hex
251#define __field_hex(_type, _item) \
252 __field_full(_type, _item, __BYTE_ORDER, 16)
253
29021503
MD
254#undef __field_oct
255#define __field_oct(_type, _item) \
256 __field_full(_type, _item, __BYTE_ORDER, 8)
257
c099397a
MD
258#undef __field_network
259#define __field_network(_type, _item) \
d71e6471
MD
260 __field_full(_type, _item, __BIG_ENDIAN, 10)
261
262#undef __field_network_hex
263#define __field_network_hex(_type, _item) \
264 __field_full(_type, _item, __BIG_ENDIAN, 16)
c099397a 265
d71e6471
MD
266#undef __array_enc_ext
267#define __array_enc_ext(_type, _item, _length, _order, _base, _encoding)\
299338c8 268 { \
c099397a
MD
269 .name = #_item, \
270 .type = \
271 { \
299338c8 272 .atype = atype_array, \
c099397a
MD
273 .u.array = \
274 { \
275 .length = _length, \
d71e6471 276 .elem_type = __type_integer(_type, _order, _base, _encoding), \
c099397a 277 }, \
299338c8
MD
278 }, \
279 },
40652b65 280
64c796d8
MD
281#undef __array
282#define __array(_type, _item, _length) \
d71e6471 283 __array_enc_ext(_type, _item, _length, __BYTE_ORDER, 10, none)
64c796d8
MD
284
285#undef __array_text
286#define __array_text(_type, _item, _length) \
d71e6471 287 __array_enc_ext(_type, _item, _length, __BYTE_ORDER, 10, UTF8)
64c796d8 288
d71e6471
MD
289#undef __array_hex
290#define __array_hex(_type, _item, _length) \
291 __array_enc_ext(_type, _item, _length, __BYTE_ORDER, 16, none)
292
293#undef __dynamic_array_enc_ext
294#define __dynamic_array_enc_ext(_type, _item, _length, _order, _base, _encoding) \
299338c8 295 { \
c099397a
MD
296 .name = #_item, \
297 .type = \
298 { \
299338c8 299 .atype = atype_sequence, \
c099397a
MD
300 .u.sequence = \
301 { \
64c796d8 302 .length_type = __type_integer(u32, __BYTE_ORDER, 10, none), \
d71e6471 303 .elem_type = __type_integer(_type, _order, _base, _encoding), \
c099397a 304 }, \
299338c8
MD
305 }, \
306 },
40652b65 307
84da5206
MD
308#undef __dynamic_array_enc_ext_2
309#define __dynamic_array_enc_ext_2(_type, _item, _length1, _length2, _order, _base, _encoding) \
310 __dynamic_array_enc_ext(_type, _item, _length1 + _length2, _order, _base, _encoding)
311
64c796d8
MD
312#undef __dynamic_array
313#define __dynamic_array(_type, _item, _length) \
d71e6471 314 __dynamic_array_enc_ext(_type, _item, _length, __BYTE_ORDER, 10, none)
64c796d8
MD
315
316#undef __dynamic_array_text
317#define __dynamic_array_text(_type, _item, _length) \
d71e6471
MD
318 __dynamic_array_enc_ext(_type, _item, _length, __BYTE_ORDER, 10, UTF8)
319
320#undef __dynamic_array_hex
321#define __dynamic_array_hex(_type, _item, _length) \
322 __dynamic_array_enc_ext(_type, _item, _length, __BYTE_ORDER, 16, none)
64c796d8 323
7ca580f8
MD
324#undef __dynamic_array_network_hex
325#define __dynamic_array_network_hex(_type, _item, _length) \
326 __dynamic_array_enc_ext(_type, _item, _length, __BIG_ENDIAN, 16, none)
327
328#undef __dynamic_array_network
329#define __dynamic_array_network(_type, _item, _length) \
330 __dynamic_array_enc_ext(_type, _item, _length, __BIG_ENDIAN, 10, none)
331
84da5206
MD
332#undef __dynamic_array_text_2
333#define __dynamic_array_text_2(_type, _item, _length1, _length2) \
334 __dynamic_array_enc_ext_2(_type, _item, _length1, _length2, __BYTE_ORDER, 10, UTF8)
335
40652b65 336#undef __string
1d12cebd 337#define __string(_item, _src) \
299338c8 338 { \
c099397a
MD
339 .name = #_item, \
340 .type = \
341 { \
299338c8 342 .atype = atype_string, \
c099397a 343 .u.basic.string.encoding = lttng_encode_UTF8, \
299338c8
MD
344 }, \
345 },
1d12cebd 346
c6e3f225
MD
347#undef __string_from_user
348#define __string_from_user(_item, _src) \
349 __string(_item, _src)
350
40652b65 351#undef TP_STRUCT__entry
1d12cebd
MD
352#define TP_STRUCT__entry(args...) args /* Only one used in this phase */
353
3bc29f0a
MD
354#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS
355#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS(_name, _locvar, _code, _tstruct, _assign, _print) \
0d1d4002
MD
356 static const struct lttng_event_field __event_fields___##_name[] = { \
357 _tstruct \
299338c8
MD
358 };
359
3bc29f0a
MD
360#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE
361#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE(_name, _proto, _args, _locvar, _code, _tstruct, _assign, _print) \
362 LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS(_name, _locvar, _code, PARAMS(_tstruct), PARAMS(_assign), \
f7bdf4db
MD
363 PARAMS(_print))
364
299338c8
MD
365#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
366
19c57fbf 367/*
c099397a 368 * Stage 3 of the trace events.
19c57fbf
MD
369 *
370 * Create probe callback prototypes.
371 */
372
373#include "lttng-events-reset.h" /* Reset all macros within TRACE_EVENT */
374
375#undef TP_PROTO
376#define TP_PROTO(args...) args
377
3bc29f0a
MD
378#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE
379#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE(_name, _proto, _args, _locvar, _code, _tstruct, _assign, _print) \
19c57fbf
MD
380static void __event_probe__##_name(void *__data, _proto);
381
3bc29f0a
MD
382#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS
383#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS(_name, _locvar, _code, _tstruct, _assign, _print) \
f7bdf4db
MD
384static void __event_probe__##_name(void *__data);
385
19c57fbf
MD
386#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
387
299338c8 388/*
f7bdf4db 389 * Stage 3.9 of the trace events.
299338c8 390 *
f7bdf4db 391 * Create event descriptions.
299338c8
MD
392 */
393
299338c8
MD
394/* Named field types must be defined in lttng-types.h */
395
6db3d13b 396#include "lttng-events-reset.h" /* Reset all macros within TRACE_EVENT */
299338c8 397
1ec65de1
MD
398#ifndef TP_PROBE_CB
399#define TP_PROBE_CB(_template) &__event_probe__##_template
400#endif
401
3bc29f0a
MD
402#undef LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS
403#define LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS(_template, _name, _map) \
76e4f017 404static const struct lttng_event_desc __event_desc___##_map = { \
f7bdf4db 405 .fields = __event_fields___##_template, \
76e4f017 406 .name = #_map, \
a26a7e4f 407 .kname = #_name, \
f7bdf4db
MD
408 .probe_callback = (void *) TP_PROBE_CB(_template), \
409 .nr_fields = ARRAY_SIZE(__event_fields___##_template), \
410 .owner = THIS_MODULE, \
411};
412
3bc29f0a
MD
413#undef LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP
414#define LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(_template, _name, _map, _proto, _args) \
415 LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS(_template, _name, _map)
f7bdf4db
MD
416
417#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
418
419
420/*
421 * Stage 4 of the trace events.
422 *
423 * Create an array of event description pointers.
424 */
425
426/* Named field types must be defined in lttng-types.h */
427
428#include "lttng-events-reset.h" /* Reset all macros within TRACE_EVENT */
429
3bc29f0a
MD
430#undef LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS
431#define LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS(_template, _name, _map) \
76e4f017 432 &__event_desc___##_map,
f7bdf4db 433
3bc29f0a
MD
434#undef LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP
435#define LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(_template, _name, _map, _proto, _args) \
436 LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS(_template, _name, _map)
40652b65 437
d0dd2ecb
MD
438#define TP_ID1(_token, _system) _token##_system
439#define TP_ID(_token, _system) TP_ID1(_token, _system)
40652b65 440
f7bdf4db 441static const struct lttng_event_desc *TP_ID(__event_desc___, TRACE_SYSTEM)[] = {
40652b65 442#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
299338c8
MD
443};
444
d0dd2ecb
MD
445#undef TP_ID1
446#undef TP_ID
447
85a9ca7f
MD
448
449/*
c099397a 450 * Stage 5 of the trace events.
85a9ca7f
MD
451 *
452 * Create a toplevel descriptor for the whole probe.
453 */
454
455#define TP_ID1(_token, _system) _token##_system
456#define TP_ID(_token, _system) TP_ID1(_token, _system)
457
458/* non-const because list head will be modified when registered. */
25631135 459static __used struct lttng_probe_desc TP_ID(__probe_desc___, TRACE_SYSTEM) = {
85a9ca7f
MD
460 .event_desc = TP_ID(__event_desc___, TRACE_SYSTEM),
461 .nr_events = ARRAY_SIZE(TP_ID(__event_desc___, TRACE_SYSTEM)),
462};
463
464#undef TP_ID1
465#undef TP_ID
466
d0dd2ecb 467/*
c099397a 468 * Stage 6 of the trace events.
40652b65
MD
469 *
470 * Create static inline function that calculates event size.
471 */
472
6db3d13b 473#include "lttng-events-reset.h" /* Reset all macros within TRACE_EVENT */
40652b65 474
6db3d13b
MD
475/* Named field types must be defined in lttng-types.h */
476
d71e6471
MD
477#undef __field_full
478#define __field_full(_type, _item, _order, _base) \
a90917c3 479 __event_len += lib_ring_buffer_align(__event_len, lttng_alignof(_type)); \
0d1d4002 480 __event_len += sizeof(_type);
6db3d13b 481
d71e6471
MD
482#undef __array_enc_ext
483#define __array_enc_ext(_type, _item, _length, _order, _base, _encoding) \
a90917c3 484 __event_len += lib_ring_buffer_align(__event_len, lttng_alignof(_type)); \
0d1d4002 485 __event_len += sizeof(_type) * (_length);
6db3d13b 486
d71e6471
MD
487#undef __dynamic_array_enc_ext
488#define __dynamic_array_enc_ext(_type, _item, _length, _order, _base, _encoding)\
7ca580f8 489 __event_len += lib_ring_buffer_align(__event_len, lttng_alignof(u32)); \
85a80742 490 __event_len += sizeof(u32); \
a90917c3 491 __event_len += lib_ring_buffer_align(__event_len, lttng_alignof(_type)); \
41b59694
MD
492 __dynamic_len[__dynamic_len_idx] = (_length); \
493 __event_len += sizeof(_type) * __dynamic_len[__dynamic_len_idx]; \
494 __dynamic_len_idx++;
6db3d13b 495
84da5206
MD
496#undef __dynamic_array_enc_ext_2
497#define __dynamic_array_enc_ext_2(_type, _item, _length1, _length2, _order, _base, _encoding)\
7ca580f8 498 __event_len += lib_ring_buffer_align(__event_len, lttng_alignof(u32)); \
84da5206
MD
499 __event_len += sizeof(u32); \
500 __event_len += lib_ring_buffer_align(__event_len, lttng_alignof(_type)); \
501 __dynamic_len[__dynamic_len_idx] = (_length1); \
502 __event_len += sizeof(_type) * __dynamic_len[__dynamic_len_idx]; \
503 __dynamic_len_idx++; \
504 __dynamic_len[__dynamic_len_idx] = (_length2); \
505 __event_len += sizeof(_type) * __dynamic_len[__dynamic_len_idx]; \
506 __dynamic_len_idx++;
507
6db3d13b 508#undef __string
85a80742 509#define __string(_item, _src) \
54f9f68d
MD
510 __event_len += __dynamic_len[__dynamic_len_idx++] = \
511 strlen((_src) ? (_src) : __LTTNG_NULL_STRING) + 1;
0d1d4002 512
d0255731 513/*
786b8312
MD
514 * strlen_user includes \0. If returns 0, it faulted, so we set size to
515 * 1 (\0 only).
d0255731 516 */
c6e3f225
MD
517#undef __string_from_user
518#define __string_from_user(_item, _src) \
786b8312 519 __event_len += __dynamic_len[__dynamic_len_idx++] = \
7b8ea3a5 520 max_t(size_t, lttng_strlen_user_inatomic(_src), 1);
c6e3f225 521
0d1d4002
MD
522#undef TP_PROTO
523#define TP_PROTO(args...) args
6db3d13b
MD
524
525#undef TP_STRUCT__entry
0d1d4002 526#define TP_STRUCT__entry(args...) args
6db3d13b 527
7ca580f8
MD
528#undef TP_locvar
529#define TP_locvar(...) __VA_ARGS__
530
3bc29f0a
MD
531#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE
532#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE(_name, _proto, _args, _locvar, _code, _tstruct, _assign, _print) \
7ca580f8
MD
533static inline size_t __event_get_size__##_name(size_t *__dynamic_len, \
534 void *__tp_locvar, _proto) \
0d1d4002
MD
535{ \
536 size_t __event_len = 0; \
d3de7f14 537 unsigned int __dynamic_len_idx __attribute__((unused)) = 0; \
7ca580f8 538 struct { _locvar } *tp_locvar __attribute__((unused)) = __tp_locvar; \
d3de7f14
MD
539 \
540 _tstruct \
541 return __event_len; \
542}
543
3bc29f0a
MD
544#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS
545#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS(_name, _locvar, _code, _tstruct, _assign, _print) \
7ca580f8
MD
546static inline size_t __event_get_size__##_name(size_t *__dynamic_len, \
547 void *__tp_locvar) \
d3de7f14
MD
548{ \
549 size_t __event_len = 0; \
550 unsigned int __dynamic_len_idx __attribute__((unused)) = 0; \
7ca580f8 551 struct { _locvar } *tp_locvar __attribute__((unused)) = __tp_locvar; \
0d1d4002 552 \
0d1d4002
MD
553 _tstruct \
554 return __event_len; \
6db3d13b 555}
40652b65
MD
556
557#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
558
559/*
c099397a 560 * Stage 7 of the trace events.
e763dbf5
MD
561 *
562 * Create static inline function that calculates event payload alignment.
563 */
564
565#include "lttng-events-reset.h" /* Reset all macros within TRACE_EVENT */
566
567/* Named field types must be defined in lttng-types.h */
568
d71e6471
MD
569#undef __field_full
570#define __field_full(_type, _item, _order, _base) \
a90917c3 571 __event_align = max_t(size_t, __event_align, lttng_alignof(_type));
e763dbf5 572
d71e6471
MD
573#undef __array_enc_ext
574#define __array_enc_ext(_type, _item, _length, _order, _base, _encoding) \
a90917c3 575 __event_align = max_t(size_t, __event_align, lttng_alignof(_type));
e763dbf5 576
d71e6471
MD
577#undef __dynamic_array_enc_ext
578#define __dynamic_array_enc_ext(_type, _item, _length, _order, _base, _encoding)\
7ca580f8 579 __event_align = max_t(size_t, __event_align, lttng_alignof(u32)); \
a90917c3 580 __event_align = max_t(size_t, __event_align, lttng_alignof(_type));
e763dbf5 581
84da5206
MD
582#undef __dynamic_array_enc_ext_2
583#define __dynamic_array_enc_ext_2(_type, _item, _length1, _length2, _order, _base, _encoding)\
584 __dynamic_array_enc_ext(_type, _item, _length1 + _length2, _order, _base, _encoding)
585
e763dbf5
MD
586#undef __string
587#define __string(_item, _src)
588
c6e3f225
MD
589#undef __string_from_user
590#define __string_from_user(_item, _src)
591
e763dbf5
MD
592#undef TP_PROTO
593#define TP_PROTO(args...) args
594
595#undef TP_STRUCT__entry
596#define TP_STRUCT__entry(args...) args
597
7ca580f8
MD
598#undef TP_locvar
599#define TP_locvar(...) __VA_ARGS__
600
3bc29f0a
MD
601#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE
602#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE(_name, _proto, _args, _locvar, _code, _tstruct, _assign, _print) \
603static inline size_t __event_get_align__##_name(void *__tp_locvar, _proto) \
e763dbf5
MD
604{ \
605 size_t __event_align = 1; \
7ca580f8
MD
606 struct { _locvar } *tp_locvar __attribute__((unused)) = __tp_locvar; \
607 \
e763dbf5
MD
608 _tstruct \
609 return __event_align; \
610}
611
3bc29f0a
MD
612#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS
613#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS(_name, _locvar, _code, _tstruct, _assign, _print) \
7ca580f8 614static inline size_t __event_get_align__##_name(void *__tp_locvar) \
d3de7f14
MD
615{ \
616 size_t __event_align = 1; \
7ca580f8
MD
617 struct { _locvar } *tp_locvar __attribute__((unused)) = __tp_locvar; \
618 \
d3de7f14
MD
619 _tstruct \
620 return __event_align; \
621}
622
e763dbf5
MD
623#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
624
e763dbf5 625/*
c099397a 626 * Stage 8 of the trace events.
40652b65 627 *
3c4ffab9
MD
628 * Create structure declaration that allows the "assign" macros to access the
629 * field types.
630 */
631
632#include "lttng-events-reset.h" /* Reset all macros within TRACE_EVENT */
633
634/* Named field types must be defined in lttng-types.h */
635
d71e6471
MD
636#undef __field_full
637#define __field_full(_type, _item, _order, _base) _type _item;
3c4ffab9 638
d71e6471
MD
639#undef __array_enc_ext
640#define __array_enc_ext(_type, _item, _length, _order, _base, _encoding) \
641 _type _item;
64c796d8 642
d71e6471
MD
643#undef __dynamic_array_enc_ext
644#define __dynamic_array_enc_ext(_type, _item, _length, _order, _base, _encoding)\
645 _type _item;
64c796d8 646
84da5206
MD
647#undef __dynamic_array_enc_ext_2
648#define __dynamic_array_enc_ext_2(_type, _item, _length1, _length2, _order, _base, _encoding)\
649 __dynamic_array_enc_ext(_type, _item, _length1 + _length2, _order, _base, _encoding)
650
3c4ffab9 651#undef __string
c6e3f225
MD
652#define __string(_item, _src) char _item;
653
654#undef __string_from_user
655#define __string_from_user(_item, _src) \
656 __string(_item, _src)
3c4ffab9
MD
657
658#undef TP_STRUCT__entry
659#define TP_STRUCT__entry(args...) args
660
3bc29f0a
MD
661#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS
662#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS(_name, _locvar, _code, _tstruct, _assign, _print) \
3c4ffab9
MD
663struct __event_typemap__##_name { \
664 _tstruct \
665};
666
3bc29f0a
MD
667#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE
668#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE(_name, _proto, _args, _locvar, _code, _tstruct, _assign, _print) \
669 LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS(_name, _locvar, _code, _tstruct, _assign, _print)
d3de7f14 670
3c4ffab9
MD
671#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
672
673
674/*
c099397a 675 * Stage 9 of the trace events.
3c4ffab9 676 *
40652b65
MD
677 * Create the probe function : call even size calculation and write event data
678 * into the buffer.
e763dbf5 679 *
67e5e60c
MD
680 * We use both the field and assignment macros to write the fields in the order
681 * defined in the field declaration. The field declarations control the
682 * execution order, jumping to the appropriate assignment block.
40652b65
MD
683 */
684
e763dbf5
MD
685#include "lttng-events-reset.h" /* Reset all macros within TRACE_EVENT */
686
d71e6471
MD
687#undef __field_full
688#define __field_full(_type, _item, _order, _base) \
e763dbf5
MD
689 goto __assign_##_item; \
690__end_field_##_item:
40652b65 691
d71e6471
MD
692#undef __array_enc_ext
693#define __array_enc_ext(_type, _item, _length, _order, _base, _encoding)\
e763dbf5
MD
694 goto __assign_##_item; \
695__end_field_##_item:
40652b65 696
d71e6471
MD
697#undef __dynamic_array_enc_ext
698#define __dynamic_array_enc_ext(_type, _item, _length, _order, _base, _encoding)\
e763dbf5
MD
699 goto __assign_##_item##_1; \
700__end_field_##_item##_1: \
e763dbf5
MD
701 goto __assign_##_item##_2; \
702__end_field_##_item##_2:
40652b65 703
84da5206
MD
704#undef __dynamic_array_enc_ext_2
705#define __dynamic_array_enc_ext_2(_type, _item, _length1, _length2, _order, _base, _encoding)\
706 goto __assign_##_item##_1; \
707__end_field_##_item##_1: \
708 goto __assign_##_item##_2; \
709__end_field_##_item##_2: \
710 goto __assign_##_item##_3; \
711__end_field_##_item##_3:
712
e763dbf5
MD
713#undef __string
714#define __string(_item, _src) \
715 goto __assign_##_item; \
716__end_field_##_item:
717
c6e3f225
MD
718#undef __string_from_user
719#define __string_from_user(_item, _src) \
720 __string(_item, _src)
721
e763dbf5
MD
722/*
723 * Macros mapping tp_assign() to "=", tp_memcpy() to memcpy() and tp_strcpy() to
724 * strcpy().
725 */
726#undef tp_assign
727#define tp_assign(dest, src) \
728__assign_##dest: \
729 { \
3c4ffab9 730 __typeof__(__typemap.dest) __tmp = (src); \
a90917c3 731 lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(__tmp)); \
aaa4004a 732 __chan->ops->event_write(&__ctx, &__tmp, sizeof(__tmp));\
e763dbf5
MD
733 } \
734 goto __end_field_##dest;
735
d9a7cf03
FG
736/* fixed length array memcpy */
737#undef tp_memcpy_gen
738#define tp_memcpy_gen(write_ops, dest, src, len) \
e763dbf5 739__assign_##dest: \
d793d5e1
MD
740 if (0) \
741 (void) __typemap.dest; \
a90917c3 742 lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(__typemap.dest)); \
d9a7cf03 743 __chan->ops->write_ops(&__ctx, src, len); \
e763dbf5
MD
744 goto __end_field_##dest;
745
d9a7cf03
FG
746#undef tp_memcpy
747#define tp_memcpy(dest, src, len) \
748 tp_memcpy_gen(event_write, dest, src, len)
749
750#undef tp_memcpy_from_user
751#define tp_memcpy_from_user(dest, src, len) \
752 tp_memcpy_gen(event_write_from_user, dest, src, len)
753
754/* variable length sequence memcpy */
755#undef tp_memcpy_dyn_gen
756#define tp_memcpy_dyn_gen(write_ops, dest, src) \
e763dbf5
MD
757__assign_##dest##_1: \
758 { \
41b59694 759 u32 __tmpl = __dynamic_len[__dynamic_len_idx]; \
a90917c3 760 lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(u32)); \
aaa4004a 761 __chan->ops->event_write(&__ctx, &__tmpl, sizeof(u32)); \
e763dbf5
MD
762 } \
763 goto __end_field_##dest##_1; \
764__assign_##dest##_2: \
a90917c3 765 lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(__typemap.dest)); \
d9a7cf03 766 __chan->ops->write_ops(&__ctx, src, \
41b59694 767 sizeof(__typemap.dest) * __get_dynamic_array_len(dest));\
e763dbf5 768 goto __end_field_##dest##_2;
58aa5d24 769
84da5206
MD
770#undef tp_memcpy_dyn_gen_2
771#define tp_memcpy_dyn_gen_2(write_ops, dest, src1, src2) \
772__assign_##dest##_1: \
773 { \
774 u32 __tmpl = __dynamic_len[__dynamic_len_idx] \
775 + __dynamic_len[__dynamic_len_idx + 1]; \
776 lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(u32)); \
777 __chan->ops->event_write(&__ctx, &__tmpl, sizeof(u32)); \
778 } \
779 goto __end_field_##dest##_1; \
780__assign_##dest##_2: \
781 lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(__typemap.dest)); \
782 __chan->ops->write_ops(&__ctx, src1, \
783 sizeof(__typemap.dest) * __get_dynamic_array_len(dest));\
784 goto __end_field_##dest##_2; \
785__assign_##dest##_3: \
786 __chan->ops->write_ops(&__ctx, src2, \
787 sizeof(__typemap.dest) * __get_dynamic_array_len(dest));\
788 goto __end_field_##dest##_3;
789
d9a7cf03
FG
790#undef tp_memcpy_dyn
791#define tp_memcpy_dyn(dest, src) \
792 tp_memcpy_dyn_gen(event_write, dest, src)
793
84da5206
MD
794#undef tp_memcpy_dyn_2
795#define tp_memcpy_dyn_2(dest, src1, src2) \
796 tp_memcpy_dyn_gen_2(event_write, dest, src1, src2)
797
d9a7cf03
FG
798#undef tp_memcpy_dyn_from_user
799#define tp_memcpy_dyn_from_user(dest, src) \
800 tp_memcpy_dyn_gen(event_write_from_user, dest, src)
58aa5d24 801
d0255731 802/*
786b8312 803 * The string length including the final \0.
d0255731 804 */
4ea00e4f 805#undef tp_copy_string_from_user
58aa5d24 806#define tp_copy_string_from_user(dest, src) \
16f78f3a
MD
807__assign_##dest: \
808 if (0) \
809 (void) __typemap.dest; \
810 lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(__typemap.dest)); \
811 __chan->ops->event_strcpy_from_user(&__ctx, src, \
812 __get_dynamic_array_len(dest)); \
4ea00e4f 813 goto __end_field_##dest;
16f78f3a 814
e763dbf5
MD
815#undef tp_strcpy
816#define tp_strcpy(dest, src) \
16f78f3a
MD
817__assign_##dest: \
818 if (0) \
819 (void) __typemap.dest; \
54f9f68d
MD
820 { \
821 const char *__ctf_tmp_string = \
822 ((src) ? (src) : __LTTNG_NULL_STRING); \
823 lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(__typemap.dest)); \
824 __chan->ops->event_strcpy(&__ctx, __ctf_tmp_string, __get_dynamic_array_len(dest)); \
825 } \
16f78f3a 826 goto __end_field_##dest;
40652b65 827
e763dbf5
MD
828/* Named field types must be defined in lttng-types.h */
829
830#undef __get_str
831#define __get_str(field) field
832
833#undef __get_dynamic_array
834#define __get_dynamic_array(field) field
835
836/* Beware: this get len actually consumes the len value */
837#undef __get_dynamic_array_len
838#define __get_dynamic_array_len(field) __dynamic_len[__dynamic_len_idx++]
839
840#undef TP_PROTO
841#define TP_PROTO(args...) args
842
843#undef TP_ARGS
844#define TP_ARGS(args...) args
845
846#undef TP_STRUCT__entry
847#define TP_STRUCT__entry(args...) args
848
849#undef TP_fast_assign
850#define TP_fast_assign(args...) args
851
7ca580f8
MD
852#undef TP_locvar
853#define TP_locvar(...) __VA_ARGS__
854
855#undef TP_code
856#define TP_code(...) __VA_ARGS__
857
c337ddc2
MD
858/*
859 * For state dump, check that "session" argument (mandatory) matches the
860 * session this event belongs to. Ensures that we write state dump data only
861 * into the started session, not into all sessions.
862 */
863#ifdef TP_SESSION_CHECK
864#define _TP_SESSION_CHECK(session, csession) (session == csession)
865#else /* TP_SESSION_CHECK */
866#define _TP_SESSION_CHECK(session, csession) 1
867#endif /* TP_SESSION_CHECK */
868
f9771d39
MD
869/*
870 * __dynamic_len array length is twice the number of fields due to
871 * __dynamic_array_enc_ext_2() and tp_memcpy_dyn_2(), which are the
872 * worse case, needing 2 entries per field.
873 */
3bc29f0a
MD
874#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE
875#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE(_name, _proto, _args, _locvar, _code, _tstruct, _assign, _print) \
e763dbf5
MD
876static void __event_probe__##_name(void *__data, _proto) \
877{ \
7ca580f8 878 struct probe_local_vars { _locvar }; \
a90917c3
MD
879 struct lttng_event *__event = __data; \
880 struct lttng_channel *__chan = __event->chan; \
aaa4004a 881 struct lib_ring_buffer_ctx __ctx; \
e763dbf5 882 size_t __event_len, __event_align; \
d3de7f14
MD
883 size_t __dynamic_len_idx __attribute__((unused)) = 0; \
884 size_t __dynamic_len[2 * ARRAY_SIZE(__event_fields___##_name)] __attribute__((unused)); \
885 struct __event_typemap__##_name __typemap __attribute__((unused)); \
e763dbf5 886 int __ret; \
7ca580f8
MD
887 struct probe_local_vars __tp_locvar; \
888 struct probe_local_vars *tp_locvar __attribute__((unused)) = \
889 &__tp_locvar; \
e763dbf5 890 \
c337ddc2
MD
891 if (!_TP_SESSION_CHECK(session, __chan->session)) \
892 return; \
e64957da
MD
893 if (unlikely(!ACCESS_ONCE(__chan->session->active))) \
894 return; \
895 if (unlikely(!ACCESS_ONCE(__chan->enabled))) \
896 return; \
897 if (unlikely(!ACCESS_ONCE(__event->enabled))) \
52fc2e1f 898 return; \
7ca580f8
MD
899 _code \
900 __event_len = __event_get_size__##_name(__dynamic_len, tp_locvar, \
901 _args); \
902 __event_align = __event_get_align__##_name(tp_locvar, _args); \
aaa4004a 903 lib_ring_buffer_ctx_init(&__ctx, __chan->chan, __event, __event_len, \
e763dbf5 904 __event_align, -1); \
aaa4004a 905 __ret = __chan->ops->event_reserve(&__ctx, __event->id); \
e763dbf5
MD
906 if (__ret < 0) \
907 return; \
908 /* Control code (field ordering) */ \
909 _tstruct \
aaa4004a 910 __chan->ops->event_commit(&__ctx); \
e763dbf5
MD
911 return; \
912 /* Copy code, steered by control code */ \
913 _assign \
914}
915
3bc29f0a
MD
916#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS
917#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS(_name, _locvar, _code, _tstruct, _assign, _print) \
f7bdf4db
MD
918static void __event_probe__##_name(void *__data) \
919{ \
7ca580f8 920 struct probe_local_vars { _locvar }; \
a90917c3
MD
921 struct lttng_event *__event = __data; \
922 struct lttng_channel *__chan = __event->chan; \
f7bdf4db
MD
923 struct lib_ring_buffer_ctx __ctx; \
924 size_t __event_len, __event_align; \
d3de7f14
MD
925 size_t __dynamic_len_idx __attribute__((unused)) = 0; \
926 size_t __dynamic_len[2 * ARRAY_SIZE(__event_fields___##_name)] __attribute__((unused)); \
927 struct __event_typemap__##_name __typemap __attribute__((unused)); \
f7bdf4db 928 int __ret; \
7ca580f8
MD
929 struct probe_local_vars __tp_locvar; \
930 struct probe_local_vars *tp_locvar __attribute__((unused)) = \
931 &__tp_locvar; \
f7bdf4db 932 \
c337ddc2
MD
933 if (!_TP_SESSION_CHECK(session, __chan->session)) \
934 return; \
f7bdf4db
MD
935 if (unlikely(!ACCESS_ONCE(__chan->session->active))) \
936 return; \
937 if (unlikely(!ACCESS_ONCE(__chan->enabled))) \
938 return; \
939 if (unlikely(!ACCESS_ONCE(__event->enabled))) \
940 return; \
7ca580f8
MD
941 _code \
942 __event_len = __event_get_size__##_name(__dynamic_len, tp_locvar); \
943 __event_align = __event_get_align__##_name(tp_locvar); \
f7bdf4db
MD
944 lib_ring_buffer_ctx_init(&__ctx, __chan->chan, __event, __event_len, \
945 __event_align, -1); \
946 __ret = __chan->ops->event_reserve(&__ctx, __event->id); \
947 if (__ret < 0) \
948 return; \
949 /* Control code (field ordering) */ \
950 _tstruct \
951 __chan->ops->event_commit(&__ctx); \
952 return; \
953 /* Copy code, steered by control code */ \
954 _assign \
955}
956
e763dbf5
MD
957#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
958
3afe7aac 959/*
c099397a 960 * Stage 10 of the trace events.
3afe7aac
MD
961 *
962 * Register/unregister probes at module load/unload.
963 */
964
965#include "lttng-events-reset.h" /* Reset all macros within TRACE_EVENT */
966
967#define TP_ID1(_token, _system) _token##_system
968#define TP_ID(_token, _system) TP_ID1(_token, _system)
969#define module_init_eval1(_token, _system) module_init(_token##_system)
970#define module_init_eval(_token, _system) module_init_eval1(_token, _system)
971#define module_exit_eval1(_token, _system) module_exit(_token##_system)
972#define module_exit_eval(_token, _system) module_exit_eval1(_token, _system)
973
2655f9ad 974#ifndef TP_MODULE_NOINIT
3afe7aac
MD
975static int TP_ID(__lttng_events_init__, TRACE_SYSTEM)(void)
976{
6d2a620c 977 wrapper_vmalloc_sync_all();
a90917c3 978 return lttng_probe_register(&TP_ID(__probe_desc___, TRACE_SYSTEM));
3afe7aac
MD
979}
980
3afe7aac
MD
981static void TP_ID(__lttng_events_exit__, TRACE_SYSTEM)(void)
982{
a90917c3 983 lttng_probe_unregister(&TP_ID(__probe_desc___, TRACE_SYSTEM));
3afe7aac
MD
984}
985
2655f9ad
MD
986#ifndef TP_MODULE_NOAUTOLOAD
987module_init_eval(__lttng_events_init__, TRACE_SYSTEM);
3afe7aac 988module_exit_eval(__lttng_events_exit__, TRACE_SYSTEM);
259b6cb3 989#endif
3afe7aac 990
2655f9ad
MD
991#endif
992
3afe7aac
MD
993#undef module_init_eval
994#undef module_exit_eval
995#undef TP_ID1
996#undef TP_ID
177b3692
MD
997
998#undef TP_PROTO
999#undef TP_ARGS
This page took 0.123888 seconds and 4 git commands to generate.