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