| 1 |
|
| 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 |
|
| 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)
|