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