xref: /linux/include/trace/define_remote_events.h (revision e4bf304f000e6fcceaf60b1455a5124b783b3a66)
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...)						\
26 do {											\
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)
74