linux/tools/lib/traceevent/event-parse.h
<<
>>
Prefs
   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#ifndef __maybe_unused
  30#define __maybe_unused __attribute__((unused))
  31#endif
  32
  33/* ----------------------- trace_seq ----------------------- */
  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;  /* buffer dropped events before */
  48        int                     record_size;    /* size of binary record */
  49        int                     size;           /* size of data */
  50        void                    *data;
  51        int                     cpu;
  52        int                     ref_count;
  53        int                     locked;         /* Do not free, even if ref_count is zero */
  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 * Trace sequences are used to allow a function to call several other functions
  70 * to create a string of data to use (up to a max of PAGE_SIZE).
  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/* ----------------------- pevent ----------------------- */
 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 * Plugin hooks that can be called:
 126 *
 127 * PEVENT_PLUGIN_LOADER:  (required)
 128 *   The function name to initialized the plugin.
 129 *
 130 *   int PEVENT_PLUGIN_LOADER(struct pevent *pevent)
 131 *
 132 * PEVENT_PLUGIN_UNLOADER:  (optional)
 133 *   The function called just before unloading
 134 *
 135 *   int PEVENT_PLUGIN_UNLOADER(struct pevent *pevent)
 136 *
 137 * PEVENT_PLUGIN_OPTIONS:  (optional)
 138 *   Plugin options that can be set before loading
 139 *
 140 *   struct pevent_plugin_option PEVENT_PLUGIN_OPTIONS[] = {
 141 *      {
 142 *              .name = "option-name",
 143 *              .plugin_alias = "override-file-name", (optional)
 144 *              .description = "description of option to show users",
 145 *      },
 146 *      {
 147 *              .name = NULL,
 148 *      },
 149 *   };
 150 *
 151 *   Array must end with .name = NULL;
 152 *
 153 *
 154 *   .plugin_alias is used to give a shorter name to access
 155 *   the vairable. Useful if a plugin handles more than one event.
 156 *
 157 *   If .value is not set, then it is considered a boolean and only
 158 *   .set will be processed. If .value is defined, then it is considered
 159 *   a string option and .set will be ignored.
 160 *
 161 * PEVENT_PLUGIN_ALIAS: (optional)
 162 *   The name to use for finding options (uses filename if not defined)
 163 */
 164#define PEVENT_PLUGIN_LOADER pevent_plugin_loader
 165#define PEVENT_PLUGIN_UNLOADER pevent_plugin_unloader
 166#define PEVENT_PLUGIN_OPTIONS pevent_plugin_options
 167#define PEVENT_PLUGIN_ALIAS pevent_plugin_alias
 168#define _MAKE_STR(x)    #x
 169#define MAKE_STR(x)     _MAKE_STR(x)
 170#define PEVENT_PLUGIN_LOADER_NAME MAKE_STR(PEVENT_PLUGIN_LOADER)
 171#define PEVENT_PLUGIN_UNLOADER_NAME MAKE_STR(PEVENT_PLUGIN_UNLOADER)
 172#define PEVENT_PLUGIN_OPTIONS_NAME MAKE_STR(PEVENT_PLUGIN_OPTIONS)
 173#define PEVENT_PLUGIN_ALIAS_NAME MAKE_STR(PEVENT_PLUGIN_ALIAS)
 174
 175enum format_flags {
 176        FIELD_IS_ARRAY          = 1,
 177        FIELD_IS_POINTER        = 2,
 178        FIELD_IS_SIGNED         = 4,
 179        FIELD_IS_STRING         = 8,
 180        FIELD_IS_DYNAMIC        = 16,
 181        FIELD_IS_LONG           = 32,
 182        FIELD_IS_FLAG           = 64,
 183        FIELD_IS_SYMBOLIC       = 128,
 184};
 185
 186struct format_field {
 187        struct format_field     *next;
 188        struct event_format     *event;
 189        char                    *type;
 190        char                    *name;
 191        char                    *alias;
 192        int                     offset;
 193        int                     size;
 194        unsigned int            arraylen;
 195        unsigned int            elementsize;
 196        unsigned long           flags;
 197};
 198
 199struct format {
 200        int                     nr_common;
 201        int                     nr_fields;
 202        struct format_field     *common_fields;
 203        struct format_field     *fields;
 204};
 205
 206struct print_arg_atom {
 207        char                    *atom;
 208};
 209
 210struct print_arg_string {
 211        char                    *string;
 212        int                     offset;
 213};
 214
 215struct print_arg_bitmask {
 216        char                    *bitmask;
 217        int                     offset;
 218};
 219
 220struct print_arg_field {
 221        char                    *name;
 222        struct format_field     *field;
 223};
 224
 225struct print_flag_sym {
 226        struct print_flag_sym   *next;
 227        char                    *value;
 228        char                    *str;
 229};
 230
 231struct print_arg_typecast {
 232        char                    *type;
 233        struct print_arg        *item;
 234};
 235
 236struct print_arg_flags {
 237        struct print_arg        *field;
 238        char                    *delim;
 239        struct print_flag_sym   *flags;
 240};
 241
 242struct print_arg_symbol {
 243        struct print_arg        *field;
 244        struct print_flag_sym   *symbols;
 245};
 246
 247struct print_arg_hex {
 248        struct print_arg        *field;
 249        struct print_arg        *size;
 250};
 251
 252struct print_arg_int_array {
 253        struct print_arg        *field;
 254        struct print_arg        *count;
 255        struct print_arg        *el_size;
 256};
 257
 258struct print_arg_dynarray {
 259        struct format_field     *field;
 260        struct print_arg        *index;
 261};
 262
 263struct print_arg;
 264
 265struct print_arg_op {
 266        char                    *op;
 267        int                     prio;
 268        struct print_arg        *left;
 269        struct print_arg        *right;
 270};
 271
 272struct pevent_function_handler;
 273
 274struct print_arg_func {
 275        struct pevent_function_handler  *func;
 276        struct print_arg                *args;
 277};
 278
 279enum print_arg_type {
 280        PRINT_NULL,
 281        PRINT_ATOM,
 282        PRINT_FIELD,
 283        PRINT_FLAGS,
 284        PRINT_SYMBOL,
 285        PRINT_HEX,
 286        PRINT_INT_ARRAY,
 287        PRINT_TYPE,
 288        PRINT_STRING,
 289        PRINT_BSTRING,
 290        PRINT_DYNAMIC_ARRAY,
 291        PRINT_OP,
 292        PRINT_FUNC,
 293        PRINT_BITMASK,
 294        PRINT_DYNAMIC_ARRAY_LEN,
 295        PRINT_HEX_STR,
 296};
 297
 298struct print_arg {
 299        struct print_arg                *next;
 300        enum print_arg_type             type;
 301        union {
 302                struct print_arg_atom           atom;
 303                struct print_arg_field          field;
 304                struct print_arg_typecast       typecast;
 305                struct print_arg_flags          flags;
 306                struct print_arg_symbol         symbol;
 307                struct print_arg_hex            hex;
 308                struct print_arg_int_array      int_array;
 309                struct print_arg_func           func;
 310                struct print_arg_string         string;
 311                struct print_arg_bitmask        bitmask;
 312                struct print_arg_op             op;
 313                struct print_arg_dynarray       dynarray;
 314        };
 315};
 316
 317struct print_fmt {
 318        char                    *format;
 319        struct print_arg        *args;
 320};
 321
 322struct event_format {
 323        struct pevent           *pevent;
 324        char                    *name;
 325        int                     id;
 326        int                     flags;
 327        struct format           format;
 328        struct print_fmt        print_fmt;
 329        char                    *system;
 330        pevent_event_handler_func handler;
 331        void                    *context;
 332};
 333
 334enum {
 335        EVENT_FL_ISFTRACE       = 0x01,
 336        EVENT_FL_ISPRINT        = 0x02,
 337        EVENT_FL_ISBPRINT       = 0x04,
 338        EVENT_FL_ISFUNCENT      = 0x10,
 339        EVENT_FL_ISFUNCRET      = 0x20,
 340        EVENT_FL_NOHANDLE       = 0x40,
 341        EVENT_FL_PRINTRAW       = 0x80,
 342
 343        EVENT_FL_FAILED         = 0x80000000
 344};
 345
 346enum event_sort_type {
 347        EVENT_SORT_ID,
 348        EVENT_SORT_NAME,
 349        EVENT_SORT_SYSTEM,
 350};
 351
 352enum event_type {
 353        EVENT_ERROR,
 354        EVENT_NONE,
 355        EVENT_SPACE,
 356        EVENT_NEWLINE,
 357        EVENT_OP,
 358        EVENT_DELIM,
 359        EVENT_ITEM,
 360        EVENT_DQUOTE,
 361        EVENT_SQUOTE,
 362};
 363
 364typedef unsigned long long (*pevent_func_handler)(struct trace_seq *s,
 365                                             unsigned long long *args);
 366
 367enum pevent_func_arg_type {
 368        PEVENT_FUNC_ARG_VOID,
 369        PEVENT_FUNC_ARG_INT,
 370        PEVENT_FUNC_ARG_LONG,
 371        PEVENT_FUNC_ARG_STRING,
 372        PEVENT_FUNC_ARG_PTR,
 373        PEVENT_FUNC_ARG_MAX_TYPES
 374};
 375
 376enum pevent_flag {
 377        PEVENT_NSEC_OUTPUT              = 1,    /* output in NSECS */
 378        PEVENT_DISABLE_SYS_PLUGINS      = 1 << 1,
 379        PEVENT_DISABLE_PLUGINS          = 1 << 2,
 380};
 381
 382#define PEVENT_ERRORS                                                         \
 383        _PE(MEM_ALLOC_FAILED,   "failed to allocate memory"),                 \
 384        _PE(PARSE_EVENT_FAILED, "failed to parse event"),                     \
 385        _PE(READ_ID_FAILED,     "failed to read event id"),                   \
 386        _PE(READ_FORMAT_FAILED, "failed to read event format"),               \
 387        _PE(READ_PRINT_FAILED,  "failed to read event print fmt"),            \
 388        _PE(OLD_FTRACE_ARG_FAILED,"failed to allocate field name for ftrace"),\
 389        _PE(INVALID_ARG_TYPE,   "invalid argument type"),                     \
 390        _PE(INVALID_EXP_TYPE,   "invalid expression type"),                   \
 391        _PE(INVALID_OP_TYPE,    "invalid operator type"),                     \
 392        _PE(INVALID_EVENT_NAME, "invalid event name"),                        \
 393        _PE(EVENT_NOT_FOUND,    "no event found"),                            \
 394        _PE(SYNTAX_ERROR,       "syntax error"),                              \
 395        _PE(ILLEGAL_RVALUE,     "illegal rvalue"),                            \
 396        _PE(ILLEGAL_LVALUE,     "illegal lvalue for string comparison"),      \
 397        _PE(INVALID_REGEX,      "regex did not compute"),                     \
 398        _PE(ILLEGAL_STRING_CMP, "illegal comparison for string"),             \
 399        _PE(ILLEGAL_INTEGER_CMP,"illegal comparison for integer"),            \
 400        _PE(REPARENT_NOT_OP,    "cannot reparent other than OP"),             \
 401        _PE(REPARENT_FAILED,    "failed to reparent filter OP"),              \
 402        _PE(BAD_FILTER_ARG,     "bad arg in filter tree"),                    \
 403        _PE(UNEXPECTED_TYPE,    "unexpected type (not a value)"),             \
 404        _PE(ILLEGAL_TOKEN,      "illegal token"),                             \
 405        _PE(INVALID_PAREN,      "open parenthesis cannot come here"),         \
 406        _PE(UNBALANCED_PAREN,   "unbalanced number of parenthesis"),          \
 407        _PE(UNKNOWN_TOKEN,      "unknown token"),                             \
 408        _PE(FILTER_NOT_FOUND,   "no filter found"),                           \
 409        _PE(NOT_A_NUMBER,       "must have number field"),                    \
 410        _PE(NO_FILTER,          "no filters exists"),                         \
 411        _PE(FILTER_MISS,        "record does not match to filter")
 412
 413#undef _PE
 414#define _PE(__code, __str) PEVENT_ERRNO__ ## __code
 415enum pevent_errno {
 416        PEVENT_ERRNO__SUCCESS                   = 0,
 417        PEVENT_ERRNO__FILTER_MATCH              = PEVENT_ERRNO__SUCCESS,
 418
 419        /*
 420         * Choose an arbitrary negative big number not to clash with standard
 421         * errno since SUS requires the errno has distinct positive values.
 422         * See 'Issue 6' in the link below.
 423         *
 424         * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html
 425         */
 426        __PEVENT_ERRNO__START                   = -100000,
 427
 428        PEVENT_ERRORS,
 429
 430        __PEVENT_ERRNO__END,
 431};
 432#undef _PE
 433
 434struct plugin_list;
 435
 436#define INVALID_PLUGIN_LIST_OPTION      ((char **)((unsigned long)-1))
 437
 438struct plugin_list *traceevent_load_plugins(struct pevent *pevent);
 439void traceevent_unload_plugins(struct plugin_list *plugin_list,
 440                               struct pevent *pevent);
 441char **traceevent_plugin_list_options(void);
 442void traceevent_plugin_free_options_list(char **list);
 443int traceevent_plugin_add_options(const char *name,
 444                                  struct pevent_plugin_option *options);
 445void traceevent_plugin_remove_options(struct pevent_plugin_option *options);
 446void traceevent_print_plugins(struct trace_seq *s,
 447                              const char *prefix, const char *suffix,
 448                              const struct plugin_list *list);
 449
 450struct cmdline;
 451struct cmdline_list;
 452struct func_map;
 453struct func_list;
 454struct event_handler;
 455struct func_resolver;
 456
 457typedef char *(pevent_func_resolver_t)(void *priv,
 458                                       unsigned long long *addrp, char **modp);
 459
 460struct pevent {
 461        int ref_count;
 462
 463        int header_page_ts_offset;
 464        int header_page_ts_size;
 465        int header_page_size_offset;
 466        int header_page_size_size;
 467        int header_page_data_offset;
 468        int header_page_data_size;
 469        int header_page_overwrite;
 470
 471        int file_bigendian;
 472        int host_bigendian;
 473
 474        int latency_format;
 475
 476        int old_format;
 477
 478        int cpus;
 479        int long_size;
 480        int page_size;
 481
 482        struct cmdline *cmdlines;
 483        struct cmdline_list *cmdlist;
 484        int cmdline_count;
 485
 486        struct func_map *func_map;
 487        struct func_resolver *func_resolver;
 488        struct func_list *funclist;
 489        unsigned int func_count;
 490
 491        struct printk_map *printk_map;
 492        struct printk_list *printklist;
 493        unsigned int printk_count;
 494
 495
 496        struct event_format **events;
 497        int nr_events;
 498        struct event_format **sort_events;
 499        enum event_sort_type last_type;
 500
 501        int type_offset;
 502        int type_size;
 503
 504        int pid_offset;
 505        int pid_size;
 506
 507        int pc_offset;
 508        int pc_size;
 509
 510        int flags_offset;
 511        int flags_size;
 512
 513        int ld_offset;
 514        int ld_size;
 515
 516        int print_raw;
 517
 518        int test_filters;
 519
 520        int flags;
 521
 522        struct format_field *bprint_ip_field;
 523        struct format_field *bprint_fmt_field;
 524        struct format_field *bprint_buf_field;
 525
 526        struct event_handler *handlers;
 527        struct pevent_function_handler *func_handlers;
 528
 529        /* cache */
 530        struct event_format *last_event;
 531
 532        char *trace_clock;
 533};
 534
 535static inline void pevent_set_flag(struct pevent *pevent, int flag)
 536{
 537        pevent->flags |= flag;
 538}
 539
 540static inline unsigned short
 541__data2host2(struct pevent *pevent, unsigned short data)
 542{
 543        unsigned short swap;
 544
 545        if (pevent->host_bigendian == pevent->file_bigendian)
 546                return data;
 547
 548        swap = ((data & 0xffULL) << 8) |
 549                ((data & (0xffULL << 8)) >> 8);
 550
 551        return swap;
 552}
 553
 554static inline unsigned int
 555__data2host4(struct pevent *pevent, unsigned int data)
 556{
 557        unsigned int swap;
 558
 559        if (pevent->host_bigendian == pevent->file_bigendian)
 560                return data;
 561
 562        swap = ((data & 0xffULL) << 24) |
 563                ((data & (0xffULL << 8)) << 8) |
 564                ((data & (0xffULL << 16)) >> 8) |
 565                ((data & (0xffULL << 24)) >> 24);
 566
 567        return swap;
 568}
 569
 570static inline unsigned long long
 571__data2host8(struct pevent *pevent, unsigned long long data)
 572{
 573        unsigned long long swap;
 574
 575        if (pevent->host_bigendian == pevent->file_bigendian)
 576                return data;
 577
 578        swap = ((data & 0xffULL) << 56) |
 579                ((data & (0xffULL << 8)) << 40) |
 580                ((data & (0xffULL << 16)) << 24) |
 581                ((data & (0xffULL << 24)) << 8) |
 582                ((data & (0xffULL << 32)) >> 8) |
 583                ((data & (0xffULL << 40)) >> 24) |
 584                ((data & (0xffULL << 48)) >> 40) |
 585                ((data & (0xffULL << 56)) >> 56);
 586
 587        return swap;
 588}
 589
 590#define data2host2(pevent, ptr)         __data2host2(pevent, *(unsigned short *)(ptr))
 591#define data2host4(pevent, ptr)         __data2host4(pevent, *(unsigned int *)(ptr))
 592#define data2host8(pevent, ptr)                                 \
 593({                                                              \
 594        unsigned long long __val;                               \
 595                                                                \
 596        memcpy(&__val, (ptr), sizeof(unsigned long long));      \
 597        __data2host8(pevent, __val);                            \
 598})
 599
 600static inline int traceevent_host_bigendian(void)
 601{
 602        unsigned char str[] = { 0x1, 0x2, 0x3, 0x4 };
 603        unsigned int val;
 604
 605        memcpy(&val, str, 4);
 606        return val == 0x01020304;
 607}
 608
 609/* taken from kernel/trace/trace.h */
 610enum trace_flag_type {
 611        TRACE_FLAG_IRQS_OFF             = 0x01,
 612        TRACE_FLAG_IRQS_NOSUPPORT       = 0x02,
 613        TRACE_FLAG_NEED_RESCHED         = 0x04,
 614        TRACE_FLAG_HARDIRQ              = 0x08,
 615        TRACE_FLAG_SOFTIRQ              = 0x10,
 616};
 617
 618int pevent_set_function_resolver(struct pevent *pevent,
 619                                 pevent_func_resolver_t *func, void *priv);
 620void pevent_reset_function_resolver(struct pevent *pevent);
 621int pevent_register_comm(struct pevent *pevent, const char *comm, int pid);
 622int pevent_register_trace_clock(struct pevent *pevent, const char *trace_clock);
 623int pevent_register_function(struct pevent *pevent, char *name,
 624                             unsigned long long addr, char *mod);
 625int pevent_register_print_string(struct pevent *pevent, const char *fmt,
 626                                 unsigned long long addr);
 627int pevent_pid_is_registered(struct pevent *pevent, int pid);
 628
 629void pevent_print_event_task(struct pevent *pevent, struct trace_seq *s,
 630                             struct event_format *event,
 631                             struct pevent_record *record);
 632void pevent_print_event_time(struct pevent *pevent, struct trace_seq *s,
 633                             struct event_format *event,
 634                             struct pevent_record *record,
 635                             bool use_trace_clock);
 636void pevent_print_event_data(struct pevent *pevent, struct trace_seq *s,
 637                             struct event_format *event,
 638                             struct pevent_record *record);
 639void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
 640                        struct pevent_record *record, bool use_trace_clock);
 641
 642int pevent_parse_header_page(struct pevent *pevent, char *buf, unsigned long size,
 643                             int long_size);
 644
 645enum pevent_errno pevent_parse_event(struct pevent *pevent, const char *buf,
 646                                     unsigned long size, const char *sys);
 647enum pevent_errno pevent_parse_format(struct pevent *pevent,
 648                                      struct event_format **eventp,
 649                                      const char *buf,
 650                                      unsigned long size, const char *sys);
 651void pevent_free_format(struct event_format *event);
 652void pevent_free_format_field(struct format_field *field);
 653
 654void *pevent_get_field_raw(struct trace_seq *s, struct event_format *event,
 655                           const char *name, struct pevent_record *record,
 656                           int *len, int err);
 657
 658int pevent_get_field_val(struct trace_seq *s, struct event_format *event,
 659                         const char *name, struct pevent_record *record,
 660                         unsigned long long *val, int err);
 661int pevent_get_common_field_val(struct trace_seq *s, struct event_format *event,
 662                                const char *name, struct pevent_record *record,
 663                                unsigned long long *val, int err);
 664int pevent_get_any_field_val(struct trace_seq *s, struct event_format *event,
 665                             const char *name, struct pevent_record *record,
 666                             unsigned long long *val, int err);
 667
 668int pevent_print_num_field(struct trace_seq *s, const char *fmt,
 669                           struct event_format *event, const char *name,
 670                           struct pevent_record *record, int err);
 671
 672int pevent_print_func_field(struct trace_seq *s, const char *fmt,
 673                           struct event_format *event, const char *name,
 674                           struct pevent_record *record, int err);
 675
 676int pevent_register_event_handler(struct pevent *pevent, int id,
 677                                  const char *sys_name, const char *event_name,
 678                                  pevent_event_handler_func func, void *context);
 679int pevent_unregister_event_handler(struct pevent *pevent, int id,
 680                                    const char *sys_name, const char *event_name,
 681                                    pevent_event_handler_func func, void *context);
 682int pevent_register_print_function(struct pevent *pevent,
 683                                   pevent_func_handler func,
 684                                   enum pevent_func_arg_type ret_type,
 685                                   char *name, ...);
 686int pevent_unregister_print_function(struct pevent *pevent,
 687                                     pevent_func_handler func, char *name);
 688
 689struct format_field *pevent_find_common_field(struct event_format *event, const char *name);
 690struct format_field *pevent_find_field(struct event_format *event, const char *name);
 691struct format_field *pevent_find_any_field(struct event_format *event, const char *name);
 692
 693const char *pevent_find_function(struct pevent *pevent, unsigned long long addr);
 694unsigned long long
 695pevent_find_function_address(struct pevent *pevent, unsigned long long addr);
 696unsigned long long pevent_read_number(struct pevent *pevent, const void *ptr, int size);
 697int pevent_read_number_field(struct format_field *field, const void *data,
 698                             unsigned long long *value);
 699
 700struct event_format *pevent_find_event(struct pevent *pevent, int id);
 701
 702struct event_format *
 703pevent_find_event_by_name(struct pevent *pevent, const char *sys, const char *name);
 704
 705struct event_format *
 706pevent_find_event_by_record(struct pevent *pevent, struct pevent_record *record);
 707
 708void pevent_data_lat_fmt(struct pevent *pevent,
 709                         struct trace_seq *s, struct pevent_record *record);
 710int pevent_data_type(struct pevent *pevent, struct pevent_record *rec);
 711struct event_format *pevent_data_event_from_type(struct pevent *pevent, int type);
 712int pevent_data_pid(struct pevent *pevent, struct pevent_record *rec);
 713int pevent_data_preempt_count(struct pevent *pevent, struct pevent_record *rec);
 714int pevent_data_flags(struct pevent *pevent, struct pevent_record *rec);
 715const char *pevent_data_comm_from_pid(struct pevent *pevent, int pid);
 716struct cmdline;
 717struct cmdline *pevent_data_pid_from_comm(struct pevent *pevent, const char *comm,
 718                                          struct cmdline *next);
 719int pevent_cmdline_pid(struct pevent *pevent, struct cmdline *cmdline);
 720
 721void pevent_print_field(struct trace_seq *s, void *data,
 722                        struct format_field *field);
 723void pevent_print_fields(struct trace_seq *s, void *data,
 724                         int size __maybe_unused, struct event_format *event);
 725void pevent_event_info(struct trace_seq *s, struct event_format *event,
 726                       struct pevent_record *record);
 727int pevent_strerror(struct pevent *pevent, enum pevent_errno errnum,
 728                    char *buf, size_t buflen);
 729
 730struct event_format **pevent_list_events(struct pevent *pevent, enum event_sort_type);
 731struct format_field **pevent_event_common_fields(struct event_format *event);
 732struct format_field **pevent_event_fields(struct event_format *event);
 733
 734static inline int pevent_get_cpus(struct pevent *pevent)
 735{
 736        return pevent->cpus;
 737}
 738
 739static inline void pevent_set_cpus(struct pevent *pevent, int cpus)
 740{
 741        pevent->cpus = cpus;
 742}
 743
 744static inline int pevent_get_long_size(struct pevent *pevent)
 745{
 746        return pevent->long_size;
 747}
 748
 749static inline void pevent_set_long_size(struct pevent *pevent, int long_size)
 750{
 751        pevent->long_size = long_size;
 752}
 753
 754static inline int pevent_get_page_size(struct pevent *pevent)
 755{
 756        return pevent->page_size;
 757}
 758
 759static inline void pevent_set_page_size(struct pevent *pevent, int _page_size)
 760{
 761        pevent->page_size = _page_size;
 762}
 763
 764static inline int pevent_is_file_bigendian(struct pevent *pevent)
 765{
 766        return pevent->file_bigendian;
 767}
 768
 769static inline void pevent_set_file_bigendian(struct pevent *pevent, int endian)
 770{
 771        pevent->file_bigendian = endian;
 772}
 773
 774static inline int pevent_is_host_bigendian(struct pevent *pevent)
 775{
 776        return pevent->host_bigendian;
 777}
 778
 779static inline void pevent_set_host_bigendian(struct pevent *pevent, int endian)
 780{
 781        pevent->host_bigendian = endian;
 782}
 783
 784static inline int pevent_is_latency_format(struct pevent *pevent)
 785{
 786        return pevent->latency_format;
 787}
 788
 789static inline void pevent_set_latency_format(struct pevent *pevent, int lat)
 790{
 791        pevent->latency_format = lat;
 792}
 793
 794struct pevent *pevent_alloc(void);
 795void pevent_free(struct pevent *pevent);
 796void pevent_ref(struct pevent *pevent);
 797void pevent_unref(struct pevent *pevent);
 798
 799/* access to the internal parser */
 800void pevent_buffer_init(const char *buf, unsigned long long size);
 801enum event_type pevent_read_token(char **tok);
 802void pevent_free_token(char *token);
 803int pevent_peek_char(void);
 804const char *pevent_get_input_buf(void);
 805unsigned long long pevent_get_input_buf_ptr(void);
 806
 807/* for debugging */
 808void pevent_print_funcs(struct pevent *pevent);
 809void pevent_print_printk(struct pevent *pevent);
 810
 811/* ----------------------- filtering ----------------------- */
 812
 813enum filter_boolean_type {
 814        FILTER_FALSE,
 815        FILTER_TRUE,
 816};
 817
 818enum filter_op_type {
 819        FILTER_OP_AND = 1,
 820        FILTER_OP_OR,
 821        FILTER_OP_NOT,
 822};
 823
 824enum filter_cmp_type {
 825        FILTER_CMP_NONE,
 826        FILTER_CMP_EQ,
 827        FILTER_CMP_NE,
 828        FILTER_CMP_GT,
 829        FILTER_CMP_LT,
 830        FILTER_CMP_GE,
 831        FILTER_CMP_LE,
 832        FILTER_CMP_MATCH,
 833        FILTER_CMP_NOT_MATCH,
 834        FILTER_CMP_REGEX,
 835        FILTER_CMP_NOT_REGEX,
 836};
 837
 838enum filter_exp_type {
 839        FILTER_EXP_NONE,
 840        FILTER_EXP_ADD,
 841        FILTER_EXP_SUB,
 842        FILTER_EXP_MUL,
 843        FILTER_EXP_DIV,
 844        FILTER_EXP_MOD,
 845        FILTER_EXP_RSHIFT,
 846        FILTER_EXP_LSHIFT,
 847        FILTER_EXP_AND,
 848        FILTER_EXP_OR,
 849        FILTER_EXP_XOR,
 850        FILTER_EXP_NOT,
 851};
 852
 853enum filter_arg_type {
 854        FILTER_ARG_NONE,
 855        FILTER_ARG_BOOLEAN,
 856        FILTER_ARG_VALUE,
 857        FILTER_ARG_FIELD,
 858        FILTER_ARG_EXP,
 859        FILTER_ARG_OP,
 860        FILTER_ARG_NUM,
 861        FILTER_ARG_STR,
 862};
 863
 864enum filter_value_type {
 865        FILTER_NUMBER,
 866        FILTER_STRING,
 867        FILTER_CHAR
 868};
 869
 870struct fliter_arg;
 871
 872struct filter_arg_boolean {
 873        enum filter_boolean_type        value;
 874};
 875
 876struct filter_arg_field {
 877        struct format_field     *field;
 878};
 879
 880struct filter_arg_value {
 881        enum filter_value_type  type;
 882        union {
 883                char                    *str;
 884                unsigned long long      val;
 885        };
 886};
 887
 888struct filter_arg_op {
 889        enum filter_op_type     type;
 890        struct filter_arg       *left;
 891        struct filter_arg       *right;
 892};
 893
 894struct filter_arg_exp {
 895        enum filter_exp_type    type;
 896        struct filter_arg       *left;
 897        struct filter_arg       *right;
 898};
 899
 900struct filter_arg_num {
 901        enum filter_cmp_type    type;
 902        struct filter_arg       *left;
 903        struct filter_arg       *right;
 904};
 905
 906struct filter_arg_str {
 907        enum filter_cmp_type    type;
 908        struct format_field     *field;
 909        char                    *val;
 910        char                    *buffer;
 911        regex_t                 reg;
 912};
 913
 914struct filter_arg {
 915        enum filter_arg_type    type;
 916        union {
 917                struct filter_arg_boolean       boolean;
 918                struct filter_arg_field         field;
 919                struct filter_arg_value         value;
 920                struct filter_arg_op            op;
 921                struct filter_arg_exp           exp;
 922                struct filter_arg_num           num;
 923                struct filter_arg_str           str;
 924        };
 925};
 926
 927struct filter_type {
 928        int                     event_id;
 929        struct event_format     *event;
 930        struct filter_arg       *filter;
 931};
 932
 933#define PEVENT_FILTER_ERROR_BUFSZ  1024
 934
 935struct event_filter {
 936        struct pevent           *pevent;
 937        int                     filters;
 938        struct filter_type      *event_filters;
 939        char                    error_buffer[PEVENT_FILTER_ERROR_BUFSZ];
 940};
 941
 942struct event_filter *pevent_filter_alloc(struct pevent *pevent);
 943
 944/* for backward compatibility */
 945#define FILTER_NONE             PEVENT_ERRNO__NO_FILTER
 946#define FILTER_NOEXIST          PEVENT_ERRNO__FILTER_NOT_FOUND
 947#define FILTER_MISS             PEVENT_ERRNO__FILTER_MISS
 948#define FILTER_MATCH            PEVENT_ERRNO__FILTER_MATCH
 949
 950enum filter_trivial_type {
 951        FILTER_TRIVIAL_FALSE,
 952        FILTER_TRIVIAL_TRUE,
 953        FILTER_TRIVIAL_BOTH,
 954};
 955
 956enum pevent_errno pevent_filter_add_filter_str(struct event_filter *filter,
 957                                               const char *filter_str);
 958
 959enum pevent_errno pevent_filter_match(struct event_filter *filter,
 960                                      struct pevent_record *record);
 961
 962int pevent_filter_strerror(struct event_filter *filter, enum pevent_errno err,
 963                           char *buf, size_t buflen);
 964
 965int pevent_event_filtered(struct event_filter *filter,
 966                          int event_id);
 967
 968void pevent_filter_reset(struct event_filter *filter);
 969
 970int pevent_filter_clear_trivial(struct event_filter *filter,
 971                                 enum filter_trivial_type type);
 972
 973void pevent_filter_free(struct event_filter *filter);
 974
 975char *pevent_filter_make_string(struct event_filter *filter, int event_id);
 976
 977int pevent_filter_remove_event(struct event_filter *filter,
 978                               int event_id);
 979
 980int pevent_filter_event_has_trivial(struct event_filter *filter,
 981                                    int event_id,
 982                                    enum filter_trivial_type type);
 983
 984int pevent_filter_copy(struct event_filter *dest, struct event_filter *source);
 985
 986int pevent_update_trivial(struct event_filter *dest, struct event_filter *source,
 987                          enum filter_trivial_type type);
 988
 989int pevent_filter_compare(struct event_filter *filter1, struct event_filter *filter2);
 990
 991#endif /* _PARSE_EVENTS_H */
 992