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