Drop 'linux/irq.h' wrapper
[lttng-modules.git] / include / lttng / events.h
CommitLineData
b7cdc182 1/* SPDX-License-Identifier: (GPL-2.0-only or LGPL-2.1-only)
9f36eaed 2 *
2df37e95 3 * lttng/events.h
4e3c1b9b 4 *
4e3c1b9b 5 * Holds LTTng per-session event registry.
17baffe2 6 *
886d51a3 7 * Copyright (C) 2010-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4e3c1b9b
MD
8 */
9
9f36eaed
MJ
10#ifndef _LTTNG_EVENTS_H
11#define _LTTNG_EVENTS_H
12
5f4c791e 13#include <lttng/kernel-version.h>
4e3c1b9b 14#include <linux/list.h>
d6d808f3 15#include <linux/kprobes.h>
d83004aa 16#include <linux/kref.h>
41f229dc 17#include <linux/uuid.h>
754d534a 18#include <linux/irq_work.h>
149b9a9d 19#include <wrapper/uprobes.h>
2df37e95
MD
20#include <lttng/cpuhotplug.h>
21#include <lttng/tracer.h>
22#include <lttng/abi.h>
23#include <lttng/abi-old.h>
24#include <lttng/endian.h>
4e3c1b9b 25
e97dc605 26#define lttng_is_signed_type(type) (((type) -1) < (type) 1)
9e7e4892 27
f7d06400 28struct lttng_kernel_channel_buffer;
8cdc1a81 29struct lttng_kernel_session;
8a57ec02 30struct lttng_kernel_ring_buffer_ctx;
4e3c1b9b 31
c0edae1d
MD
32/* Type description */
33
12bb2edb
MD
34enum lttng_kernel_type {
35 lttng_kernel_type_integer,
36 lttng_kernel_type_string,
437d5aa5
MD
37 lttng_kernel_type_enum,
38 lttng_kernel_type_array,
39 lttng_kernel_type_sequence,
40 lttng_kernel_type_struct,
41 lttng_kernel_type_variant,
12bb2edb 42 NR_LTTNG_KERNEL_TYPES,
c0edae1d
MD
43};
44
28cbcb59
MD
45enum lttng_kernel_string_encoding {
46 lttng_kernel_string_encoding_none = 0,
47 lttng_kernel_string_encoding_UTF8 = 1,
48 lttng_kernel_string_encoding_ASCII = 2,
49 NR_LTTNG_KERNEL_STRING_ENCODING,
c0edae1d
MD
50};
51
a28cc520 52struct lttng_kernel_enum_value {
141ddf28
MD
53 unsigned long long value;
54 unsigned int signedness:1;
55};
56
a28cc520
MD
57struct lttng_kernel_enum_entry {
58 struct lttng_kernel_enum_value start, end; /* start and end are inclusive */
c0edae1d 59 const char *string;
08ad1061
PP
60 struct {
61 unsigned int is_auto:1;
62 } options;
c0edae1d
MD
63};
64
437d5aa5
MD
65/*
66 * struct lttng_kernel_type_common is fixed-size. Its children inherits
67 * from it by embedding struct lttng_kernel_type_common as its first field.
68 */
69struct lttng_kernel_type_common {
70 enum lttng_kernel_type type;
71};
72
73struct lttng_kernel_type_integer {
74 struct lttng_kernel_type_common parent;
c099397a
MD
75 unsigned int size; /* in bits */
76 unsigned short alignment; /* in bits */
9cccf98a 77 unsigned int signedness:1,
4697aac7
MD
78 reverse_byte_order:1,
79 user:1; /* fetch from user-space */
e0a7a7c4 80 unsigned int base; /* 2, 8, 10, 16, for pretty print */
437d5aa5
MD
81};
82
83struct lttng_kernel_type_string {
84 struct lttng_kernel_type_common parent;
28cbcb59 85 enum lttng_kernel_string_encoding encoding;
4697aac7 86 unsigned int user:1; /* fetch from user-space */
c099397a
MD
87};
88
437d5aa5
MD
89struct lttng_kernel_type_enum {
90 struct lttng_kernel_type_common parent;
91 const struct lttng_kernel_enum_desc *desc; /* Enumeration mapping */
92 const struct lttng_kernel_type_common *container_type;
93};
94
95struct lttng_kernel_type_array {
96 struct lttng_kernel_type_common parent;
97 const struct lttng_kernel_type_common *elem_type;
98 unsigned int length; /* Num. elems. */
c27937ce 99 unsigned int alignment; /* Alignment in bytes before elements. */
437d5aa5
MD
100 enum lttng_kernel_string_encoding encoding;
101};
102
103struct lttng_kernel_type_sequence {
104 struct lttng_kernel_type_common parent;
51ef4536 105 const char *length_name; /* Length field name. If NULL, use previous field. */
437d5aa5 106 const struct lttng_kernel_type_common *elem_type;
c27937ce 107 unsigned int alignment; /* Alignment in bytes before elements. */
437d5aa5
MD
108 enum lttng_kernel_string_encoding encoding;
109};
110
111struct lttng_kernel_type_struct {
112 struct lttng_kernel_type_common parent;
113 unsigned int nr_fields;
4f1d1ee5 114 const struct lttng_kernel_event_field * const *fields; /* Array of pointers to fields. */
c27937ce 115 unsigned int alignment; /* Alignment in bits */
437d5aa5
MD
116};
117
118struct lttng_kernel_type_variant {
119 struct lttng_kernel_type_common parent;
51ef4536 120 const char *tag_name; /* Tag field name. If NULL, use previous field. */
4f1d1ee5 121 const struct lttng_kernel_event_field * const *choices; /* Array of pointers to fields. */
437d5aa5 122 unsigned int nr_choices;
c27937ce 123 unsigned int alignment; /* Alignment in bytes */
c099397a
MD
124};
125
d96a4a7a 126struct lttng_kernel_enum_desc {
c099397a 127 const char *name;
4f1d1ee5 128 const struct lttng_kernel_enum_entry * const *entries;
141ddf28 129 unsigned int nr_entries;
6c8c025b 130 const struct lttng_kernel_probe_desc *probe_desc;
c099397a 131};
c0edae1d
MD
132
133/* Event field description */
134
437d5aa5 135struct lttng_kernel_event_field {
c0edae1d 136 const char *name;
437d5aa5 137 const struct lttng_kernel_type_common *type;
f127e61e 138 unsigned int nowrite:1, /* do not write into trace */
ceabb767 139 nofilter:1; /* do not consider for filter */
c0edae1d
MD
140};
141
9857164a
FD
142#ifndef PARAMS
143#define PARAMS(args...) args
144#endif
145
4697aac7 146#define _lttng_kernel_static_type_integer(_size, _alignment, _signedness, _byte_order, _user, _base) \
437d5aa5
MD
147 ((const struct lttng_kernel_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_type_integer, { \
148 .parent = { \
149 .type = lttng_kernel_type_integer, \
150 }, \
151 .size = (_size), \
152 .alignment = (_alignment), \
153 .signedness = (_signedness), \
154 .reverse_byte_order = (_byte_order) != __BYTE_ORDER, \
4697aac7 155 .user = (_user), \
437d5aa5
MD
156 .base = (_base), \
157 }))
158
4697aac7
MD
159#define lttng_kernel_static_type_integer(_size, _alignment, _signedness, _byte_order, _base) \
160 _lttng_kernel_static_type_integer(_size, _alignment, _signedness, _byte_order, 0, _base)
161
162#define lttng_kernel_static_type_user_integer(_size, _alignment, _signedness, _byte_order, _base) \
163 _lttng_kernel_static_type_integer(_size, _alignment, _signedness, _byte_order, 1, _base)
164
165#define _lttng_kernel_static_type_integer_from_type(_type, _byte_order, _user, _base) \
6f185e4f 166 _lttng_kernel_static_type_integer(sizeof(_type) * CHAR_BIT, \
437d5aa5
MD
167 lttng_alignof(_type) * CHAR_BIT, \
168 lttng_is_signed_type(_type), \
6f185e4f 169 _byte_order, _user, _base)
437d5aa5 170
4697aac7
MD
171#define lttng_kernel_static_type_integer_from_type(_type, _byte_order, _base) \
172 _lttng_kernel_static_type_integer_from_type(_type, _byte_order, 0, _base)
173
174#define lttng_kernel_static_type_user_integer_from_type(_type, _byte_order, _base) \
175 _lttng_kernel_static_type_integer_from_type(_type, _byte_order, 1, _base)
176
437d5aa5
MD
177#define lttng_kernel_static_type_enum(_desc, _container_type) \
178 ((const struct lttng_kernel_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_type_enum, { \
179 .parent = { \
180 .type = lttng_kernel_type_enum, \
181 }, \
182 .desc = (_desc), \
183 .container_type = (_container_type), \
184 }))
185
186#define lttng_kernel_static_type_array(_length, _elem_type, _alignment, _encoding) \
187 ((const struct lttng_kernel_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_type_array, { \
188 .parent = { \
189 .type = lttng_kernel_type_array, \
190 }, \
191 .length = (_length), \
192 .alignment = (_alignment), \
193 .encoding = lttng_kernel_string_encoding_##_encoding, \
194 .elem_type = (_elem_type), \
195 }))
196
197#define lttng_kernel_static_type_array_text(_length) \
198 lttng_kernel_static_type_array(_length, \
199 lttng_kernel_static_type_integer(sizeof(char) * CHAR_BIT, \
200 lttng_alignof(char) * CHAR_BIT, lttng_is_signed_type(char), \
201 __BYTE_ORDER, 10), \
202 0, UTF8)
203
204#define lttng_kernel_static_type_sequence(_length_name, _elem_type, _alignment, _encoding) \
205 ((const struct lttng_kernel_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_type_sequence, { \
206 .parent = { \
207 .type = lttng_kernel_type_sequence, \
208 }, \
209 .length_name = (_length_name), \
210 .alignment = (_alignment), \
211 .encoding = lttng_kernel_string_encoding_##_encoding, \
212 .elem_type = (_elem_type), \
213 }))
214
4697aac7 215#define lttng_kernel_static_type_string(_encoding, _user) \
437d5aa5
MD
216 ((const struct lttng_kernel_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_type_string, { \
217 .parent = { \
218 .type = lttng_kernel_type_string, \
219 }, \
220 .encoding = lttng_kernel_string_encoding_##_encoding, \
4697aac7 221 .user = (_user), \
437d5aa5
MD
222 }))
223
9857164a
FD
224#define lttng_kernel_static_type_struct_init(_nr_fields, _fields, _alignment) \
225 { \
437d5aa5
MD
226 .parent = { \
227 .type = lttng_kernel_type_struct, \
228 }, \
229 .nr_fields = (_nr_fields), \
230 .fields = _fields, \
231 .alignment = (_alignment), \
9857164a
FD
232 }
233
234#define lttng_kernel_static_type_struct(_nr_fields, _fields, _alignment) \
235 ((const struct lttng_kernel_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_type_struct, \
236 lttng_kernel_static_type_struct_init(_nr_fields, PARAMS(_fields), _alignment) \
237 ))
437d5aa5
MD
238
239#define lttng_kernel_static_type_variant(_nr_choices, _choices, _tag_name, _alignment) \
240 ((const struct lttng_kernel_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_type_variant, { \
241 .parent = { \
242 .type = lttng_kernel_type_variant, \
243 }, \
244 .tag_name = (_tag_name), \
245 .choices = _choices, \
246 .nr_choices = (_nr_choices), \
247 .alignment = (_alignment), \
248 }))
249
4697aac7 250#define lttng_kernel_static_event_field(_name, _type, _nowrite, _nofilter) \
437d5aa5
MD
251 __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_event_field, { \
252 .name = (_name), \
253 .type = (_type), \
254 .nowrite = (_nowrite), \
437d5aa5
MD
255 .nofilter = (_nofilter), \
256 })
257
258#define lttng_kernel_static_event_field_array(_fields...) \
259 __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_event_field *, \
260 _fields \
261 )
262
437d5aa5
MD
263#define lttng_kernel_static_enum_entry_value(_string, _value) \
264 __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_enum_entry, { \
265 .start = { \
266 .signedness = lttng_is_signed_type(__typeof__(_value)), \
267 .value = lttng_is_signed_type(__typeof__(_value)) ? \
268 (long long) (_value) : (_value), \
269 }, \
270 .end = { \
271 .signedness = lttng_is_signed_type(__typeof__(_value)), \
272 .value = lttng_is_signed_type(__typeof__(_value)) ? \
273 (long long) (_value) : (_value), \
274 }, \
275 .string = (_string), \
276 }),
277
278#define lttng_kernel_static_enum_entry_range(_string, _range_start, _range_end) \
279 __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_enum_entry, { \
280 .start = { \
281 .signedness = lttng_is_signed_type(__typeof__(_range_start)), \
282 .value = lttng_is_signed_type(__typeof__(_range_start)) ? \
283 (long long) (_range_start) : (_range_start), \
284 }, \
285 .end = { \
286 .signedness = lttng_is_signed_type(__typeof__(_range_end)), \
287 .value = lttng_is_signed_type(__typeof__(_range_end)) ? \
288 (long long) (_range_end) : (_range_end), \
289 }, \
290 .string = (_string), \
291 }),
292
293#define lttng_kernel_static_enum_entry_auto(_string) \
294 __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_enum_entry, { \
295 .start = { \
296 .signedness = -1, \
297 .value = -1, \
298 }, \
299 .end = { \
300 .signedness = -1, \
301 .value = -1, \
302 }, \
303 .string = (_string), \
304 .options = { \
305 .is_auto = 1, \
306 } \
307 }),
308
a92e844e 309struct lttng_kernel_probe_ctx {
e2d5dbc7 310 struct lttng_kernel_event_common *event;
79150a49
JD
311 uint8_t interruptible;
312};
313
6c8c025b
MD
314struct lttng_kernel_tracepoint_class {
315 void (*probe_callback)(void);
4f1d1ee5 316 const struct lttng_kernel_event_field * const *fields; /* event payload */
6c8c025b
MD
317 unsigned int nr_fields;
318 const struct lttng_kernel_probe_desc *probe_desc;
319};
320
437d5aa5
MD
321struct lttng_kernel_event_desc {
322 const char *event_name; /* lttng-modules name */
323 const char *event_kname; /* Linux kernel name (tracepoints) */
324 const struct lttng_kernel_probe_desc *probe_desc;
6c8c025b 325 const struct lttng_kernel_tracepoint_class *tp_class;
dc7f600a 326 struct module *owner;
c0edae1d
MD
327};
328
437d5aa5
MD
329struct lttng_kernel_probe_desc {
330 const char *provider_name;
4f1d1ee5 331 const struct lttng_kernel_event_desc * const *event_desc;
85a9ca7f
MD
332 unsigned int nr_events;
333 struct list_head head; /* chain registered probes */
3c997079
MD
334 struct list_head lazy_init_head;
335 int lazy; /* lazy registration */
85a9ca7f
MD
336};
337
8a445457
MD
338/*
339 * Result of the run_filter() callback.
340 */
341enum lttng_kernel_event_filter_result {
342 LTTNG_KERNEL_EVENT_FILTER_ACCEPT = 0,
343 LTTNG_KERNEL_EVENT_FILTER_REJECT = 1,
344};
345
a67ba386
MD
346struct lttng_kernel_event_common_private;
347
348enum lttng_kernel_event_type {
349 LTTNG_KERNEL_EVENT_TYPE_RECORDER = 0,
350 LTTNG_KERNEL_EVENT_TYPE_NOTIFIER = 1,
351};
352
353struct lttng_kernel_event_common {
354 struct lttng_kernel_event_common_private *priv; /* Private event interface */
355
356 enum lttng_kernel_event_type type;
357 /* Get child with container_of(). */
358
e64957da 359 int enabled;
a67ba386 360 int eval_filter; /* Need to evaluate filters */
8a445457 361 int (*run_filter)(const struct lttng_kernel_event_common *event,
a67ba386 362 const char *stack_data,
a92e844e 363 struct lttng_kernel_probe_ctx *probe_ctx,
a67ba386 364 void *filter_ctx);
3c997079
MD
365};
366
a67ba386
MD
367struct lttng_kernel_event_recorder_private;
368
369struct lttng_kernel_event_recorder {
370 struct lttng_kernel_event_common parent;
371 struct lttng_kernel_event_recorder_private *priv; /* Private event record interface */
372
f7d06400 373 struct lttng_kernel_channel_buffer *chan;
c3eddb2e
MD
374};
375
a67ba386
MD
376struct lttng_kernel_notification_ctx {
377 int eval_capture; /* Capture evaluation available. */
378};
dffef45d 379
a67ba386 380struct lttng_kernel_event_notifier_private;
8a8ac9a8 381
a67ba386
MD
382struct lttng_kernel_event_notifier {
383 struct lttng_kernel_event_common parent;
384 struct lttng_kernel_event_notifier_private *priv; /* Private event notifier interface */
dffef45d 385
a67ba386
MD
386 int eval_capture; /* Need to evaluate capture */
387 void (*notification_send)(struct lttng_kernel_event_notifier *event_notifier,
a67ba386 388 const char *stack_data,
a92e844e 389 struct lttng_kernel_probe_ctx *probe_ctx,
a67ba386 390 struct lttng_kernel_notification_ctx *notif_ctx);
dffef45d
FD
391};
392
4a399b76
MD
393struct lttng_kernel_channel_buffer_ops {
394 struct lttng_kernel_channel_buffer_ops_private *priv; /* Private channel buffer ops interface. */
395
8a57ec02
MD
396 int (*event_reserve)(struct lttng_kernel_ring_buffer_ctx *ctx);
397 void (*event_commit)(struct lttng_kernel_ring_buffer_ctx *ctx);
398 void (*event_write)(struct lttng_kernel_ring_buffer_ctx *ctx, const void *src,
f5ffbd77 399 size_t len, size_t alignment);
8a57ec02 400 void (*event_write_from_user)(struct lttng_kernel_ring_buffer_ctx *ctx,
f5ffbd77 401 const void *src, size_t len, size_t alignment);
8a57ec02 402 void (*event_memset)(struct lttng_kernel_ring_buffer_ctx *ctx,
58aa5d24 403 int c, size_t len);
8a57ec02 404 void (*event_strcpy)(struct lttng_kernel_ring_buffer_ctx *ctx, const char *src,
16f78f3a 405 size_t len);
8a57ec02 406 void (*event_strcpy_from_user)(struct lttng_kernel_ring_buffer_ctx *ctx,
16f78f3a 407 const char __user *src, size_t len);
0d1080f4
MD
408 void (*event_pstrcpy_pad)(struct lttng_kernel_ring_buffer_ctx *ctx,
409 const char *src, size_t len);
410 void (*event_pstrcpy_pad_from_user)(struct lttng_kernel_ring_buffer_ctx *ctx,
411 const char __user *src, size_t len);
f7d06400
MD
412 void (*lost_event_too_big)(struct lttng_kernel_channel_buffer *lttng_channel);
413};
414
415enum lttng_kernel_channel_type {
416 LTTNG_KERNEL_CHANNEL_TYPE_BUFFER = 0,
85a9ca7f
MD
417};
418
f7d06400
MD
419struct lttng_kernel_channel_common_private;
420
421/* Use container_of() to get child. */
422struct lttng_kernel_channel_common {
423 struct lttng_kernel_channel_common_private *priv; /* Private channel interface. */
424
425 enum lttng_kernel_channel_type type;
426
e64957da 427 int enabled;
8cdc1a81 428 struct lttng_kernel_session *session;
f7d06400
MD
429};
430
431struct lttng_kernel_channel_buffer_private;
432
433struct lttng_kernel_channel_buffer {
434 struct lttng_kernel_channel_common parent;
435 struct lttng_kernel_channel_buffer_private *priv;
436
4a399b76 437 struct lttng_kernel_channel_buffer_ops *ops;
85a9ca7f
MD
438};
439
114667d5
MD
440#define LTTNG_DYNAMIC_LEN_STACK_SIZE 128
441
442struct lttng_dynamic_len_stack {
443 size_t stack[LTTNG_DYNAMIC_LEN_STACK_SIZE];
444 size_t offset;
445};
446
447DECLARE_PER_CPU(struct lttng_dynamic_len_stack, lttng_dynamic_len_stack);
e0130fab
MD
448
449/*
8c0393c3 450 * struct lttng_kernel_id_tracker declared in header due to deferencing of *v
e0130fab
MD
451 * in RCU_INITIALIZER(v).
452 */
d1f652f8
MD
453#define LTTNG_ID_HASH_BITS 6
454#define LTTNG_ID_TABLE_SIZE (1 << LTTNG_ID_HASH_BITS)
e0130fab 455
8c0393c3 456struct lttng_kernel_id_tracker_rcu {
d1f652f8
MD
457 struct hlist_head id_hash[LTTNG_ID_TABLE_SIZE];
458};
459
8c0393c3
MD
460struct lttng_kernel_id_tracker {
461 struct lttng_kernel_id_tracker_private *priv; /* Private API */
462
463 struct lttng_kernel_id_tracker_rcu *p; /* RCU dereferenced. */
e0130fab
MD
464};
465
8cdc1a81
MD
466struct lttng_kernel_session_private;
467
468struct lttng_kernel_session {
469 struct lttng_kernel_session_private *priv; /* Private session interface */
470
85a9ca7f 471 int active; /* Is trace session active ? */
8cdc1a81 472
8c0393c3
MD
473 struct lttng_kernel_id_tracker pid_tracker;
474 struct lttng_kernel_id_tracker vpid_tracker;
475 struct lttng_kernel_id_tracker uid_tracker;
476 struct lttng_kernel_id_tracker vuid_tracker;
477 struct lttng_kernel_id_tracker gid_tracker;
478 struct lttng_kernel_id_tracker vgid_tracker;
85a9ca7f
MD
479};
480
d1769981
MD
481int lttng_kernel_probe_register(struct lttng_kernel_probe_desc *desc);
482void lttng_kernel_probe_unregister(struct lttng_kernel_probe_desc *desc);
d83004aa 483
8c0393c3 484bool lttng_id_tracker_lookup(struct lttng_kernel_id_tracker_rcu *p, int id);
271b6681 485
a90917c3 486#endif /* _LTTNG_EVENTS_H */
This page took 0.110264 seconds and 4 git commands to generate.