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