projects/linux·blob master · refs

73 lines · 2.4 KiB

1/* SPDX-License-Identifier: GPL-2.0 */
2
3#include <linux/trace_events.h>
4#include <linux/trace_remote_event.h>
5#include <linux/trace_seq.h>
6#include <linux/stringify.h>
7
8#define REMOTE_EVENT_INCLUDE(__file) __stringify(../../__file)
9
10#ifdef REMOTE_EVENT_SECTION
11# define __REMOTE_EVENT_SECTION(__name) __used __section(REMOTE_EVENT_SECTION"."#__name)
12#else
13# define __REMOTE_EVENT_SECTION(__name)
14#endif
15
16#define REMOTE_PRINTK_COUNT_ARGS(__args...) \
17 __COUNT_ARGS(, ##__args, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0)
18
19#define __remote_printk0() \
20 trace_seq_putc(seq, '\n')
21
22#define __remote_printk1(__fmt) \
23 trace_seq_puts(seq, " " __fmt "\n") \
24
25#define __remote_printk2(__fmt, __args...) \
26do { \
27 trace_seq_putc(seq, ' '); \
28 trace_seq_printf(seq, __fmt, __args); \
29 trace_seq_putc(seq, '\n'); \
30} while (0)
31
32/* Apply the appropriate trace_seq sequence according to the number of arguments */
33#define remote_printk(__args...) \
34 CONCATENATE(__remote_printk, REMOTE_PRINTK_COUNT_ARGS(__args))(__args)
35
36#define RE_PRINTK(__args...) __args
37
38#define REMOTE_EVENT(__name, __id, __struct, __printk) \
39 REMOTE_EVENT_FORMAT(__name, __struct); \
40 static void remote_event_print_##__name(void *evt, struct trace_seq *seq) \
41 { \
42 struct remote_event_format_##__name __maybe_unused *__entry = evt; \
43 trace_seq_puts(seq, #__name); \
44 remote_printk(__printk); \
45 }
46#include REMOTE_EVENT_INCLUDE(REMOTE_EVENT_INCLUDE_FILE)
47
48#undef REMOTE_EVENT
49#undef RE_PRINTK
50#undef re_field
51#define re_field(__type, __field) \
52 { \
53 .type = #__type, .name = #__field, \
54 .size = sizeof(__type), .align = __alignof__(__type), \
55 .is_signed = is_signed_type(__type), \
56 },
57#define __entry REC
58#define RE_PRINTK(__fmt, __args...) "\"" __fmt "\", " __stringify(__args)
59#define REMOTE_EVENT(__name, __id, __struct, __printk) \
60 static struct trace_event_fields remote_event_fields_##__name[] = { \
61 __struct \
62 {} \
63 }; \
64 static char remote_event_print_fmt_##__name[] = __printk; \
65 static struct remote_event __REMOTE_EVENT_SECTION(__name) \
66 remote_event_##__name = { \
67 .name = #__name, \
68 .id = __id, \
69 .fields = remote_event_fields_##__name, \
70 .print_fmt = remote_event_print_fmt_##__name, \
71 .print = remote_event_print_##__name, \
72 }
73#include REMOTE_EVENT_INCLUDE(REMOTE_EVENT_INCLUDE_FILE)