1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#ifndef _PARSE_EVENTS_H
21#define _PARSE_EVENTS_H
22
23#include <stdbool.h>
24#include <stdarg.h>
25#include <stdio.h>
26#include <regex.h>
27#include <string.h>
28
29#ifndef __maybe_unused
30#define __maybe_unused __attribute__((unused))
31#endif
32
33
34
35
36#ifndef TRACE_SEQ_BUF_SIZE
37#define TRACE_SEQ_BUF_SIZE 4096
38#endif
39
40#ifndef DEBUG_RECORD
41#define DEBUG_RECORD 0
42#endif
43
44struct pevent_record {
45 unsigned long long ts;
46 unsigned long long offset;
47 long long missed_events;
48 int record_size;
49 int size;
50 void *data;
51 int cpu;
52 int ref_count;
53 int locked;
54 void *priv;
55#if DEBUG_RECORD
56 struct pevent_record *prev;
57 struct pevent_record *next;
58 long alloc_addr;
59#endif
60};
61
62enum trace_seq_fail {
63 TRACE_SEQ__GOOD,
64 TRACE_SEQ__BUFFER_POISONED,
65 TRACE_SEQ__MEM_ALLOC_FAILED,
66};
67
68
69
70
71
72
73struct trace_seq {
74 char *buffer;
75 unsigned int buffer_size;
76 unsigned int len;
77 unsigned int readpos;
78 enum trace_seq_fail state;
79};
80
81void trace_seq_init(struct trace_seq *s);
82void trace_seq_reset(struct trace_seq *s);
83void trace_seq_destroy(struct trace_seq *s);
84
85extern int trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
86 __attribute__ ((format (printf, 2, 3)));
87extern int trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args)
88 __attribute__ ((format (printf, 2, 0)));
89
90extern int trace_seq_puts(struct trace_seq *s, const char *str);
91extern int trace_seq_putc(struct trace_seq *s, unsigned char c);
92
93extern void trace_seq_terminate(struct trace_seq *s);
94
95extern int trace_seq_do_fprintf(struct trace_seq *s, FILE *fp);
96extern int trace_seq_do_printf(struct trace_seq *s);
97
98
99
100
101struct pevent;
102struct event_format;
103
104typedef int (*pevent_event_handler_func)(struct trace_seq *s,
105 struct pevent_record *record,
106 struct event_format *event,
107 void *context);
108
109typedef int (*pevent_plugin_load_func)(struct pevent *pevent);
110typedef int (*pevent_plugin_unload_func)(struct pevent *pevent);
111
112struct pevent_plugin_option {
113 struct pevent_plugin_option *next;
114 void *handle;
115 char *file;
116 char *name;
117 char *plugin_alias;
118 char *description;
119 const char *value;
120 void *priv;
121 int set;
122};
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164#define PEVENT_PLUGIN_LOADER pevent_plugin_loader
165#define PEVENT_PLUGIN_UNLOADER pevent_plugin_unloader
166#define PEVENT_PLUGIN_OPTIONS pevent_plugin_options
167#define PEVENT_PLUGIN_ALIAS pevent_plugin_alias
168#define _MAKE_STR(x) #x
169#define MAKE_STR(x) _MAKE_STR(x)
170#define PEVENT_PLUGIN_LOADER_NAME MAKE_STR(PEVENT_PLUGIN_LOADER)
171#define PEVENT_PLUGIN_UNLOADER_NAME MAKE_STR(PEVENT_PLUGIN_UNLOADER)
172#define PEVENT_PLUGIN_OPTIONS_NAME MAKE_STR(PEVENT_PLUGIN_OPTIONS)
173#define PEVENT_PLUGIN_ALIAS_NAME MAKE_STR(PEVENT_PLUGIN_ALIAS)
174
175#define NSECS_PER_SEC 1000000000ULL
176#define NSECS_PER_USEC 1000ULL
177
178enum format_flags {
179 FIELD_IS_ARRAY = 1,
180 FIELD_IS_POINTER = 2,
181 FIELD_IS_SIGNED = 4,
182 FIELD_IS_STRING = 8,
183 FIELD_IS_DYNAMIC = 16,
184 FIELD_IS_LONG = 32,
185 FIELD_IS_FLAG = 64,
186 FIELD_IS_SYMBOLIC = 128,
187};
188
189struct format_field {
190 struct format_field *next;
191 struct event_format *event;
192 char *type;
193 char *name;
194 char *alias;
195 int offset;
196 int size;
197 unsigned int arraylen;
198 unsigned int elementsize;
199 unsigned long flags;
200};
201
202struct format {
203 int nr_common;
204 int nr_fields;
205 struct format_field *common_fields;
206 struct format_field *fields;
207};
208
209struct print_arg_atom {
210 char *atom;
211};
212
213struct print_arg_string {
214 char *string;
215 int offset;
216};
217
218struct print_arg_bitmask {
219 char *bitmask;
220 int offset;
221};
222
223struct print_arg_field {
224 char *name;
225 struct format_field *field;
226};
227
228struct print_flag_sym {
229 struct print_flag_sym *next;
230 char *value;
231 char *str;
232};
233
234struct print_arg_typecast {
235 char *type;
236 struct print_arg *item;
237};
238
239struct print_arg_flags {
240 struct print_arg *field;
241 char *delim;
242 struct print_flag_sym *flags;
243};
244
245struct print_arg_symbol {
246 struct print_arg *field;
247 struct print_flag_sym *symbols;
248};
249
250struct print_arg_hex {
251 struct print_arg *field;
252 struct print_arg *size;
253};
254
255struct print_arg_int_array {
256 struct print_arg *field;
257 struct print_arg *count;
258 struct print_arg *el_size;
259};
260
261struct print_arg_dynarray {
262 struct format_field *field;
263 struct print_arg *index;
264};
265
266struct print_arg;
267
268struct print_arg_op {
269 char *op;
270 int prio;
271 struct print_arg *left;
272 struct print_arg *right;
273};
274
275struct pevent_function_handler;
276
277struct print_arg_func {
278 struct pevent_function_handler *func;
279 struct print_arg *args;
280};
281
282enum print_arg_type {
283 PRINT_NULL,
284 PRINT_ATOM,
285 PRINT_FIELD,
286 PRINT_FLAGS,
287 PRINT_SYMBOL,
288 PRINT_HEX,
289 PRINT_INT_ARRAY,
290 PRINT_TYPE,
291 PRINT_STRING,
292 PRINT_BSTRING,
293 PRINT_DYNAMIC_ARRAY,
294 PRINT_OP,
295 PRINT_FUNC,
296 PRINT_BITMASK,
297 PRINT_DYNAMIC_ARRAY_LEN,
298};
299
300struct print_arg {
301 struct print_arg *next;
302 enum print_arg_type type;
303 union {
304 struct print_arg_atom atom;
305 struct print_arg_field field;
306 struct print_arg_typecast typecast;
307 struct print_arg_flags flags;
308 struct print_arg_symbol symbol;
309 struct print_arg_hex hex;
310 struct print_arg_int_array int_array;
311 struct print_arg_func func;
312 struct print_arg_string string;
313 struct print_arg_bitmask bitmask;
314 struct print_arg_op op;
315 struct print_arg_dynarray dynarray;
316 };
317};
318
319struct print_fmt {
320 char *format;
321 struct print_arg *args;
322};
323
324struct event_format {
325 struct pevent *pevent;
326 char *name;
327 int id;
328 int flags;
329 struct format format;
330 struct print_fmt print_fmt;
331 char *system;
332 pevent_event_handler_func handler;
333 void *context;
334};
335
336enum {
337 EVENT_FL_ISFTRACE = 0x01,
338 EVENT_FL_ISPRINT = 0x02,
339 EVENT_FL_ISBPRINT = 0x04,
340 EVENT_FL_ISFUNCENT = 0x10,
341 EVENT_FL_ISFUNCRET = 0x20,
342 EVENT_FL_NOHANDLE = 0x40,
343 EVENT_FL_PRINTRAW = 0x80,
344
345 EVENT_FL_FAILED = 0x80000000
346};
347
348enum event_sort_type {
349 EVENT_SORT_ID,
350 EVENT_SORT_NAME,
351 EVENT_SORT_SYSTEM,
352};
353
354enum event_type {
355 EVENT_ERROR,
356 EVENT_NONE,
357 EVENT_SPACE,
358 EVENT_NEWLINE,
359 EVENT_OP,
360 EVENT_DELIM,
361 EVENT_ITEM,
362 EVENT_DQUOTE,
363 EVENT_SQUOTE,
364};
365
366typedef unsigned long long (*pevent_func_handler)(struct trace_seq *s,
367 unsigned long long *args);
368
369enum pevent_func_arg_type {
370 PEVENT_FUNC_ARG_VOID,
371 PEVENT_FUNC_ARG_INT,
372 PEVENT_FUNC_ARG_LONG,
373 PEVENT_FUNC_ARG_STRING,
374 PEVENT_FUNC_ARG_PTR,
375 PEVENT_FUNC_ARG_MAX_TYPES
376};
377
378enum pevent_flag {
379 PEVENT_NSEC_OUTPUT = 1,
380 PEVENT_DISABLE_SYS_PLUGINS = 1 << 1,
381 PEVENT_DISABLE_PLUGINS = 1 << 2,
382};
383
384#define PEVENT_ERRORS \
385 _PE(MEM_ALLOC_FAILED, "failed to allocate memory"), \
386 _PE(PARSE_EVENT_FAILED, "failed to parse event"), \
387 _PE(READ_ID_FAILED, "failed to read event id"), \
388 _PE(READ_FORMAT_FAILED, "failed to read event format"), \
389 _PE(READ_PRINT_FAILED, "failed to read event print fmt"), \
390 _PE(OLD_FTRACE_ARG_FAILED,"failed to allocate field name for ftrace"),\
391 _PE(INVALID_ARG_TYPE, "invalid argument type"), \
392 _PE(INVALID_EXP_TYPE, "invalid expression type"), \
393 _PE(INVALID_OP_TYPE, "invalid operator type"), \
394 _PE(INVALID_EVENT_NAME, "invalid event name"), \
395 _PE(EVENT_NOT_FOUND, "no event found"), \
396 _PE(SYNTAX_ERROR, "syntax error"), \
397 _PE(ILLEGAL_RVALUE, "illegal rvalue"), \
398 _PE(ILLEGAL_LVALUE, "illegal lvalue for string comparison"), \
399 _PE(INVALID_REGEX, "regex did not compute"), \
400 _PE(ILLEGAL_STRING_CMP, "illegal comparison for string"), \
401 _PE(ILLEGAL_INTEGER_CMP,"illegal comparison for integer"), \
402 _PE(REPARENT_NOT_OP, "cannot reparent other than OP"), \
403 _PE(REPARENT_FAILED, "failed to reparent filter OP"), \
404 _PE(BAD_FILTER_ARG, "bad arg in filter tree"), \
405 _PE(UNEXPECTED_TYPE, "unexpected type (not a value)"), \
406 _PE(ILLEGAL_TOKEN, "illegal token"), \
407 _PE(INVALID_PAREN, "open parenthesis cannot come here"), \
408 _PE(UNBALANCED_PAREN, "unbalanced number of parenthesis"), \
409 _PE(UNKNOWN_TOKEN, "unknown token"), \
410 _PE(FILTER_NOT_FOUND, "no filter found"), \
411 _PE(NOT_A_NUMBER, "must have number field"), \
412 _PE(NO_FILTER, "no filters exists"), \
413 _PE(FILTER_MISS, "record does not match to filter")
414
415#undef _PE
416#define _PE(__code, __str) PEVENT_ERRNO__ ## __code
417enum pevent_errno {
418 PEVENT_ERRNO__SUCCESS = 0,
419 PEVENT_ERRNO__FILTER_MATCH = PEVENT_ERRNO__SUCCESS,
420
421
422
423
424
425
426
427
428 __PEVENT_ERRNO__START = -100000,
429
430 PEVENT_ERRORS,
431
432 __PEVENT_ERRNO__END,
433};
434#undef _PE
435
436struct plugin_list;
437
438#define INVALID_PLUGIN_LIST_OPTION ((char **)((unsigned long)-1))
439
440struct plugin_list *traceevent_load_plugins(struct pevent *pevent);
441void traceevent_unload_plugins(struct plugin_list *plugin_list,
442 struct pevent *pevent);
443char **traceevent_plugin_list_options(void);
444void traceevent_plugin_free_options_list(char **list);
445int traceevent_plugin_add_options(const char *name,
446 struct pevent_plugin_option *options);
447void traceevent_plugin_remove_options(struct pevent_plugin_option *options);
448void traceevent_print_plugins(struct trace_seq *s,
449 const char *prefix, const char *suffix,
450 const struct plugin_list *list);
451
452struct cmdline;
453struct cmdline_list;
454struct func_map;
455struct func_list;
456struct event_handler;
457struct func_resolver;
458
459typedef char *(pevent_func_resolver_t)(void *priv,
460 unsigned long long *addrp, char **modp);
461
462struct pevent {
463 int ref_count;
464
465 int header_page_ts_offset;
466 int header_page_ts_size;
467 int header_page_size_offset;
468 int header_page_size_size;
469 int header_page_data_offset;
470 int header_page_data_size;
471 int header_page_overwrite;
472
473 int file_bigendian;
474 int host_bigendian;
475
476 int latency_format;
477
478 int old_format;
479
480 int cpus;
481 int long_size;
482 int page_size;
483
484 struct cmdline *cmdlines;
485 struct cmdline_list *cmdlist;
486 int cmdline_count;
487
488 struct func_map *func_map;
489 struct func_resolver *func_resolver;
490 struct func_list *funclist;
491 unsigned int func_count;
492
493 struct printk_map *printk_map;
494 struct printk_list *printklist;
495 unsigned int printk_count;
496
497
498 struct event_format **events;
499 int nr_events;
500 struct event_format **sort_events;
501 enum event_sort_type last_type;
502
503 int type_offset;
504 int type_size;
505
506 int pid_offset;
507 int pid_size;
508
509 int pc_offset;
510 int pc_size;
511
512 int flags_offset;
513 int flags_size;
514
515 int ld_offset;
516 int ld_size;
517
518 int print_raw;
519
520 int test_filters;
521
522 int flags;
523
524 struct format_field *bprint_ip_field;
525 struct format_field *bprint_fmt_field;
526 struct format_field *bprint_buf_field;
527
528 struct event_handler *handlers;
529 struct pevent_function_handler *func_handlers;
530
531
532 struct event_format *last_event;
533
534 char *trace_clock;
535};
536
537static inline void pevent_set_flag(struct pevent *pevent, int flag)
538{
539 pevent->flags |= flag;
540}
541
542static inline unsigned short
543__data2host2(struct pevent *pevent, unsigned short data)
544{
545 unsigned short swap;
546
547 if (pevent->host_bigendian == pevent->file_bigendian)
548 return data;
549
550 swap = ((data & 0xffULL) << 8) |
551 ((data & (0xffULL << 8)) >> 8);
552
553 return swap;
554}
555
556static inline unsigned int
557__data2host4(struct pevent *pevent, unsigned int data)
558{
559 unsigned int swap;
560
561 if (pevent->host_bigendian == pevent->file_bigendian)
562 return data;
563
564 swap = ((data & 0xffULL) << 24) |
565 ((data & (0xffULL << 8)) << 8) |
566 ((data & (0xffULL << 16)) >> 8) |
567 ((data & (0xffULL << 24)) >> 24);
568
569 return swap;
570}
571
572static inline unsigned long long
573__data2host8(struct pevent *pevent, unsigned long long data)
574{
575 unsigned long long swap;
576
577 if (pevent->host_bigendian == pevent->file_bigendian)
578 return data;
579
580 swap = ((data & 0xffULL) << 56) |
581 ((data & (0xffULL << 8)) << 40) |
582 ((data & (0xffULL << 16)) << 24) |
583 ((data & (0xffULL << 24)) << 8) |
584 ((data & (0xffULL << 32)) >> 8) |
585 ((data & (0xffULL << 40)) >> 24) |
586 ((data & (0xffULL << 48)) >> 40) |
587 ((data & (0xffULL << 56)) >> 56);
588
589 return swap;
590}
591
592#define data2host2(pevent, ptr) __data2host2(pevent, *(unsigned short *)(ptr))
593#define data2host4(pevent, ptr) __data2host4(pevent, *(unsigned int *)(ptr))
594#define data2host8(pevent, ptr) \
595({ \
596 unsigned long long __val; \
597 \
598 memcpy(&__val, (ptr), sizeof(unsigned long long)); \
599 __data2host8(pevent, __val); \
600})
601
602static inline int traceevent_host_bigendian(void)
603{
604 unsigned char str[] = { 0x1, 0x2, 0x3, 0x4 };
605 unsigned int val;
606
607 memcpy(&val, str, 4);
608 return val == 0x01020304;
609}
610
611
612enum trace_flag_type {
613 TRACE_FLAG_IRQS_OFF = 0x01,
614 TRACE_FLAG_IRQS_NOSUPPORT = 0x02,
615 TRACE_FLAG_NEED_RESCHED = 0x04,
616 TRACE_FLAG_HARDIRQ = 0x08,
617 TRACE_FLAG_SOFTIRQ = 0x10,
618};
619
620int pevent_set_function_resolver(struct pevent *pevent,
621 pevent_func_resolver_t *func, void *priv);
622void pevent_reset_function_resolver(struct pevent *pevent);
623int pevent_register_comm(struct pevent *pevent, const char *comm, int pid);
624int pevent_register_trace_clock(struct pevent *pevent, const char *trace_clock);
625int pevent_register_function(struct pevent *pevent, char *name,
626 unsigned long long addr, char *mod);
627int pevent_register_print_string(struct pevent *pevent, const char *fmt,
628 unsigned long long addr);
629int pevent_pid_is_registered(struct pevent *pevent, int pid);
630
631void pevent_print_event_task(struct pevent *pevent, struct trace_seq *s,
632 struct event_format *event,
633 struct pevent_record *record);
634void pevent_print_event_time(struct pevent *pevent, struct trace_seq *s,
635 struct event_format *event,
636 struct pevent_record *record,
637 bool use_trace_clock);
638void pevent_print_event_data(struct pevent *pevent, struct trace_seq *s,
639 struct event_format *event,
640 struct pevent_record *record);
641void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
642 struct pevent_record *record, bool use_trace_clock);
643
644int pevent_parse_header_page(struct pevent *pevent, char *buf, unsigned long size,
645 int long_size);
646
647enum pevent_errno pevent_parse_event(struct pevent *pevent, const char *buf,
648 unsigned long size, const char *sys);
649enum pevent_errno pevent_parse_format(struct pevent *pevent,
650 struct event_format **eventp,
651 const char *buf,
652 unsigned long size, const char *sys);
653void pevent_free_format(struct event_format *event);
654void pevent_free_format_field(struct format_field *field);
655
656void *pevent_get_field_raw(struct trace_seq *s, struct event_format *event,
657 const char *name, struct pevent_record *record,
658 int *len, int err);
659
660int pevent_get_field_val(struct trace_seq *s, struct event_format *event,
661 const char *name, struct pevent_record *record,
662 unsigned long long *val, int err);
663int pevent_get_common_field_val(struct trace_seq *s, struct event_format *event,
664 const char *name, struct pevent_record *record,
665 unsigned long long *val, int err);
666int pevent_get_any_field_val(struct trace_seq *s, struct event_format *event,
667 const char *name, struct pevent_record *record,
668 unsigned long long *val, int err);
669
670int pevent_print_num_field(struct trace_seq *s, const char *fmt,
671 struct event_format *event, const char *name,
672 struct pevent_record *record, int err);
673
674int pevent_print_func_field(struct trace_seq *s, const char *fmt,
675 struct event_format *event, const char *name,
676 struct pevent_record *record, int err);
677
678int pevent_register_event_handler(struct pevent *pevent, int id,
679 const char *sys_name, const char *event_name,
680 pevent_event_handler_func func, void *context);
681int pevent_unregister_event_handler(struct pevent *pevent, int id,
682 const char *sys_name, const char *event_name,
683 pevent_event_handler_func func, void *context);
684int pevent_register_print_function(struct pevent *pevent,
685 pevent_func_handler func,
686 enum pevent_func_arg_type ret_type,
687 char *name, ...);
688int pevent_unregister_print_function(struct pevent *pevent,
689 pevent_func_handler func, char *name);
690
691struct format_field *pevent_find_common_field(struct event_format *event, const char *name);
692struct format_field *pevent_find_field(struct event_format *event, const char *name);
693struct format_field *pevent_find_any_field(struct event_format *event, const char *name);
694
695const char *pevent_find_function(struct pevent *pevent, unsigned long long addr);
696unsigned long long
697pevent_find_function_address(struct pevent *pevent, unsigned long long addr);
698unsigned long long pevent_read_number(struct pevent *pevent, const void *ptr, int size);
699int pevent_read_number_field(struct format_field *field, const void *data,
700 unsigned long long *value);
701
702struct event_format *pevent_find_event(struct pevent *pevent, int id);
703
704struct event_format *
705pevent_find_event_by_name(struct pevent *pevent, const char *sys, const char *name);
706
707struct event_format *
708pevent_find_event_by_record(struct pevent *pevent, struct pevent_record *record);
709
710void pevent_data_lat_fmt(struct pevent *pevent,
711 struct trace_seq *s, struct pevent_record *record);
712int pevent_data_type(struct pevent *pevent, struct pevent_record *rec);
713struct event_format *pevent_data_event_from_type(struct pevent *pevent, int type);
714int pevent_data_pid(struct pevent *pevent, struct pevent_record *rec);
715const char *pevent_data_comm_from_pid(struct pevent *pevent, int pid);
716struct cmdline;
717struct cmdline *pevent_data_pid_from_comm(struct pevent *pevent, const char *comm,
718 struct cmdline *next);
719int pevent_cmdline_pid(struct pevent *pevent, struct cmdline *cmdline);
720
721void pevent_print_field(struct trace_seq *s, void *data,
722 struct format_field *field);
723void pevent_print_fields(struct trace_seq *s, void *data,
724 int size __maybe_unused, struct event_format *event);
725void pevent_event_info(struct trace_seq *s, struct event_format *event,
726 struct pevent_record *record);
727int pevent_strerror(struct pevent *pevent, enum pevent_errno errnum,
728 char *buf, size_t buflen);
729
730struct event_format **pevent_list_events(struct pevent *pevent, enum event_sort_type);
731struct format_field **pevent_event_common_fields(struct event_format *event);
732struct format_field **pevent_event_fields(struct event_format *event);
733
734static inline int pevent_get_cpus(struct pevent *pevent)
735{
736 return pevent->cpus;
737}
738
739static inline void pevent_set_cpus(struct pevent *pevent, int cpus)
740{
741 pevent->cpus = cpus;
742}
743
744static inline int pevent_get_long_size(struct pevent *pevent)
745{
746 return pevent->long_size;
747}
748
749static inline void pevent_set_long_size(struct pevent *pevent, int long_size)
750{
751 pevent->long_size = long_size;
752}
753
754static inline int pevent_get_page_size(struct pevent *pevent)
755{
756 return pevent->page_size;
757}
758
759static inline void pevent_set_page_size(struct pevent *pevent, int _page_size)
760{
761 pevent->page_size = _page_size;
762}
763
764static inline int pevent_is_file_bigendian(struct pevent *pevent)
765{
766 return pevent->file_bigendian;
767}
768
769static inline void pevent_set_file_bigendian(struct pevent *pevent, int endian)
770{
771 pevent->file_bigendian = endian;
772}
773
774static inline int pevent_is_host_bigendian(struct pevent *pevent)
775{
776 return pevent->host_bigendian;
777}
778
779static inline void pevent_set_host_bigendian(struct pevent *pevent, int endian)
780{
781 pevent->host_bigendian = endian;
782}
783
784static inline int pevent_is_latency_format(struct pevent *pevent)
785{
786 return pevent->latency_format;
787}
788
789static inline void pevent_set_latency_format(struct pevent *pevent, int lat)
790{
791 pevent->latency_format = lat;
792}
793
794struct pevent *pevent_alloc(void);
795void pevent_free(struct pevent *pevent);
796void pevent_ref(struct pevent *pevent);
797void pevent_unref(struct pevent *pevent);
798
799
800void pevent_buffer_init(const char *buf, unsigned long long size);
801enum event_type pevent_read_token(char **tok);
802void pevent_free_token(char *token);
803int pevent_peek_char(void);
804const char *pevent_get_input_buf(void);
805unsigned long long pevent_get_input_buf_ptr(void);
806
807
808void pevent_print_funcs(struct pevent *pevent);
809void pevent_print_printk(struct pevent *pevent);
810
811
812
813enum filter_boolean_type {
814 FILTER_FALSE,
815 FILTER_TRUE,
816};
817
818enum filter_op_type {
819 FILTER_OP_AND = 1,
820 FILTER_OP_OR,
821 FILTER_OP_NOT,
822};
823
824enum filter_cmp_type {
825 FILTER_CMP_NONE,
826 FILTER_CMP_EQ,
827 FILTER_CMP_NE,
828 FILTER_CMP_GT,
829 FILTER_CMP_LT,
830 FILTER_CMP_GE,
831 FILTER_CMP_LE,
832 FILTER_CMP_MATCH,
833 FILTER_CMP_NOT_MATCH,
834 FILTER_CMP_REGEX,
835 FILTER_CMP_NOT_REGEX,
836};
837
838enum filter_exp_type {
839 FILTER_EXP_NONE,
840 FILTER_EXP_ADD,
841 FILTER_EXP_SUB,
842 FILTER_EXP_MUL,
843 FILTER_EXP_DIV,
844 FILTER_EXP_MOD,
845 FILTER_EXP_RSHIFT,
846 FILTER_EXP_LSHIFT,
847 FILTER_EXP_AND,
848 FILTER_EXP_OR,
849 FILTER_EXP_XOR,
850 FILTER_EXP_NOT,
851};
852
853enum filter_arg_type {
854 FILTER_ARG_NONE,
855 FILTER_ARG_BOOLEAN,
856 FILTER_ARG_VALUE,
857 FILTER_ARG_FIELD,
858 FILTER_ARG_EXP,
859 FILTER_ARG_OP,
860 FILTER_ARG_NUM,
861 FILTER_ARG_STR,
862};
863
864enum filter_value_type {
865 FILTER_NUMBER,
866 FILTER_STRING,
867 FILTER_CHAR
868};
869
870struct fliter_arg;
871
872struct filter_arg_boolean {
873 enum filter_boolean_type value;
874};
875
876struct filter_arg_field {
877 struct format_field *field;
878};
879
880struct filter_arg_value {
881 enum filter_value_type type;
882 union {
883 char *str;
884 unsigned long long val;
885 };
886};
887
888struct filter_arg_op {
889 enum filter_op_type type;
890 struct filter_arg *left;
891 struct filter_arg *right;
892};
893
894struct filter_arg_exp {
895 enum filter_exp_type type;
896 struct filter_arg *left;
897 struct filter_arg *right;
898};
899
900struct filter_arg_num {
901 enum filter_cmp_type type;
902 struct filter_arg *left;
903 struct filter_arg *right;
904};
905
906struct filter_arg_str {
907 enum filter_cmp_type type;
908 struct format_field *field;
909 char *val;
910 char *buffer;
911 regex_t reg;
912};
913
914struct filter_arg {
915 enum filter_arg_type type;
916 union {
917 struct filter_arg_boolean boolean;
918 struct filter_arg_field field;
919 struct filter_arg_value value;
920 struct filter_arg_op op;
921 struct filter_arg_exp exp;
922 struct filter_arg_num num;
923 struct filter_arg_str str;
924 };
925};
926
927struct filter_type {
928 int event_id;
929 struct event_format *event;
930 struct filter_arg *filter;
931};
932
933#define PEVENT_FILTER_ERROR_BUFSZ 1024
934
935struct event_filter {
936 struct pevent *pevent;
937 int filters;
938 struct filter_type *event_filters;
939 char error_buffer[PEVENT_FILTER_ERROR_BUFSZ];
940};
941
942struct event_filter *pevent_filter_alloc(struct pevent *pevent);
943
944
945#define FILTER_NONE PEVENT_ERRNO__NO_FILTER
946#define FILTER_NOEXIST PEVENT_ERRNO__FILTER_NOT_FOUND
947#define FILTER_MISS PEVENT_ERRNO__FILTER_MISS
948#define FILTER_MATCH PEVENT_ERRNO__FILTER_MATCH
949
950enum filter_trivial_type {
951 FILTER_TRIVIAL_FALSE,
952 FILTER_TRIVIAL_TRUE,
953 FILTER_TRIVIAL_BOTH,
954};
955
956enum pevent_errno pevent_filter_add_filter_str(struct event_filter *filter,
957 const char *filter_str);
958
959enum pevent_errno pevent_filter_match(struct event_filter *filter,
960 struct pevent_record *record);
961
962int pevent_filter_strerror(struct event_filter *filter, enum pevent_errno err,
963 char *buf, size_t buflen);
964
965int pevent_event_filtered(struct event_filter *filter,
966 int event_id);
967
968void pevent_filter_reset(struct event_filter *filter);
969
970int pevent_filter_clear_trivial(struct event_filter *filter,
971 enum filter_trivial_type type);
972
973void pevent_filter_free(struct event_filter *filter);
974
975char *pevent_filter_make_string(struct event_filter *filter, int event_id);
976
977int pevent_filter_remove_event(struct event_filter *filter,
978 int event_id);
979
980int pevent_filter_event_has_trivial(struct event_filter *filter,
981 int event_id,
982 enum filter_trivial_type type);
983
984int pevent_filter_copy(struct event_filter *dest, struct event_filter *source);
985
986int pevent_update_trivial(struct event_filter *dest, struct event_filter *source,
987 enum filter_trivial_type type);
988
989int pevent_filter_compare(struct event_filter *filter1, struct event_filter *filter2);
990
991#endif
992