at v5.2 759 lines 22 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 <stdbool.h> 24#include <stdarg.h> 25#include <stdio.h> 26#include <regex.h> 27#include <string.h> 28 29#include "trace-seq.h" 30 31#ifndef __maybe_unused 32#define __maybe_unused __attribute__((unused)) 33#endif 34 35#ifndef DEBUG_RECORD 36#define DEBUG_RECORD 0 37#endif 38 39struct tep_record { 40 unsigned long long ts; 41 unsigned long long offset; 42 long long missed_events; /* buffer dropped events before */ 43 int record_size; /* size of binary record */ 44 int size; /* size of data */ 45 void *data; 46 int cpu; 47 int ref_count; 48 int locked; /* Do not free, even if ref_count is zero */ 49 void *priv; 50#if DEBUG_RECORD 51 struct tep_record *prev; 52 struct tep_record *next; 53 long alloc_addr; 54#endif 55}; 56 57/* ----------------------- tep ----------------------- */ 58 59struct tep_handle; 60struct tep_event; 61 62typedef int (*tep_event_handler_func)(struct trace_seq *s, 63 struct tep_record *record, 64 struct tep_event *event, 65 void *context); 66 67typedef int (*tep_plugin_load_func)(struct tep_handle *tep); 68typedef int (*tep_plugin_unload_func)(struct tep_handle *tep); 69 70struct tep_plugin_option { 71 struct tep_plugin_option *next; 72 void *handle; 73 char *file; 74 char *name; 75 char *plugin_alias; 76 char *description; 77 const char *value; 78 void *priv; 79 int set; 80}; 81 82/* 83 * Plugin hooks that can be called: 84 * 85 * TEP_PLUGIN_LOADER: (required) 86 * The function name to initialized the plugin. 87 * 88 * int TEP_PLUGIN_LOADER(struct tep_handle *tep) 89 * 90 * TEP_PLUGIN_UNLOADER: (optional) 91 * The function called just before unloading 92 * 93 * int TEP_PLUGIN_UNLOADER(struct tep_handle *tep) 94 * 95 * TEP_PLUGIN_OPTIONS: (optional) 96 * Plugin options that can be set before loading 97 * 98 * struct tep_plugin_option TEP_PLUGIN_OPTIONS[] = { 99 * { 100 * .name = "option-name", 101 * .plugin_alias = "override-file-name", (optional) 102 * .description = "description of option to show users", 103 * }, 104 * { 105 * .name = NULL, 106 * }, 107 * }; 108 * 109 * Array must end with .name = NULL; 110 * 111 * 112 * .plugin_alias is used to give a shorter name to access 113 * the vairable. Useful if a plugin handles more than one event. 114 * 115 * If .value is not set, then it is considered a boolean and only 116 * .set will be processed. If .value is defined, then it is considered 117 * a string option and .set will be ignored. 118 * 119 * TEP_PLUGIN_ALIAS: (optional) 120 * The name to use for finding options (uses filename if not defined) 121 */ 122#define TEP_PLUGIN_LOADER tep_plugin_loader 123#define TEP_PLUGIN_UNLOADER tep_plugin_unloader 124#define TEP_PLUGIN_OPTIONS tep_plugin_options 125#define TEP_PLUGIN_ALIAS tep_plugin_alias 126#define _MAKE_STR(x) #x 127#define MAKE_STR(x) _MAKE_STR(x) 128#define TEP_PLUGIN_LOADER_NAME MAKE_STR(TEP_PLUGIN_LOADER) 129#define TEP_PLUGIN_UNLOADER_NAME MAKE_STR(TEP_PLUGIN_UNLOADER) 130#define TEP_PLUGIN_OPTIONS_NAME MAKE_STR(TEP_PLUGIN_OPTIONS) 131#define TEP_PLUGIN_ALIAS_NAME MAKE_STR(TEP_PLUGIN_ALIAS) 132 133enum tep_format_flags { 134 TEP_FIELD_IS_ARRAY = 1, 135 TEP_FIELD_IS_POINTER = 2, 136 TEP_FIELD_IS_SIGNED = 4, 137 TEP_FIELD_IS_STRING = 8, 138 TEP_FIELD_IS_DYNAMIC = 16, 139 TEP_FIELD_IS_LONG = 32, 140 TEP_FIELD_IS_FLAG = 64, 141 TEP_FIELD_IS_SYMBOLIC = 128, 142}; 143 144struct tep_format_field { 145 struct tep_format_field *next; 146 struct tep_event *event; 147 char *type; 148 char *name; 149 char *alias; 150 int offset; 151 int size; 152 unsigned int arraylen; 153 unsigned int elementsize; 154 unsigned long flags; 155}; 156 157struct tep_format { 158 int nr_common; 159 int nr_fields; 160 struct tep_format_field *common_fields; 161 struct tep_format_field *fields; 162}; 163 164struct tep_print_arg_atom { 165 char *atom; 166}; 167 168struct tep_print_arg_string { 169 char *string; 170 int offset; 171}; 172 173struct tep_print_arg_bitmask { 174 char *bitmask; 175 int offset; 176}; 177 178struct tep_print_arg_field { 179 char *name; 180 struct tep_format_field *field; 181}; 182 183struct tep_print_flag_sym { 184 struct tep_print_flag_sym *next; 185 char *value; 186 char *str; 187}; 188 189struct tep_print_arg_typecast { 190 char *type; 191 struct tep_print_arg *item; 192}; 193 194struct tep_print_arg_flags { 195 struct tep_print_arg *field; 196 char *delim; 197 struct tep_print_flag_sym *flags; 198}; 199 200struct tep_print_arg_symbol { 201 struct tep_print_arg *field; 202 struct tep_print_flag_sym *symbols; 203}; 204 205struct tep_print_arg_hex { 206 struct tep_print_arg *field; 207 struct tep_print_arg *size; 208}; 209 210struct tep_print_arg_int_array { 211 struct tep_print_arg *field; 212 struct tep_print_arg *count; 213 struct tep_print_arg *el_size; 214}; 215 216struct tep_print_arg_dynarray { 217 struct tep_format_field *field; 218 struct tep_print_arg *index; 219}; 220 221struct tep_print_arg; 222 223struct tep_print_arg_op { 224 char *op; 225 int prio; 226 struct tep_print_arg *left; 227 struct tep_print_arg *right; 228}; 229 230struct tep_function_handler; 231 232struct tep_print_arg_func { 233 struct tep_function_handler *func; 234 struct tep_print_arg *args; 235}; 236 237enum tep_print_arg_type { 238 TEP_PRINT_NULL, 239 TEP_PRINT_ATOM, 240 TEP_PRINT_FIELD, 241 TEP_PRINT_FLAGS, 242 TEP_PRINT_SYMBOL, 243 TEP_PRINT_HEX, 244 TEP_PRINT_INT_ARRAY, 245 TEP_PRINT_TYPE, 246 TEP_PRINT_STRING, 247 TEP_PRINT_BSTRING, 248 TEP_PRINT_DYNAMIC_ARRAY, 249 TEP_PRINT_OP, 250 TEP_PRINT_FUNC, 251 TEP_PRINT_BITMASK, 252 TEP_PRINT_DYNAMIC_ARRAY_LEN, 253 TEP_PRINT_HEX_STR, 254}; 255 256struct tep_print_arg { 257 struct tep_print_arg *next; 258 enum tep_print_arg_type type; 259 union { 260 struct tep_print_arg_atom atom; 261 struct tep_print_arg_field field; 262 struct tep_print_arg_typecast typecast; 263 struct tep_print_arg_flags flags; 264 struct tep_print_arg_symbol symbol; 265 struct tep_print_arg_hex hex; 266 struct tep_print_arg_int_array int_array; 267 struct tep_print_arg_func func; 268 struct tep_print_arg_string string; 269 struct tep_print_arg_bitmask bitmask; 270 struct tep_print_arg_op op; 271 struct tep_print_arg_dynarray dynarray; 272 }; 273}; 274 275struct tep_print_fmt { 276 char *format; 277 struct tep_print_arg *args; 278}; 279 280struct tep_event { 281 struct tep_handle *tep; 282 char *name; 283 int id; 284 int flags; 285 struct tep_format format; 286 struct tep_print_fmt print_fmt; 287 char *system; 288 tep_event_handler_func handler; 289 void *context; 290}; 291 292enum { 293 TEP_EVENT_FL_ISFTRACE = 0x01, 294 TEP_EVENT_FL_ISPRINT = 0x02, 295 TEP_EVENT_FL_ISBPRINT = 0x04, 296 TEP_EVENT_FL_ISFUNCENT = 0x10, 297 TEP_EVENT_FL_ISFUNCRET = 0x20, 298 TEP_EVENT_FL_NOHANDLE = 0x40, 299 TEP_EVENT_FL_PRINTRAW = 0x80, 300 301 TEP_EVENT_FL_FAILED = 0x80000000 302}; 303 304enum tep_event_sort_type { 305 TEP_EVENT_SORT_ID, 306 TEP_EVENT_SORT_NAME, 307 TEP_EVENT_SORT_SYSTEM, 308}; 309 310enum tep_event_type { 311 TEP_EVENT_ERROR, 312 TEP_EVENT_NONE, 313 TEP_EVENT_SPACE, 314 TEP_EVENT_NEWLINE, 315 TEP_EVENT_OP, 316 TEP_EVENT_DELIM, 317 TEP_EVENT_ITEM, 318 TEP_EVENT_DQUOTE, 319 TEP_EVENT_SQUOTE, 320}; 321 322typedef unsigned long long (*tep_func_handler)(struct trace_seq *s, 323 unsigned long long *args); 324 325enum tep_func_arg_type { 326 TEP_FUNC_ARG_VOID, 327 TEP_FUNC_ARG_INT, 328 TEP_FUNC_ARG_LONG, 329 TEP_FUNC_ARG_STRING, 330 TEP_FUNC_ARG_PTR, 331 TEP_FUNC_ARG_MAX_TYPES 332}; 333 334enum tep_flag { 335 TEP_NSEC_OUTPUT = 1, /* output in NSECS */ 336 TEP_DISABLE_SYS_PLUGINS = 1 << 1, 337 TEP_DISABLE_PLUGINS = 1 << 2, 338}; 339 340#define TEP_ERRORS \ 341 _PE(MEM_ALLOC_FAILED, "failed to allocate memory"), \ 342 _PE(PARSE_EVENT_FAILED, "failed to parse event"), \ 343 _PE(READ_ID_FAILED, "failed to read event id"), \ 344 _PE(READ_FORMAT_FAILED, "failed to read event format"), \ 345 _PE(READ_PRINT_FAILED, "failed to read event print fmt"), \ 346 _PE(OLD_FTRACE_ARG_FAILED,"failed to allocate field name for ftrace"),\ 347 _PE(INVALID_ARG_TYPE, "invalid argument type"), \ 348 _PE(INVALID_EXP_TYPE, "invalid expression type"), \ 349 _PE(INVALID_OP_TYPE, "invalid operator type"), \ 350 _PE(INVALID_EVENT_NAME, "invalid event name"), \ 351 _PE(EVENT_NOT_FOUND, "no event found"), \ 352 _PE(SYNTAX_ERROR, "syntax error"), \ 353 _PE(ILLEGAL_RVALUE, "illegal rvalue"), \ 354 _PE(ILLEGAL_LVALUE, "illegal lvalue for string comparison"), \ 355 _PE(INVALID_REGEX, "regex did not compute"), \ 356 _PE(ILLEGAL_STRING_CMP, "illegal comparison for string"), \ 357 _PE(ILLEGAL_INTEGER_CMP,"illegal comparison for integer"), \ 358 _PE(REPARENT_NOT_OP, "cannot reparent other than OP"), \ 359 _PE(REPARENT_FAILED, "failed to reparent filter OP"), \ 360 _PE(BAD_FILTER_ARG, "bad arg in filter tree"), \ 361 _PE(UNEXPECTED_TYPE, "unexpected type (not a value)"), \ 362 _PE(ILLEGAL_TOKEN, "illegal token"), \ 363 _PE(INVALID_PAREN, "open parenthesis cannot come here"), \ 364 _PE(UNBALANCED_PAREN, "unbalanced number of parenthesis"), \ 365 _PE(UNKNOWN_TOKEN, "unknown token"), \ 366 _PE(FILTER_NOT_FOUND, "no filter found"), \ 367 _PE(NOT_A_NUMBER, "must have number field"), \ 368 _PE(NO_FILTER, "no filters exists"), \ 369 _PE(FILTER_MISS, "record does not match to filter") 370 371#undef _PE 372#define _PE(__code, __str) TEP_ERRNO__ ## __code 373enum tep_errno { 374 TEP_ERRNO__SUCCESS = 0, 375 TEP_ERRNO__FILTER_MATCH = TEP_ERRNO__SUCCESS, 376 377 /* 378 * Choose an arbitrary negative big number not to clash with standard 379 * errno since SUS requires the errno has distinct positive values. 380 * See 'Issue 6' in the link below. 381 * 382 * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html 383 */ 384 __TEP_ERRNO__START = -100000, 385 386 TEP_ERRORS, 387 388 __TEP_ERRNO__END, 389}; 390#undef _PE 391 392struct tep_plugin_list; 393 394#define INVALID_PLUGIN_LIST_OPTION ((char **)((unsigned long)-1)) 395 396struct tep_plugin_list *tep_load_plugins(struct tep_handle *tep); 397void tep_unload_plugins(struct tep_plugin_list *plugin_list, 398 struct tep_handle *tep); 399char **tep_plugin_list_options(void); 400void tep_plugin_free_options_list(char **list); 401int tep_plugin_add_options(const char *name, 402 struct tep_plugin_option *options); 403void tep_plugin_remove_options(struct tep_plugin_option *options); 404void tep_print_plugins(struct trace_seq *s, 405 const char *prefix, const char *suffix, 406 const struct tep_plugin_list *list); 407 408/* tep_handle */ 409typedef char *(tep_func_resolver_t)(void *priv, 410 unsigned long long *addrp, char **modp); 411void tep_set_flag(struct tep_handle *tep, int flag); 412void tep_clear_flag(struct tep_handle *tep, enum tep_flag flag); 413bool tep_test_flag(struct tep_handle *tep, enum tep_flag flags); 414 415static inline int tep_is_bigendian(void) 416{ 417 unsigned char str[] = { 0x1, 0x2, 0x3, 0x4 }; 418 unsigned int val; 419 420 memcpy(&val, str, 4); 421 return val == 0x01020304; 422} 423 424/* taken from kernel/trace/trace.h */ 425enum trace_flag_type { 426 TRACE_FLAG_IRQS_OFF = 0x01, 427 TRACE_FLAG_IRQS_NOSUPPORT = 0x02, 428 TRACE_FLAG_NEED_RESCHED = 0x04, 429 TRACE_FLAG_HARDIRQ = 0x08, 430 TRACE_FLAG_SOFTIRQ = 0x10, 431}; 432 433int tep_set_function_resolver(struct tep_handle *tep, 434 tep_func_resolver_t *func, void *priv); 435void tep_reset_function_resolver(struct tep_handle *tep); 436int tep_register_comm(struct tep_handle *tep, const char *comm, int pid); 437int tep_override_comm(struct tep_handle *tep, const char *comm, int pid); 438int tep_register_trace_clock(struct tep_handle *tep, const char *trace_clock); 439int tep_register_function(struct tep_handle *tep, char *name, 440 unsigned long long addr, char *mod); 441int tep_register_print_string(struct tep_handle *tep, const char *fmt, 442 unsigned long long addr); 443bool tep_is_pid_registered(struct tep_handle *tep, int pid); 444 445void tep_print_event_task(struct tep_handle *tep, struct trace_seq *s, 446 struct tep_event *event, 447 struct tep_record *record); 448void tep_print_event_time(struct tep_handle *tep, struct trace_seq *s, 449 struct tep_event *event, 450 struct tep_record *record, 451 bool use_trace_clock); 452void tep_print_event_data(struct tep_handle *tep, struct trace_seq *s, 453 struct tep_event *event, 454 struct tep_record *record); 455void tep_print_event(struct tep_handle *tep, struct trace_seq *s, 456 struct tep_record *record, bool use_trace_clock); 457 458int tep_parse_header_page(struct tep_handle *tep, char *buf, unsigned long size, 459 int long_size); 460 461enum tep_errno tep_parse_event(struct tep_handle *tep, const char *buf, 462 unsigned long size, const char *sys); 463enum tep_errno tep_parse_format(struct tep_handle *tep, 464 struct tep_event **eventp, 465 const char *buf, 466 unsigned long size, const char *sys); 467 468void *tep_get_field_raw(struct trace_seq *s, struct tep_event *event, 469 const char *name, struct tep_record *record, 470 int *len, int err); 471 472int tep_get_field_val(struct trace_seq *s, struct tep_event *event, 473 const char *name, struct tep_record *record, 474 unsigned long long *val, int err); 475int tep_get_common_field_val(struct trace_seq *s, struct tep_event *event, 476 const char *name, struct tep_record *record, 477 unsigned long long *val, int err); 478int tep_get_any_field_val(struct trace_seq *s, struct tep_event *event, 479 const char *name, struct tep_record *record, 480 unsigned long long *val, int err); 481 482int tep_print_num_field(struct trace_seq *s, const char *fmt, 483 struct tep_event *event, const char *name, 484 struct tep_record *record, int err); 485 486int tep_print_func_field(struct trace_seq *s, const char *fmt, 487 struct tep_event *event, const char *name, 488 struct tep_record *record, int err); 489 490enum tep_reg_handler { 491 TEP_REGISTER_SUCCESS = 0, 492 TEP_REGISTER_SUCCESS_OVERWRITE, 493}; 494 495int tep_register_event_handler(struct tep_handle *tep, int id, 496 const char *sys_name, const char *event_name, 497 tep_event_handler_func func, void *context); 498int tep_unregister_event_handler(struct tep_handle *tep, int id, 499 const char *sys_name, const char *event_name, 500 tep_event_handler_func func, void *context); 501int tep_register_print_function(struct tep_handle *tep, 502 tep_func_handler func, 503 enum tep_func_arg_type ret_type, 504 char *name, ...); 505int tep_unregister_print_function(struct tep_handle *tep, 506 tep_func_handler func, char *name); 507 508struct tep_format_field *tep_find_common_field(struct tep_event *event, const char *name); 509struct tep_format_field *tep_find_field(struct tep_event *event, const char *name); 510struct tep_format_field *tep_find_any_field(struct tep_event *event, const char *name); 511 512const char *tep_find_function(struct tep_handle *tep, unsigned long long addr); 513unsigned long long 514tep_find_function_address(struct tep_handle *tep, unsigned long long addr); 515unsigned long long tep_read_number(struct tep_handle *tep, const void *ptr, int size); 516int tep_read_number_field(struct tep_format_field *field, const void *data, 517 unsigned long long *value); 518 519struct tep_event *tep_get_first_event(struct tep_handle *tep); 520int tep_get_events_count(struct tep_handle *tep); 521struct tep_event *tep_find_event(struct tep_handle *tep, int id); 522 523struct tep_event * 524tep_find_event_by_name(struct tep_handle *tep, const char *sys, const char *name); 525struct tep_event * 526tep_find_event_by_record(struct tep_handle *tep, struct tep_record *record); 527 528void tep_data_latency_format(struct tep_handle *tep, 529 struct trace_seq *s, struct tep_record *record); 530int tep_data_type(struct tep_handle *tep, struct tep_record *rec); 531int tep_data_pid(struct tep_handle *tep, struct tep_record *rec); 532int tep_data_preempt_count(struct tep_handle *tep, struct tep_record *rec); 533int tep_data_flags(struct tep_handle *tep, struct tep_record *rec); 534const char *tep_data_comm_from_pid(struct tep_handle *tep, int pid); 535struct tep_cmdline; 536struct tep_cmdline *tep_data_pid_from_comm(struct tep_handle *tep, const char *comm, 537 struct tep_cmdline *next); 538int tep_cmdline_pid(struct tep_handle *tep, struct tep_cmdline *cmdline); 539 540void tep_print_field(struct trace_seq *s, void *data, 541 struct tep_format_field *field); 542void tep_print_fields(struct trace_seq *s, void *data, 543 int size __maybe_unused, struct tep_event *event); 544void tep_event_info(struct trace_seq *s, struct tep_event *event, 545 struct tep_record *record); 546int tep_strerror(struct tep_handle *tep, enum tep_errno errnum, 547 char *buf, size_t buflen); 548 549struct tep_event **tep_list_events(struct tep_handle *tep, enum tep_event_sort_type); 550struct tep_event **tep_list_events_copy(struct tep_handle *tep, 551 enum tep_event_sort_type); 552struct tep_format_field **tep_event_common_fields(struct tep_event *event); 553struct tep_format_field **tep_event_fields(struct tep_event *event); 554 555enum tep_endian { 556 TEP_LITTLE_ENDIAN = 0, 557 TEP_BIG_ENDIAN 558}; 559int tep_get_cpus(struct tep_handle *tep); 560void tep_set_cpus(struct tep_handle *tep, int cpus); 561int tep_get_long_size(struct tep_handle *tep); 562void tep_set_long_size(struct tep_handle *tep, int long_size); 563int tep_get_page_size(struct tep_handle *tep); 564void tep_set_page_size(struct tep_handle *tep, int _page_size); 565bool tep_is_file_bigendian(struct tep_handle *tep); 566void tep_set_file_bigendian(struct tep_handle *tep, enum tep_endian endian); 567bool tep_is_local_bigendian(struct tep_handle *tep); 568void tep_set_local_bigendian(struct tep_handle *tep, enum tep_endian endian); 569bool tep_is_latency_format(struct tep_handle *tep); 570void tep_set_latency_format(struct tep_handle *tep, int lat); 571int tep_get_header_page_size(struct tep_handle *tep); 572int tep_get_header_timestamp_size(struct tep_handle *tep); 573bool tep_is_old_format(struct tep_handle *tep); 574void tep_set_print_raw(struct tep_handle *tep, int print_raw); 575void tep_set_test_filters(struct tep_handle *tep, int test_filters); 576 577struct tep_handle *tep_alloc(void); 578void tep_free(struct tep_handle *tep); 579void tep_ref(struct tep_handle *tep); 580void tep_unref(struct tep_handle *tep); 581int tep_get_ref(struct tep_handle *tep); 582 583/* access to the internal parser */ 584void tep_buffer_init(const char *buf, unsigned long long size); 585enum tep_event_type tep_read_token(char **tok); 586void tep_free_token(char *token); 587int tep_peek_char(void); 588const char *tep_get_input_buf(void); 589unsigned long long tep_get_input_buf_ptr(void); 590 591/* for debugging */ 592void tep_print_funcs(struct tep_handle *tep); 593void tep_print_printk(struct tep_handle *tep); 594 595/* ----------------------- filtering ----------------------- */ 596 597enum tep_filter_boolean_type { 598 TEP_FILTER_FALSE, 599 TEP_FILTER_TRUE, 600}; 601 602enum tep_filter_op_type { 603 TEP_FILTER_OP_AND = 1, 604 TEP_FILTER_OP_OR, 605 TEP_FILTER_OP_NOT, 606}; 607 608enum tep_filter_cmp_type { 609 TEP_FILTER_CMP_NONE, 610 TEP_FILTER_CMP_EQ, 611 TEP_FILTER_CMP_NE, 612 TEP_FILTER_CMP_GT, 613 TEP_FILTER_CMP_LT, 614 TEP_FILTER_CMP_GE, 615 TEP_FILTER_CMP_LE, 616 TEP_FILTER_CMP_MATCH, 617 TEP_FILTER_CMP_NOT_MATCH, 618 TEP_FILTER_CMP_REGEX, 619 TEP_FILTER_CMP_NOT_REGEX, 620}; 621 622enum tep_filter_exp_type { 623 TEP_FILTER_EXP_NONE, 624 TEP_FILTER_EXP_ADD, 625 TEP_FILTER_EXP_SUB, 626 TEP_FILTER_EXP_MUL, 627 TEP_FILTER_EXP_DIV, 628 TEP_FILTER_EXP_MOD, 629 TEP_FILTER_EXP_RSHIFT, 630 TEP_FILTER_EXP_LSHIFT, 631 TEP_FILTER_EXP_AND, 632 TEP_FILTER_EXP_OR, 633 TEP_FILTER_EXP_XOR, 634 TEP_FILTER_EXP_NOT, 635}; 636 637enum tep_filter_arg_type { 638 TEP_FILTER_ARG_NONE, 639 TEP_FILTER_ARG_BOOLEAN, 640 TEP_FILTER_ARG_VALUE, 641 TEP_FILTER_ARG_FIELD, 642 TEP_FILTER_ARG_EXP, 643 TEP_FILTER_ARG_OP, 644 TEP_FILTER_ARG_NUM, 645 TEP_FILTER_ARG_STR, 646}; 647 648enum tep_filter_value_type { 649 TEP_FILTER_NUMBER, 650 TEP_FILTER_STRING, 651 TEP_FILTER_CHAR 652}; 653 654struct tep_filter_arg; 655 656struct tep_filter_arg_boolean { 657 enum tep_filter_boolean_type value; 658}; 659 660struct tep_filter_arg_field { 661 struct tep_format_field *field; 662}; 663 664struct tep_filter_arg_value { 665 enum tep_filter_value_type type; 666 union { 667 char *str; 668 unsigned long long val; 669 }; 670}; 671 672struct tep_filter_arg_op { 673 enum tep_filter_op_type type; 674 struct tep_filter_arg *left; 675 struct tep_filter_arg *right; 676}; 677 678struct tep_filter_arg_exp { 679 enum tep_filter_exp_type type; 680 struct tep_filter_arg *left; 681 struct tep_filter_arg *right; 682}; 683 684struct tep_filter_arg_num { 685 enum tep_filter_cmp_type type; 686 struct tep_filter_arg *left; 687 struct tep_filter_arg *right; 688}; 689 690struct tep_filter_arg_str { 691 enum tep_filter_cmp_type type; 692 struct tep_format_field *field; 693 char *val; 694 char *buffer; 695 regex_t reg; 696}; 697 698struct tep_filter_arg { 699 enum tep_filter_arg_type type; 700 union { 701 struct tep_filter_arg_boolean boolean; 702 struct tep_filter_arg_field field; 703 struct tep_filter_arg_value value; 704 struct tep_filter_arg_op op; 705 struct tep_filter_arg_exp exp; 706 struct tep_filter_arg_num num; 707 struct tep_filter_arg_str str; 708 }; 709}; 710 711struct tep_filter_type { 712 int event_id; 713 struct tep_event *event; 714 struct tep_filter_arg *filter; 715}; 716 717#define TEP_FILTER_ERROR_BUFSZ 1024 718 719struct tep_event_filter { 720 struct tep_handle *tep; 721 int filters; 722 struct tep_filter_type *event_filters; 723 char error_buffer[TEP_FILTER_ERROR_BUFSZ]; 724}; 725 726struct tep_event_filter *tep_filter_alloc(struct tep_handle *tep); 727 728/* for backward compatibility */ 729#define FILTER_NONE TEP_ERRNO__NO_FILTER 730#define FILTER_NOEXIST TEP_ERRNO__FILTER_NOT_FOUND 731#define FILTER_MISS TEP_ERRNO__FILTER_MISS 732#define FILTER_MATCH TEP_ERRNO__FILTER_MATCH 733 734enum tep_errno tep_filter_add_filter_str(struct tep_event_filter *filter, 735 const char *filter_str); 736 737enum tep_errno tep_filter_match(struct tep_event_filter *filter, 738 struct tep_record *record); 739 740int tep_filter_strerror(struct tep_event_filter *filter, enum tep_errno err, 741 char *buf, size_t buflen); 742 743int tep_event_filtered(struct tep_event_filter *filter, 744 int event_id); 745 746void tep_filter_reset(struct tep_event_filter *filter); 747 748void tep_filter_free(struct tep_event_filter *filter); 749 750char *tep_filter_make_string(struct tep_event_filter *filter, int event_id); 751 752int tep_filter_remove_event(struct tep_event_filter *filter, 753 int event_id); 754 755int tep_filter_copy(struct tep_event_filter *dest, struct tep_event_filter *source); 756 757int tep_filter_compare(struct tep_event_filter *filter1, struct tep_event_filter *filter2); 758 759#endif /* _PARSE_EVENTS_H */