at v4.20-rc6 777 lines 23 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_format; 61 62typedef int (*tep_event_handler_func)(struct trace_seq *s, 63 struct tep_record *record, 64 struct tep_event_format *event, 65 void *context); 66 67typedef int (*tep_plugin_load_func)(struct tep_handle *pevent); 68typedef int (*tep_plugin_unload_func)(struct tep_handle *pevent); 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 *pevent) 89 * 90 * TEP_PLUGIN_UNLOADER: (optional) 91 * The function called just before unloading 92 * 93 * int TEP_PLUGIN_UNLOADER(struct tep_handle *pevent) 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_format *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_format { 281 struct tep_handle *pevent; 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 *pevent); 397void tep_unload_plugins(struct tep_plugin_list *plugin_list, 398 struct tep_handle *pevent); 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); 412unsigned short __tep_data2host2(struct tep_handle *pevent, unsigned short data); 413unsigned int __tep_data2host4(struct tep_handle *pevent, unsigned int data); 414unsigned long long 415__tep_data2host8(struct tep_handle *pevent, unsigned long long data); 416 417#define tep_data2host2(pevent, ptr) __tep_data2host2(pevent, *(unsigned short *)(ptr)) 418#define tep_data2host4(pevent, ptr) __tep_data2host4(pevent, *(unsigned int *)(ptr)) 419#define tep_data2host8(pevent, ptr) \ 420({ \ 421 unsigned long long __val; \ 422 \ 423 memcpy(&__val, (ptr), sizeof(unsigned long long)); \ 424 __tep_data2host8(pevent, __val); \ 425}) 426 427static inline int tep_host_bigendian(void) 428{ 429 unsigned char str[] = { 0x1, 0x2, 0x3, 0x4 }; 430 unsigned int val; 431 432 memcpy(&val, str, 4); 433 return val == 0x01020304; 434} 435 436/* taken from kernel/trace/trace.h */ 437enum trace_flag_type { 438 TRACE_FLAG_IRQS_OFF = 0x01, 439 TRACE_FLAG_IRQS_NOSUPPORT = 0x02, 440 TRACE_FLAG_NEED_RESCHED = 0x04, 441 TRACE_FLAG_HARDIRQ = 0x08, 442 TRACE_FLAG_SOFTIRQ = 0x10, 443}; 444 445int tep_set_function_resolver(struct tep_handle *pevent, 446 tep_func_resolver_t *func, void *priv); 447void tep_reset_function_resolver(struct tep_handle *pevent); 448int tep_register_comm(struct tep_handle *pevent, const char *comm, int pid); 449int tep_register_trace_clock(struct tep_handle *pevent, const char *trace_clock); 450int tep_register_function(struct tep_handle *pevent, char *name, 451 unsigned long long addr, char *mod); 452int tep_register_print_string(struct tep_handle *pevent, const char *fmt, 453 unsigned long long addr); 454int tep_pid_is_registered(struct tep_handle *pevent, int pid); 455 456void tep_print_event_task(struct tep_handle *pevent, struct trace_seq *s, 457 struct tep_event_format *event, 458 struct tep_record *record); 459void tep_print_event_time(struct tep_handle *pevent, struct trace_seq *s, 460 struct tep_event_format *event, 461 struct tep_record *record, 462 bool use_trace_clock); 463void tep_print_event_data(struct tep_handle *pevent, struct trace_seq *s, 464 struct tep_event_format *event, 465 struct tep_record *record); 466void tep_print_event(struct tep_handle *pevent, struct trace_seq *s, 467 struct tep_record *record, bool use_trace_clock); 468 469int tep_parse_header_page(struct tep_handle *pevent, char *buf, unsigned long size, 470 int long_size); 471 472enum tep_errno tep_parse_event(struct tep_handle *pevent, const char *buf, 473 unsigned long size, const char *sys); 474enum tep_errno tep_parse_format(struct tep_handle *pevent, 475 struct tep_event_format **eventp, 476 const char *buf, 477 unsigned long size, const char *sys); 478void tep_free_format(struct tep_event_format *event); 479void tep_free_format_field(struct tep_format_field *field); 480 481void *tep_get_field_raw(struct trace_seq *s, struct tep_event_format *event, 482 const char *name, struct tep_record *record, 483 int *len, int err); 484 485int tep_get_field_val(struct trace_seq *s, struct tep_event_format *event, 486 const char *name, struct tep_record *record, 487 unsigned long long *val, int err); 488int tep_get_common_field_val(struct trace_seq *s, struct tep_event_format *event, 489 const char *name, struct tep_record *record, 490 unsigned long long *val, int err); 491int tep_get_any_field_val(struct trace_seq *s, struct tep_event_format *event, 492 const char *name, struct tep_record *record, 493 unsigned long long *val, int err); 494 495int tep_print_num_field(struct trace_seq *s, const char *fmt, 496 struct tep_event_format *event, const char *name, 497 struct tep_record *record, int err); 498 499int tep_print_func_field(struct trace_seq *s, const char *fmt, 500 struct tep_event_format *event, const char *name, 501 struct tep_record *record, int err); 502 503int tep_register_event_handler(struct tep_handle *pevent, int id, 504 const char *sys_name, const char *event_name, 505 tep_event_handler_func func, void *context); 506int tep_unregister_event_handler(struct tep_handle *pevent, int id, 507 const char *sys_name, const char *event_name, 508 tep_event_handler_func func, void *context); 509int tep_register_print_function(struct tep_handle *pevent, 510 tep_func_handler func, 511 enum tep_func_arg_type ret_type, 512 char *name, ...); 513int tep_unregister_print_function(struct tep_handle *pevent, 514 tep_func_handler func, char *name); 515 516struct tep_format_field *tep_find_common_field(struct tep_event_format *event, const char *name); 517struct tep_format_field *tep_find_field(struct tep_event_format *event, const char *name); 518struct tep_format_field *tep_find_any_field(struct tep_event_format *event, const char *name); 519 520const char *tep_find_function(struct tep_handle *pevent, unsigned long long addr); 521unsigned long long 522tep_find_function_address(struct tep_handle *pevent, unsigned long long addr); 523unsigned long long tep_read_number(struct tep_handle *pevent, const void *ptr, int size); 524int tep_read_number_field(struct tep_format_field *field, const void *data, 525 unsigned long long *value); 526 527struct tep_event_format *tep_get_first_event(struct tep_handle *tep); 528int tep_get_events_count(struct tep_handle *tep); 529struct tep_event_format *tep_find_event(struct tep_handle *pevent, int id); 530 531struct tep_event_format * 532tep_find_event_by_name(struct tep_handle *pevent, const char *sys, const char *name); 533struct tep_event_format * 534tep_find_event_by_record(struct tep_handle *pevent, struct tep_record *record); 535 536void tep_data_lat_fmt(struct tep_handle *pevent, 537 struct trace_seq *s, struct tep_record *record); 538int tep_data_type(struct tep_handle *pevent, struct tep_record *rec); 539struct tep_event_format *tep_data_event_from_type(struct tep_handle *pevent, int type); 540int tep_data_pid(struct tep_handle *pevent, struct tep_record *rec); 541int tep_data_preempt_count(struct tep_handle *pevent, struct tep_record *rec); 542int tep_data_flags(struct tep_handle *pevent, struct tep_record *rec); 543const char *tep_data_comm_from_pid(struct tep_handle *pevent, int pid); 544struct cmdline; 545struct cmdline *tep_data_pid_from_comm(struct tep_handle *pevent, const char *comm, 546 struct cmdline *next); 547int tep_cmdline_pid(struct tep_handle *pevent, struct cmdline *cmdline); 548 549void tep_print_field(struct trace_seq *s, void *data, 550 struct tep_format_field *field); 551void tep_print_fields(struct trace_seq *s, void *data, 552 int size __maybe_unused, struct tep_event_format *event); 553void tep_event_info(struct trace_seq *s, struct tep_event_format *event, 554 struct tep_record *record); 555int tep_strerror(struct tep_handle *pevent, enum tep_errno errnum, 556 char *buf, size_t buflen); 557 558struct tep_event_format **tep_list_events(struct tep_handle *pevent, enum tep_event_sort_type); 559struct tep_format_field **tep_event_common_fields(struct tep_event_format *event); 560struct tep_format_field **tep_event_fields(struct tep_event_format *event); 561 562enum tep_endian { 563 TEP_LITTLE_ENDIAN = 0, 564 TEP_BIG_ENDIAN 565}; 566int tep_get_cpus(struct tep_handle *pevent); 567void tep_set_cpus(struct tep_handle *pevent, int cpus); 568int tep_get_long_size(struct tep_handle *pevent); 569void tep_set_long_size(struct tep_handle *pevent, int long_size); 570int tep_get_page_size(struct tep_handle *pevent); 571void tep_set_page_size(struct tep_handle *pevent, int _page_size); 572int tep_is_file_bigendian(struct tep_handle *pevent); 573void tep_set_file_bigendian(struct tep_handle *pevent, enum tep_endian endian); 574int tep_is_host_bigendian(struct tep_handle *pevent); 575void tep_set_host_bigendian(struct tep_handle *pevent, enum tep_endian endian); 576int tep_is_latency_format(struct tep_handle *pevent); 577void tep_set_latency_format(struct tep_handle *pevent, int lat); 578int tep_get_header_page_size(struct tep_handle *pevent); 579 580struct tep_handle *tep_alloc(void); 581void tep_free(struct tep_handle *pevent); 582void tep_ref(struct tep_handle *pevent); 583void tep_unref(struct tep_handle *pevent); 584 585/* access to the internal parser */ 586void tep_buffer_init(const char *buf, unsigned long long size); 587enum tep_event_type tep_read_token(char **tok); 588void tep_free_token(char *token); 589int tep_peek_char(void); 590const char *tep_get_input_buf(void); 591unsigned long long tep_get_input_buf_ptr(void); 592 593/* for debugging */ 594void tep_print_funcs(struct tep_handle *pevent); 595void tep_print_printk(struct tep_handle *pevent); 596 597/* ----------------------- filtering ----------------------- */ 598 599enum tep_filter_boolean_type { 600 TEP_FILTER_FALSE, 601 TEP_FILTER_TRUE, 602}; 603 604enum tep_filter_op_type { 605 TEP_FILTER_OP_AND = 1, 606 TEP_FILTER_OP_OR, 607 TEP_FILTER_OP_NOT, 608}; 609 610enum tep_filter_cmp_type { 611 TEP_FILTER_CMP_NONE, 612 TEP_FILTER_CMP_EQ, 613 TEP_FILTER_CMP_NE, 614 TEP_FILTER_CMP_GT, 615 TEP_FILTER_CMP_LT, 616 TEP_FILTER_CMP_GE, 617 TEP_FILTER_CMP_LE, 618 TEP_FILTER_CMP_MATCH, 619 TEP_FILTER_CMP_NOT_MATCH, 620 TEP_FILTER_CMP_REGEX, 621 TEP_FILTER_CMP_NOT_REGEX, 622}; 623 624enum tep_filter_exp_type { 625 TEP_FILTER_EXP_NONE, 626 TEP_FILTER_EXP_ADD, 627 TEP_FILTER_EXP_SUB, 628 TEP_FILTER_EXP_MUL, 629 TEP_FILTER_EXP_DIV, 630 TEP_FILTER_EXP_MOD, 631 TEP_FILTER_EXP_RSHIFT, 632 TEP_FILTER_EXP_LSHIFT, 633 TEP_FILTER_EXP_AND, 634 TEP_FILTER_EXP_OR, 635 TEP_FILTER_EXP_XOR, 636 TEP_FILTER_EXP_NOT, 637}; 638 639enum tep_filter_arg_type { 640 TEP_FILTER_ARG_NONE, 641 TEP_FILTER_ARG_BOOLEAN, 642 TEP_FILTER_ARG_VALUE, 643 TEP_FILTER_ARG_FIELD, 644 TEP_FILTER_ARG_EXP, 645 TEP_FILTER_ARG_OP, 646 TEP_FILTER_ARG_NUM, 647 TEP_FILTER_ARG_STR, 648}; 649 650enum tep_filter_value_type { 651 TEP_FILTER_NUMBER, 652 TEP_FILTER_STRING, 653 TEP_FILTER_CHAR 654}; 655 656struct tep_filter_arg; 657 658struct tep_filter_arg_boolean { 659 enum tep_filter_boolean_type value; 660}; 661 662struct tep_filter_arg_field { 663 struct tep_format_field *field; 664}; 665 666struct tep_filter_arg_value { 667 enum tep_filter_value_type type; 668 union { 669 char *str; 670 unsigned long long val; 671 }; 672}; 673 674struct tep_filter_arg_op { 675 enum tep_filter_op_type type; 676 struct tep_filter_arg *left; 677 struct tep_filter_arg *right; 678}; 679 680struct tep_filter_arg_exp { 681 enum tep_filter_exp_type type; 682 struct tep_filter_arg *left; 683 struct tep_filter_arg *right; 684}; 685 686struct tep_filter_arg_num { 687 enum tep_filter_cmp_type type; 688 struct tep_filter_arg *left; 689 struct tep_filter_arg *right; 690}; 691 692struct tep_filter_arg_str { 693 enum tep_filter_cmp_type type; 694 struct tep_format_field *field; 695 char *val; 696 char *buffer; 697 regex_t reg; 698}; 699 700struct tep_filter_arg { 701 enum tep_filter_arg_type type; 702 union { 703 struct tep_filter_arg_boolean boolean; 704 struct tep_filter_arg_field field; 705 struct tep_filter_arg_value value; 706 struct tep_filter_arg_op op; 707 struct tep_filter_arg_exp exp; 708 struct tep_filter_arg_num num; 709 struct tep_filter_arg_str str; 710 }; 711}; 712 713struct tep_filter_type { 714 int event_id; 715 struct tep_event_format *event; 716 struct tep_filter_arg *filter; 717}; 718 719#define TEP_FILTER_ERROR_BUFSZ 1024 720 721struct tep_event_filter { 722 struct tep_handle *pevent; 723 int filters; 724 struct tep_filter_type *event_filters; 725 char error_buffer[TEP_FILTER_ERROR_BUFSZ]; 726}; 727 728struct tep_event_filter *tep_filter_alloc(struct tep_handle *pevent); 729 730/* for backward compatibility */ 731#define FILTER_NONE TEP_ERRNO__NO_FILTER 732#define FILTER_NOEXIST TEP_ERRNO__FILTER_NOT_FOUND 733#define FILTER_MISS TEP_ERRNO__FILTER_MISS 734#define FILTER_MATCH TEP_ERRNO__FILTER_MATCH 735 736enum tep_filter_trivial_type { 737 TEP_FILTER_TRIVIAL_FALSE, 738 TEP_FILTER_TRIVIAL_TRUE, 739 TEP_FILTER_TRIVIAL_BOTH, 740}; 741 742enum tep_errno tep_filter_add_filter_str(struct tep_event_filter *filter, 743 const char *filter_str); 744 745enum tep_errno tep_filter_match(struct tep_event_filter *filter, 746 struct tep_record *record); 747 748int tep_filter_strerror(struct tep_event_filter *filter, enum tep_errno err, 749 char *buf, size_t buflen); 750 751int tep_event_filtered(struct tep_event_filter *filter, 752 int event_id); 753 754void tep_filter_reset(struct tep_event_filter *filter); 755 756int tep_filter_clear_trivial(struct tep_event_filter *filter, 757 enum tep_filter_trivial_type type); 758 759void tep_filter_free(struct tep_event_filter *filter); 760 761char *tep_filter_make_string(struct tep_event_filter *filter, int event_id); 762 763int tep_filter_remove_event(struct tep_event_filter *filter, 764 int event_id); 765 766int tep_filter_event_has_trivial(struct tep_event_filter *filter, 767 int event_id, 768 enum tep_filter_trivial_type type); 769 770int tep_filter_copy(struct tep_event_filter *dest, struct tep_event_filter *source); 771 772int tep_update_trivial(struct tep_event_filter *dest, struct tep_event_filter *source, 773 enum tep_filter_trivial_type type); 774 775int tep_filter_compare(struct tep_event_filter *filter1, struct tep_event_filter *filter2); 776 777#endif /* _PARSE_EVENTS_H */