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};
296
297struct print_arg {
298 struct print_arg *next;
299 enum print_arg_type type;
300 union {
301 struct print_arg_atom atom;
302 struct print_arg_field field;
303 struct print_arg_typecast typecast;
304 struct print_arg_flags flags;
305 struct print_arg_symbol symbol;
306 struct print_arg_hex hex;
307 struct print_arg_int_array int_array;
308 struct print_arg_func func;
309 struct print_arg_string string;
310 struct print_arg_bitmask bitmask;
311 struct print_arg_op op;
312 struct print_arg_dynarray dynarray;
313 };
314};
315
316struct print_fmt {
317 char *format;
318 struct print_arg *args;
319};
320
321struct event_format {
322 struct pevent *pevent;
323 char *name;
324 int id;
325 int flags;
326 struct format format;
327 struct print_fmt print_fmt;
328 char *system;
329 pevent_event_handler_func handler;
330 void *context;
331};
332
333enum {
334 EVENT_FL_ISFTRACE = 0x01,
335 EVENT_FL_ISPRINT = 0x02,
336 EVENT_FL_ISBPRINT = 0x04,
337 EVENT_FL_ISFUNCENT = 0x10,
338 EVENT_FL_ISFUNCRET = 0x20,
339 EVENT_FL_NOHANDLE = 0x40,
340 EVENT_FL_PRINTRAW = 0x80,
341
342 EVENT_FL_FAILED = 0x80000000
343};
344
345enum event_sort_type {
346 EVENT_SORT_ID,
347 EVENT_SORT_NAME,
348 EVENT_SORT_SYSTEM,
349};
350
351enum event_type {
352 EVENT_ERROR,
353 EVENT_NONE,
354 EVENT_SPACE,
355 EVENT_NEWLINE,
356 EVENT_OP,
357 EVENT_DELIM,
358 EVENT_ITEM,
359 EVENT_DQUOTE,
360 EVENT_SQUOTE,
361};
362
363typedef unsigned long long (*pevent_func_handler)(struct trace_seq *s,
364 unsigned long long *args);
365
366enum pevent_func_arg_type {
367 PEVENT_FUNC_ARG_VOID,
368 PEVENT_FUNC_ARG_INT,
369 PEVENT_FUNC_ARG_LONG,
370 PEVENT_FUNC_ARG_STRING,
371 PEVENT_FUNC_ARG_PTR,
372 PEVENT_FUNC_ARG_MAX_TYPES
373};
374
375enum pevent_flag {
376 PEVENT_NSEC_OUTPUT = 1,
377 PEVENT_DISABLE_SYS_PLUGINS = 1 << 1,
378 PEVENT_DISABLE_PLUGINS = 1 << 2,
379};
380
381#define PEVENT_ERRORS \
382 _PE(MEM_ALLOC_FAILED, "failed to allocate memory"), \
383 _PE(PARSE_EVENT_FAILED, "failed to parse event"), \
384 _PE(READ_ID_FAILED, "failed to read event id"), \
385 _PE(READ_FORMAT_FAILED, "failed to read event format"), \
386 _PE(READ_PRINT_FAILED, "failed to read event print fmt"), \
387 _PE(OLD_FTRACE_ARG_FAILED,"failed to allocate field name for ftrace"),\
388 _PE(INVALID_ARG_TYPE, "invalid argument type"), \
389 _PE(INVALID_EXP_TYPE, "invalid expression type"), \
390 _PE(INVALID_OP_TYPE, "invalid operator type"), \
391 _PE(INVALID_EVENT_NAME, "invalid event name"), \
392 _PE(EVENT_NOT_FOUND, "no event found"), \
393 _PE(SYNTAX_ERROR, "syntax error"), \
394 _PE(ILLEGAL_RVALUE, "illegal rvalue"), \
395 _PE(ILLEGAL_LVALUE, "illegal lvalue for string comparison"), \
396 _PE(INVALID_REGEX, "regex did not compute"), \
397 _PE(ILLEGAL_STRING_CMP, "illegal comparison for string"), \
398 _PE(ILLEGAL_INTEGER_CMP,"illegal comparison for integer"), \
399 _PE(REPARENT_NOT_OP, "cannot reparent other than OP"), \
400 _PE(REPARENT_FAILED, "failed to reparent filter OP"), \
401 _PE(BAD_FILTER_ARG, "bad arg in filter tree"), \
402 _PE(UNEXPECTED_TYPE, "unexpected type (not a value)"), \
403 _PE(ILLEGAL_TOKEN, "illegal token"), \
404 _PE(INVALID_PAREN, "open parenthesis cannot come here"), \
405 _PE(UNBALANCED_PAREN, "unbalanced number of parenthesis"), \
406 _PE(UNKNOWN_TOKEN, "unknown token"), \
407 _PE(FILTER_NOT_FOUND, "no filter found"), \
408 _PE(NOT_A_NUMBER, "must have number field"), \
409 _PE(NO_FILTER, "no filters exists"), \
410 _PE(FILTER_MISS, "record does not match to filter")
411
412#undef _PE
413#define _PE(__code, __str) PEVENT_ERRNO__ ## __code
414enum pevent_errno {
415 PEVENT_ERRNO__SUCCESS = 0,
416 PEVENT_ERRNO__FILTER_MATCH = PEVENT_ERRNO__SUCCESS,
417
418
419
420
421
422
423
424
425 __PEVENT_ERRNO__START = -100000,
426
427 PEVENT_ERRORS,
428
429 __PEVENT_ERRNO__END,
430};
431#undef _PE
432
433struct plugin_list;
434
435#define INVALID_PLUGIN_LIST_OPTION ((char **)((unsigned long)-1))
436
437struct plugin_list *traceevent_load_plugins(struct pevent *pevent);
438void traceevent_unload_plugins(struct plugin_list *plugin_list,
439 struct pevent *pevent);
440char **traceevent_plugin_list_options(void);
441void traceevent_plugin_free_options_list(char **list);
442int traceevent_plugin_add_options(const char *name,
443 struct pevent_plugin_option *options);
444void traceevent_plugin_remove_options(struct pevent_plugin_option *options);
445void traceevent_print_plugins(struct trace_seq *s,
446 const char *prefix, const char *suffix,
447 const struct plugin_list *list);
448
449struct cmdline;
450struct cmdline_list;
451struct func_map;
452struct func_list;
453struct event_handler;
454struct func_resolver;
455
456typedef char *(pevent_func_resolver_t)(void *priv,
457 unsigned long long *addrp, char **modp);
458
459struct pevent {
460 int ref_count;
461
462 int header_page_ts_offset;
463 int header_page_ts_size;
464 int header_page_size_offset;
465 int header_page_size_size;
466 int header_page_data_offset;
467 int header_page_data_size;
468 int header_page_overwrite;
469
470 int file_bigendian;
471 int host_bigendian;
472
473 int latency_format;
474
475 int old_format;
476
477 int cpus;
478 int long_size;
479 int page_size;
480
481 struct cmdline *cmdlines;
482 struct cmdline_list *cmdlist;
483 int cmdline_count;
484
485 struct func_map *func_map;
486 struct func_resolver *func_resolver;
487 struct func_list *funclist;
488 unsigned int func_count;
489
490 struct printk_map *printk_map;
491 struct printk_list *printklist;
492 unsigned int printk_count;
493
494
495 struct event_format **events;
496 int nr_events;
497 struct event_format **sort_events;
498 enum event_sort_type last_type;
499
500 int type_offset;
501 int type_size;
502
503 int pid_offset;
504 int pid_size;
505
506 int pc_offset;
507 int pc_size;
508
509 int flags_offset;
510 int flags_size;
511
512 int ld_offset;
513 int ld_size;
514
515 int print_raw;
516
517 int test_filters;
518
519 int flags;
520
521 struct format_field *bprint_ip_field;
522 struct format_field *bprint_fmt_field;
523 struct format_field *bprint_buf_field;
524
525 struct event_handler *handlers;
526 struct pevent_function_handler *func_handlers;
527
528
529 struct event_format *last_event;
530
531 char *trace_clock;
532};
533
534static inline void pevent_set_flag(struct pevent *pevent, int flag)
535{
536 pevent->flags |= flag;
537}
538
539static inline unsigned short
540__data2host2(struct pevent *pevent, unsigned short data)
541{
542 unsigned short swap;
543
544 if (pevent->host_bigendian == pevent->file_bigendian)
545 return data;
546
547 swap = ((data & 0xffULL) << 8) |
548 ((data & (0xffULL << 8)) >> 8);
549
550 return swap;
551}
552
553static inline unsigned int
554__data2host4(struct pevent *pevent, unsigned int data)
555{
556 unsigned int swap;
557
558 if (pevent->host_bigendian == pevent->file_bigendian)
559 return data;
560
561 swap = ((data & 0xffULL) << 24) |
562 ((data & (0xffULL << 8)) << 8) |
563 ((data & (0xffULL << 16)) >> 8) |
564 ((data & (0xffULL << 24)) >> 24);
565
566 return swap;
567}
568
569static inline unsigned long long
570__data2host8(struct pevent *pevent, unsigned long long data)
571{
572 unsigned long long swap;
573
574 if (pevent->host_bigendian == pevent->file_bigendian)
575 return data;
576
577 swap = ((data & 0xffULL) << 56) |
578 ((data & (0xffULL << 8)) << 40) |
579 ((data & (0xffULL << 16)) << 24) |
580 ((data & (0xffULL << 24)) << 8) |
581 ((data & (0xffULL << 32)) >> 8) |
582 ((data & (0xffULL << 40)) >> 24) |
583 ((data & (0xffULL << 48)) >> 40) |
584 ((data & (0xffULL << 56)) >> 56);
585
586 return swap;
587}
588
589#define data2host2(pevent, ptr) __data2host2(pevent, *(unsigned short *)(ptr))
590#define data2host4(pevent, ptr) __data2host4(pevent, *(unsigned int *)(ptr))
591#define data2host8(pevent, ptr) \
592({ \
593 unsigned long long __val; \
594 \
595 memcpy(&__val, (ptr), sizeof(unsigned long long)); \
596 __data2host8(pevent, __val); \
597})
598
599static inline int traceevent_host_bigendian(void)
600{
601 unsigned char str[] = { 0x1, 0x2, 0x3, 0x4 };
602 unsigned int val;
603
604 memcpy(&val, str, 4);
605 return val == 0x01020304;
606}
607
608
609enum trace_flag_type {
610 TRACE_FLAG_IRQS_OFF = 0x01,
611 TRACE_FLAG_IRQS_NOSUPPORT = 0x02,
612 TRACE_FLAG_NEED_RESCHED = 0x04,
613 TRACE_FLAG_HARDIRQ = 0x08,
614 TRACE_FLAG_SOFTIRQ = 0x10,
615};
616
617int pevent_set_function_resolver(struct pevent *pevent,
618 pevent_func_resolver_t *func, void *priv);
619void pevent_reset_function_resolver(struct pevent *pevent);
620int pevent_register_comm(struct pevent *pevent, const char *comm, int pid);
621int pevent_register_trace_clock(struct pevent *pevent, const char *trace_clock);
622int pevent_register_function(struct pevent *pevent, char *name,
623 unsigned long long addr, char *mod);
624int pevent_register_print_string(struct pevent *pevent, const char *fmt,
625 unsigned long long addr);
626int pevent_pid_is_registered(struct pevent *pevent, int pid);
627
628void pevent_print_event_task(struct pevent *pevent, struct trace_seq *s,
629 struct event_format *event,
630 struct pevent_record *record);
631void pevent_print_event_time(struct pevent *pevent, struct trace_seq *s,
632 struct event_format *event,
633 struct pevent_record *record,
634 bool use_trace_clock);
635void pevent_print_event_data(struct pevent *pevent, struct trace_seq *s,
636 struct event_format *event,
637 struct pevent_record *record);
638void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
639 struct pevent_record *record, bool use_trace_clock);
640
641int pevent_parse_header_page(struct pevent *pevent, char *buf, unsigned long size,
642 int long_size);
643
644enum pevent_errno pevent_parse_event(struct pevent *pevent, const char *buf,
645 unsigned long size, const char *sys);
646enum pevent_errno pevent_parse_format(struct pevent *pevent,
647 struct event_format **eventp,
648 const char *buf,
649 unsigned long size, const char *sys);
650void pevent_free_format(struct event_format *event);
651void pevent_free_format_field(struct format_field *field);
652
653void *pevent_get_field_raw(struct trace_seq *s, struct event_format *event,
654 const char *name, struct pevent_record *record,
655 int *len, int err);
656
657int pevent_get_field_val(struct trace_seq *s, struct event_format *event,
658 const char *name, struct pevent_record *record,
659 unsigned long long *val, int err);
660int pevent_get_common_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_any_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);
666
667int pevent_print_num_field(struct trace_seq *s, const char *fmt,
668 struct event_format *event, const char *name,
669 struct pevent_record *record, int err);
670
671int pevent_print_func_field(struct trace_seq *s, const char *fmt,
672 struct event_format *event, const char *name,
673 struct pevent_record *record, int err);
674
675int pevent_register_event_handler(struct pevent *pevent, int id,
676 const char *sys_name, const char *event_name,
677 pevent_event_handler_func func, void *context);
678int pevent_unregister_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_register_print_function(struct pevent *pevent,
682 pevent_func_handler func,
683 enum pevent_func_arg_type ret_type,
684 char *name, ...);
685int pevent_unregister_print_function(struct pevent *pevent,
686 pevent_func_handler func, char *name);
687
688struct format_field *pevent_find_common_field(struct event_format *event, const char *name);
689struct format_field *pevent_find_field(struct event_format *event, const char *name);
690struct format_field *pevent_find_any_field(struct event_format *event, const char *name);
691
692const char *pevent_find_function(struct pevent *pevent, unsigned long long addr);
693unsigned long long
694pevent_find_function_address(struct pevent *pevent, unsigned long long addr);
695unsigned long long pevent_read_number(struct pevent *pevent, const void *ptr, int size);
696int pevent_read_number_field(struct format_field *field, const void *data,
697 unsigned long long *value);
698
699struct event_format *pevent_find_event(struct pevent *pevent, int id);
700
701struct event_format *
702pevent_find_event_by_name(struct pevent *pevent, const char *sys, const char *name);
703
704struct event_format *
705pevent_find_event_by_record(struct pevent *pevent, struct pevent_record *record);
706
707void pevent_data_lat_fmt(struct pevent *pevent,
708 struct trace_seq *s, struct pevent_record *record);
709int pevent_data_type(struct pevent *pevent, struct pevent_record *rec);
710struct event_format *pevent_data_event_from_type(struct pevent *pevent, int type);
711int pevent_data_pid(struct pevent *pevent, struct pevent_record *rec);
712int pevent_data_prempt_count(struct pevent *pevent, struct pevent_record *rec);
713int pevent_data_flags(struct pevent *pevent, struct pevent_record *rec);
714const char *pevent_data_comm_from_pid(struct pevent *pevent, int pid);
715struct cmdline;
716struct cmdline *pevent_data_pid_from_comm(struct pevent *pevent, const char *comm,
717 struct cmdline *next);
718int pevent_cmdline_pid(struct pevent *pevent, struct cmdline *cmdline);
719
720void pevent_print_field(struct trace_seq *s, void *data,
721 struct format_field *field);
722void pevent_print_fields(struct trace_seq *s, void *data,
723 int size __maybe_unused, struct event_format *event);
724void pevent_event_info(struct trace_seq *s, struct event_format *event,
725 struct pevent_record *record);
726int pevent_strerror(struct pevent *pevent, enum pevent_errno errnum,
727 char *buf, size_t buflen);
728
729struct event_format **pevent_list_events(struct pevent *pevent, enum event_sort_type);
730struct format_field **pevent_event_common_fields(struct event_format *event);
731struct format_field **pevent_event_fields(struct event_format *event);
732
733static inline int pevent_get_cpus(struct pevent *pevent)
734{
735 return pevent->cpus;
736}
737
738static inline void pevent_set_cpus(struct pevent *pevent, int cpus)
739{
740 pevent->cpus = cpus;
741}
742
743static inline int pevent_get_long_size(struct pevent *pevent)
744{
745 return pevent->long_size;
746}
747
748static inline void pevent_set_long_size(struct pevent *pevent, int long_size)
749{
750 pevent->long_size = long_size;
751}
752
753static inline int pevent_get_page_size(struct pevent *pevent)
754{
755 return pevent->page_size;
756}
757
758static inline void pevent_set_page_size(struct pevent *pevent, int _page_size)
759{
760 pevent->page_size = _page_size;
761}
762
763static inline int pevent_is_file_bigendian(struct pevent *pevent)
764{
765 return pevent->file_bigendian;
766}
767
768static inline void pevent_set_file_bigendian(struct pevent *pevent, int endian)
769{
770 pevent->file_bigendian = endian;
771}
772
773static inline int pevent_is_host_bigendian(struct pevent *pevent)
774{
775 return pevent->host_bigendian;
776}
777
778static inline void pevent_set_host_bigendian(struct pevent *pevent, int endian)
779{
780 pevent->host_bigendian = endian;
781}
782
783static inline int pevent_is_latency_format(struct pevent *pevent)
784{
785 return pevent->latency_format;
786}
787
788static inline void pevent_set_latency_format(struct pevent *pevent, int lat)
789{
790 pevent->latency_format = lat;
791}
792
793struct pevent *pevent_alloc(void);
794void pevent_free(struct pevent *pevent);
795void pevent_ref(struct pevent *pevent);
796void pevent_unref(struct pevent *pevent);
797
798
799void pevent_buffer_init(const char *buf, unsigned long long size);
800enum event_type pevent_read_token(char **tok);
801void pevent_free_token(char *token);
802int pevent_peek_char(void);
803const char *pevent_get_input_buf(void);
804unsigned long long pevent_get_input_buf_ptr(void);
805
806
807void pevent_print_funcs(struct pevent *pevent);
808void pevent_print_printk(struct pevent *pevent);
809
810
811
812enum filter_boolean_type {
813 FILTER_FALSE,
814 FILTER_TRUE,
815};
816
817enum filter_op_type {
818 FILTER_OP_AND = 1,
819 FILTER_OP_OR,
820 FILTER_OP_NOT,
821};
822
823enum filter_cmp_type {
824 FILTER_CMP_NONE,
825 FILTER_CMP_EQ,
826 FILTER_CMP_NE,
827 FILTER_CMP_GT,
828 FILTER_CMP_LT,
829 FILTER_CMP_GE,
830 FILTER_CMP_LE,
831 FILTER_CMP_MATCH,
832 FILTER_CMP_NOT_MATCH,
833 FILTER_CMP_REGEX,
834 FILTER_CMP_NOT_REGEX,
835};
836
837enum filter_exp_type {
838 FILTER_EXP_NONE,
839 FILTER_EXP_ADD,
840 FILTER_EXP_SUB,
841 FILTER_EXP_MUL,
842 FILTER_EXP_DIV,
843 FILTER_EXP_MOD,
844 FILTER_EXP_RSHIFT,
845 FILTER_EXP_LSHIFT,
846 FILTER_EXP_AND,
847 FILTER_EXP_OR,
848 FILTER_EXP_XOR,
849 FILTER_EXP_NOT,
850};
851
852enum filter_arg_type {
853 FILTER_ARG_NONE,
854 FILTER_ARG_BOOLEAN,
855 FILTER_ARG_VALUE,
856 FILTER_ARG_FIELD,
857 FILTER_ARG_EXP,
858 FILTER_ARG_OP,
859 FILTER_ARG_NUM,
860 FILTER_ARG_STR,
861};
862
863enum filter_value_type {
864 FILTER_NUMBER,
865 FILTER_STRING,
866 FILTER_CHAR
867};
868
869struct fliter_arg;
870
871struct filter_arg_boolean {
872 enum filter_boolean_type value;
873};
874
875struct filter_arg_field {
876 struct format_field *field;
877};
878
879struct filter_arg_value {
880 enum filter_value_type type;
881 union {
882 char *str;
883 unsigned long long val;
884 };
885};
886
887struct filter_arg_op {
888 enum filter_op_type type;
889 struct filter_arg *left;
890 struct filter_arg *right;
891};
892
893struct filter_arg_exp {
894 enum filter_exp_type type;
895 struct filter_arg *left;
896 struct filter_arg *right;
897};
898
899struct filter_arg_num {
900 enum filter_cmp_type type;
901 struct filter_arg *left;
902 struct filter_arg *right;
903};
904
905struct filter_arg_str {
906 enum filter_cmp_type type;
907 struct format_field *field;
908 char *val;
909 char *buffer;
910 regex_t reg;
911};
912
913struct filter_arg {
914 enum filter_arg_type type;
915 union {
916 struct filter_arg_boolean boolean;
917 struct filter_arg_field field;
918 struct filter_arg_value value;
919 struct filter_arg_op op;
920 struct filter_arg_exp exp;
921 struct filter_arg_num num;
922 struct filter_arg_str str;
923 };
924};
925
926struct filter_type {
927 int event_id;
928 struct event_format *event;
929 struct filter_arg *filter;
930};
931
932#define PEVENT_FILTER_ERROR_BUFSZ 1024
933
934struct event_filter {
935 struct pevent *pevent;
936 int filters;
937 struct filter_type *event_filters;
938 char error_buffer[PEVENT_FILTER_ERROR_BUFSZ];
939};
940
941struct event_filter *pevent_filter_alloc(struct pevent *pevent);
942
943
944#define FILTER_NONE PEVENT_ERRNO__NO_FILTER
945#define FILTER_NOEXIST PEVENT_ERRNO__FILTER_NOT_FOUND
946#define FILTER_MISS PEVENT_ERRNO__FILTER_MISS
947#define FILTER_MATCH PEVENT_ERRNO__FILTER_MATCH
948
949enum filter_trivial_type {
950 FILTER_TRIVIAL_FALSE,
951 FILTER_TRIVIAL_TRUE,
952 FILTER_TRIVIAL_BOTH,
953};
954
955enum pevent_errno pevent_filter_add_filter_str(struct event_filter *filter,
956 const char *filter_str);
957
958enum pevent_errno pevent_filter_match(struct event_filter *filter,
959 struct pevent_record *record);
960
961int pevent_filter_strerror(struct event_filter *filter, enum pevent_errno err,
962 char *buf, size_t buflen);
963
964int pevent_event_filtered(struct event_filter *filter,
965 int event_id);
966
967void pevent_filter_reset(struct event_filter *filter);
968
969int pevent_filter_clear_trivial(struct event_filter *filter,
970 enum filter_trivial_type type);
971
972void pevent_filter_free(struct event_filter *filter);
973
974char *pevent_filter_make_string(struct event_filter *filter, int event_id);
975
976int pevent_filter_remove_event(struct event_filter *filter,
977 int event_id);
978
979int pevent_filter_event_has_trivial(struct event_filter *filter,
980 int event_id,
981 enum filter_trivial_type type);
982
983int pevent_filter_copy(struct event_filter *dest, struct event_filter *source);
984
985int pevent_update_trivial(struct event_filter *dest, struct event_filter *source,
986 enum filter_trivial_type type);
987
988int pevent_filter_compare(struct event_filter *filter1, struct event_filter *filter2);
989
990#endif
991