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
175enum format_flags {
176 FIELD_IS_ARRAY = 1,
177 FIELD_IS_POINTER = 2,
178 FIELD_IS_SIGNED = 4,
179 FIELD_IS_STRING = 8,
180 FIELD_IS_DYNAMIC = 16,
181 FIELD_IS_LONG = 32,
182 FIELD_IS_FLAG = 64,
183 FIELD_IS_SYMBOLIC = 128,
184};
185
186struct format_field {
187 struct format_field *next;
188 struct event_format *event;
189 char *type;
190 char *name;
191 char *alias;
192 int offset;
193 int size;
194 unsigned int arraylen;
195 unsigned int elementsize;
196 unsigned long flags;
197};
198
199struct format {
200 int nr_common;
201 int nr_fields;
202 struct format_field *common_fields;
203 struct format_field *fields;
204};
205
206struct print_arg_atom {
207 char *atom;
208};
209
210struct print_arg_string {
211 char *string;
212 int offset;
213};
214
215struct print_arg_bitmask {
216 char *bitmask;
217 int offset;
218};
219
220struct print_arg_field {
221 char *name;
222 struct format_field *field;
223};
224
225struct print_flag_sym {
226 struct print_flag_sym *next;
227 char *value;
228 char *str;
229};
230
231struct print_arg_typecast {
232 char *type;
233 struct print_arg *item;
234};
235
236struct print_arg_flags {
237 struct print_arg *field;
238 char *delim;
239 struct print_flag_sym *flags;
240};
241
242struct print_arg_symbol {
243 struct print_arg *field;
244 struct print_flag_sym *symbols;
245};
246
247struct print_arg_hex {
248 struct print_arg *field;
249 struct print_arg *size;
250};
251
252struct print_arg_int_array {
253 struct print_arg *field;
254 struct print_arg *count;
255 struct print_arg *el_size;
256};
257
258struct print_arg_dynarray {
259 struct format_field *field;
260 struct print_arg *index;
261};
262
263struct print_arg;
264
265struct print_arg_op {
266 char *op;
267 int prio;
268 struct print_arg *left;
269 struct print_arg *right;
270};
271
272struct pevent_function_handler;
273
274struct print_arg_func {
275 struct pevent_function_handler *func;
276 struct print_arg *args;
277};
278
279enum print_arg_type {
280 PRINT_NULL,
281 PRINT_ATOM,
282 PRINT_FIELD,
283 PRINT_FLAGS,
284 PRINT_SYMBOL,
285 PRINT_HEX,
286 PRINT_INT_ARRAY,
287 PRINT_TYPE,
288 PRINT_STRING,
289 PRINT_BSTRING,
290 PRINT_DYNAMIC_ARRAY,
291 PRINT_OP,
292 PRINT_FUNC,
293 PRINT_BITMASK,
294 PRINT_DYNAMIC_ARRAY_LEN,
295 PRINT_HEX_STR,
296};
297
298struct print_arg {
299 struct print_arg *next;
300 enum print_arg_type type;
301 union {
302 struct print_arg_atom atom;
303 struct print_arg_field field;
304 struct print_arg_typecast typecast;
305 struct print_arg_flags flags;
306 struct print_arg_symbol symbol;
307 struct print_arg_hex hex;
308 struct print_arg_int_array int_array;
309 struct print_arg_func func;
310 struct print_arg_string string;
311 struct print_arg_bitmask bitmask;
312 struct print_arg_op op;
313 struct print_arg_dynarray dynarray;
314 };
315};
316
317struct print_fmt {
318 char *format;
319 struct print_arg *args;
320};
321
322struct event_format {
323 struct pevent *pevent;
324 char *name;
325 int id;
326 int flags;
327 struct format format;
328 struct print_fmt print_fmt;
329 char *system;
330 pevent_event_handler_func handler;
331 void *context;
332};
333
334enum {
335 EVENT_FL_ISFTRACE = 0x01,
336 EVENT_FL_ISPRINT = 0x02,
337 EVENT_FL_ISBPRINT = 0x04,
338 EVENT_FL_ISFUNCENT = 0x10,
339 EVENT_FL_ISFUNCRET = 0x20,
340 EVENT_FL_NOHANDLE = 0x40,
341 EVENT_FL_PRINTRAW = 0x80,
342
343 EVENT_FL_FAILED = 0x80000000
344};
345
346enum event_sort_type {
347 EVENT_SORT_ID,
348 EVENT_SORT_NAME,
349 EVENT_SORT_SYSTEM,
350};
351
352enum event_type {
353 EVENT_ERROR,
354 EVENT_NONE,
355 EVENT_SPACE,
356 EVENT_NEWLINE,
357 EVENT_OP,
358 EVENT_DELIM,
359 EVENT_ITEM,
360 EVENT_DQUOTE,
361 EVENT_SQUOTE,
362};
363
364typedef unsigned long long (*pevent_func_handler)(struct trace_seq *s,
365 unsigned long long *args);
366
367enum pevent_func_arg_type {
368 PEVENT_FUNC_ARG_VOID,
369 PEVENT_FUNC_ARG_INT,
370 PEVENT_FUNC_ARG_LONG,
371 PEVENT_FUNC_ARG_STRING,
372 PEVENT_FUNC_ARG_PTR,
373 PEVENT_FUNC_ARG_MAX_TYPES
374};
375
376enum pevent_flag {
377 PEVENT_NSEC_OUTPUT = 1,
378 PEVENT_DISABLE_SYS_PLUGINS = 1 << 1,
379 PEVENT_DISABLE_PLUGINS = 1 << 2,
380};
381
382#define PEVENT_ERRORS \
383 _PE(MEM_ALLOC_FAILED, "failed to allocate memory"), \
384 _PE(PARSE_EVENT_FAILED, "failed to parse event"), \
385 _PE(READ_ID_FAILED, "failed to read event id"), \
386 _PE(READ_FORMAT_FAILED, "failed to read event format"), \
387 _PE(READ_PRINT_FAILED, "failed to read event print fmt"), \
388 _PE(OLD_FTRACE_ARG_FAILED,"failed to allocate field name for ftrace"),\
389 _PE(INVALID_ARG_TYPE, "invalid argument type"), \
390 _PE(INVALID_EXP_TYPE, "invalid expression type"), \
391 _PE(INVALID_OP_TYPE, "invalid operator type"), \
392 _PE(INVALID_EVENT_NAME, "invalid event name"), \
393 _PE(EVENT_NOT_FOUND, "no event found"), \
394 _PE(SYNTAX_ERROR, "syntax error"), \
395 _PE(ILLEGAL_RVALUE, "illegal rvalue"), \
396 _PE(ILLEGAL_LVALUE, "illegal lvalue for string comparison"), \
397 _PE(INVALID_REGEX, "regex did not compute"), \
398 _PE(ILLEGAL_STRING_CMP, "illegal comparison for string"), \
399 _PE(ILLEGAL_INTEGER_CMP,"illegal comparison for integer"), \
400 _PE(REPARENT_NOT_OP, "cannot reparent other than OP"), \
401 _PE(REPARENT_FAILED, "failed to reparent filter OP"), \
402 _PE(BAD_FILTER_ARG, "bad arg in filter tree"), \
403 _PE(UNEXPECTED_TYPE, "unexpected type (not a value)"), \
404 _PE(ILLEGAL_TOKEN, "illegal token"), \
405 _PE(INVALID_PAREN, "open parenthesis cannot come here"), \
406 _PE(UNBALANCED_PAREN, "unbalanced number of parenthesis"), \
407 _PE(UNKNOWN_TOKEN, "unknown token"), \
408 _PE(FILTER_NOT_FOUND, "no filter found"), \
409 _PE(NOT_A_NUMBER, "must have number field"), \
410 _PE(NO_FILTER, "no filters exists"), \
411 _PE(FILTER_MISS, "record does not match to filter")
412
413#undef _PE
414#define _PE(__code, __str) PEVENT_ERRNO__ ## __code
415enum pevent_errno {
416 PEVENT_ERRNO__SUCCESS = 0,
417 PEVENT_ERRNO__FILTER_MATCH = PEVENT_ERRNO__SUCCESS,
418
419
420
421
422
423
424
425
426 __PEVENT_ERRNO__START = -100000,
427
428 PEVENT_ERRORS,
429
430 __PEVENT_ERRNO__END,
431};
432#undef _PE
433
434struct plugin_list;
435
436#define INVALID_PLUGIN_LIST_OPTION ((char **)((unsigned long)-1))
437
438struct plugin_list *traceevent_load_plugins(struct pevent *pevent);
439void traceevent_unload_plugins(struct plugin_list *plugin_list,
440 struct pevent *pevent);
441char **traceevent_plugin_list_options(void);
442void traceevent_plugin_free_options_list(char **list);
443int traceevent_plugin_add_options(const char *name,
444 struct pevent_plugin_option *options);
445void traceevent_plugin_remove_options(struct pevent_plugin_option *options);
446void traceevent_print_plugins(struct trace_seq *s,
447 const char *prefix, const char *suffix,
448 const struct plugin_list *list);
449
450struct cmdline;
451struct cmdline_list;
452struct func_map;
453struct func_list;
454struct event_handler;
455struct func_resolver;
456
457typedef char *(pevent_func_resolver_t)(void *priv,
458 unsigned long long *addrp, char **modp);
459
460struct pevent {
461 int ref_count;
462
463 int header_page_ts_offset;
464 int header_page_ts_size;
465 int header_page_size_offset;
466 int header_page_size_size;
467 int header_page_data_offset;
468 int header_page_data_size;
469 int header_page_overwrite;
470
471 int file_bigendian;
472 int host_bigendian;
473
474 int latency_format;
475
476 int old_format;
477
478 int cpus;
479 int long_size;
480 int page_size;
481
482 struct cmdline *cmdlines;
483 struct cmdline_list *cmdlist;
484 int cmdline_count;
485
486 struct func_map *func_map;
487 struct func_resolver *func_resolver;
488 struct func_list *funclist;
489 unsigned int func_count;
490
491 struct printk_map *printk_map;
492 struct printk_list *printklist;
493 unsigned int printk_count;
494
495
496 struct event_format **events;
497 int nr_events;
498 struct event_format **sort_events;
499 enum event_sort_type last_type;
500
501 int type_offset;
502 int type_size;
503
504 int pid_offset;
505 int pid_size;
506
507 int pc_offset;
508 int pc_size;
509
510 int flags_offset;
511 int flags_size;
512
513 int ld_offset;
514 int ld_size;
515
516 int print_raw;
517
518 int test_filters;
519
520 int flags;
521
522 struct format_field *bprint_ip_field;
523 struct format_field *bprint_fmt_field;
524 struct format_field *bprint_buf_field;
525
526 struct event_handler *handlers;
527 struct pevent_function_handler *func_handlers;
528
529
530 struct event_format *last_event;
531
532 char *trace_clock;
533};
534
535static inline void pevent_set_flag(struct pevent *pevent, int flag)
536{
537 pevent->flags |= flag;
538}
539
540static inline unsigned short
541__data2host2(struct pevent *pevent, unsigned short data)
542{
543 unsigned short swap;
544
545 if (pevent->host_bigendian == pevent->file_bigendian)
546 return data;
547
548 swap = ((data & 0xffULL) << 8) |
549 ((data & (0xffULL << 8)) >> 8);
550
551 return swap;
552}
553
554static inline unsigned int
555__data2host4(struct pevent *pevent, unsigned int data)
556{
557 unsigned int swap;
558
559 if (pevent->host_bigendian == pevent->file_bigendian)
560 return data;
561
562 swap = ((data & 0xffULL) << 24) |
563 ((data & (0xffULL << 8)) << 8) |
564 ((data & (0xffULL << 16)) >> 8) |
565 ((data & (0xffULL << 24)) >> 24);
566
567 return swap;
568}
569
570static inline unsigned long long
571__data2host8(struct pevent *pevent, unsigned long long data)
572{
573 unsigned long long swap;
574
575 if (pevent->host_bigendian == pevent->file_bigendian)
576 return data;
577
578 swap = ((data & 0xffULL) << 56) |
579 ((data & (0xffULL << 8)) << 40) |
580 ((data & (0xffULL << 16)) << 24) |
581 ((data & (0xffULL << 24)) << 8) |
582 ((data & (0xffULL << 32)) >> 8) |
583 ((data & (0xffULL << 40)) >> 24) |
584 ((data & (0xffULL << 48)) >> 40) |
585 ((data & (0xffULL << 56)) >> 56);
586
587 return swap;
588}
589
590#define data2host2(pevent, ptr) __data2host2(pevent, *(unsigned short *)(ptr))
591#define data2host4(pevent, ptr) __data2host4(pevent, *(unsigned int *)(ptr))
592#define data2host8(pevent, ptr) \
593({ \
594 unsigned long long __val; \
595 \
596 memcpy(&__val, (ptr), sizeof(unsigned long long)); \
597 __data2host8(pevent, __val); \
598})
599
600static inline int traceevent_host_bigendian(void)
601{
602 unsigned char str[] = { 0x1, 0x2, 0x3, 0x4 };
603 unsigned int val;
604
605 memcpy(&val, str, 4);
606 return val == 0x01020304;
607}
608
609
610enum trace_flag_type {
611 TRACE_FLAG_IRQS_OFF = 0x01,
612 TRACE_FLAG_IRQS_NOSUPPORT = 0x02,
613 TRACE_FLAG_NEED_RESCHED = 0x04,
614 TRACE_FLAG_HARDIRQ = 0x08,
615 TRACE_FLAG_SOFTIRQ = 0x10,
616};
617
618int pevent_set_function_resolver(struct pevent *pevent,
619 pevent_func_resolver_t *func, void *priv);
620void pevent_reset_function_resolver(struct pevent *pevent);
621int pevent_register_comm(struct pevent *pevent, const char *comm, int pid);
622int pevent_register_trace_clock(struct pevent *pevent, const char *trace_clock);
623int pevent_register_function(struct pevent *pevent, char *name,
624 unsigned long long addr, char *mod);
625int pevent_register_print_string(struct pevent *pevent, const char *fmt,
626 unsigned long long addr);
627int pevent_pid_is_registered(struct pevent *pevent, int pid);
628
629void pevent_print_event_task(struct pevent *pevent, struct trace_seq *s,
630 struct event_format *event,
631 struct pevent_record *record);
632void pevent_print_event_time(struct pevent *pevent, struct trace_seq *s,
633 struct event_format *event,
634 struct pevent_record *record,
635 bool use_trace_clock);
636void pevent_print_event_data(struct pevent *pevent, struct trace_seq *s,
637 struct event_format *event,
638 struct pevent_record *record);
639void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
640 struct pevent_record *record, bool use_trace_clock);
641
642int pevent_parse_header_page(struct pevent *pevent, char *buf, unsigned long size,
643 int long_size);
644
645enum pevent_errno pevent_parse_event(struct pevent *pevent, const char *buf,
646 unsigned long size, const char *sys);
647enum pevent_errno pevent_parse_format(struct pevent *pevent,
648 struct event_format **eventp,
649 const char *buf,
650 unsigned long size, const char *sys);
651void pevent_free_format(struct event_format *event);
652void pevent_free_format_field(struct format_field *field);
653
654void *pevent_get_field_raw(struct trace_seq *s, struct event_format *event,
655 const char *name, struct pevent_record *record,
656 int *len, int err);
657
658int pevent_get_field_val(struct trace_seq *s, struct event_format *event,
659 const char *name, struct pevent_record *record,
660 unsigned long long *val, int err);
661int pevent_get_common_field_val(struct trace_seq *s, struct event_format *event,
662 const char *name, struct pevent_record *record,
663 unsigned long long *val, int err);
664int pevent_get_any_field_val(struct trace_seq *s, struct event_format *event,
665 const char *name, struct pevent_record *record,
666 unsigned long long *val, int err);
667
668int pevent_print_num_field(struct trace_seq *s, const char *fmt,
669 struct event_format *event, const char *name,
670 struct pevent_record *record, int err);
671
672int pevent_print_func_field(struct trace_seq *s, const char *fmt,
673 struct event_format *event, const char *name,
674 struct pevent_record *record, int err);
675
676int pevent_register_event_handler(struct pevent *pevent, int id,
677 const char *sys_name, const char *event_name,
678 pevent_event_handler_func func, void *context);
679int pevent_unregister_event_handler(struct pevent *pevent, int id,
680 const char *sys_name, const char *event_name,
681 pevent_event_handler_func func, void *context);
682int pevent_register_print_function(struct pevent *pevent,
683 pevent_func_handler func,
684 enum pevent_func_arg_type ret_type,
685 char *name, ...);
686int pevent_unregister_print_function(struct pevent *pevent,
687 pevent_func_handler func, char *name);
688
689struct format_field *pevent_find_common_field(struct event_format *event, const char *name);
690struct format_field *pevent_find_field(struct event_format *event, const char *name);
691struct format_field *pevent_find_any_field(struct event_format *event, const char *name);
692
693const char *pevent_find_function(struct pevent *pevent, unsigned long long addr);
694unsigned long long
695pevent_find_function_address(struct pevent *pevent, unsigned long long addr);
696unsigned long long pevent_read_number(struct pevent *pevent, const void *ptr, int size);
697int pevent_read_number_field(struct format_field *field, const void *data,
698 unsigned long long *value);
699
700struct event_format *pevent_find_event(struct pevent *pevent, int id);
701
702struct event_format *
703pevent_find_event_by_name(struct pevent *pevent, const char *sys, const char *name);
704
705struct event_format *
706pevent_find_event_by_record(struct pevent *pevent, struct pevent_record *record);
707
708void pevent_data_lat_fmt(struct pevent *pevent,
709 struct trace_seq *s, struct pevent_record *record);
710int pevent_data_type(struct pevent *pevent, struct pevent_record *rec);
711struct event_format *pevent_data_event_from_type(struct pevent *pevent, int type);
712int pevent_data_pid(struct pevent *pevent, struct pevent_record *rec);
713int pevent_data_preempt_count(struct pevent *pevent, struct pevent_record *rec);
714int pevent_data_flags(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