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