at v3.10-rc6 844 lines 21 kB view raw
1/* 2 * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com> 3 * 4 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Lesser General Public 7 * License as published by the Free Software Foundation; 8 * version 2.1 of the License (not later!) 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU Lesser General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public 16 * License along with this program; if not, see <http://www.gnu.org/licenses> 17 * 18 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 19 */ 20#ifndef _PARSE_EVENTS_H 21#define _PARSE_EVENTS_H 22 23#include <stdarg.h> 24#include <regex.h> 25 26#ifndef __maybe_unused 27#define __maybe_unused __attribute__((unused)) 28#endif 29 30/* ----------------------- trace_seq ----------------------- */ 31 32 33#ifndef TRACE_SEQ_BUF_SIZE 34#define TRACE_SEQ_BUF_SIZE 4096 35#endif 36 37#ifndef DEBUG_RECORD 38#define DEBUG_RECORD 0 39#endif 40 41struct pevent_record { 42 unsigned long long ts; 43 unsigned long long offset; 44 long long missed_events; /* buffer dropped events before */ 45 int record_size; /* size of binary record */ 46 int size; /* size of data */ 47 void *data; 48 int cpu; 49 int ref_count; 50 int locked; /* Do not free, even if ref_count is zero */ 51 void *priv; 52#if DEBUG_RECORD 53 struct pevent_record *prev; 54 struct pevent_record *next; 55 long alloc_addr; 56#endif 57}; 58 59/* 60 * Trace sequences are used to allow a function to call several other functions 61 * to create a string of data to use (up to a max of PAGE_SIZE). 62 */ 63 64struct trace_seq { 65 char *buffer; 66 unsigned int buffer_size; 67 unsigned int len; 68 unsigned int readpos; 69}; 70 71void trace_seq_init(struct trace_seq *s); 72void trace_seq_destroy(struct trace_seq *s); 73 74extern int trace_seq_printf(struct trace_seq *s, const char *fmt, ...) 75 __attribute__ ((format (printf, 2, 3))); 76extern int trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args) 77 __attribute__ ((format (printf, 2, 0))); 78 79extern int trace_seq_puts(struct trace_seq *s, const char *str); 80extern int trace_seq_putc(struct trace_seq *s, unsigned char c); 81 82extern void trace_seq_terminate(struct trace_seq *s); 83 84extern int trace_seq_do_printf(struct trace_seq *s); 85 86 87/* ----------------------- pevent ----------------------- */ 88 89struct pevent; 90struct event_format; 91 92typedef int (*pevent_event_handler_func)(struct trace_seq *s, 93 struct pevent_record *record, 94 struct event_format *event, 95 void *context); 96 97typedef int (*pevent_plugin_load_func)(struct pevent *pevent); 98typedef int (*pevent_plugin_unload_func)(void); 99 100struct plugin_option { 101 struct plugin_option *next; 102 void *handle; 103 char *file; 104 char *name; 105 char *plugin_alias; 106 char *description; 107 char *value; 108 void *priv; 109 int set; 110}; 111 112/* 113 * Plugin hooks that can be called: 114 * 115 * PEVENT_PLUGIN_LOADER: (required) 116 * The function name to initialized the plugin. 117 * 118 * int PEVENT_PLUGIN_LOADER(struct pevent *pevent) 119 * 120 * PEVENT_PLUGIN_UNLOADER: (optional) 121 * The function called just before unloading 122 * 123 * int PEVENT_PLUGIN_UNLOADER(void) 124 * 125 * PEVENT_PLUGIN_OPTIONS: (optional) 126 * Plugin options that can be set before loading 127 * 128 * struct plugin_option PEVENT_PLUGIN_OPTIONS[] = { 129 * { 130 * .name = "option-name", 131 * .plugin_alias = "overide-file-name", (optional) 132 * .description = "description of option to show users", 133 * }, 134 * { 135 * .name = NULL, 136 * }, 137 * }; 138 * 139 * Array must end with .name = NULL; 140 * 141 * 142 * .plugin_alias is used to give a shorter name to access 143 * the vairable. Useful if a plugin handles more than one event. 144 * 145 * PEVENT_PLUGIN_ALIAS: (optional) 146 * The name to use for finding options (uses filename if not defined) 147 */ 148#define PEVENT_PLUGIN_LOADER pevent_plugin_loader 149#define PEVENT_PLUGIN_UNLOADER pevent_plugin_unloader 150#define PEVENT_PLUGIN_OPTIONS pevent_plugin_options 151#define PEVENT_PLUGIN_ALIAS pevent_plugin_alias 152#define _MAKE_STR(x) #x 153#define MAKE_STR(x) _MAKE_STR(x) 154#define PEVENT_PLUGIN_LOADER_NAME MAKE_STR(PEVENT_PLUGIN_LOADER) 155#define PEVENT_PLUGIN_UNLOADER_NAME MAKE_STR(PEVENT_PLUGIN_UNLOADER) 156#define PEVENT_PLUGIN_OPTIONS_NAME MAKE_STR(PEVENT_PLUGIN_OPTIONS) 157#define PEVENT_PLUGIN_ALIAS_NAME MAKE_STR(PEVENT_PLUGIN_ALIAS) 158 159#define NSECS_PER_SEC 1000000000ULL 160#define NSECS_PER_USEC 1000ULL 161 162enum format_flags { 163 FIELD_IS_ARRAY = 1, 164 FIELD_IS_POINTER = 2, 165 FIELD_IS_SIGNED = 4, 166 FIELD_IS_STRING = 8, 167 FIELD_IS_DYNAMIC = 16, 168 FIELD_IS_LONG = 32, 169 FIELD_IS_FLAG = 64, 170 FIELD_IS_SYMBOLIC = 128, 171}; 172 173struct format_field { 174 struct format_field *next; 175 struct event_format *event; 176 char *type; 177 char *name; 178 int offset; 179 int size; 180 unsigned int arraylen; 181 unsigned int elementsize; 182 unsigned long flags; 183}; 184 185struct format { 186 int nr_common; 187 int nr_fields; 188 struct format_field *common_fields; 189 struct format_field *fields; 190}; 191 192struct print_arg_atom { 193 char *atom; 194}; 195 196struct print_arg_string { 197 char *string; 198 int offset; 199}; 200 201struct print_arg_field { 202 char *name; 203 struct format_field *field; 204}; 205 206struct print_flag_sym { 207 struct print_flag_sym *next; 208 char *value; 209 char *str; 210}; 211 212struct print_arg_typecast { 213 char *type; 214 struct print_arg *item; 215}; 216 217struct print_arg_flags { 218 struct print_arg *field; 219 char *delim; 220 struct print_flag_sym *flags; 221}; 222 223struct print_arg_symbol { 224 struct print_arg *field; 225 struct print_flag_sym *symbols; 226}; 227 228struct print_arg_hex { 229 struct print_arg *field; 230 struct print_arg *size; 231}; 232 233struct print_arg_dynarray { 234 struct format_field *field; 235 struct print_arg *index; 236}; 237 238struct print_arg; 239 240struct print_arg_op { 241 char *op; 242 int prio; 243 struct print_arg *left; 244 struct print_arg *right; 245}; 246 247struct pevent_function_handler; 248 249struct print_arg_func { 250 struct pevent_function_handler *func; 251 struct print_arg *args; 252}; 253 254enum print_arg_type { 255 PRINT_NULL, 256 PRINT_ATOM, 257 PRINT_FIELD, 258 PRINT_FLAGS, 259 PRINT_SYMBOL, 260 PRINT_HEX, 261 PRINT_TYPE, 262 PRINT_STRING, 263 PRINT_BSTRING, 264 PRINT_DYNAMIC_ARRAY, 265 PRINT_OP, 266 PRINT_FUNC, 267}; 268 269struct print_arg { 270 struct print_arg *next; 271 enum print_arg_type type; 272 union { 273 struct print_arg_atom atom; 274 struct print_arg_field field; 275 struct print_arg_typecast typecast; 276 struct print_arg_flags flags; 277 struct print_arg_symbol symbol; 278 struct print_arg_hex hex; 279 struct print_arg_func func; 280 struct print_arg_string string; 281 struct print_arg_op op; 282 struct print_arg_dynarray dynarray; 283 }; 284}; 285 286struct print_fmt { 287 char *format; 288 struct print_arg *args; 289}; 290 291struct event_format { 292 struct pevent *pevent; 293 char *name; 294 int id; 295 int flags; 296 struct format format; 297 struct print_fmt print_fmt; 298 char *system; 299 pevent_event_handler_func handler; 300 void *context; 301}; 302 303enum { 304 EVENT_FL_ISFTRACE = 0x01, 305 EVENT_FL_ISPRINT = 0x02, 306 EVENT_FL_ISBPRINT = 0x04, 307 EVENT_FL_ISFUNCENT = 0x10, 308 EVENT_FL_ISFUNCRET = 0x20, 309 310 EVENT_FL_FAILED = 0x80000000 311}; 312 313enum event_sort_type { 314 EVENT_SORT_ID, 315 EVENT_SORT_NAME, 316 EVENT_SORT_SYSTEM, 317}; 318 319enum event_type { 320 EVENT_ERROR, 321 EVENT_NONE, 322 EVENT_SPACE, 323 EVENT_NEWLINE, 324 EVENT_OP, 325 EVENT_DELIM, 326 EVENT_ITEM, 327 EVENT_DQUOTE, 328 EVENT_SQUOTE, 329}; 330 331typedef unsigned long long (*pevent_func_handler)(struct trace_seq *s, 332 unsigned long long *args); 333 334enum pevent_func_arg_type { 335 PEVENT_FUNC_ARG_VOID, 336 PEVENT_FUNC_ARG_INT, 337 PEVENT_FUNC_ARG_LONG, 338 PEVENT_FUNC_ARG_STRING, 339 PEVENT_FUNC_ARG_PTR, 340 PEVENT_FUNC_ARG_MAX_TYPES 341}; 342 343enum pevent_flag { 344 PEVENT_NSEC_OUTPUT = 1, /* output in NSECS */ 345}; 346 347#define PEVENT_ERRORS \ 348 _PE(MEM_ALLOC_FAILED, "failed to allocate memory"), \ 349 _PE(PARSE_EVENT_FAILED, "failed to parse event"), \ 350 _PE(READ_ID_FAILED, "failed to read event id"), \ 351 _PE(READ_FORMAT_FAILED, "failed to read event format"), \ 352 _PE(READ_PRINT_FAILED, "failed to read event print fmt"), \ 353 _PE(OLD_FTRACE_ARG_FAILED,"failed to allocate field name for ftrace"),\ 354 _PE(INVALID_ARG_TYPE, "invalid argument type") 355 356#undef _PE 357#define _PE(__code, __str) PEVENT_ERRNO__ ## __code 358enum pevent_errno { 359 PEVENT_ERRNO__SUCCESS = 0, 360 361 /* 362 * Choose an arbitrary negative big number not to clash with standard 363 * errno since SUS requires the errno has distinct positive values. 364 * See 'Issue 6' in the link below. 365 * 366 * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html 367 */ 368 __PEVENT_ERRNO__START = -100000, 369 370 PEVENT_ERRORS, 371 372 __PEVENT_ERRNO__END, 373}; 374#undef _PE 375 376struct cmdline; 377struct cmdline_list; 378struct func_map; 379struct func_list; 380struct event_handler; 381 382struct pevent { 383 int ref_count; 384 385 int header_page_ts_offset; 386 int header_page_ts_size; 387 int header_page_size_offset; 388 int header_page_size_size; 389 int header_page_data_offset; 390 int header_page_data_size; 391 int header_page_overwrite; 392 393 int file_bigendian; 394 int host_bigendian; 395 396 int latency_format; 397 398 int old_format; 399 400 int cpus; 401 int long_size; 402 403 struct cmdline *cmdlines; 404 struct cmdline_list *cmdlist; 405 int cmdline_count; 406 407 struct func_map *func_map; 408 struct func_list *funclist; 409 unsigned int func_count; 410 411 struct printk_map *printk_map; 412 struct printk_list *printklist; 413 unsigned int printk_count; 414 415 416 struct event_format **events; 417 int nr_events; 418 struct event_format **sort_events; 419 enum event_sort_type last_type; 420 421 int type_offset; 422 int type_size; 423 424 int pid_offset; 425 int pid_size; 426 427 int pc_offset; 428 int pc_size; 429 430 int flags_offset; 431 int flags_size; 432 433 int ld_offset; 434 int ld_size; 435 436 int print_raw; 437 438 int test_filters; 439 440 int flags; 441 442 struct format_field *bprint_ip_field; 443 struct format_field *bprint_fmt_field; 444 struct format_field *bprint_buf_field; 445 446 struct event_handler *handlers; 447 struct pevent_function_handler *func_handlers; 448 449 /* cache */ 450 struct event_format *last_event; 451}; 452 453static inline void pevent_set_flag(struct pevent *pevent, int flag) 454{ 455 pevent->flags |= flag; 456} 457 458static inline unsigned short 459__data2host2(struct pevent *pevent, unsigned short data) 460{ 461 unsigned short swap; 462 463 if (pevent->host_bigendian == pevent->file_bigendian) 464 return data; 465 466 swap = ((data & 0xffULL) << 8) | 467 ((data & (0xffULL << 8)) >> 8); 468 469 return swap; 470} 471 472static inline unsigned int 473__data2host4(struct pevent *pevent, unsigned int data) 474{ 475 unsigned int swap; 476 477 if (pevent->host_bigendian == pevent->file_bigendian) 478 return data; 479 480 swap = ((data & 0xffULL) << 24) | 481 ((data & (0xffULL << 8)) << 8) | 482 ((data & (0xffULL << 16)) >> 8) | 483 ((data & (0xffULL << 24)) >> 24); 484 485 return swap; 486} 487 488static inline unsigned long long 489__data2host8(struct pevent *pevent, unsigned long long data) 490{ 491 unsigned long long swap; 492 493 if (pevent->host_bigendian == pevent->file_bigendian) 494 return data; 495 496 swap = ((data & 0xffULL) << 56) | 497 ((data & (0xffULL << 8)) << 40) | 498 ((data & (0xffULL << 16)) << 24) | 499 ((data & (0xffULL << 24)) << 8) | 500 ((data & (0xffULL << 32)) >> 8) | 501 ((data & (0xffULL << 40)) >> 24) | 502 ((data & (0xffULL << 48)) >> 40) | 503 ((data & (0xffULL << 56)) >> 56); 504 505 return swap; 506} 507 508#define data2host2(pevent, ptr) __data2host2(pevent, *(unsigned short *)(ptr)) 509#define data2host4(pevent, ptr) __data2host4(pevent, *(unsigned int *)(ptr)) 510#define data2host8(pevent, ptr) \ 511({ \ 512 unsigned long long __val; \ 513 \ 514 memcpy(&__val, (ptr), sizeof(unsigned long long)); \ 515 __data2host8(pevent, __val); \ 516}) 517 518/* taken from kernel/trace/trace.h */ 519enum trace_flag_type { 520 TRACE_FLAG_IRQS_OFF = 0x01, 521 TRACE_FLAG_IRQS_NOSUPPORT = 0x02, 522 TRACE_FLAG_NEED_RESCHED = 0x04, 523 TRACE_FLAG_HARDIRQ = 0x08, 524 TRACE_FLAG_SOFTIRQ = 0x10, 525}; 526 527int pevent_register_comm(struct pevent *pevent, const char *comm, int pid); 528int pevent_register_function(struct pevent *pevent, char *name, 529 unsigned long long addr, char *mod); 530int pevent_register_print_string(struct pevent *pevent, char *fmt, 531 unsigned long long addr); 532int pevent_pid_is_registered(struct pevent *pevent, int pid); 533 534void pevent_print_event(struct pevent *pevent, struct trace_seq *s, 535 struct pevent_record *record); 536 537int pevent_parse_header_page(struct pevent *pevent, char *buf, unsigned long size, 538 int long_size); 539 540enum pevent_errno pevent_parse_event(struct pevent *pevent, const char *buf, 541 unsigned long size, const char *sys); 542enum pevent_errno pevent_parse_format(struct event_format **eventp, const char *buf, 543 unsigned long size, const char *sys); 544void pevent_free_format(struct event_format *event); 545 546void *pevent_get_field_raw(struct trace_seq *s, struct event_format *event, 547 const char *name, struct pevent_record *record, 548 int *len, int err); 549 550int pevent_get_field_val(struct trace_seq *s, struct event_format *event, 551 const char *name, struct pevent_record *record, 552 unsigned long long *val, int err); 553int pevent_get_common_field_val(struct trace_seq *s, struct event_format *event, 554 const char *name, struct pevent_record *record, 555 unsigned long long *val, int err); 556int pevent_get_any_field_val(struct trace_seq *s, struct event_format *event, 557 const char *name, struct pevent_record *record, 558 unsigned long long *val, int err); 559 560int pevent_print_num_field(struct trace_seq *s, const char *fmt, 561 struct event_format *event, const char *name, 562 struct pevent_record *record, int err); 563 564int pevent_register_event_handler(struct pevent *pevent, int id, char *sys_name, char *event_name, 565 pevent_event_handler_func func, void *context); 566int pevent_register_print_function(struct pevent *pevent, 567 pevent_func_handler func, 568 enum pevent_func_arg_type ret_type, 569 char *name, ...); 570 571struct format_field *pevent_find_common_field(struct event_format *event, const char *name); 572struct format_field *pevent_find_field(struct event_format *event, const char *name); 573struct format_field *pevent_find_any_field(struct event_format *event, const char *name); 574 575const char *pevent_find_function(struct pevent *pevent, unsigned long long addr); 576unsigned long long 577pevent_find_function_address(struct pevent *pevent, unsigned long long addr); 578unsigned long long pevent_read_number(struct pevent *pevent, const void *ptr, int size); 579int pevent_read_number_field(struct format_field *field, const void *data, 580 unsigned long long *value); 581 582struct event_format *pevent_find_event(struct pevent *pevent, int id); 583 584struct event_format * 585pevent_find_event_by_name(struct pevent *pevent, const char *sys, const char *name); 586 587void pevent_data_lat_fmt(struct pevent *pevent, 588 struct trace_seq *s, struct pevent_record *record); 589int pevent_data_type(struct pevent *pevent, struct pevent_record *rec); 590struct event_format *pevent_data_event_from_type(struct pevent *pevent, int type); 591int pevent_data_pid(struct pevent *pevent, struct pevent_record *rec); 592const char *pevent_data_comm_from_pid(struct pevent *pevent, int pid); 593void pevent_event_info(struct trace_seq *s, struct event_format *event, 594 struct pevent_record *record); 595int pevent_strerror(struct pevent *pevent, enum pevent_errno errnum, 596 char *buf, size_t buflen); 597 598struct event_format **pevent_list_events(struct pevent *pevent, enum event_sort_type); 599struct format_field **pevent_event_common_fields(struct event_format *event); 600struct format_field **pevent_event_fields(struct event_format *event); 601 602static inline int pevent_get_cpus(struct pevent *pevent) 603{ 604 return pevent->cpus; 605} 606 607static inline void pevent_set_cpus(struct pevent *pevent, int cpus) 608{ 609 pevent->cpus = cpus; 610} 611 612static inline int pevent_get_long_size(struct pevent *pevent) 613{ 614 return pevent->long_size; 615} 616 617static inline void pevent_set_long_size(struct pevent *pevent, int long_size) 618{ 619 pevent->long_size = long_size; 620} 621 622static inline int pevent_is_file_bigendian(struct pevent *pevent) 623{ 624 return pevent->file_bigendian; 625} 626 627static inline void pevent_set_file_bigendian(struct pevent *pevent, int endian) 628{ 629 pevent->file_bigendian = endian; 630} 631 632static inline int pevent_is_host_bigendian(struct pevent *pevent) 633{ 634 return pevent->host_bigendian; 635} 636 637static inline void pevent_set_host_bigendian(struct pevent *pevent, int endian) 638{ 639 pevent->host_bigendian = endian; 640} 641 642static inline int pevent_is_latency_format(struct pevent *pevent) 643{ 644 return pevent->latency_format; 645} 646 647static inline void pevent_set_latency_format(struct pevent *pevent, int lat) 648{ 649 pevent->latency_format = lat; 650} 651 652struct pevent *pevent_alloc(void); 653void pevent_free(struct pevent *pevent); 654void pevent_ref(struct pevent *pevent); 655void pevent_unref(struct pevent *pevent); 656 657/* access to the internal parser */ 658void pevent_buffer_init(const char *buf, unsigned long long size); 659enum event_type pevent_read_token(char **tok); 660void pevent_free_token(char *token); 661int pevent_peek_char(void); 662const char *pevent_get_input_buf(void); 663unsigned long long pevent_get_input_buf_ptr(void); 664 665/* for debugging */ 666void pevent_print_funcs(struct pevent *pevent); 667void pevent_print_printk(struct pevent *pevent); 668 669/* ----------------------- filtering ----------------------- */ 670 671enum filter_boolean_type { 672 FILTER_FALSE, 673 FILTER_TRUE, 674}; 675 676enum filter_op_type { 677 FILTER_OP_AND = 1, 678 FILTER_OP_OR, 679 FILTER_OP_NOT, 680}; 681 682enum filter_cmp_type { 683 FILTER_CMP_NONE, 684 FILTER_CMP_EQ, 685 FILTER_CMP_NE, 686 FILTER_CMP_GT, 687 FILTER_CMP_LT, 688 FILTER_CMP_GE, 689 FILTER_CMP_LE, 690 FILTER_CMP_MATCH, 691 FILTER_CMP_NOT_MATCH, 692 FILTER_CMP_REGEX, 693 FILTER_CMP_NOT_REGEX, 694}; 695 696enum filter_exp_type { 697 FILTER_EXP_NONE, 698 FILTER_EXP_ADD, 699 FILTER_EXP_SUB, 700 FILTER_EXP_MUL, 701 FILTER_EXP_DIV, 702 FILTER_EXP_MOD, 703 FILTER_EXP_RSHIFT, 704 FILTER_EXP_LSHIFT, 705 FILTER_EXP_AND, 706 FILTER_EXP_OR, 707 FILTER_EXP_XOR, 708 FILTER_EXP_NOT, 709}; 710 711enum filter_arg_type { 712 FILTER_ARG_NONE, 713 FILTER_ARG_BOOLEAN, 714 FILTER_ARG_VALUE, 715 FILTER_ARG_FIELD, 716 FILTER_ARG_EXP, 717 FILTER_ARG_OP, 718 FILTER_ARG_NUM, 719 FILTER_ARG_STR, 720}; 721 722enum filter_value_type { 723 FILTER_NUMBER, 724 FILTER_STRING, 725 FILTER_CHAR 726}; 727 728struct fliter_arg; 729 730struct filter_arg_boolean { 731 enum filter_boolean_type value; 732}; 733 734struct filter_arg_field { 735 struct format_field *field; 736}; 737 738struct filter_arg_value { 739 enum filter_value_type type; 740 union { 741 char *str; 742 unsigned long long val; 743 }; 744}; 745 746struct filter_arg_op { 747 enum filter_op_type type; 748 struct filter_arg *left; 749 struct filter_arg *right; 750}; 751 752struct filter_arg_exp { 753 enum filter_exp_type type; 754 struct filter_arg *left; 755 struct filter_arg *right; 756}; 757 758struct filter_arg_num { 759 enum filter_cmp_type type; 760 struct filter_arg *left; 761 struct filter_arg *right; 762}; 763 764struct filter_arg_str { 765 enum filter_cmp_type type; 766 struct format_field *field; 767 char *val; 768 char *buffer; 769 regex_t reg; 770}; 771 772struct filter_arg { 773 enum filter_arg_type type; 774 union { 775 struct filter_arg_boolean boolean; 776 struct filter_arg_field field; 777 struct filter_arg_value value; 778 struct filter_arg_op op; 779 struct filter_arg_exp exp; 780 struct filter_arg_num num; 781 struct filter_arg_str str; 782 }; 783}; 784 785struct filter_type { 786 int event_id; 787 struct event_format *event; 788 struct filter_arg *filter; 789}; 790 791struct event_filter { 792 struct pevent *pevent; 793 int filters; 794 struct filter_type *event_filters; 795}; 796 797struct event_filter *pevent_filter_alloc(struct pevent *pevent); 798 799#define FILTER_NONE -2 800#define FILTER_NOEXIST -1 801#define FILTER_MISS 0 802#define FILTER_MATCH 1 803 804enum filter_trivial_type { 805 FILTER_TRIVIAL_FALSE, 806 FILTER_TRIVIAL_TRUE, 807 FILTER_TRIVIAL_BOTH, 808}; 809 810int pevent_filter_add_filter_str(struct event_filter *filter, 811 const char *filter_str, 812 char **error_str); 813 814 815int pevent_filter_match(struct event_filter *filter, 816 struct pevent_record *record); 817 818int pevent_event_filtered(struct event_filter *filter, 819 int event_id); 820 821void pevent_filter_reset(struct event_filter *filter); 822 823void pevent_filter_clear_trivial(struct event_filter *filter, 824 enum filter_trivial_type type); 825 826void pevent_filter_free(struct event_filter *filter); 827 828char *pevent_filter_make_string(struct event_filter *filter, int event_id); 829 830int pevent_filter_remove_event(struct event_filter *filter, 831 int event_id); 832 833int pevent_filter_event_has_trivial(struct event_filter *filter, 834 int event_id, 835 enum filter_trivial_type type); 836 837int pevent_filter_copy(struct event_filter *dest, struct event_filter *source); 838 839int pevent_update_trivial(struct event_filter *dest, struct event_filter *source, 840 enum filter_trivial_type type); 841 842int pevent_filter_compare(struct event_filter *filter1, struct event_filter *filter2); 843 844#endif /* _PARSE_EVENTS_H */