linux/tools/lib/traceevent/event-parse.c
<<
>>
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 *  The parts for function graph printing was taken and modified from the
  21 *  Linux Kernel that were written by
  22 *    - Copyright (C) 2009  Frederic Weisbecker,
  23 *  Frederic Weisbecker gave his permission to relicense the code to
  24 *  the Lesser General Public License.
  25 */
  26#include <inttypes.h>
  27#include <stdio.h>
  28#include <stdlib.h>
  29#include <string.h>
  30#include <stdarg.h>
  31#include <ctype.h>
  32#include <errno.h>
  33#include <stdint.h>
  34#include <limits.h>
  35#include <linux/string.h>
  36#include <linux/time64.h>
  37
  38#include <netinet/in.h>
  39#include "event-parse.h"
  40#include "event-utils.h"
  41
  42static const char *input_buf;
  43static unsigned long long input_buf_ptr;
  44static unsigned long long input_buf_siz;
  45
  46static int is_flag_field;
  47static int is_symbolic_field;
  48
  49static int show_warning = 1;
  50
  51#define do_warning(fmt, ...)                            \
  52        do {                                            \
  53                if (show_warning)                       \
  54                        warning(fmt, ##__VA_ARGS__);    \
  55        } while (0)
  56
  57#define do_warning_event(event, fmt, ...)                       \
  58        do {                                                    \
  59                if (!show_warning)                              \
  60                        continue;                               \
  61                                                                \
  62                if (event)                                      \
  63                        warning("[%s:%s] " fmt, event->system,  \
  64                                event->name, ##__VA_ARGS__);    \
  65                else                                            \
  66                        warning(fmt, ##__VA_ARGS__);            \
  67        } while (0)
  68
  69static void init_input_buf(const char *buf, unsigned long long size)
  70{
  71        input_buf = buf;
  72        input_buf_siz = size;
  73        input_buf_ptr = 0;
  74}
  75
  76const char *pevent_get_input_buf(void)
  77{
  78        return input_buf;
  79}
  80
  81unsigned long long pevent_get_input_buf_ptr(void)
  82{
  83        return input_buf_ptr;
  84}
  85
  86struct event_handler {
  87        struct event_handler            *next;
  88        int                             id;
  89        const char                      *sys_name;
  90        const char                      *event_name;
  91        pevent_event_handler_func       func;
  92        void                            *context;
  93};
  94
  95struct pevent_func_params {
  96        struct pevent_func_params       *next;
  97        enum pevent_func_arg_type       type;
  98};
  99
 100struct pevent_function_handler {
 101        struct pevent_function_handler  *next;
 102        enum pevent_func_arg_type       ret_type;
 103        char                            *name;
 104        pevent_func_handler             func;
 105        struct pevent_func_params       *params;
 106        int                             nr_args;
 107};
 108
 109static unsigned long long
 110process_defined_func(struct trace_seq *s, void *data, int size,
 111                     struct event_format *event, struct print_arg *arg);
 112
 113static void free_func_handle(struct pevent_function_handler *func);
 114
 115/**
 116 * pevent_buffer_init - init buffer for parsing
 117 * @buf: buffer to parse
 118 * @size: the size of the buffer
 119 *
 120 * For use with pevent_read_token(), this initializes the internal
 121 * buffer that pevent_read_token() will parse.
 122 */
 123void pevent_buffer_init(const char *buf, unsigned long long size)
 124{
 125        init_input_buf(buf, size);
 126}
 127
 128void breakpoint(void)
 129{
 130        static int x;
 131        x++;
 132}
 133
 134struct print_arg *alloc_arg(void)
 135{
 136        return calloc(1, sizeof(struct print_arg));
 137}
 138
 139struct cmdline {
 140        char *comm;
 141        int pid;
 142};
 143
 144static int cmdline_cmp(const void *a, const void *b)
 145{
 146        const struct cmdline *ca = a;
 147        const struct cmdline *cb = b;
 148
 149        if (ca->pid < cb->pid)
 150                return -1;
 151        if (ca->pid > cb->pid)
 152                return 1;
 153
 154        return 0;
 155}
 156
 157struct cmdline_list {
 158        struct cmdline_list     *next;
 159        char                    *comm;
 160        int                     pid;
 161};
 162
 163static int cmdline_init(struct pevent *pevent)
 164{
 165        struct cmdline_list *cmdlist = pevent->cmdlist;
 166        struct cmdline_list *item;
 167        struct cmdline *cmdlines;
 168        int i;
 169
 170        cmdlines = malloc(sizeof(*cmdlines) * pevent->cmdline_count);
 171        if (!cmdlines)
 172                return -1;
 173
 174        i = 0;
 175        while (cmdlist) {
 176                cmdlines[i].pid = cmdlist->pid;
 177                cmdlines[i].comm = cmdlist->comm;
 178                i++;
 179                item = cmdlist;
 180                cmdlist = cmdlist->next;
 181                free(item);
 182        }
 183
 184        qsort(cmdlines, pevent->cmdline_count, sizeof(*cmdlines), cmdline_cmp);
 185
 186        pevent->cmdlines = cmdlines;
 187        pevent->cmdlist = NULL;
 188
 189        return 0;
 190}
 191
 192static const char *find_cmdline(struct pevent *pevent, int pid)
 193{
 194        const struct cmdline *comm;
 195        struct cmdline key;
 196
 197        if (!pid)
 198                return "<idle>";
 199
 200        if (!pevent->cmdlines && cmdline_init(pevent))
 201                return "<not enough memory for cmdlines!>";
 202
 203        key.pid = pid;
 204
 205        comm = bsearch(&key, pevent->cmdlines, pevent->cmdline_count,
 206                       sizeof(*pevent->cmdlines), cmdline_cmp);
 207
 208        if (comm)
 209                return comm->comm;
 210        return "<...>";
 211}
 212
 213/**
 214 * pevent_pid_is_registered - return if a pid has a cmdline registered
 215 * @pevent: handle for the pevent
 216 * @pid: The pid to check if it has a cmdline registered with.
 217 *
 218 * Returns 1 if the pid has a cmdline mapped to it
 219 * 0 otherwise.
 220 */
 221int pevent_pid_is_registered(struct pevent *pevent, int pid)
 222{
 223        const struct cmdline *comm;
 224        struct cmdline key;
 225
 226        if (!pid)
 227                return 1;
 228
 229        if (!pevent->cmdlines && cmdline_init(pevent))
 230                return 0;
 231
 232        key.pid = pid;
 233
 234        comm = bsearch(&key, pevent->cmdlines, pevent->cmdline_count,
 235                       sizeof(*pevent->cmdlines), cmdline_cmp);
 236
 237        if (comm)
 238                return 1;
 239        return 0;
 240}
 241
 242/*
 243 * If the command lines have been converted to an array, then
 244 * we must add this pid. This is much slower than when cmdlines
 245 * are added before the array is initialized.
 246 */
 247static int add_new_comm(struct pevent *pevent, const char *comm, int pid)
 248{
 249        struct cmdline *cmdlines = pevent->cmdlines;
 250        const struct cmdline *cmdline;
 251        struct cmdline key;
 252
 253        if (!pid)
 254                return 0;
 255
 256        /* avoid duplicates */
 257        key.pid = pid;
 258
 259        cmdline = bsearch(&key, pevent->cmdlines, pevent->cmdline_count,
 260                       sizeof(*pevent->cmdlines), cmdline_cmp);
 261        if (cmdline) {
 262                errno = EEXIST;
 263                return -1;
 264        }
 265
 266        cmdlines = realloc(cmdlines, sizeof(*cmdlines) * (pevent->cmdline_count + 1));
 267        if (!cmdlines) {
 268                errno = ENOMEM;
 269                return -1;
 270        }
 271
 272        cmdlines[pevent->cmdline_count].comm = strdup(comm);
 273        if (!cmdlines[pevent->cmdline_count].comm) {
 274                free(cmdlines);
 275                errno = ENOMEM;
 276                return -1;
 277        }
 278
 279        cmdlines[pevent->cmdline_count].pid = pid;
 280                
 281        if (cmdlines[pevent->cmdline_count].comm)
 282                pevent->cmdline_count++;
 283
 284        qsort(cmdlines, pevent->cmdline_count, sizeof(*cmdlines), cmdline_cmp);
 285        pevent->cmdlines = cmdlines;
 286
 287        return 0;
 288}
 289
 290/**
 291 * pevent_register_comm - register a pid / comm mapping
 292 * @pevent: handle for the pevent
 293 * @comm: the command line to register
 294 * @pid: the pid to map the command line to
 295 *
 296 * This adds a mapping to search for command line names with
 297 * a given pid. The comm is duplicated.
 298 */
 299int pevent_register_comm(struct pevent *pevent, const char *comm, int pid)
 300{
 301        struct cmdline_list *item;
 302
 303        if (pevent->cmdlines)
 304                return add_new_comm(pevent, comm, pid);
 305
 306        item = malloc(sizeof(*item));
 307        if (!item)
 308                return -1;
 309
 310        if (comm)
 311                item->comm = strdup(comm);
 312        else
 313                item->comm = strdup("<...>");
 314        if (!item->comm) {
 315                free(item);
 316                return -1;
 317        }
 318        item->pid = pid;
 319        item->next = pevent->cmdlist;
 320
 321        pevent->cmdlist = item;
 322        pevent->cmdline_count++;
 323
 324        return 0;
 325}
 326
 327int pevent_register_trace_clock(struct pevent *pevent, const char *trace_clock)
 328{
 329        pevent->trace_clock = strdup(trace_clock);
 330        if (!pevent->trace_clock) {
 331                errno = ENOMEM;
 332                return -1;
 333        }
 334        return 0;
 335}
 336
 337struct func_map {
 338        unsigned long long              addr;
 339        char                            *func;
 340        char                            *mod;
 341};
 342
 343struct func_list {
 344        struct func_list        *next;
 345        unsigned long long      addr;
 346        char                    *func;
 347        char                    *mod;
 348};
 349
 350static int func_cmp(const void *a, const void *b)
 351{
 352        const struct func_map *fa = a;
 353        const struct func_map *fb = b;
 354
 355        if (fa->addr < fb->addr)
 356                return -1;
 357        if (fa->addr > fb->addr)
 358                return 1;
 359
 360        return 0;
 361}
 362
 363/*
 364 * We are searching for a record in between, not an exact
 365 * match.
 366 */
 367static int func_bcmp(const void *a, const void *b)
 368{
 369        const struct func_map *fa = a;
 370        const struct func_map *fb = b;
 371
 372        if ((fa->addr == fb->addr) ||
 373
 374            (fa->addr > fb->addr &&
 375             fa->addr < (fb+1)->addr))
 376                return 0;
 377
 378        if (fa->addr < fb->addr)
 379                return -1;
 380
 381        return 1;
 382}
 383
 384static int func_map_init(struct pevent *pevent)
 385{
 386        struct func_list *funclist;
 387        struct func_list *item;
 388        struct func_map *func_map;
 389        int i;
 390
 391        func_map = malloc(sizeof(*func_map) * (pevent->func_count + 1));
 392        if (!func_map)
 393                return -1;
 394
 395        funclist = pevent->funclist;
 396
 397        i = 0;
 398        while (funclist) {
 399                func_map[i].func = funclist->func;
 400                func_map[i].addr = funclist->addr;
 401                func_map[i].mod = funclist->mod;
 402                i++;
 403                item = funclist;
 404                funclist = funclist->next;
 405                free(item);
 406        }
 407
 408        qsort(func_map, pevent->func_count, sizeof(*func_map), func_cmp);
 409
 410        /*
 411         * Add a special record at the end.
 412         */
 413        func_map[pevent->func_count].func = NULL;
 414        func_map[pevent->func_count].addr = 0;
 415        func_map[pevent->func_count].mod = NULL;
 416
 417        pevent->func_map = func_map;
 418        pevent->funclist = NULL;
 419
 420        return 0;
 421}
 422
 423static struct func_map *
 424__find_func(struct pevent *pevent, unsigned long long addr)
 425{
 426        struct func_map *func;
 427        struct func_map key;
 428
 429        if (!pevent->func_map)
 430                func_map_init(pevent);
 431
 432        key.addr = addr;
 433
 434        func = bsearch(&key, pevent->func_map, pevent->func_count,
 435                       sizeof(*pevent->func_map), func_bcmp);
 436
 437        return func;
 438}
 439
 440struct func_resolver {
 441        pevent_func_resolver_t *func;
 442        void                   *priv;
 443        struct func_map        map;
 444};
 445
 446/**
 447 * pevent_set_function_resolver - set an alternative function resolver
 448 * @pevent: handle for the pevent
 449 * @resolver: function to be used
 450 * @priv: resolver function private state.
 451 *
 452 * Some tools may have already a way to resolve kernel functions, allow them to
 453 * keep using it instead of duplicating all the entries inside
 454 * pevent->funclist.
 455 */
 456int pevent_set_function_resolver(struct pevent *pevent,
 457                                 pevent_func_resolver_t *func, void *priv)
 458{
 459        struct func_resolver *resolver = malloc(sizeof(*resolver));
 460
 461        if (resolver == NULL)
 462                return -1;
 463
 464        resolver->func = func;
 465        resolver->priv = priv;
 466
 467        free(pevent->func_resolver);
 468        pevent->func_resolver = resolver;
 469
 470        return 0;
 471}
 472
 473/**
 474 * pevent_reset_function_resolver - reset alternative function resolver
 475 * @pevent: handle for the pevent
 476 *
 477 * Stop using whatever alternative resolver was set, use the default
 478 * one instead.
 479 */
 480void pevent_reset_function_resolver(struct pevent *pevent)
 481{
 482        free(pevent->func_resolver);
 483        pevent->func_resolver = NULL;
 484}
 485
 486static struct func_map *
 487find_func(struct pevent *pevent, unsigned long long addr)
 488{
 489        struct func_map *map;
 490
 491        if (!pevent->func_resolver)
 492                return __find_func(pevent, addr);
 493
 494        map = &pevent->func_resolver->map;
 495        map->mod  = NULL;
 496        map->addr = addr;
 497        map->func = pevent->func_resolver->func(pevent->func_resolver->priv,
 498                                                &map->addr, &map->mod);
 499        if (map->func == NULL)
 500                return NULL;
 501
 502        return map;
 503}
 504
 505/**
 506 * pevent_find_function - find a function by a given address
 507 * @pevent: handle for the pevent
 508 * @addr: the address to find the function with
 509 *
 510 * Returns a pointer to the function stored that has the given
 511 * address. Note, the address does not have to be exact, it
 512 * will select the function that would contain the address.
 513 */
 514const char *pevent_find_function(struct pevent *pevent, unsigned long long addr)
 515{
 516        struct func_map *map;
 517
 518        map = find_func(pevent, addr);
 519        if (!map)
 520                return NULL;
 521
 522        return map->func;
 523}
 524
 525/**
 526 * pevent_find_function_address - find a function address by a given address
 527 * @pevent: handle for the pevent
 528 * @addr: the address to find the function with
 529 *
 530 * Returns the address the function starts at. This can be used in
 531 * conjunction with pevent_find_function to print both the function
 532 * name and the function offset.
 533 */
 534unsigned long long
 535pevent_find_function_address(struct pevent *pevent, unsigned long long addr)
 536{
 537        struct func_map *map;
 538
 539        map = find_func(pevent, addr);
 540        if (!map)
 541                return 0;
 542
 543        return map->addr;
 544}
 545
 546/**
 547 * pevent_register_function - register a function with a given address
 548 * @pevent: handle for the pevent
 549 * @function: the function name to register
 550 * @addr: the address the function starts at
 551 * @mod: the kernel module the function may be in (NULL for none)
 552 *
 553 * This registers a function name with an address and module.
 554 * The @func passed in is duplicated.
 555 */
 556int pevent_register_function(struct pevent *pevent, char *func,
 557                             unsigned long long addr, char *mod)
 558{
 559        struct func_list *item = malloc(sizeof(*item));
 560
 561        if (!item)
 562                return -1;
 563
 564        item->next = pevent->funclist;
 565        item->func = strdup(func);
 566        if (!item->func)
 567                goto out_free;
 568
 569        if (mod) {
 570                item->mod = strdup(mod);
 571                if (!item->mod)
 572                        goto out_free_func;
 573        } else
 574                item->mod = NULL;
 575        item->addr = addr;
 576
 577        pevent->funclist = item;
 578        pevent->func_count++;
 579
 580        return 0;
 581
 582out_free_func:
 583        free(item->func);
 584        item->func = NULL;
 585out_free:
 586        free(item);
 587        errno = ENOMEM;
 588        return -1;
 589}
 590
 591/**
 592 * pevent_print_funcs - print out the stored functions
 593 * @pevent: handle for the pevent
 594 *
 595 * This prints out the stored functions.
 596 */
 597void pevent_print_funcs(struct pevent *pevent)
 598{
 599        int i;
 600
 601        if (!pevent->func_map)
 602                func_map_init(pevent);
 603
 604        for (i = 0; i < (int)pevent->func_count; i++) {
 605                printf("%016llx %s",
 606                       pevent->func_map[i].addr,
 607                       pevent->func_map[i].func);
 608                if (pevent->func_map[i].mod)
 609                        printf(" [%s]\n", pevent->func_map[i].mod);
 610                else
 611                        printf("\n");
 612        }
 613}
 614
 615struct printk_map {
 616        unsigned long long              addr;
 617        char                            *printk;
 618};
 619
 620struct printk_list {
 621        struct printk_list      *next;
 622        unsigned long long      addr;
 623        char                    *printk;
 624};
 625
 626static int printk_cmp(const void *a, const void *b)
 627{
 628        const struct printk_map *pa = a;
 629        const struct printk_map *pb = b;
 630
 631        if (pa->addr < pb->addr)
 632                return -1;
 633        if (pa->addr > pb->addr)
 634                return 1;
 635
 636        return 0;
 637}
 638
 639static int printk_map_init(struct pevent *pevent)
 640{
 641        struct printk_list *printklist;
 642        struct printk_list *item;
 643        struct printk_map *printk_map;
 644        int i;
 645
 646        printk_map = malloc(sizeof(*printk_map) * (pevent->printk_count + 1));
 647        if (!printk_map)
 648                return -1;
 649
 650        printklist = pevent->printklist;
 651
 652        i = 0;
 653        while (printklist) {
 654                printk_map[i].printk = printklist->printk;
 655                printk_map[i].addr = printklist->addr;
 656                i++;
 657                item = printklist;
 658                printklist = printklist->next;
 659                free(item);
 660        }
 661
 662        qsort(printk_map, pevent->printk_count, sizeof(*printk_map), printk_cmp);
 663
 664        pevent->printk_map = printk_map;
 665        pevent->printklist = NULL;
 666
 667        return 0;
 668}
 669
 670static struct printk_map *
 671find_printk(struct pevent *pevent, unsigned long long addr)
 672{
 673        struct printk_map *printk;
 674        struct printk_map key;
 675
 676        if (!pevent->printk_map && printk_map_init(pevent))
 677                return NULL;
 678
 679        key.addr = addr;
 680
 681        printk = bsearch(&key, pevent->printk_map, pevent->printk_count,
 682                         sizeof(*pevent->printk_map), printk_cmp);
 683
 684        return printk;
 685}
 686
 687/**
 688 * pevent_register_print_string - register a string by its address
 689 * @pevent: handle for the pevent
 690 * @fmt: the string format to register
 691 * @addr: the address the string was located at
 692 *
 693 * This registers a string by the address it was stored in the kernel.
 694 * The @fmt passed in is duplicated.
 695 */
 696int pevent_register_print_string(struct pevent *pevent, const char *fmt,
 697                                 unsigned long long addr)
 698{
 699        struct printk_list *item = malloc(sizeof(*item));
 700        char *p;
 701
 702        if (!item)
 703                return -1;
 704
 705        item->next = pevent->printklist;
 706        item->addr = addr;
 707
 708        /* Strip off quotes and '\n' from the end */
 709        if (fmt[0] == '"')
 710                fmt++;
 711        item->printk = strdup(fmt);
 712        if (!item->printk)
 713                goto out_free;
 714
 715        p = item->printk + strlen(item->printk) - 1;
 716        if (*p == '"')
 717                *p = 0;
 718
 719        p -= 2;
 720        if (strcmp(p, "\\n") == 0)
 721                *p = 0;
 722
 723        pevent->printklist = item;
 724        pevent->printk_count++;
 725
 726        return 0;
 727
 728out_free:
 729        free(item);
 730        errno = ENOMEM;
 731        return -1;
 732}
 733
 734/**
 735 * pevent_print_printk - print out the stored strings
 736 * @pevent: handle for the pevent
 737 *
 738 * This prints the string formats that were stored.
 739 */
 740void pevent_print_printk(struct pevent *pevent)
 741{
 742        int i;
 743
 744        if (!pevent->printk_map)
 745                printk_map_init(pevent);
 746
 747        for (i = 0; i < (int)pevent->printk_count; i++) {
 748                printf("%016llx %s\n",
 749                       pevent->printk_map[i].addr,
 750                       pevent->printk_map[i].printk);
 751        }
 752}
 753
 754static struct event_format *alloc_event(void)
 755{
 756        return calloc(1, sizeof(struct event_format));
 757}
 758
 759static int add_event(struct pevent *pevent, struct event_format *event)
 760{
 761        int i;
 762        struct event_format **events = realloc(pevent->events, sizeof(event) *
 763                                               (pevent->nr_events + 1));
 764        if (!events)
 765                return -1;
 766
 767        pevent->events = events;
 768
 769        for (i = 0; i < pevent->nr_events; i++) {
 770                if (pevent->events[i]->id > event->id)
 771                        break;
 772        }
 773        if (i < pevent->nr_events)
 774                memmove(&pevent->events[i + 1],
 775                        &pevent->events[i],
 776                        sizeof(event) * (pevent->nr_events - i));
 777
 778        pevent->events[i] = event;
 779        pevent->nr_events++;
 780
 781        event->pevent = pevent;
 782
 783        return 0;
 784}
 785
 786static int event_item_type(enum event_type type)
 787{
 788        switch (type) {
 789        case EVENT_ITEM ... EVENT_SQUOTE:
 790                return 1;
 791        case EVENT_ERROR ... EVENT_DELIM:
 792        default:
 793                return 0;
 794        }
 795}
 796
 797static void free_flag_sym(struct print_flag_sym *fsym)
 798{
 799        struct print_flag_sym *next;
 800
 801        while (fsym) {
 802                next = fsym->next;
 803                free(fsym->value);
 804                free(fsym->str);
 805                free(fsym);
 806                fsym = next;
 807        }
 808}
 809
 810static void free_arg(struct print_arg *arg)
 811{
 812        struct print_arg *farg;
 813
 814        if (!arg)
 815                return;
 816
 817        switch (arg->type) {
 818        case PRINT_ATOM:
 819                free(arg->atom.atom);
 820                break;
 821        case PRINT_FIELD:
 822                free(arg->field.name);
 823                break;
 824        case PRINT_FLAGS:
 825                free_arg(arg->flags.field);
 826                free(arg->flags.delim);
 827                free_flag_sym(arg->flags.flags);
 828                break;
 829        case PRINT_SYMBOL:
 830                free_arg(arg->symbol.field);
 831                free_flag_sym(arg->symbol.symbols);
 832                break;
 833        case PRINT_HEX:
 834        case PRINT_HEX_STR:
 835                free_arg(arg->hex.field);
 836                free_arg(arg->hex.size);
 837                break;
 838        case PRINT_INT_ARRAY:
 839                free_arg(arg->int_array.field);
 840                free_arg(arg->int_array.count);
 841                free_arg(arg->int_array.el_size);
 842                break;
 843        case PRINT_TYPE:
 844                free(arg->typecast.type);
 845                free_arg(arg->typecast.item);
 846                break;
 847        case PRINT_STRING:
 848        case PRINT_BSTRING:
 849                free(arg->string.string);
 850                break;
 851        case PRINT_BITMASK:
 852                free(arg->bitmask.bitmask);
 853                break;
 854        case PRINT_DYNAMIC_ARRAY:
 855        case PRINT_DYNAMIC_ARRAY_LEN:
 856                free(arg->dynarray.index);
 857                break;
 858        case PRINT_OP:
 859                free(arg->op.op);
 860                free_arg(arg->op.left);
 861                free_arg(arg->op.right);
 862                break;
 863        case PRINT_FUNC:
 864                while (arg->func.args) {
 865                        farg = arg->func.args;
 866                        arg->func.args = farg->next;
 867                        free_arg(farg);
 868                }
 869                break;
 870
 871        case PRINT_NULL:
 872        default:
 873                break;
 874        }
 875
 876        free(arg);
 877}
 878
 879static enum event_type get_type(int ch)
 880{
 881        if (ch == '\n')
 882                return EVENT_NEWLINE;
 883        if (isspace(ch))
 884                return EVENT_SPACE;
 885        if (isalnum(ch) || ch == '_')
 886                return EVENT_ITEM;
 887        if (ch == '\'')
 888                return EVENT_SQUOTE;
 889        if (ch == '"')
 890                return EVENT_DQUOTE;
 891        if (!isprint(ch))
 892                return EVENT_NONE;
 893        if (ch == '(' || ch == ')' || ch == ',')
 894                return EVENT_DELIM;
 895
 896        return EVENT_OP;
 897}
 898
 899static int __read_char(void)
 900{
 901        if (input_buf_ptr >= input_buf_siz)
 902                return -1;
 903
 904        return input_buf[input_buf_ptr++];
 905}
 906
 907static int __peek_char(void)
 908{
 909        if (input_buf_ptr >= input_buf_siz)
 910                return -1;
 911
 912        return input_buf[input_buf_ptr];
 913}
 914
 915/**
 916 * pevent_peek_char - peek at the next character that will be read
 917 *
 918 * Returns the next character read, or -1 if end of buffer.
 919 */
 920int pevent_peek_char(void)
 921{
 922        return __peek_char();
 923}
 924
 925static int extend_token(char **tok, char *buf, int size)
 926{
 927        char *newtok = realloc(*tok, size);
 928
 929        if (!newtok) {
 930                free(*tok);
 931                *tok = NULL;
 932                return -1;
 933        }
 934
 935        if (!*tok)
 936                strcpy(newtok, buf);
 937        else
 938                strcat(newtok, buf);
 939        *tok = newtok;
 940
 941        return 0;
 942}
 943
 944static enum event_type force_token(const char *str, char **tok);
 945
 946static enum event_type __read_token(char **tok)
 947{
 948        char buf[BUFSIZ];
 949        int ch, last_ch, quote_ch, next_ch;
 950        int i = 0;
 951        int tok_size = 0;
 952        enum event_type type;
 953
 954        *tok = NULL;
 955
 956
 957        ch = __read_char();
 958        if (ch < 0)
 959                return EVENT_NONE;
 960
 961        type = get_type(ch);
 962        if (type == EVENT_NONE)
 963                return type;
 964
 965        buf[i++] = ch;
 966
 967        switch (type) {
 968        case EVENT_NEWLINE:
 969        case EVENT_DELIM:
 970                if (asprintf(tok, "%c", ch) < 0)
 971                        return EVENT_ERROR;
 972
 973                return type;
 974
 975        case EVENT_OP:
 976                switch (ch) {
 977                case '-':
 978                        next_ch = __peek_char();
 979                        if (next_ch == '>') {
 980                                buf[i++] = __read_char();
 981                                break;
 982                        }
 983                        /* fall through */
 984                case '+':
 985                case '|':
 986                case '&':
 987                case '>':
 988                case '<':
 989                        last_ch = ch;
 990                        ch = __peek_char();
 991                        if (ch != last_ch)
 992                                goto test_equal;
 993                        buf[i++] = __read_char();
 994                        switch (last_ch) {
 995                        case '>':
 996                        case '<':
 997                                goto test_equal;
 998                        default:
 999                                break;
1000                        }
1001                        break;
1002                case '!':
1003                case '=':
1004                        goto test_equal;
1005                default: /* what should we do instead? */
1006                        break;
1007                }
1008                buf[i] = 0;
1009                *tok = strdup(buf);
1010                return type;
1011
1012 test_equal:
1013                ch = __peek_char();
1014                if (ch == '=')
1015                        buf[i++] = __read_char();
1016                goto out;
1017
1018        case EVENT_DQUOTE:
1019        case EVENT_SQUOTE:
1020                /* don't keep quotes */
1021                i--;
1022                quote_ch = ch;
1023                last_ch = 0;
1024 concat:
1025                do {
1026                        if (i == (BUFSIZ - 1)) {
1027                                buf[i] = 0;
1028                                tok_size += BUFSIZ;
1029
1030                                if (extend_token(tok, buf, tok_size) < 0)
1031                                        return EVENT_NONE;
1032                                i = 0;
1033                        }
1034                        last_ch = ch;
1035                        ch = __read_char();
1036                        buf[i++] = ch;
1037                        /* the '\' '\' will cancel itself */
1038                        if (ch == '\\' && last_ch == '\\')
1039                                last_ch = 0;
1040                } while (ch != quote_ch || last_ch == '\\');
1041                /* remove the last quote */
1042                i--;
1043
1044                /*
1045                 * For strings (double quotes) check the next token.
1046                 * If it is another string, concatinate the two.
1047                 */
1048                if (type == EVENT_DQUOTE) {
1049                        unsigned long long save_input_buf_ptr = input_buf_ptr;
1050
1051                        do {
1052                                ch = __read_char();
1053                        } while (isspace(ch));
1054                        if (ch == '"')
1055                                goto concat;
1056                        input_buf_ptr = save_input_buf_ptr;
1057                }
1058
1059                goto out;
1060
1061        case EVENT_ERROR ... EVENT_SPACE:
1062        case EVENT_ITEM:
1063        default:
1064                break;
1065        }
1066
1067        while (get_type(__peek_char()) == type) {
1068                if (i == (BUFSIZ - 1)) {
1069                        buf[i] = 0;
1070                        tok_size += BUFSIZ;
1071
1072                        if (extend_token(tok, buf, tok_size) < 0)
1073                                return EVENT_NONE;
1074                        i = 0;
1075                }
1076                ch = __read_char();
1077                buf[i++] = ch;
1078        }
1079
1080 out:
1081        buf[i] = 0;
1082        if (extend_token(tok, buf, tok_size + i + 1) < 0)
1083                return EVENT_NONE;
1084
1085        if (type == EVENT_ITEM) {
1086                /*
1087                 * Older versions of the kernel has a bug that
1088                 * creates invalid symbols and will break the mac80211
1089                 * parsing. This is a work around to that bug.
1090                 *
1091                 * See Linux kernel commit:
1092                 *  811cb50baf63461ce0bdb234927046131fc7fa8b
1093                 */
1094                if (strcmp(*tok, "LOCAL_PR_FMT") == 0) {
1095                        free(*tok);
1096                        *tok = NULL;
1097                        return force_token("\"\%s\" ", tok);
1098                } else if (strcmp(*tok, "STA_PR_FMT") == 0) {
1099                        free(*tok);
1100                        *tok = NULL;
1101                        return force_token("\" sta:%pM\" ", tok);
1102                } else if (strcmp(*tok, "VIF_PR_FMT") == 0) {
1103                        free(*tok);
1104                        *tok = NULL;
1105                        return force_token("\" vif:%p(%d)\" ", tok);
1106                }
1107        }
1108
1109        return type;
1110}
1111
1112static enum event_type force_token(const char *str, char **tok)
1113{
1114        const char *save_input_buf;
1115        unsigned long long save_input_buf_ptr;
1116        unsigned long long save_input_buf_siz;
1117        enum event_type type;
1118        
1119        /* save off the current input pointers */
1120        save_input_buf = input_buf;
1121        save_input_buf_ptr = input_buf_ptr;
1122        save_input_buf_siz = input_buf_siz;
1123
1124        init_input_buf(str, strlen(str));
1125
1126        type = __read_token(tok);
1127
1128        /* reset back to original token */
1129        input_buf = save_input_buf;
1130        input_buf_ptr = save_input_buf_ptr;
1131        input_buf_siz = save_input_buf_siz;
1132
1133        return type;
1134}
1135
1136static void free_token(char *tok)
1137{
1138        if (tok)
1139                free(tok);
1140}
1141
1142static enum event_type read_token(char **tok)
1143{
1144        enum event_type type;
1145
1146        for (;;) {
1147                type = __read_token(tok);
1148                if (type != EVENT_SPACE)
1149                        return type;
1150
1151                free_token(*tok);
1152        }
1153
1154        /* not reached */
1155        *tok = NULL;
1156        return EVENT_NONE;
1157}
1158
1159/**
1160 * pevent_read_token - access to utilites to use the pevent parser
1161 * @tok: The token to return
1162 *
1163 * This will parse tokens from the string given by
1164 * pevent_init_data().
1165 *
1166 * Returns the token type.
1167 */
1168enum event_type pevent_read_token(char **tok)
1169{
1170        return read_token(tok);
1171}
1172
1173/**
1174 * pevent_free_token - free a token returned by pevent_read_token
1175 * @token: the token to free
1176 */
1177void pevent_free_token(char *token)
1178{
1179        free_token(token);
1180}
1181
1182/* no newline */
1183static enum event_type read_token_item(char **tok)
1184{
1185        enum event_type type;
1186
1187        for (;;) {
1188                type = __read_token(tok);
1189                if (type != EVENT_SPACE && type != EVENT_NEWLINE)
1190                        return type;
1191                free_token(*tok);
1192                *tok = NULL;
1193        }
1194
1195        /* not reached */
1196        *tok = NULL;
1197        return EVENT_NONE;
1198}
1199
1200static int test_type(enum event_type type, enum event_type expect)
1201{
1202        if (type != expect) {
1203                do_warning("Error: expected type %d but read %d",
1204                    expect, type);
1205                return -1;
1206        }
1207        return 0;
1208}
1209
1210static int test_type_token(enum event_type type, const char *token,
1211                    enum event_type expect, const char *expect_tok)
1212{
1213        if (type != expect) {
1214                do_warning("Error: expected type %d but read %d",
1215                    expect, type);
1216                return -1;
1217        }
1218
1219        if (strcmp(token, expect_tok) != 0) {
1220                do_warning("Error: expected '%s' but read '%s'",
1221                    expect_tok, token);
1222                return -1;
1223        }
1224        return 0;
1225}
1226
1227static int __read_expect_type(enum event_type expect, char **tok, int newline_ok)
1228{
1229        enum event_type type;
1230
1231        if (newline_ok)
1232                type = read_token(tok);
1233        else
1234                type = read_token_item(tok);
1235        return test_type(type, expect);
1236}
1237
1238static int read_expect_type(enum event_type expect, char **tok)
1239{
1240        return __read_expect_type(expect, tok, 1);
1241}
1242
1243static int __read_expected(enum event_type expect, const char *str,
1244                           int newline_ok)
1245{
1246        enum event_type type;
1247        char *token;
1248        int ret;
1249
1250        if (newline_ok)
1251                type = read_token(&token);
1252        else
1253                type = read_token_item(&token);
1254
1255        ret = test_type_token(type, token, expect, str);
1256
1257        free_token(token);
1258
1259        return ret;
1260}
1261
1262static int read_expected(enum event_type expect, const char *str)
1263{
1264        return __read_expected(expect, str, 1);
1265}
1266
1267static int read_expected_item(enum event_type expect, const char *str)
1268{
1269        return __read_expected(expect, str, 0);
1270}
1271
1272static char *event_read_name(void)
1273{
1274        char *token;
1275
1276        if (read_expected(EVENT_ITEM, "name") < 0)
1277                return NULL;
1278
1279        if (read_expected(EVENT_OP, ":") < 0)
1280                return NULL;
1281
1282        if (read_expect_type(EVENT_ITEM, &token) < 0)
1283                goto fail;
1284
1285        return token;
1286
1287 fail:
1288        free_token(token);
1289        return NULL;
1290}
1291
1292static int event_read_id(void)
1293{
1294        char *token;
1295        int id;
1296
1297        if (read_expected_item(EVENT_ITEM, "ID") < 0)
1298                return -1;
1299
1300        if (read_expected(EVENT_OP, ":") < 0)
1301                return -1;
1302
1303        if (read_expect_type(EVENT_ITEM, &token) < 0)
1304                goto fail;
1305
1306        id = strtoul(token, NULL, 0);
1307        free_token(token);
1308        return id;
1309
1310 fail:
1311        free_token(token);
1312        return -1;
1313}
1314
1315static int field_is_string(struct format_field *field)
1316{
1317        if ((field->flags & FIELD_IS_ARRAY) &&
1318            (strstr(field->type, "char") || strstr(field->type, "u8") ||
1319             strstr(field->type, "s8")))
1320                return 1;
1321
1322        return 0;
1323}
1324
1325static int field_is_dynamic(struct format_field *field)
1326{
1327        if (strncmp(field->type, "__data_loc", 10) == 0)
1328                return 1;
1329
1330        return 0;
1331}
1332
1333static int field_is_long(struct format_field *field)
1334{
1335        /* includes long long */
1336        if (strstr(field->type, "long"))
1337                return 1;
1338
1339        return 0;
1340}
1341
1342static unsigned int type_size(const char *name)
1343{
1344        /* This covers all FIELD_IS_STRING types. */
1345        static struct {
1346                const char *type;
1347                unsigned int size;
1348        } table[] = {
1349                { "u8",   1 },
1350                { "u16",  2 },
1351                { "u32",  4 },
1352                { "u64",  8 },
1353                { "s8",   1 },
1354                { "s16",  2 },
1355                { "s32",  4 },
1356                { "s64",  8 },
1357                { "char", 1 },
1358                { },
1359        };
1360        int i;
1361
1362        for (i = 0; table[i].type; i++) {
1363                if (!strcmp(table[i].type, name))
1364                        return table[i].size;
1365        }
1366
1367        return 0;
1368}
1369
1370static int event_read_fields(struct event_format *event, struct format_field **fields)
1371{
1372        struct format_field *field = NULL;
1373        enum event_type type;
1374        char *token;
1375        char *last_token;
1376        int count = 0;
1377
1378        do {
1379                unsigned int size_dynamic = 0;
1380
1381                type = read_token(&token);
1382                if (type == EVENT_NEWLINE) {
1383                        free_token(token);
1384                        return count;
1385                }
1386
1387                count++;
1388
1389                if (test_type_token(type, token, EVENT_ITEM, "field"))
1390                        goto fail;
1391                free_token(token);
1392
1393                type = read_token(&token);
1394                /*
1395                 * The ftrace fields may still use the "special" name.
1396                 * Just ignore it.
1397                 */
1398                if (event->flags & EVENT_FL_ISFTRACE &&
1399                    type == EVENT_ITEM && strcmp(token, "special") == 0) {
1400                        free_token(token);
1401                        type = read_token(&token);
1402                }
1403
1404                if (test_type_token(type, token, EVENT_OP, ":") < 0)
1405                        goto fail;
1406
1407                free_token(token);
1408                if (read_expect_type(EVENT_ITEM, &token) < 0)
1409                        goto fail;
1410
1411                last_token = token;
1412
1413                field = calloc(1, sizeof(*field));
1414                if (!field)
1415                        goto fail;
1416
1417                field->event = event;
1418
1419                /* read the rest of the type */
1420                for (;;) {
1421                        type = read_token(&token);
1422                        if (type == EVENT_ITEM ||
1423                            (type == EVENT_OP && strcmp(token, "*") == 0) ||
1424                            /*
1425                             * Some of the ftrace fields are broken and have
1426                             * an illegal "." in them.
1427                             */
1428                            (event->flags & EVENT_FL_ISFTRACE &&
1429                             type == EVENT_OP && strcmp(token, ".") == 0)) {
1430
1431                                if (strcmp(token, "*") == 0)
1432                                        field->flags |= FIELD_IS_POINTER;
1433
1434                                if (field->type) {
1435                                        char *new_type;
1436                                        new_type = realloc(field->type,
1437                                                           strlen(field->type) +
1438                                                           strlen(last_token) + 2);
1439                                        if (!new_type) {
1440                                                free(last_token);
1441                                                goto fail;
1442                                        }
1443                                        field->type = new_type;
1444                                        strcat(field->type, " ");
1445                                        strcat(field->type, last_token);
1446                                        free(last_token);
1447                                } else
1448                                        field->type = last_token;
1449                                last_token = token;
1450                                continue;
1451                        }
1452
1453                        break;
1454                }
1455
1456                if (!field->type) {
1457                        do_warning_event(event, "%s: no type found", __func__);
1458                        goto fail;
1459                }
1460                field->name = field->alias = last_token;
1461
1462                if (test_type(type, EVENT_OP))
1463                        goto fail;
1464
1465                if (strcmp(token, "[") == 0) {
1466                        enum event_type last_type = type;
1467                        char *brackets = token;
1468                        char *new_brackets;
1469                        int len;
1470
1471                        field->flags |= FIELD_IS_ARRAY;
1472
1473                        type = read_token(&token);
1474
1475                        if (type == EVENT_ITEM)
1476                                field->arraylen = strtoul(token, NULL, 0);
1477                        else
1478                                field->arraylen = 0;
1479
1480                        while (strcmp(token, "]") != 0) {
1481                                if (last_type == EVENT_ITEM &&
1482                                    type == EVENT_ITEM)
1483                                        len = 2;
1484                                else
1485                                        len = 1;
1486                                last_type = type;
1487
1488                                new_brackets = realloc(brackets,
1489                                                       strlen(brackets) +
1490                                                       strlen(token) + len);
1491                                if (!new_brackets) {
1492                                        free(brackets);
1493                                        goto fail;
1494                                }
1495                                brackets = new_brackets;
1496                                if (len == 2)
1497                                        strcat(brackets, " ");
1498                                strcat(brackets, token);
1499                                /* We only care about the last token */
1500                                field->arraylen = strtoul(token, NULL, 0);
1501                                free_token(token);
1502                                type = read_token(&token);
1503                                if (type == EVENT_NONE) {
1504                                        do_warning_event(event, "failed to find token");
1505                                        goto fail;
1506                                }
1507                        }
1508
1509                        free_token(token);
1510
1511                        new_brackets = realloc(brackets, strlen(brackets) + 2);
1512                        if (!new_brackets) {
1513                                free(brackets);
1514                                goto fail;
1515                        }
1516                        brackets = new_brackets;
1517                        strcat(brackets, "]");
1518
1519                        /* add brackets to type */
1520
1521                        type = read_token(&token);
1522                        /*
1523                         * If the next token is not an OP, then it is of
1524                         * the format: type [] item;
1525                         */
1526                        if (type == EVENT_ITEM) {
1527                                char *new_type;
1528                                new_type = realloc(field->type,
1529                                                   strlen(field->type) +
1530                                                   strlen(field->name) +
1531                                                   strlen(brackets) + 2);
1532                                if (!new_type) {
1533                                        free(brackets);
1534                                        goto fail;
1535                                }
1536                                field->type = new_type;
1537                                strcat(field->type, " ");
1538                                strcat(field->type, field->name);
1539                                size_dynamic = type_size(field->name);
1540                                free_token(field->name);
1541                                strcat(field->type, brackets);
1542                                field->name = field->alias = token;
1543                                type = read_token(&token);
1544                        } else {
1545                                char *new_type;
1546                                new_type = realloc(field->type,
1547                                                   strlen(field->type) +
1548                                                   strlen(brackets) + 1);
1549                                if (!new_type) {
1550                                        free(brackets);
1551                                        goto fail;
1552                                }
1553                                field->type = new_type;
1554                                strcat(field->type, brackets);
1555                        }
1556                        free(brackets);
1557                }
1558
1559                if (field_is_string(field))
1560                        field->flags |= FIELD_IS_STRING;
1561                if (field_is_dynamic(field))
1562                        field->flags |= FIELD_IS_DYNAMIC;
1563                if (field_is_long(field))
1564                        field->flags |= FIELD_IS_LONG;
1565
1566                if (test_type_token(type, token,  EVENT_OP, ";"))
1567                        goto fail;
1568                free_token(token);
1569
1570                if (read_expected(EVENT_ITEM, "offset") < 0)
1571                        goto fail_expect;
1572
1573                if (read_expected(EVENT_OP, ":") < 0)
1574                        goto fail_expect;
1575
1576                if (read_expect_type(EVENT_ITEM, &token))
1577                        goto fail;
1578                field->offset = strtoul(token, NULL, 0);
1579                free_token(token);
1580
1581                if (read_expected(EVENT_OP, ";") < 0)
1582                        goto fail_expect;
1583
1584                if (read_expected(EVENT_ITEM, "size") < 0)
1585                        goto fail_expect;
1586
1587                if (read_expected(EVENT_OP, ":") < 0)
1588                        goto fail_expect;
1589
1590                if (read_expect_type(EVENT_ITEM, &token))
1591                        goto fail;
1592                field->size = strtoul(token, NULL, 0);
1593                free_token(token);
1594
1595                if (read_expected(EVENT_OP, ";") < 0)
1596                        goto fail_expect;
1597
1598                type = read_token(&token);
1599                if (type != EVENT_NEWLINE) {
1600                        /* newer versions of the kernel have a "signed" type */
1601                        if (test_type_token(type, token, EVENT_ITEM, "signed"))
1602                                goto fail;
1603
1604                        free_token(token);
1605
1606                        if (read_expected(EVENT_OP, ":") < 0)
1607                                goto fail_expect;
1608
1609                        if (read_expect_type(EVENT_ITEM, &token))
1610                                goto fail;
1611
1612                        if (strtoul(token, NULL, 0))
1613                                field->flags |= FIELD_IS_SIGNED;
1614
1615                        free_token(token);
1616                        if (read_expected(EVENT_OP, ";") < 0)
1617                                goto fail_expect;
1618
1619                        if (read_expect_type(EVENT_NEWLINE, &token))
1620                                goto fail;
1621                }
1622
1623                free_token(token);
1624
1625                if (field->flags & FIELD_IS_ARRAY) {
1626                        if (field->arraylen)
1627                                field->elementsize = field->size / field->arraylen;
1628                        else if (field->flags & FIELD_IS_DYNAMIC)
1629                                field->elementsize = size_dynamic;
1630                        else if (field->flags & FIELD_IS_STRING)
1631                                field->elementsize = 1;
1632                        else if (field->flags & FIELD_IS_LONG)
1633                                field->elementsize = event->pevent ?
1634                                                     event->pevent->long_size :
1635                                                     sizeof(long);
1636                } else
1637                        field->elementsize = field->size;
1638
1639                *fields = field;
1640                fields = &field->next;
1641
1642        } while (1);
1643
1644        return 0;
1645
1646fail:
1647        free_token(token);
1648fail_expect:
1649        if (field) {
1650                free(field->type);
1651                free(field->name);
1652                free(field);
1653        }
1654        return -1;
1655}
1656
1657static int event_read_format(struct event_format *event)
1658{
1659        char *token;
1660        int ret;
1661
1662        if (read_expected_item(EVENT_ITEM, "format") < 0)
1663                return -1;
1664
1665        if (read_expected(EVENT_OP, ":") < 0)
1666                return -1;
1667
1668        if (read_expect_type(EVENT_NEWLINE, &token))
1669                goto fail;
1670        free_token(token);
1671
1672        ret = event_read_fields(event, &event->format.common_fields);
1673        if (ret < 0)
1674                return ret;
1675        event->format.nr_common = ret;
1676
1677        ret = event_read_fields(event, &event->format.fields);
1678        if (ret < 0)
1679                return ret;
1680        event->format.nr_fields = ret;
1681
1682        return 0;
1683
1684 fail:
1685        free_token(token);
1686        return -1;
1687}
1688
1689static enum event_type
1690process_arg_token(struct event_format *event, struct print_arg *arg,
1691                  char **tok, enum event_type type);
1692
1693static enum event_type
1694process_arg(struct event_format *event, struct print_arg *arg, char **tok)
1695{
1696        enum event_type type;
1697        char *token;
1698
1699        type = read_token(&token);
1700        *tok = token;
1701
1702        return process_arg_token(event, arg, tok, type);
1703}
1704
1705static enum event_type
1706process_op(struct event_format *event, struct print_arg *arg, char **tok);
1707
1708/*
1709 * For __print_symbolic() and __print_flags, we need to completely
1710 * evaluate the first argument, which defines what to print next.
1711 */
1712static enum event_type
1713process_field_arg(struct event_format *event, struct print_arg *arg, char **tok)
1714{
1715        enum event_type type;
1716
1717        type = process_arg(event, arg, tok);
1718
1719        while (type == EVENT_OP) {
1720                type = process_op(event, arg, tok);
1721        }
1722
1723        return type;
1724}
1725
1726static enum event_type
1727process_cond(struct event_format *event, struct print_arg *top, char **tok)
1728{
1729        struct print_arg *arg, *left, *right;
1730        enum event_type type;
1731        char *token = NULL;
1732
1733        arg = alloc_arg();
1734        left = alloc_arg();
1735        right = alloc_arg();
1736
1737        if (!arg || !left || !right) {
1738                do_warning_event(event, "%s: not enough memory!", __func__);
1739                /* arg will be freed at out_free */
1740                free_arg(left);
1741                free_arg(right);
1742                goto out_free;
1743        }
1744
1745        arg->type = PRINT_OP;
1746        arg->op.left = left;
1747        arg->op.right = right;
1748
1749        *tok = NULL;
1750        type = process_arg(event, left, &token);
1751
1752 again:
1753        if (type == EVENT_ERROR)
1754                goto out_free;
1755
1756        /* Handle other operations in the arguments */
1757        if (type == EVENT_OP && strcmp(token, ":") != 0) {
1758                type = process_op(event, left, &token);
1759                goto again;
1760        }
1761
1762        if (test_type_token(type, token, EVENT_OP, ":"))
1763                goto out_free;
1764
1765        arg->op.op = token;
1766
1767        type = process_arg(event, right, &token);
1768
1769        top->op.right = arg;
1770
1771        *tok = token;
1772        return type;
1773
1774out_free:
1775        /* Top may point to itself */
1776        top->op.right = NULL;
1777        free_token(token);
1778        free_arg(arg);
1779        return EVENT_ERROR;
1780}
1781
1782static enum event_type
1783process_array(struct event_format *event, struct print_arg *top, char **tok)
1784{
1785        struct print_arg *arg;
1786        enum event_type type;
1787        char *token = NULL;
1788
1789        arg = alloc_arg();
1790        if (!arg) {
1791                do_warning_event(event, "%s: not enough memory!", __func__);
1792                /* '*tok' is set to top->op.op.  No need to free. */
1793                *tok = NULL;
1794                return EVENT_ERROR;
1795        }
1796
1797        *tok = NULL;
1798        type = process_arg(event, arg, &token);
1799        if (test_type_token(type, token, EVENT_OP, "]"))
1800                goto out_free;
1801
1802        top->op.right = arg;
1803
1804        free_token(token);
1805        type = read_token_item(&token);
1806        *tok = token;
1807
1808        return type;
1809
1810out_free:
1811        free_token(token);
1812        free_arg(arg);
1813        return EVENT_ERROR;
1814}
1815
1816static int get_op_prio(char *op)
1817{
1818        if (!op[1]) {
1819                switch (op[0]) {
1820                case '~':
1821                case '!':
1822                        return 4;
1823                case '*':
1824                case '/':
1825                case '%':
1826                        return 6;
1827                case '+':
1828                case '-':
1829                        return 7;
1830                        /* '>>' and '<<' are 8 */
1831                case '<':
1832                case '>':
1833                        return 9;
1834                        /* '==' and '!=' are 10 */
1835                case '&':
1836                        return 11;
1837                case '^':
1838                        return 12;
1839                case '|':
1840                        return 13;
1841                case '?':
1842                        return 16;
1843                default:
1844                        do_warning("unknown op '%c'", op[0]);
1845                        return -1;
1846                }
1847        } else {
1848                if (strcmp(op, "++") == 0 ||
1849                    strcmp(op, "--") == 0) {
1850                        return 3;
1851                } else if (strcmp(op, ">>") == 0 ||
1852                           strcmp(op, "<<") == 0) {
1853                        return 8;
1854                } else if (strcmp(op, ">=") == 0 ||
1855                           strcmp(op, "<=") == 0) {
1856                        return 9;
1857                } else if (strcmp(op, "==") == 0 ||
1858                           strcmp(op, "!=") == 0) {
1859                        return 10;
1860                } else if (strcmp(op, "&&") == 0) {
1861                        return 14;
1862                } else if (strcmp(op, "||") == 0) {
1863                        return 15;
1864                } else {
1865                        do_warning("unknown op '%s'", op);
1866                        return -1;
1867                }
1868        }
1869}
1870
1871static int set_op_prio(struct print_arg *arg)
1872{
1873
1874        /* single ops are the greatest */
1875        if (!arg->op.left || arg->op.left->type == PRINT_NULL)
1876                arg->op.prio = 0;
1877        else
1878                arg->op.prio = get_op_prio(arg->op.op);
1879
1880        return arg->op.prio;
1881}
1882
1883/* Note, *tok does not get freed, but will most likely be saved */
1884static enum event_type
1885process_op(struct event_format *event, struct print_arg *arg, char **tok)
1886{
1887        struct print_arg *left, *right = NULL;
1888        enum event_type type;
1889        char *token;
1890
1891        /* the op is passed in via tok */
1892        token = *tok;
1893
1894        if (arg->type == PRINT_OP && !arg->op.left) {
1895                /* handle single op */
1896                if (token[1]) {
1897                        do_warning_event(event, "bad op token %s", token);
1898                        goto out_free;
1899                }
1900                switch (token[0]) {
1901                case '~':
1902                case '!':
1903                case '+':
1904                case '-':
1905                        break;
1906                default:
1907                        do_warning_event(event, "bad op token %s", token);
1908                        goto out_free;
1909
1910                }
1911
1912                /* make an empty left */
1913                left = alloc_arg();
1914                if (!left)
1915                        goto out_warn_free;
1916
1917                left->type = PRINT_NULL;
1918                arg->op.left = left;
1919
1920                right = alloc_arg();
1921                if (!right)
1922                        goto out_warn_free;
1923
1924                arg->op.right = right;
1925
1926                /* do not free the token, it belongs to an op */
1927                *tok = NULL;
1928                type = process_arg(event, right, tok);
1929
1930        } else if (strcmp(token, "?") == 0) {
1931
1932                left = alloc_arg();
1933                if (!left)
1934                        goto out_warn_free;
1935
1936                /* copy the top arg to the left */
1937                *left = *arg;
1938
1939                arg->type = PRINT_OP;
1940                arg->op.op = token;
1941                arg->op.left = left;
1942                arg->op.prio = 0;
1943
1944                /* it will set arg->op.right */
1945                type = process_cond(event, arg, tok);
1946
1947        } else if (strcmp(token, ">>") == 0 ||
1948                   strcmp(token, "<<") == 0 ||
1949                   strcmp(token, "&") == 0 ||
1950                   strcmp(token, "|") == 0 ||
1951                   strcmp(token, "&&") == 0 ||
1952                   strcmp(token, "||") == 0 ||
1953                   strcmp(token, "-") == 0 ||
1954                   strcmp(token, "+") == 0 ||
1955                   strcmp(token, "*") == 0 ||
1956                   strcmp(token, "^") == 0 ||
1957                   strcmp(token, "/") == 0 ||
1958                   strcmp(token, "%") == 0 ||
1959                   strcmp(token, "<") == 0 ||
1960                   strcmp(token, ">") == 0 ||
1961                   strcmp(token, "<=") == 0 ||
1962                   strcmp(token, ">=") == 0 ||
1963                   strcmp(token, "==") == 0 ||
1964                   strcmp(token, "!=") == 0) {
1965
1966                left = alloc_arg();
1967                if (!left)
1968                        goto out_warn_free;
1969
1970                /* copy the top arg to the left */
1971                *left = *arg;
1972
1973                arg->type = PRINT_OP;
1974                arg->op.op = token;
1975                arg->op.left = left;
1976                arg->op.right = NULL;
1977
1978                if (set_op_prio(arg) == -1) {
1979                        event->flags |= EVENT_FL_FAILED;
1980                        /* arg->op.op (= token) will be freed at out_free */
1981                        arg->op.op = NULL;
1982                        goto out_free;
1983                }
1984
1985                type = read_token_item(&token);
1986                *tok = token;
1987
1988                /* could just be a type pointer */
1989                if ((strcmp(arg->op.op, "*") == 0) &&
1990                    type == EVENT_DELIM && (strcmp(token, ")") == 0)) {
1991                        char *new_atom;
1992
1993                        if (left->type != PRINT_ATOM) {
1994                                do_warning_event(event, "bad pointer type");
1995                                goto out_free;
1996                        }
1997                        new_atom = realloc(left->atom.atom,
1998                                            strlen(left->atom.atom) + 3);
1999                        if (!new_atom)
2000                                goto out_warn_free;
2001
2002                        left->atom.atom = new_atom;
2003                        strcat(left->atom.atom, " *");
2004                        free(arg->op.op);
2005                        *arg = *left;
2006                        free(left);
2007
2008                        return type;
2009                }
2010
2011                right = alloc_arg();
2012                if (!right)
2013                        goto out_warn_free;
2014
2015                type = process_arg_token(event, right, tok, type);
2016                if (type == EVENT_ERROR) {
2017                        free_arg(right);
2018                        /* token was freed in process_arg_token() via *tok */
2019                        token = NULL;
2020                        goto out_free;
2021                }
2022
2023                if (right->type == PRINT_OP &&
2024                    get_op_prio(arg->op.op) < get_op_prio(right->op.op)) {
2025                        struct print_arg tmp;
2026
2027                        /* rotate ops according to the priority */
2028                        arg->op.right = right->op.left;
2029
2030                        tmp = *arg;
2031                        *arg = *right;
2032                        *right = tmp;
2033
2034                        arg->op.left = right;
2035                } else {
2036                        arg->op.right = right;
2037                }
2038
2039        } else if (strcmp(token, "[") == 0) {
2040
2041                left = alloc_arg();
2042                if (!left)
2043                        goto out_warn_free;
2044
2045                *left = *arg;
2046
2047                arg->type = PRINT_OP;
2048                arg->op.op = token;
2049                arg->op.left = left;
2050
2051                arg->op.prio = 0;
2052
2053                /* it will set arg->op.right */
2054                type = process_array(event, arg, tok);
2055
2056        } else {
2057                do_warning_event(event, "unknown op '%s'", token);
2058                event->flags |= EVENT_FL_FAILED;
2059                /* the arg is now the left side */
2060                goto out_free;
2061        }
2062
2063        if (type == EVENT_OP && strcmp(*tok, ":") != 0) {
2064                int prio;
2065
2066                /* higher prios need to be closer to the root */
2067                prio = get_op_prio(*tok);
2068
2069                if (prio > arg->op.prio)
2070                        return process_op(event, arg, tok);
2071
2072                return process_op(event, right, tok);
2073        }
2074
2075        return type;
2076
2077out_warn_free:
2078        do_warning_event(event, "%s: not enough memory!", __func__);
2079out_free:
2080        free_token(token);
2081        *tok = NULL;
2082        return EVENT_ERROR;
2083}
2084
2085static enum event_type
2086process_entry(struct event_format *event __maybe_unused, struct print_arg *arg,
2087              char **tok)
2088{
2089        enum event_type type;
2090        char *field;
2091        char *token;
2092
2093        if (read_expected(EVENT_OP, "->") < 0)
2094                goto out_err;
2095
2096        if (read_expect_type(EVENT_ITEM, &token) < 0)
2097                goto out_free;
2098        field = token;
2099
2100        arg->type = PRINT_FIELD;
2101        arg->field.name = field;
2102
2103        if (is_flag_field) {
2104                arg->field.field = pevent_find_any_field(event, arg->field.name);
2105                arg->field.field->flags |= FIELD_IS_FLAG;
2106                is_flag_field = 0;
2107        } else if (is_symbolic_field) {
2108                arg->field.field = pevent_find_any_field(event, arg->field.name);
2109                arg->field.field->flags |= FIELD_IS_SYMBOLIC;
2110                is_symbolic_field = 0;
2111        }
2112
2113        type = read_token(&token);
2114        *tok = token;
2115
2116        return type;
2117
2118 out_free:
2119        free_token(token);
2120 out_err:
2121        *tok = NULL;
2122        return EVENT_ERROR;
2123}
2124
2125static int alloc_and_process_delim(struct event_format *event, char *next_token,
2126                                   struct print_arg **print_arg)
2127{
2128        struct print_arg *field;
2129        enum event_type type;
2130        char *token;
2131        int ret = 0;
2132
2133        field = alloc_arg();
2134        if (!field) {
2135                do_warning_event(event, "%s: not enough memory!", __func__);
2136                errno = ENOMEM;
2137                return -1;
2138        }
2139
2140        type = process_arg(event, field, &token);
2141
2142        if (test_type_token(type, token, EVENT_DELIM, next_token)) {
2143                errno = EINVAL;
2144                ret = -1;
2145                free_arg(field);
2146                goto out_free_token;
2147        }
2148
2149        *print_arg = field;
2150
2151out_free_token:
2152        free_token(token);
2153
2154        return ret;
2155}
2156
2157static char *arg_eval (struct print_arg *arg);
2158
2159static unsigned long long
2160eval_type_str(unsigned long long val, const char *type, int pointer)
2161{
2162        int sign = 0;
2163        char *ref;
2164        int len;
2165
2166        len = strlen(type);
2167
2168        if (pointer) {
2169
2170                if (type[len-1] != '*') {
2171                        do_warning("pointer expected with non pointer type");
2172                        return val;
2173                }
2174
2175                ref = malloc(len);
2176                if (!ref) {
2177                        do_warning("%s: not enough memory!", __func__);
2178                        return val;
2179                }
2180                memcpy(ref, type, len);
2181
2182                /* chop off the " *" */
2183                ref[len - 2] = 0;
2184
2185                val = eval_type_str(val, ref, 0);
2186                free(ref);
2187                return val;
2188        }
2189
2190        /* check if this is a pointer */
2191        if (type[len - 1] == '*')
2192                return val;
2193
2194        /* Try to figure out the arg size*/
2195        if (strncmp(type, "struct", 6) == 0)
2196                /* all bets off */
2197                return val;
2198
2199        if (strcmp(type, "u8") == 0)
2200                return val & 0xff;
2201
2202        if (strcmp(type, "u16") == 0)
2203                return val & 0xffff;
2204
2205        if (strcmp(type, "u32") == 0)
2206                return val & 0xffffffff;
2207
2208        if (strcmp(type, "u64") == 0 ||
2209            strcmp(type, "s64"))
2210                return val;
2211
2212        if (strcmp(type, "s8") == 0)
2213                return (unsigned long long)(char)val & 0xff;
2214
2215        if (strcmp(type, "s16") == 0)
2216                return (unsigned long long)(short)val & 0xffff;
2217
2218        if (strcmp(type, "s32") == 0)
2219                return (unsigned long long)(int)val & 0xffffffff;
2220
2221        if (strncmp(type, "unsigned ", 9) == 0) {
2222                sign = 0;
2223                type += 9;
2224        }
2225
2226        if (strcmp(type, "char") == 0) {
2227                if (sign)
2228                        return (unsigned long long)(char)val & 0xff;
2229                else
2230                        return val & 0xff;
2231        }
2232
2233        if (strcmp(type, "short") == 0) {
2234                if (sign)
2235                        return (unsigned long long)(short)val & 0xffff;
2236                else
2237                        return val & 0xffff;
2238        }
2239
2240        if (strcmp(type, "int") == 0) {
2241                if (sign)
2242                        return (unsigned long long)(int)val & 0xffffffff;
2243                else
2244                        return val & 0xffffffff;
2245        }
2246
2247        return val;
2248}
2249
2250/*
2251 * Try to figure out the type.
2252 */
2253static unsigned long long
2254eval_type(unsigned long long val, struct print_arg *arg, int pointer)
2255{
2256        if (arg->type != PRINT_TYPE) {
2257                do_warning("expected type argument");
2258                return 0;
2259        }
2260
2261        return eval_type_str(val, arg->typecast.type, pointer);
2262}
2263
2264static int arg_num_eval(struct print_arg *arg, long long *val)
2265{
2266        long long left, right;
2267        int ret = 1;
2268
2269        switch (arg->type) {
2270        case PRINT_ATOM:
2271                *val = strtoll(arg->atom.atom, NULL, 0);
2272                break;
2273        case PRINT_TYPE:
2274                ret = arg_num_eval(arg->typecast.item, val);
2275                if (!ret)
2276                        break;
2277                *val = eval_type(*val, arg, 0);
2278                break;
2279        case PRINT_OP:
2280                switch (arg->op.op[0]) {
2281                case '|':
2282                        ret = arg_num_eval(arg->op.left, &left);
2283                        if (!ret)
2284                                break;
2285                        ret = arg_num_eval(arg->op.right, &right);
2286                        if (!ret)
2287                                break;
2288                        if (arg->op.op[1])
2289                                *val = left || right;
2290                        else
2291                                *val = left | right;
2292                        break;
2293                case '&':
2294                        ret = arg_num_eval(arg->op.left, &left);
2295                        if (!ret)
2296                                break;
2297                        ret = arg_num_eval(arg->op.right, &right);
2298                        if (!ret)
2299                                break;
2300                        if (arg->op.op[1])
2301                                *val = left && right;
2302                        else
2303                                *val = left & right;
2304                        break;
2305                case '<':
2306                        ret = arg_num_eval(arg->op.left, &left);
2307                        if (!ret)
2308                                break;
2309                        ret = arg_num_eval(arg->op.right, &right);
2310                        if (!ret)
2311                                break;
2312                        switch (arg->op.op[1]) {
2313                        case 0:
2314                                *val = left < right;
2315                                break;
2316                        case '<':
2317                                *val = left << right;
2318                                break;
2319                        case '=':
2320                                *val = left <= right;
2321                                break;
2322                        default:
2323                                do_warning("unknown op '%s'", arg->op.op);
2324                                ret = 0;
2325                        }
2326                        break;
2327                case '>':
2328                        ret = arg_num_eval(arg->op.left, &left);
2329                        if (!ret)
2330                                break;
2331                        ret = arg_num_eval(arg->op.right, &right);
2332                        if (!ret)
2333                                break;
2334                        switch (arg->op.op[1]) {
2335                        case 0:
2336                                *val = left > right;
2337                                break;
2338                        case '>':
2339                                *val = left >> right;
2340                                break;
2341                        case '=':
2342                                *val = left >= right;
2343                                break;
2344                        default:
2345                                do_warning("unknown op '%s'", arg->op.op);
2346                                ret = 0;
2347                        }
2348                        break;
2349                case '=':
2350                        ret = arg_num_eval(arg->op.left, &left);
2351                        if (!ret)
2352                                break;
2353                        ret = arg_num_eval(arg->op.right, &right);
2354                        if (!ret)
2355                                break;
2356
2357                        if (arg->op.op[1] != '=') {
2358                                do_warning("unknown op '%s'", arg->op.op);
2359                                ret = 0;
2360                        } else
2361                                *val = left == right;
2362                        break;
2363                case '!':
2364                        ret = arg_num_eval(arg->op.left, &left);
2365                        if (!ret)
2366                                break;
2367                        ret = arg_num_eval(arg->op.right, &right);
2368                        if (!ret)
2369                                break;
2370
2371                        switch (arg->op.op[1]) {
2372                        case '=':
2373                                *val = left != right;
2374                                break;
2375                        default:
2376                                do_warning("unknown op '%s'", arg->op.op);
2377                                ret = 0;
2378                        }
2379                        break;
2380                case '-':
2381                        /* check for negative */
2382                        if (arg->op.left->type == PRINT_NULL)
2383                                left = 0;
2384                        else
2385                                ret = arg_num_eval(arg->op.left, &left);
2386                        if (!ret)
2387                                break;
2388                        ret = arg_num_eval(arg->op.right, &right);
2389                        if (!ret)
2390                                break;
2391                        *val = left - right;
2392                        break;
2393                case '+':
2394                        if (arg->op.left->type == PRINT_NULL)
2395                                left = 0;
2396                        else
2397                                ret = arg_num_eval(arg->op.left, &left);
2398                        if (!ret)
2399                                break;
2400                        ret = arg_num_eval(arg->op.right, &right);
2401                        if (!ret)
2402                                break;
2403                        *val = left + right;
2404                        break;
2405                case '~':
2406                        ret = arg_num_eval(arg->op.right, &right);
2407                        if (!ret)
2408                                break;
2409                        *val = ~right;
2410                        break;
2411                default:
2412                        do_warning("unknown op '%s'", arg->op.op);
2413                        ret = 0;
2414                }
2415                break;
2416
2417        case PRINT_NULL:
2418        case PRINT_FIELD ... PRINT_SYMBOL:
2419        case PRINT_STRING:
2420        case PRINT_BSTRING:
2421        case PRINT_BITMASK:
2422        default:
2423                do_warning("invalid eval type %d", arg->type);
2424                ret = 0;
2425
2426        }
2427        return ret;
2428}
2429
2430static char *arg_eval (struct print_arg *arg)
2431{
2432        long long val;
2433        static char buf[20];
2434
2435        switch (arg->type) {
2436        case PRINT_ATOM:
2437                return arg->atom.atom;
2438        case PRINT_TYPE:
2439                return arg_eval(arg->typecast.item);
2440        case PRINT_OP:
2441                if (!arg_num_eval(arg, &val))
2442                        break;
2443                sprintf(buf, "%lld", val);
2444                return buf;
2445
2446        case PRINT_NULL:
2447        case PRINT_FIELD ... PRINT_SYMBOL:
2448        case PRINT_STRING:
2449        case PRINT_BSTRING:
2450        case PRINT_BITMASK:
2451        default:
2452                do_warning("invalid eval type %d", arg->type);
2453                break;
2454        }
2455
2456        return NULL;
2457}
2458
2459static enum event_type
2460process_fields(struct event_format *event, struct print_flag_sym **list, char **tok)
2461{
2462        enum event_type type;
2463        struct print_arg *arg = NULL;
2464        struct print_flag_sym *field;
2465        char *token = *tok;
2466        char *value;
2467
2468        do {
2469                free_token(token);
2470                type = read_token_item(&token);
2471                if (test_type_token(type, token, EVENT_OP, "{"))
2472                        break;
2473
2474                arg = alloc_arg();
2475                if (!arg)
2476                        goto out_free;
2477
2478                free_token(token);
2479                type = process_arg(event, arg, &token);
2480
2481                if (type == EVENT_OP)
2482                        type = process_op(event, arg, &token);
2483
2484                if (type == EVENT_ERROR)
2485                        goto out_free;
2486
2487                if (test_type_token(type, token, EVENT_DELIM, ","))
2488                        goto out_free;
2489
2490                field = calloc(1, sizeof(*field));
2491                if (!field)
2492                        goto out_free;
2493
2494                value = arg_eval(arg);
2495                if (value == NULL)
2496                        goto out_free_field;
2497                field->value = strdup(value);
2498                if (field->value == NULL)
2499                        goto out_free_field;
2500
2501                free_arg(arg);
2502                arg = alloc_arg();
2503                if (!arg)
2504                        goto out_free;
2505
2506                free_token(token);
2507                type = process_arg(event, arg, &token);
2508                if (test_type_token(type, token, EVENT_OP, "}"))
2509                        goto out_free_field;
2510
2511                value = arg_eval(arg);
2512                if (value == NULL)
2513                        goto out_free_field;
2514                field->str = strdup(value);
2515                if (field->str == NULL)
2516                        goto out_free_field;
2517                free_arg(arg);
2518                arg = NULL;
2519
2520                *list = field;
2521                list = &field->next;
2522
2523                free_token(token);
2524                type = read_token_item(&token);
2525        } while (type == EVENT_DELIM && strcmp(token, ",") == 0);
2526
2527        *tok = token;
2528        return type;
2529
2530out_free_field:
2531        free_flag_sym(field);
2532out_free:
2533        free_arg(arg);
2534        free_token(token);
2535        *tok = NULL;
2536
2537        return EVENT_ERROR;
2538}
2539
2540static enum event_type
2541process_flags(struct event_format *event, struct print_arg *arg, char **tok)
2542{
2543        struct print_arg *field;
2544        enum event_type type;
2545        char *token = NULL;
2546
2547        memset(arg, 0, sizeof(*arg));
2548        arg->type = PRINT_FLAGS;
2549
2550        field = alloc_arg();
2551        if (!field) {
2552                do_warning_event(event, "%s: not enough memory!", __func__);
2553                goto out_free;
2554        }
2555
2556        type = process_field_arg(event, field, &token);
2557
2558        /* Handle operations in the first argument */
2559        while (type == EVENT_OP)
2560                type = process_op(event, field, &token);
2561
2562        if (test_type_token(type, token, EVENT_DELIM, ","))
2563                goto out_free_field;
2564        free_token(token);
2565
2566        arg->flags.field = field;
2567
2568        type = read_token_item(&token);
2569        if (event_item_type(type)) {
2570                arg->flags.delim = token;
2571                type = read_token_item(&token);
2572        }
2573
2574        if (test_type_token(type, token, EVENT_DELIM, ","))
2575                goto out_free;
2576
2577        type = process_fields(event, &arg->flags.flags, &token);
2578        if (test_type_token(type, token, EVENT_DELIM, ")"))
2579                goto out_free;
2580
2581        free_token(token);
2582        type = read_token_item(tok);
2583        return type;
2584
2585out_free_field:
2586        free_arg(field);
2587out_free:
2588        free_token(token);
2589        *tok = NULL;
2590        return EVENT_ERROR;
2591}
2592
2593static enum event_type
2594process_symbols(struct event_format *event, struct print_arg *arg, char **tok)
2595{
2596        struct print_arg *field;
2597        enum event_type type;
2598        char *token = NULL;
2599
2600        memset(arg, 0, sizeof(*arg));
2601        arg->type = PRINT_SYMBOL;
2602
2603        field = alloc_arg();
2604        if (!field) {
2605                do_warning_event(event, "%s: not enough memory!", __func__);
2606                goto out_free;
2607        }
2608
2609        type = process_field_arg(event, field, &token);
2610
2611        if (test_type_token(type, token, EVENT_DELIM, ","))
2612                goto out_free_field;
2613
2614        arg->symbol.field = field;
2615
2616        type = process_fields(event, &arg->symbol.symbols, &token);
2617        if (test_type_token(type, token, EVENT_DELIM, ")"))
2618                goto out_free;
2619
2620        free_token(token);
2621        type = read_token_item(tok);
2622        return type;
2623
2624out_free_field:
2625        free_arg(field);
2626out_free:
2627        free_token(token);
2628        *tok = NULL;
2629        return EVENT_ERROR;
2630}
2631
2632static enum event_type
2633process_hex_common(struct event_format *event, struct print_arg *arg,
2634                   char **tok, enum print_arg_type type)
2635{
2636        memset(arg, 0, sizeof(*arg));
2637        arg->type = type;
2638
2639        if (alloc_and_process_delim(event, ",", &arg->hex.field))
2640                goto out;
2641
2642        if (alloc_and_process_delim(event, ")", &arg->hex.size))
2643                goto free_field;
2644
2645        return read_token_item(tok);
2646
2647free_field:
2648        free_arg(arg->hex.field);
2649        arg->hex.field = NULL;
2650out:
2651        *tok = NULL;
2652        return EVENT_ERROR;
2653}
2654
2655static enum event_type
2656process_hex(struct event_format *event, struct print_arg *arg, char **tok)
2657{
2658        return process_hex_common(event, arg, tok, PRINT_HEX);
2659}
2660
2661static enum event_type
2662process_hex_str(struct event_format *event, struct print_arg *arg,
2663                char **tok)
2664{
2665        return process_hex_common(event, arg, tok, PRINT_HEX_STR);
2666}
2667
2668static enum event_type
2669process_int_array(struct event_format *event, struct print_arg *arg, char **tok)
2670{
2671        memset(arg, 0, sizeof(*arg));
2672        arg->type = PRINT_INT_ARRAY;
2673
2674        if (alloc_and_process_delim(event, ",", &arg->int_array.field))
2675                goto out;
2676
2677        if (alloc_and_process_delim(event, ",", &arg->int_array.count))
2678                goto free_field;
2679
2680        if (alloc_and_process_delim(event, ")", &arg->int_array.el_size))
2681                goto free_size;
2682
2683        return read_token_item(tok);
2684
2685free_size:
2686        free_arg(arg->int_array.count);
2687        arg->int_array.count = NULL;
2688free_field:
2689        free_arg(arg->int_array.field);
2690        arg->int_array.field = NULL;
2691out:
2692        *tok = NULL;
2693        return EVENT_ERROR;
2694}
2695
2696static enum event_type
2697process_dynamic_array(struct event_format *event, struct print_arg *arg, char **tok)
2698{
2699        struct format_field *field;
2700        enum event_type type;
2701        char *token;
2702
2703        memset(arg, 0, sizeof(*arg));
2704        arg->type = PRINT_DYNAMIC_ARRAY;
2705
2706        /*
2707         * The item within the parenthesis is another field that holds
2708         * the index into where the array starts.
2709         */
2710        type = read_token(&token);
2711        *tok = token;
2712        if (type != EVENT_ITEM)
2713                goto out_free;
2714
2715        /* Find the field */
2716
2717        field = pevent_find_field(event, token);
2718        if (!field)
2719                goto out_free;
2720
2721        arg->dynarray.field = field;
2722        arg->dynarray.index = 0;
2723
2724        if (read_expected(EVENT_DELIM, ")") < 0)
2725                goto out_free;
2726
2727        free_token(token);
2728        type = read_token_item(&token);
2729        *tok = token;
2730        if (type != EVENT_OP || strcmp(token, "[") != 0)
2731                return type;
2732
2733        free_token(token);
2734        arg = alloc_arg();
2735        if (!arg) {
2736                do_warning_event(event, "%s: not enough memory!", __func__);
2737                *tok = NULL;
2738                return EVENT_ERROR;
2739        }
2740
2741        type = process_arg(event, arg, &token);
2742        if (type == EVENT_ERROR)
2743                goto out_free_arg;
2744
2745        if (!test_type_token(type, token, EVENT_OP, "]"))
2746                goto out_free_arg;
2747
2748        free_token(token);
2749        type = read_token_item(tok);
2750        return type;
2751
2752 out_free_arg:
2753        free_arg(arg);
2754 out_free:
2755        free_token(token);
2756        *tok = NULL;
2757        return EVENT_ERROR;
2758}
2759
2760static enum event_type
2761process_dynamic_array_len(struct event_format *event, struct print_arg *arg,
2762                          char **tok)
2763{
2764        struct format_field *field;
2765        enum event_type type;
2766        char *token;
2767
2768        if (read_expect_type(EVENT_ITEM, &token) < 0)
2769                goto out_free;
2770
2771        arg->type = PRINT_DYNAMIC_ARRAY_LEN;
2772
2773        /* Find the field */
2774        field = pevent_find_field(event, token);
2775        if (!field)
2776                goto out_free;
2777
2778        arg->dynarray.field = field;
2779        arg->dynarray.index = 0;
2780
2781        if (read_expected(EVENT_DELIM, ")") < 0)
2782                goto out_err;
2783
2784        type = read_token(&token);
2785        *tok = token;
2786
2787        return type;
2788
2789 out_free:
2790        free_token(token);
2791 out_err:
2792        *tok = NULL;
2793        return EVENT_ERROR;
2794}
2795
2796static enum event_type
2797process_paren(struct event_format *event, struct print_arg *arg, char **tok)
2798{
2799        struct print_arg *item_arg;
2800        enum event_type type;
2801        char *token;
2802
2803        type = process_arg(event, arg, &token);
2804
2805        if (type == EVENT_ERROR)
2806                goto out_free;
2807
2808        if (type == EVENT_OP)
2809                type = process_op(event, arg, &token);
2810
2811        if (type == EVENT_ERROR)
2812                goto out_free;
2813
2814        if (test_type_token(type, token, EVENT_DELIM, ")"))
2815                goto out_free;
2816
2817        free_token(token);
2818        type = read_token_item(&token);
2819
2820        /*
2821         * If the next token is an item or another open paren, then
2822         * this was a typecast.
2823         */
2824        if (event_item_type(type) ||
2825            (type == EVENT_DELIM && strcmp(token, "(") == 0)) {
2826
2827                /* make this a typecast and contine */
2828
2829                /* prevous must be an atom */
2830                if (arg->type != PRINT_ATOM) {
2831                        do_warning_event(event, "previous needed to be PRINT_ATOM");
2832                        goto out_free;
2833                }
2834
2835                item_arg = alloc_arg();
2836                if (!item_arg) {
2837                        do_warning_event(event, "%s: not enough memory!",
2838                                         __func__);
2839                        goto out_free;
2840                }
2841
2842                arg->type = PRINT_TYPE;
2843                arg->typecast.type = arg->atom.atom;
2844                arg->typecast.item = item_arg;
2845                type = process_arg_token(event, item_arg, &token, type);
2846
2847        }
2848
2849        *tok = token;
2850        return type;
2851
2852 out_free:
2853        free_token(token);
2854        *tok = NULL;
2855        return EVENT_ERROR;
2856}
2857
2858
2859static enum event_type
2860process_str(struct event_format *event __maybe_unused, struct print_arg *arg,
2861            char **tok)
2862{
2863        enum event_type type;
2864        char *token;
2865
2866        if (read_expect_type(EVENT_ITEM, &token) < 0)
2867                goto out_free;
2868
2869        arg->type = PRINT_STRING;
2870        arg->string.string = token;
2871        arg->string.offset = -1;
2872
2873        if (read_expected(EVENT_DELIM, ")") < 0)
2874                goto out_err;
2875
2876        type = read_token(&token);
2877        *tok = token;
2878
2879        return type;
2880
2881 out_free:
2882        free_token(token);
2883 out_err:
2884        *tok = NULL;
2885        return EVENT_ERROR;
2886}
2887
2888static enum event_type
2889process_bitmask(struct event_format *event __maybe_unused, struct print_arg *arg,
2890            char **tok)
2891{
2892        enum event_type type;
2893        char *token;
2894
2895        if (read_expect_type(EVENT_ITEM, &token) < 0)
2896                goto out_free;
2897
2898        arg->type = PRINT_BITMASK;
2899        arg->bitmask.bitmask = token;
2900        arg->bitmask.offset = -1;
2901
2902        if (read_expected(EVENT_DELIM, ")") < 0)
2903                goto out_err;
2904
2905        type = read_token(&token);
2906        *tok = token;
2907
2908        return type;
2909
2910 out_free:
2911        free_token(token);
2912 out_err:
2913        *tok = NULL;
2914        return EVENT_ERROR;
2915}
2916
2917static struct pevent_function_handler *
2918find_func_handler(struct pevent *pevent, char *func_name)
2919{
2920        struct pevent_function_handler *func;
2921
2922        if (!pevent)
2923                return NULL;
2924
2925        for (func = pevent->func_handlers; func; func = func->next) {
2926                if (strcmp(func->name, func_name) == 0)
2927                        break;
2928        }
2929
2930        return func;
2931}
2932
2933static void remove_func_handler(struct pevent *pevent, char *func_name)
2934{
2935        struct pevent_function_handler *func;
2936        struct pevent_function_handler **next;
2937
2938        next = &pevent->func_handlers;
2939        while ((func = *next)) {
2940                if (strcmp(func->name, func_name) == 0) {
2941                        *next = func->next;
2942                        free_func_handle(func);
2943                        break;
2944                }
2945                next = &func->next;
2946        }
2947}
2948
2949static enum event_type
2950process_func_handler(struct event_format *event, struct pevent_function_handler *func,
2951                     struct print_arg *arg, char **tok)
2952{
2953        struct print_arg **next_arg;
2954        struct print_arg *farg;
2955        enum event_type type;
2956        char *token;
2957        int i;
2958
2959        arg->type = PRINT_FUNC;
2960        arg->func.func = func;
2961
2962        *tok = NULL;
2963
2964        next_arg = &(arg->func.args);
2965        for (i = 0; i < func->nr_args; i++) {
2966                farg = alloc_arg();
2967                if (!farg) {
2968                        do_warning_event(event, "%s: not enough memory!",
2969                                         __func__);
2970                        return EVENT_ERROR;
2971                }
2972
2973                type = process_arg(event, farg, &token);
2974                if (i < (func->nr_args - 1)) {
2975                        if (type != EVENT_DELIM || strcmp(token, ",") != 0) {
2976                                do_warning_event(event,
2977                                        "Error: function '%s()' expects %d arguments but event %s only uses %d",
2978                                        func->name, func->nr_args,
2979                                        event->name, i + 1);
2980                                goto err;
2981                        }
2982                } else {
2983                        if (type != EVENT_DELIM || strcmp(token, ")") != 0) {
2984                                do_warning_event(event,
2985                                        "Error: function '%s()' only expects %d arguments but event %s has more",
2986                                        func->name, func->nr_args, event->name);
2987                                goto err;
2988                        }
2989                }
2990
2991                *next_arg = farg;
2992                next_arg = &(farg->next);
2993                free_token(token);
2994        }
2995
2996        type = read_token(&token);
2997        *tok = token;
2998
2999        return type;
3000
3001err:
3002        free_arg(farg);
3003        free_token(token);
3004        return EVENT_ERROR;
3005}
3006
3007static enum event_type
3008process_function(struct event_format *event, struct print_arg *arg,
3009                 char *token, char **tok)
3010{
3011        struct pevent_function_handler *func;
3012
3013        if (strcmp(token, "__print_flags") == 0) {
3014                free_token(token);
3015                is_flag_field = 1;
3016                return process_flags(event, arg, tok);
3017        }
3018        if (strcmp(token, "__print_symbolic") == 0) {
3019                free_token(token);
3020                is_symbolic_field = 1;
3021                return process_symbols(event, arg, tok);
3022        }
3023        if (strcmp(token, "__print_hex") == 0) {
3024                free_token(token);
3025                return process_hex(event, arg, tok);
3026        }
3027        if (strcmp(token, "__print_hex_str") == 0) {
3028                free_token(token);
3029                return process_hex_str(event, arg, tok);
3030        }
3031        if (strcmp(token, "__print_array") == 0) {
3032                free_token(token);
3033                return process_int_array(event, arg, tok);
3034        }
3035        if (strcmp(token, "__get_str") == 0) {
3036                free_token(token);
3037                return process_str(event, arg, tok);
3038        }
3039        if (strcmp(token, "__get_bitmask") == 0) {
3040                free_token(token);
3041                return process_bitmask(event, arg, tok);
3042        }
3043        if (strcmp(token, "__get_dynamic_array") == 0) {
3044                free_token(token);
3045                return process_dynamic_array(event, arg, tok);
3046        }
3047        if (strcmp(token, "__get_dynamic_array_len") == 0) {
3048                free_token(token);
3049                return process_dynamic_array_len(event, arg, tok);
3050        }
3051
3052        func = find_func_handler(event->pevent, token);
3053        if (func) {
3054                free_token(token);
3055                return process_func_handler(event, func, arg, tok);
3056        }
3057
3058        do_warning_event(event, "function %s not defined", token);
3059        free_token(token);
3060        return EVENT_ERROR;
3061}
3062
3063static enum event_type
3064process_arg_token(struct event_format *event, struct print_arg *arg,
3065                  char **tok, enum event_type type)
3066{
3067        char *token;
3068        char *atom;
3069
3070        token = *tok;
3071
3072        switch (type) {
3073        case EVENT_ITEM:
3074                if (strcmp(token, "REC") == 0) {
3075                        free_token(token);
3076                        type = process_entry(event, arg, &token);
3077                        break;
3078                }
3079                atom = token;
3080                /* test the next token */
3081                type = read_token_item(&token);
3082
3083                /*
3084                 * If the next token is a parenthesis, then this
3085                 * is a function.
3086                 */
3087                if (type == EVENT_DELIM && strcmp(token, "(") == 0) {
3088                        free_token(token);
3089                        token = NULL;
3090                        /* this will free atom. */
3091                        type = process_function(event, arg, atom, &token);
3092                        break;
3093                }
3094                /* atoms can be more than one token long */
3095                while (type == EVENT_ITEM) {
3096                        char *new_atom;
3097                        new_atom = realloc(atom,
3098                                           strlen(atom) + strlen(token) + 2);
3099                        if (!new_atom) {
3100                                free(atom);
3101                                *tok = NULL;
3102                                free_token(token);
3103                                return EVENT_ERROR;
3104                        }
3105                        atom = new_atom;
3106                        strcat(atom, " ");
3107                        strcat(atom, token);
3108                        free_token(token);
3109                        type = read_token_item(&token);
3110                }
3111
3112                arg->type = PRINT_ATOM;
3113                arg->atom.atom = atom;
3114                break;
3115
3116        case EVENT_DQUOTE:
3117        case EVENT_SQUOTE:
3118                arg->type = PRINT_ATOM;
3119                arg->atom.atom = token;
3120                type = read_token_item(&token);
3121                break;
3122        case EVENT_DELIM:
3123                if (strcmp(token, "(") == 0) {
3124                        free_token(token);
3125                        type = process_paren(event, arg, &token);
3126                        break;
3127                }
3128        case EVENT_OP:
3129                /* handle single ops */
3130                arg->type = PRINT_OP;
3131                arg->op.op = token;
3132                arg->op.left = NULL;
3133                type = process_op(event, arg, &token);
3134
3135                /* On error, the op is freed */
3136                if (type == EVENT_ERROR)
3137                        arg->op.op = NULL;
3138
3139                /* return error type if errored */
3140                break;
3141
3142        case EVENT_ERROR ... EVENT_NEWLINE:
3143        default:
3144                do_warning_event(event, "unexpected type %d", type);
3145                return EVENT_ERROR;
3146        }
3147        *tok = token;
3148
3149        return type;
3150}
3151
3152static int event_read_print_args(struct event_format *event, struct print_arg **list)
3153{
3154        enum event_type type = EVENT_ERROR;
3155        struct print_arg *arg;
3156        char *token;
3157        int args = 0;
3158
3159        do {
3160                if (type == EVENT_NEWLINE) {
3161                        type = read_token_item(&token);
3162                        continue;
3163                }
3164
3165                arg = alloc_arg();
3166                if (!arg) {
3167                        do_warning_event(event, "%s: not enough memory!",
3168                                         __func__);
3169                        return -1;
3170                }
3171
3172                type = process_arg(event, arg, &token);
3173
3174                if (type == EVENT_ERROR) {
3175                        free_token(token);
3176                        free_arg(arg);
3177                        return -1;
3178                }
3179
3180                *list = arg;
3181                args++;
3182
3183                if (type == EVENT_OP) {
3184                        type = process_op(event, arg, &token);
3185                        free_token(token);
3186                        if (type == EVENT_ERROR) {
3187                                *list = NULL;
3188                                free_arg(arg);
3189                                return -1;
3190                        }
3191                        list = &arg->next;
3192                        continue;
3193                }
3194
3195                if (type == EVENT_DELIM && strcmp(token, ",") == 0) {
3196                        free_token(token);
3197                        *list = arg;
3198                        list = &arg->next;
3199                        continue;
3200                }
3201                break;
3202        } while (type != EVENT_NONE);
3203
3204        if (type != EVENT_NONE && type != EVENT_ERROR)
3205                free_token(token);
3206
3207        return args;
3208}
3209
3210static int event_read_print(struct event_format *event)
3211{
3212        enum event_type type;
3213        char *token;
3214        int ret;
3215
3216        if (read_expected_item(EVENT_ITEM, "print") < 0)
3217                return -1;
3218
3219        if (read_expected(EVENT_ITEM, "fmt") < 0)
3220                return -1;
3221
3222        if (read_expected(EVENT_OP, ":") < 0)
3223                return -1;
3224
3225        if (read_expect_type(EVENT_DQUOTE, &token) < 0)
3226                goto fail;
3227
3228 concat:
3229        event->print_fmt.format = token;
3230        event->print_fmt.args = NULL;
3231
3232        /* ok to have no arg */
3233        type = read_token_item(&token);
3234
3235        if (type == EVENT_NONE)
3236                return 0;
3237
3238        /* Handle concatenation of print lines */
3239        if (type == EVENT_DQUOTE) {
3240                char *cat;
3241
3242                if (asprintf(&cat, "%s%s", event->print_fmt.format, token) < 0)
3243                        goto fail;
3244                free_token(token);
3245                free_token(event->print_fmt.format);
3246                event->print_fmt.format = NULL;
3247                token = cat;
3248                goto concat;
3249        }
3250                             
3251        if (test_type_token(type, token, EVENT_DELIM, ","))
3252                goto fail;
3253
3254        free_token(token);
3255
3256        ret = event_read_print_args(event, &event->print_fmt.args);
3257        if (ret < 0)
3258                return -1;
3259
3260        return ret;
3261
3262 fail:
3263        free_token(token);
3264        return -1;
3265}
3266
3267/**
3268 * pevent_find_common_field - return a common field by event
3269 * @event: handle for the event
3270 * @name: the name of the common field to return
3271 *
3272 * Returns a common field from the event by the given @name.
3273 * This only searchs the common fields and not all field.
3274 */
3275struct format_field *
3276pevent_find_common_field(struct event_format *event, const char *name)
3277{
3278        struct format_field *format;
3279
3280        for (format = event->format.common_fields;
3281             format; format = format->next) {
3282                if (strcmp(format->name, name) == 0)
3283                        break;
3284        }
3285
3286        return format;
3287}
3288
3289/**
3290 * pevent_find_field - find a non-common field
3291 * @event: handle for the event
3292 * @name: the name of the non-common field
3293 *
3294 * Returns a non-common field by the given @name.
3295 * This does not search common fields.
3296 */
3297struct format_field *
3298pevent_find_field(struct event_format *event, const char *name)
3299{
3300        struct format_field *format;
3301
3302        for (format = event->format.fields;
3303             format; format = format->next) {
3304                if (strcmp(format->name, name) == 0)
3305                        break;
3306        }
3307
3308        return format;
3309}
3310
3311/**
3312 * pevent_find_any_field - find any field by name
3313 * @event: handle for the event
3314 * @name: the name of the field
3315 *
3316 * Returns a field by the given @name.
3317 * This searchs the common field names first, then
3318 * the non-common ones if a common one was not found.
3319 */
3320struct format_field *
3321pevent_find_any_field(struct event_format *event, const char *name)
3322{
3323        struct format_field *format;
3324
3325        format = pevent_find_common_field(event, name);
3326        if (format)
3327                return format;
3328        return pevent_find_field(event, name);
3329}
3330
3331/**
3332 * pevent_read_number - read a number from data
3333 * @pevent: handle for the pevent
3334 * @ptr: the raw data
3335 * @size: the size of the data that holds the number
3336 *
3337 * Returns the number (converted to host) from the
3338 * raw data.
3339 */
3340unsigned long long pevent_read_number(struct pevent *pevent,
3341                                      const void *ptr, int size)
3342{
3343        switch (size) {
3344        case 1:
3345                return *(unsigned char *)ptr;
3346        case 2:
3347                return data2host2(pevent, ptr);
3348        case 4:
3349                return data2host4(pevent, ptr);
3350        case 8:
3351                return data2host8(pevent, ptr);
3352        default:
3353                /* BUG! */
3354                return 0;
3355        }
3356}
3357
3358/**
3359 * pevent_read_number_field - read a number from data
3360 * @field: a handle to the field
3361 * @data: the raw data to read
3362 * @value: the value to place the number in
3363 *
3364 * Reads raw data according to a field offset and size,
3365 * and translates it into @value.
3366 *
3367 * Returns 0 on success, -1 otherwise.
3368 */
3369int pevent_read_number_field(struct format_field *field, const void *data,
3370                             unsigned long long *value)
3371{
3372        if (!field)
3373                return -1;
3374        switch (field->size) {
3375        case 1:
3376        case 2:
3377        case 4:
3378        case 8:
3379                *value = pevent_read_number(field->event->pevent,
3380                                            data + field->offset, field->size);
3381                return 0;
3382        default:
3383                return -1;
3384        }
3385}
3386
3387static int get_common_info(struct pevent *pevent,
3388                           const char *type, int *offset, int *size)
3389{
3390        struct event_format *event;
3391        struct format_field *field;
3392
3393        /*
3394         * All events should have the same common elements.
3395         * Pick any event to find where the type is;
3396         */
3397        if (!pevent->events) {
3398                do_warning("no event_list!");
3399                return -1;
3400        }
3401
3402        event = pevent->events[0];
3403        field = pevent_find_common_field(event, type);
3404        if (!field)
3405                return -1;
3406
3407        *offset = field->offset;
3408        *size = field->size;
3409
3410        return 0;
3411}
3412
3413static int __parse_common(struct pevent *pevent, void *data,
3414                          int *size, int *offset, const char *name)
3415{
3416        int ret;
3417
3418        if (!*size) {
3419                ret = get_common_info(pevent, name, offset, size);
3420                if (ret < 0)
3421                        return ret;
3422        }
3423        return pevent_read_number(pevent, data + *offset, *size);
3424}
3425
3426static int trace_parse_common_type(struct pevent *pevent, void *data)
3427{
3428        return __parse_common(pevent, data,
3429                              &pevent->type_size, &pevent->type_offset,
3430                              "common_type");
3431}
3432
3433static int parse_common_pid(struct pevent *pevent, void *data)
3434{
3435        return __parse_common(pevent, data,
3436                              &pevent->pid_size, &pevent->pid_offset,
3437                              "common_pid");
3438}
3439
3440static int parse_common_pc(struct pevent *pevent, void *data)
3441{
3442        return __parse_common(pevent, data,
3443                              &pevent->pc_size, &pevent->pc_offset,
3444                              "common_preempt_count");
3445}
3446
3447static int parse_common_flags(struct pevent *pevent, void *data)
3448{
3449        return __parse_common(pevent, data,
3450                              &pevent->flags_size, &pevent->flags_offset,
3451                              "common_flags");
3452}
3453
3454static int parse_common_lock_depth(struct pevent *pevent, void *data)
3455{
3456        return __parse_common(pevent, data,
3457                              &pevent->ld_size, &pevent->ld_offset,
3458                              "common_lock_depth");
3459}
3460
3461static int parse_common_migrate_disable(struct pevent *pevent, void *data)
3462{
3463        return __parse_common(pevent, data,
3464                              &pevent->ld_size, &pevent->ld_offset,
3465                              "common_migrate_disable");
3466}
3467
3468static int events_id_cmp(const void *a, const void *b);
3469
3470/**
3471 * pevent_find_event - find an event by given id
3472 * @pevent: a handle to the pevent
3473 * @id: the id of the event
3474 *
3475 * Returns an event that has a given @id.
3476 */
3477struct event_format *pevent_find_event(struct pevent *pevent, int id)
3478{
3479        struct event_format **eventptr;
3480        struct event_format key;
3481        struct event_format *pkey = &key;
3482
3483        /* Check cache first */
3484        if (pevent->last_event && pevent->last_event->id == id)
3485                return pevent->last_event;
3486
3487        key.id = id;
3488
3489        eventptr = bsearch(&pkey, pevent->events, pevent->nr_events,
3490                           sizeof(*pevent->events), events_id_cmp);
3491
3492        if (eventptr) {
3493                pevent->last_event = *eventptr;
3494                return *eventptr;
3495        }
3496
3497        return NULL;
3498}
3499
3500/**
3501 * pevent_find_event_by_name - find an event by given name
3502 * @pevent: a handle to the pevent
3503 * @sys: the system name to search for
3504 * @name: the name of the event to search for
3505 *
3506 * This returns an event with a given @name and under the system
3507 * @sys. If @sys is NULL the first event with @name is returned.
3508 */
3509struct event_format *
3510pevent_find_event_by_name(struct pevent *pevent,
3511                          const char *sys, const char *name)
3512{
3513        struct event_format *event;
3514        int i;
3515
3516        if (pevent->last_event &&
3517            strcmp(pevent->last_event->name, name) == 0 &&
3518            (!sys || strcmp(pevent->last_event->system, sys) == 0))
3519                return pevent->last_event;
3520
3521        for (i = 0; i < pevent->nr_events; i++) {
3522                event = pevent->events[i];
3523                if (strcmp(event->name, name) == 0) {
3524                        if (!sys)
3525                                break;
3526                        if (strcmp(event->system, sys) == 0)
3527                                break;
3528                }
3529        }
3530        if (i == pevent->nr_events)
3531                event = NULL;
3532
3533        pevent->last_event = event;
3534        return event;
3535}
3536
3537static unsigned long long
3538eval_num_arg(void *data, int size, struct event_format *event, struct print_arg *arg)
3539{
3540        struct pevent *pevent = event->pevent;
3541        unsigned long long val = 0;
3542        unsigned long long left, right;
3543        struct print_arg *typearg = NULL;
3544        struct print_arg *larg;
3545        unsigned long offset;
3546        unsigned int field_size;
3547
3548        switch (arg->type) {
3549        case PRINT_NULL:
3550                /* ?? */
3551                return 0;
3552        case PRINT_ATOM:
3553                return strtoull(arg->atom.atom, NULL, 0);
3554        case PRINT_FIELD:
3555                if (!arg->field.field) {
3556                        arg->field.field = pevent_find_any_field(event, arg->field.name);
3557                        if (!arg->field.field)
3558                                goto out_warning_field;
3559                        
3560                }
3561                /* must be a number */
3562                val = pevent_read_number(pevent, data + arg->field.field->offset,
3563                                arg->field.field->size);
3564                break;
3565        case PRINT_FLAGS:
3566        case PRINT_SYMBOL:
3567        case PRINT_INT_ARRAY:
3568        case PRINT_HEX:
3569        case PRINT_HEX_STR:
3570                break;
3571        case PRINT_TYPE:
3572                val = eval_num_arg(data, size, event, arg->typecast.item);
3573                return eval_type(val, arg, 0);
3574        case PRINT_STRING:
3575        case PRINT_BSTRING:
3576        case PRINT_BITMASK:
3577                return 0;
3578        case PRINT_FUNC: {
3579                struct trace_seq s;
3580                trace_seq_init(&s);
3581                val = process_defined_func(&s, data, size, event, arg);
3582                trace_seq_destroy(&s);
3583                return val;
3584        }
3585        case PRINT_OP:
3586                if (strcmp(arg->op.op, "[") == 0) {
3587                        /*
3588                         * Arrays are special, since we don't want
3589                         * to read the arg as is.
3590                         */
3591                        right = eval_num_arg(data, size, event, arg->op.right);
3592
3593                        /* handle typecasts */
3594                        larg = arg->op.left;
3595                        while (larg->type == PRINT_TYPE) {
3596                                if (!typearg)
3597                                        typearg = larg;
3598                                larg = larg->typecast.item;
3599                        }
3600
3601                        /* Default to long size */
3602                        field_size = pevent->long_size;
3603
3604                        switch (larg->type) {
3605                        case PRINT_DYNAMIC_ARRAY:
3606                                offset = pevent_read_number(pevent,
3607                                                   data + larg->dynarray.field->offset,
3608                                                   larg->dynarray.field->size);
3609                                if (larg->dynarray.field->elementsize)
3610                                        field_size = larg->dynarray.field->elementsize;
3611                                /*
3612                                 * The actual length of the dynamic array is stored
3613                                 * in the top half of the field, and the offset
3614                                 * is in the bottom half of the 32 bit field.
3615                                 */
3616                                offset &= 0xffff;
3617                                offset += right;
3618                                break;
3619                        case PRINT_FIELD:
3620                                if (!larg->field.field) {
3621                                        larg->field.field =
3622                                                pevent_find_any_field(event, larg->field.name);
3623                                        if (!larg->field.field) {
3624                                                arg = larg;
3625                                                goto out_warning_field;
3626                                        }
3627                                }
3628                                field_size = larg->field.field->elementsize;
3629                                offset = larg->field.field->offset +
3630                                        right * larg->field.field->elementsize;
3631                                break;
3632                        default:
3633                                goto default_op; /* oops, all bets off */
3634                        }
3635                        val = pevent_read_number(pevent,
3636                                                 data + offset, field_size);
3637                        if (typearg)
3638                                val = eval_type(val, typearg, 1);
3639                        break;
3640                } else if (strcmp(arg->op.op, "?") == 0) {
3641                        left = eval_num_arg(data, size, event, arg->op.left);
3642                        arg = arg->op.right;
3643                        if (left)
3644                                val = eval_num_arg(data, size, event, arg->op.left);
3645                        else
3646                                val = eval_num_arg(data, size, event, arg->op.right);
3647                        break;
3648                }
3649 default_op:
3650                left = eval_num_arg(data, size, event, arg->op.left);
3651                right = eval_num_arg(data, size, event, arg->op.right);
3652                switch (arg->op.op[0]) {
3653                case '!':
3654                        switch (arg->op.op[1]) {
3655                        case 0:
3656                                val = !right;
3657                                break;
3658                        case '=':
3659                                val = left != right;
3660                                break;
3661                        default:
3662                                goto out_warning_op;
3663                        }
3664                        break;
3665                case '~':
3666                        val = ~right;
3667                        break;
3668                case '|':
3669                        if (arg->op.op[1])
3670                                val = left || right;
3671                        else
3672                                val = left | right;
3673                        break;
3674                case '&':
3675                        if (arg->op.op[1])
3676                                val = left && right;
3677                        else
3678                                val = left & right;
3679                        break;
3680                case '<':
3681                        switch (arg->op.op[1]) {
3682                        case 0:
3683                                val = left < right;
3684                                break;
3685                        case '<':
3686                                val = left << right;
3687                                break;
3688                        case '=':
3689                                val = left <= right;
3690                                break;
3691                        default:
3692                                goto out_warning_op;
3693                        }
3694                        break;
3695                case '>':
3696                        switch (arg->op.op[1]) {
3697                        case 0:
3698                                val = left > right;
3699                                break;
3700                        case '>':
3701                                val = left >> right;
3702                                break;
3703                        case '=':
3704                                val = left >= right;
3705                                break;
3706                        default:
3707                                goto out_warning_op;
3708                        }
3709                        break;
3710                case '=':
3711                        if (arg->op.op[1] != '=')
3712                                goto out_warning_op;
3713
3714                        val = left == right;
3715                        break;
3716                case '-':
3717                        val = left - right;
3718                        break;
3719                case '+':
3720                        val = left + right;
3721                        break;
3722                case '/':
3723                        val = left / right;
3724                        break;
3725                case '%':
3726                        val = left % right;
3727                        break;
3728                case '*':
3729                        val = left * right;
3730                        break;
3731                default:
3732                        goto out_warning_op;
3733                }
3734                break;
3735        case PRINT_DYNAMIC_ARRAY_LEN:
3736                offset = pevent_read_number(pevent,
3737                                            data + arg->dynarray.field->offset,
3738                                            arg->dynarray.field->size);
3739                /*
3740                 * The total allocated length of the dynamic array is
3741                 * stored in the top half of the field, and the offset
3742                 * is in the bottom half of the 32 bit field.
3743                 */
3744                val = (unsigned long long)(offset >> 16);
3745                break;
3746        case PRINT_DYNAMIC_ARRAY:
3747                /* Without [], we pass the address to the dynamic data */
3748                offset = pevent_read_number(pevent,
3749                                            data + arg->dynarray.field->offset,
3750                                            arg->dynarray.field->size);
3751                /*
3752                 * The total allocated length of the dynamic array is
3753                 * stored in the top half of the field, and the offset
3754                 * is in the bottom half of the 32 bit field.
3755                 */
3756                offset &= 0xffff;
3757                val = (unsigned long long)((unsigned long)data + offset);
3758                break;
3759        default: /* not sure what to do there */
3760                return 0;
3761        }
3762        return val;
3763
3764out_warning_op:
3765        do_warning_event(event, "%s: unknown op '%s'", __func__, arg->op.op);
3766        return 0;
3767
3768out_warning_field:
3769        do_warning_event(event, "%s: field %s not found",
3770                         __func__, arg->field.name);
3771        return 0;
3772}
3773
3774struct flag {
3775        const char *name;
3776        unsigned long long value;
3777};
3778
3779static const struct flag flags[] = {
3780        { "HI_SOFTIRQ", 0 },
3781        { "TIMER_SOFTIRQ", 1 },
3782        { "NET_TX_SOFTIRQ", 2 },
3783        { "NET_RX_SOFTIRQ", 3 },
3784        { "BLOCK_SOFTIRQ", 4 },
3785        { "IRQ_POLL_SOFTIRQ", 5 },
3786        { "TASKLET_SOFTIRQ", 6 },
3787        { "SCHED_SOFTIRQ", 7 },
3788        { "HRTIMER_SOFTIRQ", 8 },
3789        { "RCU_SOFTIRQ", 9 },
3790
3791        { "HRTIMER_NORESTART", 0 },
3792        { "HRTIMER_RESTART", 1 },
3793};
3794
3795static long long eval_flag(const char *flag)
3796{
3797        int i;
3798
3799        /*
3800         * Some flags in the format files do not get converted.
3801         * If the flag is not numeric, see if it is something that
3802         * we already know about.
3803         */
3804        if (isdigit(flag[0]))
3805                return strtoull(flag, NULL, 0);
3806
3807        for (i = 0; i < (int)(sizeof(flags)/sizeof(flags[0])); i++)
3808                if (strcmp(flags[i].name, flag) == 0)
3809                        return flags[i].value;
3810
3811        return -1LL;
3812}
3813
3814static void print_str_to_seq(struct trace_seq *s, const char *format,
3815                             int len_arg, const char *str)
3816{
3817        if (len_arg >= 0)
3818                trace_seq_printf(s, format, len_arg, str);
3819        else
3820                trace_seq_printf(s, format, str);
3821}
3822
3823static void print_bitmask_to_seq(struct pevent *pevent,
3824                                 struct trace_seq *s, const char *format,
3825                                 int len_arg, const void *data, int size)
3826{
3827        int nr_bits = size * 8;
3828        int str_size = (nr_bits + 3) / 4;
3829        int len = 0;
3830        char buf[3];
3831        char *str;
3832        int index;
3833        int i;
3834
3835        /*
3836         * The kernel likes to put in commas every 32 bits, we
3837         * can do the same.
3838         */
3839        str_size += (nr_bits - 1) / 32;
3840
3841        str = malloc(str_size + 1);
3842        if (!str) {
3843                do_warning("%s: not enough memory!", __func__);
3844                return;
3845        }
3846        str[str_size] = 0;
3847
3848        /* Start out with -2 for the two chars per byte */
3849        for (i = str_size - 2; i >= 0; i -= 2) {
3850                /*
3851                 * data points to a bit mask of size bytes.
3852                 * In the kernel, this is an array of long words, thus
3853                 * endianess is very important.
3854                 */
3855                if (pevent->file_bigendian)
3856                        index = size - (len + 1);
3857                else
3858                        index = len;
3859
3860                snprintf(buf, 3, "%02x", *((unsigned char *)data + index));
3861                memcpy(str + i, buf, 2);
3862                len++;
3863                if (!(len & 3) && i > 0) {
3864                        i--;
3865                        str[i] = ',';
3866                }
3867        }
3868
3869        if (len_arg >= 0)
3870                trace_seq_printf(s, format, len_arg, str);
3871        else
3872                trace_seq_printf(s, format, str);
3873
3874        free(str);
3875}
3876
3877static void print_str_arg(struct trace_seq *s, void *data, int size,
3878                          struct event_format *event, const char *format,
3879                          int len_arg, struct print_arg *arg)
3880{
3881        struct pevent *pevent = event->pevent;
3882        struct print_flag_sym *flag;
3883        struct format_field *field;
3884        struct printk_map *printk;
3885        long long val, fval;
3886        unsigned long long addr;
3887        char *str;
3888        unsigned char *hex;
3889        int print;
3890        int i, len;
3891
3892        switch (arg->type) {
3893        case PRINT_NULL:
3894                /* ?? */
3895                return;
3896        case PRINT_ATOM:
3897                print_str_to_seq(s, format, len_arg, arg->atom.atom);
3898                return;
3899        case PRINT_FIELD:
3900                field = arg->field.field;
3901                if (!field) {
3902                        field = pevent_find_any_field(event, arg->field.name);
3903                        if (!field) {
3904                                str = arg->field.name;
3905                                goto out_warning_field;
3906                        }
3907                        arg->field.field = field;
3908                }
3909                /* Zero sized fields, mean the rest of the data */
3910                len = field->size ? : size - field->offset;
3911
3912                /*
3913                 * Some events pass in pointers. If this is not an array
3914                 * and the size is the same as long_size, assume that it
3915                 * is a pointer.
3916                 */
3917                if (!(field->flags & FIELD_IS_ARRAY) &&
3918                    field->size == pevent->long_size) {
3919
3920                        /* Handle heterogeneous recording and processing
3921                         * architectures
3922                         *
3923                         * CASE I:
3924                         * Traces recorded on 32-bit devices (32-bit
3925                         * addressing) and processed on 64-bit devices:
3926                         * In this case, only 32 bits should be read.
3927                         *
3928                         * CASE II:
3929                         * Traces recorded on 64 bit devices and processed
3930                         * on 32-bit devices:
3931                         * In this case, 64 bits must be read.
3932                         */
3933                        addr = (pevent->long_size == 8) ?
3934                                *(unsigned long long *)(data + field->offset) :
3935                                (unsigned long long)*(unsigned int *)(data + field->offset);
3936
3937                        /* Check if it matches a print format */
3938                        printk = find_printk(pevent, addr);
3939                        if (printk)
3940                                trace_seq_puts(s, printk->printk);
3941                        else
3942                                trace_seq_printf(s, "%llx", addr);
3943                        break;
3944                }
3945                str = malloc(len + 1);
3946                if (!str) {
3947                        do_warning_event(event, "%s: not enough memory!",
3948                                         __func__);
3949                        return;
3950                }
3951                memcpy(str, data + field->offset, len);
3952                str[len] = 0;
3953                print_str_to_seq(s, format, len_arg, str);
3954                free(str);
3955                break;
3956        case PRINT_FLAGS:
3957                val = eval_num_arg(data, size, event, arg->flags.field);
3958                print = 0;
3959                for (flag = arg->flags.flags; flag; flag = flag->next) {
3960                        fval = eval_flag(flag->value);
3961                        if (!val && fval < 0) {
3962                                print_str_to_seq(s, format, len_arg, flag->str);
3963                                break;
3964                        }
3965                        if (fval > 0 && (val & fval) == fval) {
3966                                if (print && arg->flags.delim)
3967                                        trace_seq_puts(s, arg->flags.delim);
3968                                print_str_to_seq(s, format, len_arg, flag->str);
3969                                print = 1;
3970                                val &= ~fval;
3971                        }
3972                }
3973                break;
3974        case PRINT_SYMBOL:
3975                val = eval_num_arg(data, size, event, arg->symbol.field);
3976                for (flag = arg->symbol.symbols; flag; flag = flag->next) {
3977                        fval = eval_flag(flag->value);
3978                        if (val == fval) {
3979                                print_str_to_seq(s, format, len_arg, flag->str);
3980                                break;
3981                        }
3982                }
3983                break;
3984        case PRINT_HEX:
3985        case PRINT_HEX_STR:
3986                if (arg->hex.field->type == PRINT_DYNAMIC_ARRAY) {
3987                        unsigned long offset;
3988                        offset = pevent_read_number(pevent,
3989                                data + arg->hex.field->dynarray.field->offset,
3990                                arg->hex.field->dynarray.field->size);
3991                        hex = data + (offset & 0xffff);
3992                } else {
3993                        field = arg->hex.field->field.field;
3994                        if (!field) {
3995                                str = arg->hex.field->field.name;
3996                                field = pevent_find_any_field(event, str);
3997                                if (!field)
3998                                        goto out_warning_field;
3999                                arg->hex.field->field.field = field;
4000                        }
4001                        hex = data + field->offset;
4002                }
4003                len = eval_num_arg(data, size, event, arg->hex.size);
4004                for (i = 0; i < len; i++) {
4005                        if (i && arg->type == PRINT_HEX)
4006                                trace_seq_putc(s, ' ');
4007                        trace_seq_printf(s, "%02x", hex[i]);
4008                }
4009                break;
4010
4011        case PRINT_INT_ARRAY: {
4012                void *num;
4013                int el_size;
4014
4015                if (arg->int_array.field->type == PRINT_DYNAMIC_ARRAY) {
4016                        unsigned long offset;
4017                        struct format_field *field =
4018                                arg->int_array.field->dynarray.field;
4019                        offset = pevent_read_number(pevent,
4020                                                    data + field->offset,
4021                                                    field->size);
4022                        num = data + (offset & 0xffff);
4023                } else {
4024                        field = arg->int_array.field->field.field;
4025                        if (!field) {
4026                                str = arg->int_array.field->field.name;
4027                                field = pevent_find_any_field(event, str);
4028                                if (!field)
4029                                        goto out_warning_field;
4030                                arg->int_array.field->field.field = field;
4031                        }
4032                        num = data + field->offset;
4033                }
4034                len = eval_num_arg(data, size, event, arg->int_array.count);
4035                el_size = eval_num_arg(data, size, event,
4036                                       arg->int_array.el_size);
4037                for (i = 0; i < len; i++) {
4038                        if (i)
4039                                trace_seq_putc(s, ' ');
4040
4041                        if (el_size == 1) {
4042                                trace_seq_printf(s, "%u", *(uint8_t *)num);
4043                        } else if (el_size == 2) {
4044                                trace_seq_printf(s, "%u", *(uint16_t *)num);
4045                        } else if (el_size == 4) {
4046                                trace_seq_printf(s, "%u", *(uint32_t *)num);
4047                        } else if (el_size == 8) {
4048                                trace_seq_printf(s, "%"PRIu64, *(uint64_t *)num);
4049                        } else {
4050                                trace_seq_printf(s, "BAD SIZE:%d 0x%x",
4051                                                 el_size, *(uint8_t *)num);
4052                                el_size = 1;
4053                        }
4054
4055                        num += el_size;
4056                }
4057                break;
4058        }
4059        case PRINT_TYPE:
4060                break;
4061        case PRINT_STRING: {
4062                int str_offset;
4063
4064                if (arg->string.offset == -1) {
4065                        struct format_field *f;
4066
4067                        f = pevent_find_any_field(event, arg->string.string);
4068                        arg->string.offset = f->offset;
4069                }
4070                str_offset = data2host4(pevent, data + arg->string.offset);
4071                str_offset &= 0xffff;
4072                print_str_to_seq(s, format, len_arg, ((char *)data) + str_offset);
4073                break;
4074        }
4075        case PRINT_BSTRING:
4076                print_str_to_seq(s, format, len_arg, arg->string.string);
4077                break;
4078        case PRINT_BITMASK: {
4079                int bitmask_offset;
4080                int bitmask_size;
4081
4082                if (arg->bitmask.offset == -1) {
4083                        struct format_field *f;
4084
4085                        f = pevent_find_any_field(event, arg->bitmask.bitmask);
4086                        arg->bitmask.offset = f->offset;
4087                }
4088                bitmask_offset = data2host4(pevent, data + arg->bitmask.offset);
4089                bitmask_size = bitmask_offset >> 16;
4090                bitmask_offset &= 0xffff;
4091                print_bitmask_to_seq(pevent, s, format, len_arg,
4092                                     data + bitmask_offset, bitmask_size);
4093                break;
4094        }
4095        case PRINT_OP:
4096                /*
4097                 * The only op for string should be ? :
4098                 */
4099                if (arg->op.op[0] != '?')
4100                        return;
4101                val = eval_num_arg(data, size, event, arg->op.left);
4102                if (val)
4103                        print_str_arg(s, data, size, event,
4104                                      format, len_arg, arg->op.right->op.left);
4105                else
4106                        print_str_arg(s, data, size, event,
4107                                      format, len_arg, arg->op.right->op.right);
4108                break;
4109        case PRINT_FUNC:
4110                process_defined_func(s, data, size, event, arg);
4111                break;
4112        default:
4113                /* well... */
4114                break;
4115        }
4116
4117        return;
4118
4119out_warning_field:
4120        do_warning_event(event, "%s: field %s not found",
4121                         __func__, arg->field.name);
4122}
4123
4124static unsigned long long
4125process_defined_func(struct trace_seq *s, void *data, int size,
4126                     struct event_format *event, struct print_arg *arg)
4127{
4128        struct pevent_function_handler *func_handle = arg->func.func;
4129        struct pevent_func_params *param;
4130        unsigned long long *args;
4131        unsigned long long ret;
4132        struct print_arg *farg;
4133        struct trace_seq str;
4134        struct save_str {
4135                struct save_str *next;
4136                char *str;
4137        } *strings = NULL, *string;
4138        int i;
4139
4140        if (!func_handle->nr_args) {
4141                ret = (*func_handle->func)(s, NULL);
4142                goto out;
4143        }
4144
4145        farg = arg->func.args;
4146        param = func_handle->params;
4147
4148        ret = ULLONG_MAX;
4149        args = malloc(sizeof(*args) * func_handle->nr_args);
4150        if (!args)
4151                goto out;
4152
4153        for (i = 0; i < func_handle->nr_args; i++) {
4154                switch (param->type) {
4155                case PEVENT_FUNC_ARG_INT:
4156                case PEVENT_FUNC_ARG_LONG:
4157                case PEVENT_FUNC_ARG_PTR:
4158                        args[i] = eval_num_arg(data, size, event, farg);
4159                        break;
4160                case PEVENT_FUNC_ARG_STRING:
4161                        trace_seq_init(&str);
4162                        print_str_arg(&str, data, size, event, "%s", -1, farg);
4163                        trace_seq_terminate(&str);
4164                        string = malloc(sizeof(*string));
4165                        if (!string) {
4166                                do_warning_event(event, "%s(%d): malloc str",
4167                                                 __func__, __LINE__);
4168                                goto out_free;
4169                        }
4170                        string->next = strings;
4171                        string->str = strdup(str.buffer);
4172                        if (!string->str) {
4173                                free(string);
4174                                do_warning_event(event, "%s(%d): malloc str",
4175                                                 __func__, __LINE__);
4176                                goto out_free;
4177                        }
4178                        args[i] = (uintptr_t)string->str;
4179                        strings = string;
4180                        trace_seq_destroy(&str);
4181                        break;
4182                default:
4183                        /*
4184                         * Something went totally wrong, this is not
4185                         * an input error, something in this code broke.
4186                         */
4187                        do_warning_event(event, "Unexpected end of arguments\n");
4188                        goto out_free;
4189                }
4190                farg = farg->next;
4191                param = param->next;
4192        }
4193
4194        ret = (*func_handle->func)(s, args);
4195out_free:
4196        free(args);
4197        while (strings) {
4198                string = strings;
4199                strings = string->next;
4200                free(string->str);
4201                free(string);
4202        }
4203
4204 out:
4205        /* TBD : handle return type here */
4206        return ret;
4207}
4208
4209static void free_args(struct print_arg *args)
4210{
4211        struct print_arg *next;
4212
4213        while (args) {
4214                next = args->next;
4215
4216                free_arg(args);
4217                args = next;
4218        }
4219}
4220
4221static struct print_arg *make_bprint_args(char *fmt, void *data, int size, struct event_format *event)
4222{
4223        struct pevent *pevent = event->pevent;
4224        struct format_field *field, *ip_field;
4225        struct print_arg *args, *arg, **next;
4226        unsigned long long ip, val;
4227        char *ptr;
4228        void *bptr;
4229        int vsize;
4230
4231        field = pevent->bprint_buf_field;
4232        ip_field = pevent->bprint_ip_field;
4233
4234        if (!field) {
4235                field = pevent_find_field(event, "buf");
4236                if (!field) {
4237                        do_warning_event(event, "can't find buffer field for binary printk");
4238                        return NULL;
4239                }
4240                ip_field = pevent_find_field(event, "ip");
4241                if (!ip_field) {
4242                        do_warning_event(event, "can't find ip field for binary printk");
4243                        return NULL;
4244                }
4245                pevent->bprint_buf_field = field;
4246                pevent->bprint_ip_field = ip_field;
4247        }
4248
4249        ip = pevent_read_number(pevent, data + ip_field->offset, ip_field->size);
4250
4251        /*
4252         * The first arg is the IP pointer.
4253         */
4254        args = alloc_arg();
4255        if (!args) {
4256                do_warning_event(event, "%s(%d): not enough memory!",
4257                                 __func__, __LINE__);
4258                return NULL;
4259        }
4260        arg = args;
4261        arg->next = NULL;
4262        next = &arg->next;
4263
4264        arg->type = PRINT_ATOM;
4265                
4266        if (asprintf(&arg->atom.atom, "%lld", ip) < 0)
4267                goto out_free;
4268
4269        /* skip the first "%ps: " */
4270        for (ptr = fmt + 5, bptr = data + field->offset;
4271             bptr < data + size && *ptr; ptr++) {
4272                int ls = 0;
4273
4274                if (*ptr == '%') {
4275 process_again:
4276                        ptr++;
4277                        switch (*ptr) {
4278                        case '%':
4279                                break;
4280                        case 'l':
4281                                ls++;
4282                                goto process_again;
4283                        case 'L':
4284                                ls = 2;
4285                                goto process_again;
4286                        case '0' ... '9':
4287                                goto process_again;
4288                        case '.':
4289                                goto process_again;
4290                        case 'z':
4291                        case 'Z':
4292                                ls = 1;
4293                                goto process_again;
4294                        case 'p':
4295                                ls = 1;
4296                                /* fall through */
4297                        case 'd':
4298                        case 'u':
4299                        case 'x':
4300                        case 'i':
4301                                switch (ls) {
4302                                case 0:
4303                                        vsize = 4;
4304                                        break;
4305                                case 1:
4306                                        vsize = pevent->long_size;
4307                                        break;
4308                                case 2:
4309                                        vsize = 8;
4310                                        break;
4311                                default:
4312                                        vsize = ls; /* ? */
4313                                        break;
4314                                }
4315                        /* fall through */
4316                        case '*':
4317                                if (*ptr == '*')
4318                                        vsize = 4;
4319
4320                                /* the pointers are always 4 bytes aligned */
4321                                bptr = (void *)(((unsigned long)bptr + 3) &
4322                                                ~3);
4323                                val = pevent_read_number(pevent, bptr, vsize);
4324                                bptr += vsize;
4325                                arg = alloc_arg();
4326                                if (!arg) {
4327                                        do_warning_event(event, "%s(%d): not enough memory!",
4328                                                   __func__, __LINE__);
4329                                        goto out_free;
4330                                }
4331                                arg->next = NULL;
4332                                arg->type = PRINT_ATOM;
4333                                if (asprintf(&arg->atom.atom, "%lld", val) < 0) {
4334                                        free(arg);
4335                                        goto out_free;
4336                                }
4337                                *next = arg;
4338                                next = &arg->next;
4339                                /*
4340                                 * The '*' case means that an arg is used as the length.
4341                                 * We need to continue to figure out for what.
4342                                 */
4343                                if (*ptr == '*')
4344                                        goto process_again;
4345
4346                                break;
4347                        case 's':
4348                                arg = alloc_arg();
4349                                if (!arg) {
4350                                        do_warning_event(event, "%s(%d): not enough memory!",
4351                                                   __func__, __LINE__);
4352                                        goto out_free;
4353                                }
4354                                arg->next = NULL;
4355                                arg->type = PRINT_BSTRING;
4356                                arg->string.string = strdup(bptr);
4357                                if (!arg->string.string)
4358                                        goto out_free;
4359                                bptr += strlen(bptr) + 1;
4360                                *next = arg;
4361                                next = &arg->next;
4362                        default:
4363                                break;
4364                        }
4365                }
4366        }
4367
4368        return args;
4369
4370out_free:
4371        free_args(args);
4372        return NULL;
4373}
4374
4375static char *
4376get_bprint_format(void *data, int size __maybe_unused,
4377                  struct event_format *event)
4378{
4379        struct pevent *pevent = event->pevent;
4380        unsigned long long addr;
4381        struct format_field *field;
4382        struct printk_map *printk;
4383        char *format;
4384
4385        field = pevent->bprint_fmt_field;
4386
4387        if (!field) {
4388                field = pevent_find_field(event, "fmt");
4389                if (!field) {
4390                        do_warning_event(event, "can't find format field for binary printk");
4391                        return NULL;
4392                }
4393                pevent->bprint_fmt_field = field;
4394        }
4395
4396        addr = pevent_read_number(pevent, data + field->offset, field->size);
4397
4398        printk = find_printk(pevent, addr);
4399        if (!printk) {
4400                if (asprintf(&format, "%%pf: (NO FORMAT FOUND at %llx)\n", addr) < 0)
4401                        return NULL;
4402                return format;
4403        }
4404
4405        if (asprintf(&format, "%s: %s", "%pf", printk->printk) < 0)
4406                return NULL;
4407
4408        return format;
4409}
4410
4411static void print_mac_arg(struct trace_seq *s, int mac, void *data, int size,
4412                          struct event_format *event, struct print_arg *arg)
4413{
4414        unsigned char *buf;
4415        const char *fmt = "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x";
4416
4417        if (arg->type == PRINT_FUNC) {
4418                process_defined_func(s, data, size, event, arg);
4419                return;
4420        }
4421
4422        if (arg->type != PRINT_FIELD) {
4423                trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d",
4424                                 arg->type);
4425                return;
4426        }
4427
4428        if (mac == 'm')
4429                fmt = "%.2x%.2x%.2x%.2x%.2x%.2x";
4430        if (!arg->field.field) {
4431                arg->field.field =
4432                        pevent_find_any_field(event, arg->field.name);
4433                if (!arg->field.field) {
4434                        do_warning_event(event, "%s: field %s not found",
4435                                         __func__, arg->field.name);
4436                        return;
4437                }
4438        }
4439        if (arg->field.field->size != 6) {
4440                trace_seq_printf(s, "INVALIDMAC");
4441                return;
4442        }
4443        buf = data + arg->field.field->offset;
4444        trace_seq_printf(s, fmt, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
4445}
4446
4447static void print_ip4_addr(struct trace_seq *s, char i, unsigned char *buf)
4448{
4449        const char *fmt;
4450
4451        if (i == 'i')
4452                fmt = "%03d.%03d.%03d.%03d";
4453        else
4454                fmt = "%d.%d.%d.%d";
4455
4456        trace_seq_printf(s, fmt, buf[0], buf[1], buf[2], buf[3]);
4457}
4458
4459static inline bool ipv6_addr_v4mapped(const struct in6_addr *a)
4460{
4461        return ((unsigned long)(a->s6_addr32[0] | a->s6_addr32[1]) |
4462                (unsigned long)(a->s6_addr32[2] ^ htonl(0x0000ffff))) == 0UL;
4463}
4464
4465static inline bool ipv6_addr_is_isatap(const struct in6_addr *addr)
4466{
4467        return (addr->s6_addr32[2] | htonl(0x02000000)) == htonl(0x02005EFE);
4468}
4469
4470static void print_ip6c_addr(struct trace_seq *s, unsigned char *addr)
4471{
4472        int i, j, range;
4473        unsigned char zerolength[8];
4474        int longest = 1;
4475        int colonpos = -1;
4476        uint16_t word;
4477        uint8_t hi, lo;
4478        bool needcolon = false;
4479        bool useIPv4;
4480        struct in6_addr in6;
4481
4482        memcpy(&in6, addr, sizeof(struct in6_addr));
4483
4484        useIPv4 = ipv6_addr_v4mapped(&in6) || ipv6_addr_is_isatap(&in6);
4485
4486        memset(zerolength, 0, sizeof(zerolength));
4487
4488        if (useIPv4)
4489                range = 6;
4490        else
4491                range = 8;
4492
4493        /* find position of longest 0 run */
4494        for (i = 0; i < range; i++) {
4495                for (j = i; j < range; j++) {
4496                        if (in6.s6_addr16[j] != 0)
4497                                break;
4498                        zerolength[i]++;
4499                }
4500        }
4501        for (i = 0; i < range; i++) {
4502                if (zerolength[i] > longest) {
4503                        longest = zerolength[i];
4504                        colonpos = i;
4505                }
4506        }
4507        if (longest == 1)               /* don't compress a single 0 */
4508                colonpos = -1;
4509
4510        /* emit address */
4511        for (i = 0; i < range; i++) {
4512                if (i == colonpos) {
4513                        if (needcolon || i == 0)
4514                                trace_seq_printf(s, ":");
4515                        trace_seq_printf(s, ":");
4516                        needcolon = false;
4517                        i += longest - 1;
4518                        continue;
4519                }
4520                if (needcolon) {
4521                        trace_seq_printf(s, ":");
4522                        needcolon = false;
4523                }
4524                /* hex u16 without leading 0s */
4525                word = ntohs(in6.s6_addr16[i]);
4526                hi = word >> 8;
4527                lo = word & 0xff;
4528                if (hi)
4529                        trace_seq_printf(s, "%x%02x", hi, lo);
4530                else
4531                        trace_seq_printf(s, "%x", lo);
4532
4533                needcolon = true;
4534        }
4535
4536        if (useIPv4) {
4537                if (needcolon)
4538                        trace_seq_printf(s, ":");
4539                print_ip4_addr(s, 'I', &in6.s6_addr[12]);
4540        }
4541
4542        return;
4543}
4544
4545static void print_ip6_addr(struct trace_seq *s, char i, unsigned char *buf)
4546{
4547        int j;
4548
4549        for (j = 0; j < 16; j += 2) {
4550                trace_seq_printf(s, "%02x%02x", buf[j], buf[j+1]);
4551                if (i == 'I' && j < 14)
4552                        trace_seq_printf(s, ":");
4553        }
4554}
4555
4556/*
4557 * %pi4   print an IPv4 address with leading zeros
4558 * %pI4   print an IPv4 address without leading zeros
4559 * %pi6   print an IPv6 address without colons
4560 * %pI6   print an IPv6 address with colons
4561 * %pI6c  print an IPv6 address in compressed form with colons
4562 * %pISpc print an IP address based on sockaddr; p adds port.
4563 */
4564static int print_ipv4_arg(struct trace_seq *s, const char *ptr, char i,
4565                          void *data, int size, struct event_format *event,
4566                          struct print_arg *arg)
4567{
4568        unsigned char *buf;
4569
4570        if (arg->type == PRINT_FUNC) {
4571                process_defined_func(s, data, size, event, arg);
4572                return 0;
4573        }
4574
4575        if (arg->type != PRINT_FIELD) {
4576                trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type);
4577                return 0;
4578        }
4579
4580        if (!arg->field.field) {
4581                arg->field.field =
4582                        pevent_find_any_field(event, arg->field.name);
4583                if (!arg->field.field) {
4584                        do_warning("%s: field %s not found",
4585                                   __func__, arg->field.name);
4586                        return 0;
4587                }
4588        }
4589
4590        buf = data + arg->field.field->offset;
4591
4592        if (arg->field.field->size != 4) {
4593                trace_seq_printf(s, "INVALIDIPv4");
4594                return 0;
4595        }
4596        print_ip4_addr(s, i, buf);
4597
4598        return 0;
4599}
4600
4601static int print_ipv6_arg(struct trace_seq *s, const char *ptr, char i,
4602                          void *data, int size, struct event_format *event,
4603                          struct print_arg *arg)
4604{
4605        char have_c = 0;
4606        unsigned char *buf;
4607        int rc = 0;
4608
4609        /* pI6c */
4610        if (i == 'I' && *ptr == 'c') {
4611                have_c = 1;
4612                ptr++;
4613                rc++;
4614        }
4615
4616        if (arg->type == PRINT_FUNC) {
4617                process_defined_func(s, data, size, event, arg);
4618                return rc;
4619        }
4620
4621        if (arg->type != PRINT_FIELD) {
4622                trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type);
4623                return rc;
4624        }
4625
4626        if (!arg->field.field) {
4627                arg->field.field =
4628                        pevent_find_any_field(event, arg->field.name);
4629                if (!arg->field.field) {
4630                        do_warning("%s: field %s not found",
4631                                   __func__, arg->field.name);
4632                        return rc;
4633                }
4634        }
4635
4636        buf = data + arg->field.field->offset;
4637
4638        if (arg->field.field->size != 16) {
4639                trace_seq_printf(s, "INVALIDIPv6");
4640                return rc;
4641        }
4642
4643        if (have_c)
4644                print_ip6c_addr(s, buf);
4645        else
4646                print_ip6_addr(s, i, buf);
4647
4648        return rc;
4649}
4650
4651static int print_ipsa_arg(struct trace_seq *s, const char *ptr, char i,
4652                          void *data, int size, struct event_format *event,
4653                          struct print_arg *arg)
4654{
4655        char have_c = 0, have_p = 0;
4656        unsigned char *buf;
4657        struct sockaddr_storage *sa;
4658        int rc = 0;
4659
4660        /* pISpc */
4661        if (i == 'I') {
4662                if (*ptr == 'p') {
4663                        have_p = 1;
4664                        ptr++;
4665                        rc++;
4666                }
4667                if (*ptr == 'c') {
4668                        have_c = 1;
4669                        ptr++;
4670                        rc++;
4671                }
4672        }
4673
4674        if (arg->type == PRINT_FUNC) {
4675                process_defined_func(s, data, size, event, arg);
4676                return rc;
4677        }
4678
4679        if (arg->type != PRINT_FIELD) {
4680                trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type);
4681                return rc;
4682        }
4683
4684        if (!arg->field.field) {
4685                arg->field.field =
4686                        pevent_find_any_field(event, arg->field.name);
4687                if (!arg->field.field) {
4688                        do_warning("%s: field %s not found",
4689                                   __func__, arg->field.name);
4690                        return rc;
4691                }
4692        }
4693
4694        sa = (struct sockaddr_storage *) (data + arg->field.field->offset);
4695
4696        if (sa->ss_family == AF_INET) {
4697                struct sockaddr_in *sa4 = (struct sockaddr_in *) sa;
4698
4699                if (arg->field.field->size < sizeof(struct sockaddr_in)) {
4700                        trace_seq_printf(s, "INVALIDIPv4");
4701                        return rc;
4702                }
4703
4704                print_ip4_addr(s, i, (unsigned char *) &sa4->sin_addr);
4705                if (have_p)
4706                        trace_seq_printf(s, ":%d", ntohs(sa4->sin_port));
4707
4708
4709        } else if (sa->ss_family == AF_INET6) {
4710                struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *) sa;
4711
4712                if (arg->field.field->size < sizeof(struct sockaddr_in6)) {
4713                        trace_seq_printf(s, "INVALIDIPv6");
4714                        return rc;
4715                }
4716
4717                if (have_p)
4718                        trace_seq_printf(s, "[");
4719
4720                buf = (unsigned char *) &sa6->sin6_addr;
4721                if (have_c)
4722                        print_ip6c_addr(s, buf);
4723                else
4724                        print_ip6_addr(s, i, buf);
4725
4726                if (have_p)
4727                        trace_seq_printf(s, "]:%d", ntohs(sa6->sin6_port));
4728        }
4729
4730        return rc;
4731}
4732
4733static int print_ip_arg(struct trace_seq *s, const char *ptr,
4734                        void *data, int size, struct event_format *event,
4735                        struct print_arg *arg)
4736{
4737        char i = *ptr;  /* 'i' or 'I' */
4738        char ver;
4739        int rc = 0;
4740
4741        ptr++;
4742        rc++;
4743
4744        ver = *ptr;
4745        ptr++;
4746        rc++;
4747
4748        switch (ver) {
4749        case '4':
4750                rc += print_ipv4_arg(s, ptr, i, data, size, event, arg);
4751                break;
4752        case '6':
4753                rc += print_ipv6_arg(s, ptr, i, data, size, event, arg);
4754                break;
4755        case 'S':
4756                rc += print_ipsa_arg(s, ptr, i, data, size, event, arg);
4757                break;
4758        default:
4759                return 0;
4760        }
4761
4762        return rc;
4763}
4764
4765static int is_printable_array(char *p, unsigned int len)
4766{
4767        unsigned int i;
4768
4769        for (i = 0; i < len && p[i]; i++)
4770                if (!isprint(p[i]) && !isspace(p[i]))
4771                    return 0;
4772        return 1;
4773}
4774
4775void pevent_print_field(struct trace_seq *s, void *data,
4776                        struct format_field *field)
4777{
4778        unsigned long long val;
4779        unsigned int offset, len, i;
4780        struct pevent *pevent = field->event->pevent;
4781
4782        if (field->flags & FIELD_IS_ARRAY) {
4783                offset = field->offset;
4784                len = field->size;
4785                if (field->flags & FIELD_IS_DYNAMIC) {
4786                        val = pevent_read_number(pevent, data + offset, len);
4787                        offset = val;
4788                        len = offset >> 16;
4789                        offset &= 0xffff;
4790                }
4791                if (field->flags & FIELD_IS_STRING &&
4792                    is_printable_array(data + offset, len)) {
4793                        trace_seq_printf(s, "%s", (char *)data + offset);
4794                } else {
4795                        trace_seq_puts(s, "ARRAY[");
4796                        for (i = 0; i < len; i++) {
4797                                if (i)
4798                                        trace_seq_puts(s, ", ");
4799                                trace_seq_printf(s, "%02x",
4800                                                 *((unsigned char *)data + offset + i));
4801                        }
4802                        trace_seq_putc(s, ']');
4803                        field->flags &= ~FIELD_IS_STRING;
4804                }
4805        } else {
4806                val = pevent_read_number(pevent, data + field->offset,
4807                                         field->size);
4808                if (field->flags & FIELD_IS_POINTER) {
4809                        trace_seq_printf(s, "0x%llx", val);
4810                } else if (field->flags & FIELD_IS_SIGNED) {
4811                        switch (field->size) {
4812                        case 4:
4813                                /*
4814                                 * If field is long then print it in hex.
4815                                 * A long usually stores pointers.
4816                                 */
4817                                if (field->flags & FIELD_IS_LONG)
4818                                        trace_seq_printf(s, "0x%x", (int)val);
4819                                else
4820                                        trace_seq_printf(s, "%d", (int)val);
4821                                break;
4822                        case 2:
4823                                trace_seq_printf(s, "%2d", (short)val);
4824                                break;
4825                        case 1:
4826                                trace_seq_printf(s, "%1d", (char)val);
4827                                break;
4828                        default:
4829                                trace_seq_printf(s, "%lld", val);
4830                        }
4831                } else {
4832                        if (field->flags & FIELD_IS_LONG)
4833                                trace_seq_printf(s, "0x%llx", val);
4834                        else
4835                                trace_seq_printf(s, "%llu", val);
4836                }
4837        }
4838}
4839
4840void pevent_print_fields(struct trace_seq *s, void *data,
4841                         int size __maybe_unused, struct event_format *event)
4842{
4843        struct format_field *field;
4844
4845        field = event->format.fields;
4846        while (field) {
4847                trace_seq_printf(s, " %s=", field->name);
4848                pevent_print_field(s, data, field);
4849                field = field->next;
4850        }
4851}
4852
4853static void pretty_print(struct trace_seq *s, void *data, int size, struct event_format *event)
4854{
4855        struct pevent *pevent = event->pevent;
4856        struct print_fmt *print_fmt = &event->print_fmt;
4857        struct print_arg *arg = print_fmt->args;
4858        struct print_arg *args = NULL;
4859        const char *ptr = print_fmt->format;
4860        unsigned long long val;
4861        struct func_map *func;
4862        const char *saveptr;
4863        struct trace_seq p;
4864        char *bprint_fmt = NULL;
4865        char format[32];
4866        int show_func;
4867        int len_as_arg;
4868        int len_arg;
4869        int len;
4870        int ls;
4871
4872        if (event->flags & EVENT_FL_FAILED) {
4873                trace_seq_printf(s, "[FAILED TO PARSE]");
4874                pevent_print_fields(s, data, size, event);
4875                return;
4876        }
4877
4878        if (event->flags & EVENT_FL_ISBPRINT) {
4879                bprint_fmt = get_bprint_format(data, size, event);
4880                args = make_bprint_args(bprint_fmt, data, size, event);
4881                arg = args;
4882                ptr = bprint_fmt;
4883        }
4884
4885        for (; *ptr; ptr++) {
4886                ls = 0;
4887                if (*ptr == '\\') {
4888                        ptr++;
4889                        switch (*ptr) {
4890                        case 'n':
4891                                trace_seq_putc(s, '\n');
4892                                break;
4893                        case 't':
4894                                trace_seq_putc(s, '\t');
4895                                break;
4896                        case 'r':
4897                                trace_seq_putc(s, '\r');
4898                                break;
4899                        case '\\':
4900                                trace_seq_putc(s, '\\');
4901                                break;
4902                        default:
4903                                trace_seq_putc(s, *ptr);
4904                                break;
4905                        }
4906
4907                } else if (*ptr == '%') {
4908                        saveptr = ptr;
4909                        show_func = 0;
4910                        len_as_arg = 0;
4911 cont_process:
4912                        ptr++;
4913                        switch (*ptr) {
4914                        case '%':
4915                                trace_seq_putc(s, '%');
4916                                break;
4917                        case '#':
4918                                /* FIXME: need to handle properly */
4919                                goto cont_process;
4920                        case 'h':
4921                                ls--;
4922                                goto cont_process;
4923                        case 'l':
4924                                ls++;
4925                                goto cont_process;
4926                        case 'L':
4927                                ls = 2;
4928                                goto cont_process;
4929                        case '*':
4930                                /* The argument is the length. */
4931                                if (!arg) {
4932                                        do_warning_event(event, "no argument match");
4933                                        event->flags |= EVENT_FL_FAILED;
4934                                        goto out_failed;
4935                                }
4936                                len_arg = eval_num_arg(data, size, event, arg);
4937                                len_as_arg = 1;
4938                                arg = arg->next;
4939                                goto cont_process;
4940                        case '.':
4941                        case 'z':
4942                        case 'Z':
4943                        case '0' ... '9':
4944                        case '-':
4945                                goto cont_process;
4946                        case 'p':
4947                                if (pevent->long_size == 4)
4948                                        ls = 1;
4949                                else
4950                                        ls = 2;
4951
4952                                if (*(ptr+1) == 'F' || *(ptr+1) == 'f' ||
4953                                    *(ptr+1) == 'S' || *(ptr+1) == 's') {
4954                                        ptr++;
4955                                        show_func = *ptr;
4956                                } else if (*(ptr+1) == 'M' || *(ptr+1) == 'm') {
4957                                        print_mac_arg(s, *(ptr+1), data, size, event, arg);
4958                                        ptr++;
4959                                        arg = arg->next;
4960                                        break;
4961                                } else if (*(ptr+1) == 'I' || *(ptr+1) == 'i') {
4962                                        int n;
4963
4964                                        n = print_ip_arg(s, ptr+1, data, size, event, arg);
4965                                        if (n > 0) {
4966                                                ptr += n;
4967                                                arg = arg->next;
4968                                                break;
4969                                        }
4970                                }
4971
4972                                /* fall through */
4973                        case 'd':
4974                        case 'i':
4975                        case 'x':
4976                        case 'X':
4977                        case 'u':
4978                                if (!arg) {
4979                                        do_warning_event(event, "no argument match");
4980                                        event->flags |= EVENT_FL_FAILED;
4981                                        goto out_failed;
4982                                }
4983
4984                                len = ((unsigned long)ptr + 1) -
4985                                        (unsigned long)saveptr;
4986
4987                                /* should never happen */
4988                                if (len > 31) {
4989                                        do_warning_event(event, "bad format!");
4990                                        event->flags |= EVENT_FL_FAILED;
4991                                        len = 31;
4992                                }
4993
4994                                memcpy(format, saveptr, len);
4995                                format[len] = 0;
4996
4997                                val = eval_num_arg(data, size, event, arg);
4998                                arg = arg->next;
4999
5000                                if (show_func) {
5001                                        func = find_func(pevent, val);
5002                                        if (func) {
5003                                                trace_seq_puts(s, func->func);
5004                                                if (show_func == 'F')
5005                                                        trace_seq_printf(s,
5006                                                               "+0x%llx",
5007                                                               val - func->addr);
5008                                                break;
5009                                        }
5010                                }
5011                                if (pevent->long_size == 8 && ls == 1 &&
5012                                    sizeof(long) != 8) {
5013                                        char *p;
5014
5015                                        /* make %l into %ll */
5016                                        if (ls == 1 && (p = strchr(format, 'l')))
5017                                                memmove(p+1, p, strlen(p)+1);
5018                                        else if (strcmp(format, "%p") == 0)
5019                                                strcpy(format, "0x%llx");
5020                                        ls = 2;
5021                                }
5022                                switch (ls) {
5023                                case -2:
5024                                        if (len_as_arg)
5025                                                trace_seq_printf(s, format, len_arg, (char)val);
5026                                        else
5027                                                trace_seq_printf(s, format, (char)val);
5028                                        break;
5029                                case -1:
5030                                        if (len_as_arg)
5031                                                trace_seq_printf(s, format, len_arg, (short)val);
5032                                        else
5033                                                trace_seq_printf(s, format, (short)val);
5034                                        break;
5035                                case 0:
5036                                        if (len_as_arg)
5037                                                trace_seq_printf(s, format, len_arg, (int)val);
5038                                        else
5039                                                trace_seq_printf(s, format, (int)val);
5040                                        break;
5041                                case 1:
5042                                        if (len_as_arg)
5043                                                trace_seq_printf(s, format, len_arg, (long)val);
5044                                        else
5045                                                trace_seq_printf(s, format, (long)val);
5046                                        break;
5047                                case 2:
5048                                        if (len_as_arg)
5049                                                trace_seq_printf(s, format, len_arg,
5050                                                                 (long long)val);
5051                                        else
5052                                                trace_seq_printf(s, format, (long long)val);
5053                                        break;
5054                                default:
5055                                        do_warning_event(event, "bad count (%d)", ls);
5056                                        event->flags |= EVENT_FL_FAILED;
5057                                }
5058                                break;
5059                        case 's':
5060                                if (!arg) {
5061                                        do_warning_event(event, "no matching argument");
5062                                        event->flags |= EVENT_FL_FAILED;
5063                                        goto out_failed;
5064                                }
5065
5066                                len = ((unsigned long)ptr + 1) -
5067                                        (unsigned long)saveptr;
5068
5069                                /* should never happen */
5070                                if (len > 31) {
5071                                        do_warning_event(event, "bad format!");
5072                                        event->flags |= EVENT_FL_FAILED;
5073                                        len = 31;
5074                                }
5075
5076                                memcpy(format, saveptr, len);
5077                                format[len] = 0;
5078                                if (!len_as_arg)
5079                                        len_arg = -1;
5080                                /* Use helper trace_seq */
5081                                trace_seq_init(&p);
5082                                print_str_arg(&p, data, size, event,
5083                                              format, len_arg, arg);
5084                                trace_seq_terminate(&p);
5085                                trace_seq_puts(s, p.buffer);
5086                                trace_seq_destroy(&p);
5087                                arg = arg->next;
5088                                break;
5089                        default:
5090                                trace_seq_printf(s, ">%c<", *ptr);
5091
5092                        }
5093                } else
5094                        trace_seq_putc(s, *ptr);
5095        }
5096
5097        if (event->flags & EVENT_FL_FAILED) {
5098out_failed:
5099                trace_seq_printf(s, "[FAILED TO PARSE]");
5100        }
5101
5102        if (args) {
5103                free_args(args);
5104                free(bprint_fmt);
5105        }
5106}
5107
5108/**
5109 * pevent_data_lat_fmt - parse the data for the latency format
5110 * @pevent: a handle to the pevent
5111 * @s: the trace_seq to write to
5112 * @record: the record to read from
5113 *
5114 * This parses out the Latency format (interrupts disabled,
5115 * need rescheduling, in hard/soft interrupt, preempt count
5116 * and lock depth) and places it into the trace_seq.
5117 */
5118void pevent_data_lat_fmt(struct pevent *pevent,
5119                         struct trace_seq *s, struct pevent_record *record)
5120{
5121        static int check_lock_depth = 1;
5122        static int check_migrate_disable = 1;
5123        static int lock_depth_exists;
5124        static int migrate_disable_exists;
5125        unsigned int lat_flags;
5126        unsigned int pc;
5127        int lock_depth;
5128        int migrate_disable;
5129        int hardirq;
5130        int softirq;
5131        void *data = record->data;
5132
5133        lat_flags = parse_common_flags(pevent, data);
5134        pc = parse_common_pc(pevent, data);
5135        /* lock_depth may not always exist */
5136        if (lock_depth_exists)
5137                lock_depth = parse_common_lock_depth(pevent, data);
5138        else if (check_lock_depth) {
5139                lock_depth = parse_common_lock_depth(pevent, data);
5140                if (lock_depth < 0)
5141                        check_lock_depth = 0;
5142                else
5143                        lock_depth_exists = 1;
5144        }
5145
5146        /* migrate_disable may not always exist */
5147        if (migrate_disable_exists)
5148                migrate_disable = parse_common_migrate_disable(pevent, data);
5149        else if (check_migrate_disable) {
5150                migrate_disable = parse_common_migrate_disable(pevent, data);
5151                if (migrate_disable < 0)
5152                        check_migrate_disable = 0;
5153                else
5154                        migrate_disable_exists = 1;
5155        }
5156
5157        hardirq = lat_flags & TRACE_FLAG_HARDIRQ;
5158        softirq = lat_flags & TRACE_FLAG_SOFTIRQ;
5159
5160        trace_seq_printf(s, "%c%c%c",
5161               (lat_flags & TRACE_FLAG_IRQS_OFF) ? 'd' :
5162               (lat_flags & TRACE_FLAG_IRQS_NOSUPPORT) ?
5163               'X' : '.',
5164               (lat_flags & TRACE_FLAG_NEED_RESCHED) ?
5165               'N' : '.',
5166               (hardirq && softirq) ? 'H' :
5167               hardirq ? 'h' : softirq ? 's' : '.');
5168
5169        if (pc)
5170                trace_seq_printf(s, "%x", pc);
5171        else
5172                trace_seq_putc(s, '.');
5173
5174        if (migrate_disable_exists) {
5175                if (migrate_disable < 0)
5176                        trace_seq_putc(s, '.');
5177                else
5178                        trace_seq_printf(s, "%d", migrate_disable);
5179        }
5180
5181        if (lock_depth_exists) {
5182                if (lock_depth < 0)
5183                        trace_seq_putc(s, '.');
5184                else
5185                        trace_seq_printf(s, "%d", lock_depth);
5186        }
5187
5188        trace_seq_terminate(s);
5189}
5190
5191/**
5192 * pevent_data_type - parse out the given event type
5193 * @pevent: a handle to the pevent
5194 * @rec: the record to read from
5195 *
5196 * This returns the event id from the @rec.
5197 */
5198int pevent_data_type(struct pevent *pevent, struct pevent_record *rec)
5199{
5200        return trace_parse_common_type(pevent, rec->data);
5201}
5202
5203/**
5204 * pevent_data_event_from_type - find the event by a given type
5205 * @pevent: a handle to the pevent
5206 * @type: the type of the event.
5207 *
5208 * This returns the event form a given @type;
5209 */
5210struct event_format *pevent_data_event_from_type(struct pevent *pevent, int type)
5211{
5212        return pevent_find_event(pevent, type);
5213}
5214
5215/**
5216 * pevent_data_pid - parse the PID from record
5217 * @pevent: a handle to the pevent
5218 * @rec: the record to parse
5219 *
5220 * This returns the PID from a record.
5221 */
5222int pevent_data_pid(struct pevent *pevent, struct pevent_record *rec)
5223{
5224        return parse_common_pid(pevent, rec->data);
5225}
5226
5227/**
5228 * pevent_data_preempt_count - parse the preempt count from the record
5229 * @pevent: a handle to the pevent
5230 * @rec: the record to parse
5231 *
5232 * This returns the preempt count from a record.
5233 */
5234int pevent_data_preempt_count(struct pevent *pevent, struct pevent_record *rec)
5235{
5236        return parse_common_pc(pevent, rec->data);
5237}
5238
5239/**
5240 * pevent_data_flags - parse the latency flags from the record
5241 * @pevent: a handle to the pevent
5242 * @rec: the record to parse
5243 *
5244 * This returns the latency flags from a record.
5245 *
5246 *  Use trace_flag_type enum for the flags (see event-parse.h).
5247 */
5248int pevent_data_flags(struct pevent *pevent, struct pevent_record *rec)
5249{
5250        return parse_common_flags(pevent, rec->data);
5251}
5252
5253/**
5254 * pevent_data_comm_from_pid - return the command line from PID
5255 * @pevent: a handle to the pevent
5256 * @pid: the PID of the task to search for
5257 *
5258 * This returns a pointer to the command line that has the given
5259 * @pid.
5260 */
5261const char *pevent_data_comm_from_pid(struct pevent *pevent, int pid)
5262{
5263        const char *comm;
5264
5265        comm = find_cmdline(pevent, pid);
5266        return comm;
5267}
5268
5269static struct cmdline *
5270pid_from_cmdlist(struct pevent *pevent, const char *comm, struct cmdline *next)
5271{
5272        struct cmdline_list *cmdlist = (struct cmdline_list *)next;
5273
5274        if (cmdlist)
5275                cmdlist = cmdlist->next;
5276        else
5277                cmdlist = pevent->cmdlist;
5278
5279        while (cmdlist && strcmp(cmdlist->comm, comm) != 0)
5280                cmdlist = cmdlist->next;
5281
5282        return (struct cmdline *)cmdlist;
5283}
5284
5285/**
5286 * pevent_data_pid_from_comm - return the pid from a given comm
5287 * @pevent: a handle to the pevent
5288 * @comm: the cmdline to find the pid from
5289 * @next: the cmdline structure to find the next comm
5290 *
5291 * This returns the cmdline structure that holds a pid for a given
5292 * comm, or NULL if none found. As there may be more than one pid for
5293 * a given comm, the result of this call can be passed back into
5294 * a recurring call in the @next paramater, and then it will find the
5295 * next pid.
5296 * Also, it does a linear seach, so it may be slow.
5297 */
5298struct cmdline *pevent_data_pid_from_comm(struct pevent *pevent, const char *comm,
5299                                          struct cmdline *next)
5300{
5301        struct cmdline *cmdline;
5302
5303        /*
5304         * If the cmdlines have not been converted yet, then use
5305         * the list.
5306         */
5307        if (!pevent->cmdlines)
5308                return pid_from_cmdlist(pevent, comm, next);
5309
5310        if (next) {
5311                /*
5312                 * The next pointer could have been still from
5313                 * a previous call before cmdlines were created
5314                 */
5315                if (next < pevent->cmdlines ||
5316                    next >= pevent->cmdlines + pevent->cmdline_count)
5317                        next = NULL;
5318                else
5319                        cmdline  = next++;
5320        }
5321
5322        if (!next)
5323                cmdline = pevent->cmdlines;
5324
5325        while (cmdline < pevent->cmdlines + pevent->cmdline_count) {
5326                if (strcmp(cmdline->comm, comm) == 0)
5327                        return cmdline;
5328                cmdline++;
5329        }
5330        return NULL;
5331}
5332
5333/**
5334 * pevent_cmdline_pid - return the pid associated to a given cmdline
5335 * @cmdline: The cmdline structure to get the pid from
5336 *
5337 * Returns the pid for a give cmdline. If @cmdline is NULL, then
5338 * -1 is returned.
5339 */
5340int pevent_cmdline_pid(struct pevent *pevent, struct cmdline *cmdline)
5341{
5342        struct cmdline_list *cmdlist = (struct cmdline_list *)cmdline;
5343
5344        if (!cmdline)
5345                return -1;
5346
5347        /*
5348         * If cmdlines have not been created yet, or cmdline is
5349         * not part of the array, then treat it as a cmdlist instead.
5350         */
5351        if (!pevent->cmdlines ||
5352            cmdline < pevent->cmdlines ||
5353            cmdline >= pevent->cmdlines + pevent->cmdline_count)
5354                return cmdlist->pid;
5355
5356        return cmdline->pid;
5357}
5358
5359/**
5360 * pevent_data_comm_from_pid - parse the data into the print format
5361 * @s: the trace_seq to write to
5362 * @event: the handle to the event
5363 * @record: the record to read from
5364 *
5365 * This parses the raw @data using the given @event information and
5366 * writes the print format into the trace_seq.
5367 */
5368void pevent_event_info(struct trace_seq *s, struct event_format *event,
5369                       struct pevent_record *record)
5370{
5371        int print_pretty = 1;
5372
5373        if (event->pevent->print_raw || (event->flags & EVENT_FL_PRINTRAW))
5374                pevent_print_fields(s, record->data, record->size, event);
5375        else {
5376
5377                if (event->handler && !(event->flags & EVENT_FL_NOHANDLE))
5378                        print_pretty = event->handler(s, record, event,
5379                                                      event->context);
5380
5381                if (print_pretty)
5382                        pretty_print(s, record->data, record->size, event);
5383        }
5384
5385        trace_seq_terminate(s);
5386}
5387
5388static bool is_timestamp_in_us(char *trace_clock, bool use_trace_clock)
5389{
5390        if (!use_trace_clock)
5391                return true;
5392
5393        if (!strcmp(trace_clock, "local") || !strcmp(trace_clock, "global")
5394            || !strcmp(trace_clock, "uptime") || !strcmp(trace_clock, "perf"))
5395                return true;
5396
5397        /* trace_clock is setting in tsc or counter mode */
5398        return false;
5399}
5400
5401/**
5402 * pevent_find_event_by_record - return the event from a given record
5403 * @pevent: a handle to the pevent
5404 * @record: The record to get the event from
5405 *
5406 * Returns the associated event for a given record, or NULL if non is
5407 * is found.
5408 */
5409struct event_format *
5410pevent_find_event_by_record(struct pevent *pevent, struct pevent_record *record)
5411{
5412        int type;
5413
5414        if (record->size < 0) {
5415                do_warning("ug! negative record size %d", record->size);
5416                return NULL;
5417        }
5418
5419        type = trace_parse_common_type(pevent, record->data);
5420
5421        return pevent_find_event(pevent, type);
5422}
5423
5424/**
5425 * pevent_print_event_task - Write the event task comm, pid and CPU
5426 * @pevent: a handle to the pevent
5427 * @s: the trace_seq to write to
5428 * @event: the handle to the record's event
5429 * @record: The record to get the event from
5430 *
5431 * Writes the tasks comm, pid and CPU to @s.
5432 */
5433void pevent_print_event_task(struct pevent *pevent, struct trace_seq *s,
5434                             struct event_format *event,
5435                             struct pevent_record *record)
5436{
5437        void *data = record->data;
5438        const char *comm;
5439        int pid;
5440
5441        pid = parse_common_pid(pevent, data);
5442        comm = find_cmdline(pevent, pid);
5443
5444        if (pevent->latency_format) {
5445                trace_seq_printf(s, "%8.8s-%-5d %3d",
5446                       comm, pid, record->cpu);
5447        } else
5448                trace_seq_printf(s, "%16s-%-5d [%03d]", comm, pid, record->cpu);
5449}
5450
5451/**
5452 * pevent_print_event_time - Write the event timestamp
5453 * @pevent: a handle to the pevent
5454 * @s: the trace_seq to write to
5455 * @event: the handle to the record's event
5456 * @record: The record to get the event from
5457 * @use_trace_clock: Set to parse according to the @pevent->trace_clock
5458 *
5459 * Writes the timestamp of the record into @s.
5460 */
5461void pevent_print_event_time(struct pevent *pevent, struct trace_seq *s,
5462                             struct event_format *event,
5463                             struct pevent_record *record,
5464                             bool use_trace_clock)
5465{
5466        unsigned long secs;
5467        unsigned long usecs;
5468        unsigned long nsecs;
5469        int p;
5470        bool use_usec_format;
5471
5472        use_usec_format = is_timestamp_in_us(pevent->trace_clock,
5473                                                        use_trace_clock);
5474        if (use_usec_format) {
5475                secs = record->ts / NSEC_PER_SEC;
5476                nsecs = record->ts - secs * NSEC_PER_SEC;
5477        }
5478
5479        if (pevent->latency_format) {
5480                pevent_data_lat_fmt(pevent, s, record);
5481        }
5482
5483        if (use_usec_format) {
5484                if (pevent->flags & PEVENT_NSEC_OUTPUT) {
5485                        usecs = nsecs;
5486                        p = 9;
5487                } else {
5488                        usecs = (nsecs + 500) / NSEC_PER_USEC;
5489                        /* To avoid usecs larger than 1 sec */
5490                        if (usecs >= USEC_PER_SEC) {
5491                                usecs -= USEC_PER_SEC;
5492                                secs++;
5493                        }
5494                        p = 6;
5495                }
5496
5497                trace_seq_printf(s, " %5lu.%0*lu:", secs, p, usecs);
5498        } else
5499                trace_seq_printf(s, " %12llu:", record->ts);
5500}
5501
5502/**
5503 * pevent_print_event_data - Write the event data section
5504 * @pevent: a handle to the pevent
5505 * @s: the trace_seq to write to
5506 * @event: the handle to the record's event
5507 * @record: The record to get the event from
5508 *
5509 * Writes the parsing of the record's data to @s.
5510 */
5511void pevent_print_event_data(struct pevent *pevent, struct trace_seq *s,
5512                             struct event_format *event,
5513                             struct pevent_record *record)
5514{
5515        static const char *spaces = "                    "; /* 20 spaces */
5516        int len;
5517
5518        trace_seq_printf(s, " %s: ", event->name);
5519
5520        /* Space out the event names evenly. */
5521        len = strlen(event->name);
5522        if (len < 20)
5523                trace_seq_printf(s, "%.*s", 20 - len, spaces);
5524
5525        pevent_event_info(s, event, record);
5526}
5527
5528void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
5529                        struct pevent_record *record, bool use_trace_clock)
5530{
5531        struct event_format *event;
5532
5533        event = pevent_find_event_by_record(pevent, record);
5534        if (!event) {
5535                do_warning("ug! no event found for type %d",
5536                           trace_parse_common_type(pevent, record->data));
5537                return;
5538        }
5539
5540        pevent_print_event_task(pevent, s, event, record);
5541        pevent_print_event_time(pevent, s, event, record, use_trace_clock);
5542        pevent_print_event_data(pevent, s, event, record);
5543}
5544
5545static int events_id_cmp(const void *a, const void *b)
5546{
5547        struct event_format * const * ea = a;
5548        struct event_format * const * eb = b;
5549
5550        if ((*ea)->id < (*eb)->id)
5551                return -1;
5552
5553        if ((*ea)->id > (*eb)->id)
5554                return 1;
5555
5556        return 0;
5557}
5558
5559static int events_name_cmp(const void *a, const void *b)
5560{
5561        struct event_format * const * ea = a;
5562        struct event_format * const * eb = b;
5563        int res;
5564
5565        res = strcmp((*ea)->name, (*eb)->name);
5566        if (res)
5567                return res;
5568
5569        res = strcmp((*ea)->system, (*eb)->system);
5570        if (res)
5571                return res;
5572
5573        return events_id_cmp(a, b);
5574}
5575
5576static int events_system_cmp(const void *a, const void *b)
5577{
5578        struct event_format * const * ea = a;
5579        struct event_format * const * eb = b;
5580        int res;
5581
5582        res = strcmp((*ea)->system, (*eb)->system);
5583        if (res)
5584                return res;
5585
5586        res = strcmp((*ea)->name, (*eb)->name);
5587        if (res)
5588                return res;
5589
5590        return events_id_cmp(a, b);
5591}
5592
5593struct event_format **pevent_list_events(struct pevent *pevent, enum event_sort_type sort_type)
5594{
5595        struct event_format **events;
5596        int (*sort)(const void *a, const void *b);
5597
5598        events = pevent->sort_events;
5599
5600        if (events && pevent->last_type == sort_type)
5601                return events;
5602
5603        if (!events) {
5604                events = malloc(sizeof(*events) * (pevent->nr_events + 1));
5605                if (!events)
5606                        return NULL;
5607
5608                memcpy(events, pevent->events, sizeof(*events) * pevent->nr_events);
5609                events[pevent->nr_events] = NULL;
5610
5611                pevent->sort_events = events;
5612
5613                /* the internal events are sorted by id */
5614                if (sort_type == EVENT_SORT_ID) {
5615                        pevent->last_type = sort_type;
5616                        return events;
5617                }
5618        }
5619
5620        switch (sort_type) {
5621        case EVENT_SORT_ID:
5622                sort = events_id_cmp;
5623                break;
5624        case EVENT_SORT_NAME:
5625                sort = events_name_cmp;
5626                break;
5627        case EVENT_SORT_SYSTEM:
5628                sort = events_system_cmp;
5629                break;
5630        default:
5631                return events;
5632        }
5633
5634        qsort(events, pevent->nr_events, sizeof(*events), sort);
5635        pevent->last_type = sort_type;
5636
5637        return events;
5638}
5639
5640static struct format_field **
5641get_event_fields(const char *type, const char *name,
5642                 int count, struct format_field *list)
5643{
5644        struct format_field **fields;
5645        struct format_field *field;
5646        int i = 0;
5647
5648        fields = malloc(sizeof(*fields) * (count + 1));
5649        if (!fields)
5650                return NULL;
5651
5652        for (field = list; field; field = field->next) {
5653                fields[i++] = field;
5654                if (i == count + 1) {
5655                        do_warning("event %s has more %s fields than specified",
5656                                name, type);
5657                        i--;
5658                        break;
5659                }
5660        }
5661
5662        if (i != count)
5663                do_warning("event %s has less %s fields than specified",
5664                        name, type);
5665
5666        fields[i] = NULL;
5667
5668        return fields;
5669}
5670
5671/**
5672 * pevent_event_common_fields - return a list of common fields for an event
5673 * @event: the event to return the common fields of.
5674 *
5675 * Returns an allocated array of fields. The last item in the array is NULL.
5676 * The array must be freed with free().
5677 */
5678struct format_field **pevent_event_common_fields(struct event_format *event)
5679{
5680        return get_event_fields("common", event->name,
5681                                event->format.nr_common,
5682                                event->format.common_fields);
5683}
5684
5685/**
5686 * pevent_event_fields - return a list of event specific fields for an event
5687 * @event: the event to return the fields of.
5688 *
5689 * Returns an allocated array of fields. The last item in the array is NULL.
5690 * The array must be freed with free().
5691 */
5692struct format_field **pevent_event_fields(struct event_format *event)
5693{
5694        return get_event_fields("event", event->name,
5695                                event->format.nr_fields,
5696                                event->format.fields);
5697}
5698
5699static void print_fields(struct trace_seq *s, struct print_flag_sym *field)
5700{
5701        trace_seq_printf(s, "{ %s, %s }", field->value, field->str);
5702        if (field->next) {
5703                trace_seq_puts(s, ", ");
5704                print_fields(s, field->next);
5705        }
5706}
5707
5708/* for debugging */
5709static void print_args(struct print_arg *args)
5710{
5711        int print_paren = 1;
5712        struct trace_seq s;
5713
5714        switch (args->type) {
5715        case PRINT_NULL:
5716                printf("null");
5717                break;
5718        case PRINT_ATOM:
5719                printf("%s", args->atom.atom);
5720                break;
5721        case PRINT_FIELD:
5722                printf("REC->%s", args->field.name);
5723                break;
5724        case PRINT_FLAGS:
5725                printf("__print_flags(");
5726                print_args(args->flags.field);
5727                printf(", %s, ", args->flags.delim);
5728                trace_seq_init(&s);
5729                print_fields(&s, args->flags.flags);
5730                trace_seq_do_printf(&s);
5731                trace_seq_destroy(&s);
5732                printf(")");
5733                break;
5734        case PRINT_SYMBOL:
5735                printf("__print_symbolic(");
5736                print_args(args->symbol.field);
5737                printf(", ");
5738                trace_seq_init(&s);
5739                print_fields(&s, args->symbol.symbols);
5740                trace_seq_do_printf(&s);
5741                trace_seq_destroy(&s);
5742                printf(")");
5743                break;
5744        case PRINT_HEX:
5745                printf("__print_hex(");
5746                print_args(args->hex.field);
5747                printf(", ");
5748                print_args(args->hex.size);
5749                printf(")");
5750                break;
5751        case PRINT_HEX_STR:
5752                printf("__print_hex_str(");
5753                print_args(args->hex.field);
5754                printf(", ");
5755                print_args(args->hex.size);
5756                printf(")");
5757                break;
5758        case PRINT_INT_ARRAY:
5759                printf("__print_array(");
5760                print_args(args->int_array.field);
5761                printf(", ");
5762                print_args(args->int_array.count);
5763                printf(", ");
5764                print_args(args->int_array.el_size);
5765                printf(")");
5766                break;
5767        case PRINT_STRING:
5768        case PRINT_BSTRING:
5769                printf("__get_str(%s)", args->string.string);
5770                break;
5771        case PRINT_BITMASK:
5772                printf("__get_bitmask(%s)", args->bitmask.bitmask);
5773                break;
5774        case PRINT_TYPE:
5775                printf("(%s)", args->typecast.type);
5776                print_args(args->typecast.item);
5777                break;
5778        case PRINT_OP:
5779                if (strcmp(args->op.op, ":") == 0)
5780                        print_paren = 0;
5781                if (print_paren)
5782                        printf("(");
5783                print_args(args->op.left);
5784                printf(" %s ", args->op.op);
5785                print_args(args->op.right);
5786                if (print_paren)
5787                        printf(")");
5788                break;
5789        default:
5790                /* we should warn... */
5791                return;
5792        }
5793        if (args->next) {
5794                printf("\n");
5795                print_args(args->next);
5796        }
5797}
5798
5799static void parse_header_field(const char *field,
5800                               int *offset, int *size, int mandatory)
5801{
5802        unsigned long long save_input_buf_ptr;
5803        unsigned long long save_input_buf_siz;
5804        char *token;
5805        int type;
5806
5807        save_input_buf_ptr = input_buf_ptr;
5808        save_input_buf_siz = input_buf_siz;
5809
5810        if (read_expected(EVENT_ITEM, "field") < 0)
5811                return;
5812        if (read_expected(EVENT_OP, ":") < 0)
5813                return;
5814
5815        /* type */
5816        if (read_expect_type(EVENT_ITEM, &token) < 0)
5817                goto fail;
5818        free_token(token);
5819
5820        /*
5821         * If this is not a mandatory field, then test it first.
5822         */
5823        if (mandatory) {
5824                if (read_expected(EVENT_ITEM, field) < 0)
5825                        return;
5826        } else {
5827                if (read_expect_type(EVENT_ITEM, &token) < 0)
5828                        goto fail;
5829                if (strcmp(token, field) != 0)
5830                        goto discard;
5831                free_token(token);
5832        }
5833
5834        if (read_expected(EVENT_OP, ";") < 0)
5835                return;
5836        if (read_expected(EVENT_ITEM, "offset") < 0)
5837                return;
5838        if (read_expected(EVENT_OP, ":") < 0)
5839                return;
5840        if (read_expect_type(EVENT_ITEM, &token) < 0)
5841                goto fail;
5842        *offset = atoi(token);
5843        free_token(token);
5844        if (read_expected(EVENT_OP, ";") < 0)
5845                return;
5846        if (read_expected(EVENT_ITEM, "size") < 0)
5847                return;
5848        if (read_expected(EVENT_OP, ":") < 0)
5849                return;
5850        if (read_expect_type(EVENT_ITEM, &token) < 0)
5851                goto fail;
5852        *size = atoi(token);
5853        free_token(token);
5854        if (read_expected(EVENT_OP, ";") < 0)
5855                return;
5856        type = read_token(&token);
5857        if (type != EVENT_NEWLINE) {
5858                /* newer versions of the kernel have a "signed" type */
5859                if (type != EVENT_ITEM)
5860                        goto fail;
5861
5862                if (strcmp(token, "signed") != 0)
5863                        goto fail;
5864
5865                free_token(token);
5866
5867                if (read_expected(EVENT_OP, ":") < 0)
5868                        return;
5869
5870                if (read_expect_type(EVENT_ITEM, &token))
5871                        goto fail;
5872
5873                free_token(token);
5874                if (read_expected(EVENT_OP, ";") < 0)
5875                        return;
5876
5877                if (read_expect_type(EVENT_NEWLINE, &token))
5878                        goto fail;
5879        }
5880 fail:
5881        free_token(token);
5882        return;
5883
5884 discard:
5885        input_buf_ptr = save_input_buf_ptr;
5886        input_buf_siz = save_input_buf_siz;
5887        *offset = 0;
5888        *size = 0;
5889        free_token(token);
5890}
5891
5892/**
5893 * pevent_parse_header_page - parse the data stored in the header page
5894 * @pevent: the handle to the pevent
5895 * @buf: the buffer storing the header page format string
5896 * @size: the size of @buf
5897 * @long_size: the long size to use if there is no header
5898 *
5899 * This parses the header page format for information on the
5900 * ring buffer used. The @buf should be copied from
5901 *
5902 * /sys/kernel/debug/tracing/events/header_page
5903 */
5904int pevent_parse_header_page(struct pevent *pevent, char *buf, unsigned long size,
5905                             int long_size)
5906{
5907        int ignore;
5908
5909        if (!size) {
5910                /*
5911                 * Old kernels did not have header page info.
5912                 * Sorry but we just use what we find here in user space.
5913                 */
5914                pevent->header_page_ts_size = sizeof(long long);
5915                pevent->header_page_size_size = long_size;
5916                pevent->header_page_data_offset = sizeof(long long) + long_size;
5917                pevent->old_format = 1;
5918                return -1;
5919        }
5920        init_input_buf(buf, size);
5921
5922        parse_header_field("timestamp", &pevent->header_page_ts_offset,
5923                           &pevent->header_page_ts_size, 1);
5924        parse_header_field("commit", &pevent->header_page_size_offset,
5925                           &pevent->header_page_size_size, 1);
5926        parse_header_field("overwrite", &pevent->header_page_overwrite,
5927                           &ignore, 0);
5928        parse_header_field("data", &pevent->header_page_data_offset,
5929                           &pevent->header_page_data_size, 1);
5930
5931        return 0;
5932}
5933
5934static int event_matches(struct event_format *event,
5935                         int id, const char *sys_name,
5936                         const char *event_name)
5937{
5938        if (id >= 0 && id != event->id)
5939                return 0;
5940
5941        if (event_name && (strcmp(event_name, event->name) != 0))
5942                return 0;
5943
5944        if (sys_name && (strcmp(sys_name, event->system) != 0))
5945                return 0;
5946
5947        return 1;
5948}
5949
5950static void free_handler(struct event_handler *handle)
5951{
5952        free((void *)handle->sys_name);
5953        free((void *)handle->event_name);
5954        free(handle);
5955}
5956
5957static int find_event_handle(struct pevent *pevent, struct event_format *event)
5958{
5959        struct event_handler *handle, **next;
5960
5961        for (next = &pevent->handlers; *next;
5962             next = &(*next)->next) {
5963                handle = *next;
5964                if (event_matches(event, handle->id,
5965                                  handle->sys_name,
5966                                  handle->event_name))
5967                        break;
5968        }
5969
5970        if (!(*next))
5971                return 0;
5972
5973        pr_stat("overriding event (%d) %s:%s with new print handler",
5974                event->id, event->system, event->name);
5975
5976        event->handler = handle->func;
5977        event->context = handle->context;
5978
5979        *next = handle->next;
5980        free_handler(handle);
5981
5982        return 1;
5983}
5984
5985/**
5986 * __pevent_parse_format - parse the event format
5987 * @buf: the buffer storing the event format string
5988 * @size: the size of @buf
5989 * @sys: the system the event belongs to
5990 *
5991 * This parses the event format and creates an event structure
5992 * to quickly parse raw data for a given event.
5993 *
5994 * These files currently come from:
5995 *
5996 * /sys/kernel/debug/tracing/events/.../.../format
5997 */
5998enum pevent_errno __pevent_parse_format(struct event_format **eventp,
5999                                        struct pevent *pevent, const char *buf,
6000                                        unsigned long size, const char *sys)
6001{
6002        struct event_format *event;
6003        int ret;
6004
6005        init_input_buf(buf, size);
6006
6007        *eventp = event = alloc_event();
6008        if (!event)
6009                return PEVENT_ERRNO__MEM_ALLOC_FAILED;
6010
6011        event->name = event_read_name();
6012        if (!event->name) {
6013                /* Bad event? */
6014                ret = PEVENT_ERRNO__MEM_ALLOC_FAILED;
6015                goto event_alloc_failed;
6016        }
6017
6018        if (strcmp(sys, "ftrace") == 0) {
6019                event->flags |= EVENT_FL_ISFTRACE;
6020
6021                if (strcmp(event->name, "bprint") == 0)
6022                        event->flags |= EVENT_FL_ISBPRINT;
6023        }
6024                
6025        event->id = event_read_id();
6026        if (event->id < 0) {
6027                ret = PEVENT_ERRNO__READ_ID_FAILED;
6028                /*
6029                 * This isn't an allocation error actually.
6030                 * But as the ID is critical, just bail out.
6031                 */
6032                goto event_alloc_failed;
6033        }
6034
6035        event->system = strdup(sys);
6036        if (!event->system) {
6037                ret = PEVENT_ERRNO__MEM_ALLOC_FAILED;
6038                goto event_alloc_failed;
6039        }
6040
6041        /* Add pevent to event so that it can be referenced */
6042        event->pevent = pevent;
6043
6044        ret = event_read_format(event);
6045        if (ret < 0) {
6046                ret = PEVENT_ERRNO__READ_FORMAT_FAILED;
6047                goto event_parse_failed;
6048        }
6049
6050        /*
6051         * If the event has an override, don't print warnings if the event
6052         * print format fails to parse.
6053         */
6054        if (pevent && find_event_handle(pevent, event))
6055                show_warning = 0;
6056
6057        ret = event_read_print(event);
6058        show_warning = 1;
6059
6060        if (ret < 0) {
6061                ret = PEVENT_ERRNO__READ_PRINT_FAILED;
6062                goto event_parse_failed;
6063        }
6064
6065        if (!ret && (event->flags & EVENT_FL_ISFTRACE)) {
6066                struct format_field *field;
6067                struct print_arg *arg, **list;
6068
6069                /* old ftrace had no args */
6070                list = &event->print_fmt.args;
6071                for (field = event->format.fields; field; field = field->next) {
6072                        arg = alloc_arg();
6073                        if (!arg) {
6074                                event->flags |= EVENT_FL_FAILED;
6075                                return PEVENT_ERRNO__OLD_FTRACE_ARG_FAILED;
6076                        }
6077                        arg->type = PRINT_FIELD;
6078                        arg->field.name = strdup(field->name);
6079                        if (!arg->field.name) {
6080                                event->flags |= EVENT_FL_FAILED;
6081                                free_arg(arg);
6082                                return PEVENT_ERRNO__OLD_FTRACE_ARG_FAILED;
6083                        }
6084                        arg->field.field = field;
6085                        *list = arg;
6086                        list = &arg->next;
6087                }
6088                return 0;
6089        }
6090
6091        return 0;
6092
6093 event_parse_failed:
6094        event->flags |= EVENT_FL_FAILED;
6095        return ret;
6096
6097 event_alloc_failed:
6098        free(event->system);
6099        free(event->name);
6100        free(event);
6101        *eventp = NULL;
6102        return ret;
6103}
6104
6105static enum pevent_errno
6106__pevent_parse_event(struct pevent *pevent,
6107                     struct event_format **eventp,
6108                     const char *buf, unsigned long size,
6109                     const char *sys)
6110{
6111        int ret = __pevent_parse_format(eventp, pevent, buf, size, sys);
6112        struct event_format *event = *eventp;
6113
6114        if (event == NULL)
6115                return ret;
6116
6117        if (pevent && add_event(pevent, event)) {
6118                ret = PEVENT_ERRNO__MEM_ALLOC_FAILED;
6119                goto event_add_failed;
6120        }
6121
6122#define PRINT_ARGS 0
6123        if (PRINT_ARGS && event->print_fmt.args)
6124                print_args(event->print_fmt.args);
6125
6126        return 0;
6127
6128event_add_failed:
6129        pevent_free_format(event);
6130        return ret;
6131}
6132
6133/**
6134 * pevent_parse_format - parse the event format
6135 * @pevent: the handle to the pevent
6136 * @eventp: returned format
6137 * @buf: the buffer storing the event format string
6138 * @size: the size of @buf
6139 * @sys: the system the event belongs to
6140 *
6141 * This parses the event format and creates an event structure
6142 * to quickly parse raw data for a given event.
6143 *
6144 * These files currently come from:
6145 *
6146 * /sys/kernel/debug/tracing/events/.../.../format
6147 */
6148enum pevent_errno pevent_parse_format(struct pevent *pevent,
6149                                      struct event_format **eventp,
6150                                      const char *buf,
6151                                      unsigned long size, const char *sys)
6152{
6153        return __pevent_parse_event(pevent, eventp, buf, size, sys);
6154}
6155
6156/**
6157 * pevent_parse_event - parse the event format
6158 * @pevent: the handle to the pevent
6159 * @buf: the buffer storing the event format string
6160 * @size: the size of @buf
6161 * @sys: the system the event belongs to
6162 *
6163 * This parses the event format and creates an event structure
6164 * to quickly parse raw data for a given event.
6165 *
6166 * These files currently come from:
6167 *
6168 * /sys/kernel/debug/tracing/events/.../.../format
6169 */
6170enum pevent_errno pevent_parse_event(struct pevent *pevent, const char *buf,
6171                                     unsigned long size, const char *sys)
6172{
6173        struct event_format *event = NULL;
6174        return __pevent_parse_event(pevent, &event, buf, size, sys);
6175}
6176
6177#undef _PE
6178#define _PE(code, str) str
6179static const char * const pevent_error_str[] = {
6180        PEVENT_ERRORS
6181};
6182#undef _PE
6183
6184int pevent_strerror(struct pevent *pevent __maybe_unused,
6185                    enum pevent_errno errnum, char *buf, size_t buflen)
6186{
6187        int idx;
6188        const char *msg;
6189
6190        if (errnum >= 0) {
6191                str_error_r(errnum, buf, buflen);
6192                return 0;
6193        }
6194
6195        if (errnum <= __PEVENT_ERRNO__START ||
6196            errnum >= __PEVENT_ERRNO__END)
6197                return -1;
6198
6199        idx = errnum - __PEVENT_ERRNO__START - 1;
6200        msg = pevent_error_str[idx];
6201        snprintf(buf, buflen, "%s", msg);
6202
6203        return 0;
6204}
6205
6206int get_field_val(struct trace_seq *s, struct format_field *field,
6207                  const char *name, struct pevent_record *record,
6208                  unsigned long long *val, int err)
6209{
6210        if (!field) {
6211                if (err)
6212                        trace_seq_printf(s, "<CANT FIND FIELD %s>", name);
6213                return -1;
6214        }
6215
6216        if (pevent_read_number_field(field, record->data, val)) {
6217                if (err)
6218                        trace_seq_printf(s, " %s=INVALID", name);
6219                return -1;
6220        }
6221
6222        return 0;
6223}
6224
6225/**
6226 * pevent_get_field_raw - return the raw pointer into the data field
6227 * @s: The seq to print to on error
6228 * @event: the event that the field is for
6229 * @name: The name of the field
6230 * @record: The record with the field name.
6231 * @len: place to store the field length.
6232 * @err: print default error if failed.
6233 *
6234 * Returns a pointer into record->data of the field and places
6235 * the length of the field in @len.
6236 *
6237 * On failure, it returns NULL.
6238 */
6239void *pevent_get_field_raw(struct trace_seq *s, struct event_format *event,
6240                           const char *name, struct pevent_record *record,
6241                           int *len, int err)
6242{
6243        struct format_field *field;
6244        void *data = record->data;
6245        unsigned offset;
6246        int dummy;
6247
6248        if (!event)
6249                return NULL;
6250
6251        field = pevent_find_field(event, name);
6252
6253        if (!field) {
6254                if (err)
6255                        trace_seq_printf(s, "<CANT FIND FIELD %s>", name);
6256                return NULL;
6257        }
6258
6259        /* Allow @len to be NULL */
6260        if (!len)
6261                len = &dummy;
6262
6263        offset = field->offset;
6264        if (field->flags & FIELD_IS_DYNAMIC) {
6265                offset = pevent_read_number(event->pevent,
6266                                            data + offset, field->size);
6267                *len = offset >> 16;
6268                offset &= 0xffff;
6269        } else
6270                *len = field->size;
6271
6272        return data + offset;
6273}
6274
6275/**
6276 * pevent_get_field_val - find a field and return its value
6277 * @s: The seq to print to on error
6278 * @event: the event that the field is for
6279 * @name: The name of the field
6280 * @record: The record with the field name.
6281 * @val: place to store the value of the field.
6282 * @err: print default error if failed.
6283 *
6284 * Returns 0 on success -1 on field not found.
6285 */
6286int pevent_get_field_val(struct trace_seq *s, struct event_format *event,
6287                         const char *name, struct pevent_record *record,
6288                         unsigned long long *val, int err)
6289{
6290        struct format_field *field;
6291
6292        if (!event)
6293                return -1;
6294
6295        field = pevent_find_field(event, name);
6296
6297        return get_field_val(s, field, name, record, val, err);
6298}
6299
6300/**
6301 * pevent_get_common_field_val - find a common field and return its value
6302 * @s: The seq to print to on error
6303 * @event: the event that the field is for
6304 * @name: The name of the field
6305 * @record: The record with the field name.
6306 * @val: place to store the value of the field.
6307 * @err: print default error if failed.
6308 *
6309 * Returns 0 on success -1 on field not found.
6310 */
6311int pevent_get_common_field_val(struct trace_seq *s, struct event_format *event,
6312                                const char *name, struct pevent_record *record,
6313                                unsigned long long *val, int err)
6314{
6315        struct format_field *field;
6316
6317        if (!event)
6318                return -1;
6319
6320        field = pevent_find_common_field(event, name);
6321
6322        return get_field_val(s, field, name, record, val, err);
6323}
6324
6325/**
6326 * pevent_get_any_field_val - find a any field and return its value
6327 * @s: The seq to print to on error
6328 * @event: the event that the field is for
6329 * @name: The name of the field
6330 * @record: The record with the field name.
6331 * @val: place to store the value of the field.
6332 * @err: print default error if failed.
6333 *
6334 * Returns 0 on success -1 on field not found.
6335 */
6336int pevent_get_any_field_val(struct trace_seq *s, struct event_format *event,
6337                             const char *name, struct pevent_record *record,
6338                             unsigned long long *val, int err)
6339{
6340        struct format_field *field;
6341
6342        if (!event)
6343                return -1;
6344
6345        field = pevent_find_any_field(event, name);
6346
6347        return get_field_val(s, field, name, record, val, err);
6348}
6349
6350/**
6351 * pevent_print_num_field - print a field and a format
6352 * @s: The seq to print to
6353 * @fmt: The printf format to print the field with.
6354 * @event: the event that the field is for
6355 * @name: The name of the field
6356 * @record: The record with the field name.
6357 * @err: print default error if failed.
6358 *
6359 * Returns: 0 on success, -1 field not found, or 1 if buffer is full.
6360 */
6361int pevent_print_num_field(struct trace_seq *s, const char *fmt,
6362                           struct event_format *event, const char *name,
6363                           struct pevent_record *record, int err)
6364{
6365        struct format_field *field = pevent_find_field(event, name);
6366        unsigned long long val;
6367
6368        if (!field)
6369                goto failed;
6370
6371        if (pevent_read_number_field(field, record->data, &val))
6372                goto failed;
6373
6374        return trace_seq_printf(s, fmt, val);
6375
6376 failed:
6377        if (err)
6378                trace_seq_printf(s, "CAN'T FIND FIELD \"%s\"", name);
6379        return -1;
6380}
6381
6382/**
6383 * pevent_print_func_field - print a field and a format for function pointers
6384 * @s: The seq to print to
6385 * @fmt: The printf format to print the field with.
6386 * @event: the event that the field is for
6387 * @name: The name of the field
6388 * @record: The record with the field name.
6389 * @err: print default error if failed.
6390 *
6391 * Returns: 0 on success, -1 field not found, or 1 if buffer is full.
6392 */
6393int pevent_print_func_field(struct trace_seq *s, const char *fmt,
6394                            struct event_format *event, const char *name,
6395                            struct pevent_record *record, int err)
6396{
6397        struct format_field *field = pevent_find_field(event, name);
6398        struct pevent *pevent = event->pevent;
6399        unsigned long long val;
6400        struct func_map *func;
6401        char tmp[128];
6402
6403        if (!field)
6404                goto failed;
6405
6406        if (pevent_read_number_field(field, record->data, &val))
6407                goto failed;
6408
6409        func = find_func(pevent, val);
6410
6411        if (func)
6412                snprintf(tmp, 128, "%s/0x%llx", func->func, func->addr - val);
6413        else
6414                sprintf(tmp, "0x%08llx", val);
6415
6416        return trace_seq_printf(s, fmt, tmp);
6417
6418 failed:
6419        if (err)
6420                trace_seq_printf(s, "CAN'T FIND FIELD \"%s\"", name);
6421        return -1;
6422}
6423
6424static void free_func_handle(struct pevent_function_handler *func)
6425{
6426        struct pevent_func_params *params;
6427
6428        free(func->name);
6429
6430        while (func->params) {
6431                params = func->params;
6432                func->params = params->next;
6433                free(params);
6434        }
6435
6436        free(func);
6437}
6438
6439/**
6440 * pevent_register_print_function - register a helper function
6441 * @pevent: the handle to the pevent
6442 * @func: the function to process the helper function
6443 * @ret_type: the return type of the helper function
6444 * @name: the name of the helper function
6445 * @parameters: A list of enum pevent_func_arg_type
6446 *
6447 * Some events may have helper functions in the print format arguments.
6448 * This allows a plugin to dynamically create a way to process one
6449 * of these functions.
6450 *
6451 * The @parameters is a variable list of pevent_func_arg_type enums that
6452 * must end with PEVENT_FUNC_ARG_VOID.
6453 */
6454int pevent_register_print_function(struct pevent *pevent,
6455                                   pevent_func_handler func,
6456                                   enum pevent_func_arg_type ret_type,
6457                                   char *name, ...)
6458{
6459        struct pevent_function_handler *func_handle;
6460        struct pevent_func_params **next_param;
6461        struct pevent_func_params *param;
6462        enum pevent_func_arg_type type;
6463        va_list ap;
6464        int ret;
6465
6466        func_handle = find_func_handler(pevent, name);
6467        if (func_handle) {
6468                /*
6469                 * This is most like caused by the users own
6470                 * plugins updating the function. This overrides the
6471                 * system defaults.
6472                 */
6473                pr_stat("override of function helper '%s'", name);
6474                remove_func_handler(pevent, name);
6475        }
6476
6477        func_handle = calloc(1, sizeof(*func_handle));
6478        if (!func_handle) {
6479                do_warning("Failed to allocate function handler");
6480                return PEVENT_ERRNO__MEM_ALLOC_FAILED;
6481        }
6482
6483        func_handle->ret_type = ret_type;
6484        func_handle->name = strdup(name);
6485        func_handle->func = func;
6486        if (!func_handle->name) {
6487                do_warning("Failed to allocate function name");
6488                free(func_handle);
6489                return PEVENT_ERRNO__MEM_ALLOC_FAILED;
6490        }
6491
6492        next_param = &(func_handle->params);
6493        va_start(ap, name);
6494        for (;;) {
6495                type = va_arg(ap, enum pevent_func_arg_type);
6496                if (type == PEVENT_FUNC_ARG_VOID)
6497                        break;
6498
6499                if (type >= PEVENT_FUNC_ARG_MAX_TYPES) {
6500                        do_warning("Invalid argument type %d", type);
6501                        ret = PEVENT_ERRNO__INVALID_ARG_TYPE;
6502                        goto out_free;
6503                }
6504
6505                param = malloc(sizeof(*param));
6506                if (!param) {
6507                        do_warning("Failed to allocate function param");
6508                        ret = PEVENT_ERRNO__MEM_ALLOC_FAILED;
6509                        goto out_free;
6510                }
6511                param->type = type;
6512                param->next = NULL;
6513
6514                *next_param = param;
6515                next_param = &(param->next);
6516
6517                func_handle->nr_args++;
6518        }
6519        va_end(ap);
6520
6521        func_handle->next = pevent->func_handlers;
6522        pevent->func_handlers = func_handle;
6523
6524        return 0;
6525 out_free:
6526        va_end(ap);
6527        free_func_handle(func_handle);
6528        return ret;
6529}
6530
6531/**
6532 * pevent_unregister_print_function - unregister a helper function
6533 * @pevent: the handle to the pevent
6534 * @func: the function to process the helper function
6535 * @name: the name of the helper function
6536 *
6537 * This function removes existing print handler for function @name.
6538 *
6539 * Returns 0 if the handler was removed successully, -1 otherwise.
6540 */
6541int pevent_unregister_print_function(struct pevent *pevent,
6542                                     pevent_func_handler func, char *name)
6543{
6544        struct pevent_function_handler *func_handle;
6545
6546        func_handle = find_func_handler(pevent, name);
6547        if (func_handle && func_handle->func == func) {
6548                remove_func_handler(pevent, name);
6549                return 0;
6550        }
6551        return -1;
6552}
6553
6554static struct event_format *pevent_search_event(struct pevent *pevent, int id,
6555                                                const char *sys_name,
6556                                                const char *event_name)
6557{
6558        struct event_format *event;
6559
6560        if (id >= 0) {
6561                /* search by id */
6562                event = pevent_find_event(pevent, id);
6563                if (!event)
6564                        return NULL;
6565                if (event_name && (strcmp(event_name, event->name) != 0))
6566                        return NULL;
6567                if (sys_name && (strcmp(sys_name, event->system) != 0))
6568                        return NULL;
6569        } else {
6570                event = pevent_find_event_by_name(pevent, sys_name, event_name);
6571                if (!event)
6572                        return NULL;
6573        }
6574        return event;
6575}
6576
6577/**
6578 * pevent_register_event_handler - register a way to parse an event
6579 * @pevent: the handle to the pevent
6580 * @id: the id of the event to register
6581 * @sys_name: the system name the event belongs to
6582 * @event_name: the name of the event
6583 * @func: the function to call to parse the event information
6584 * @context: the data to be passed to @func
6585 *
6586 * This function allows a developer to override the parsing of
6587 * a given event. If for some reason the default print format
6588 * is not sufficient, this function will register a function
6589 * for an event to be used to parse the data instead.
6590 *
6591 * If @id is >= 0, then it is used to find the event.
6592 * else @sys_name and @event_name are used.
6593 */
6594int pevent_register_event_handler(struct pevent *pevent, int id,
6595                                  const char *sys_name, const char *event_name,
6596                                  pevent_event_handler_func func, void *context)
6597{
6598        struct event_format *event;
6599        struct event_handler *handle;
6600
6601        event = pevent_search_event(pevent, id, sys_name, event_name);
6602        if (event == NULL)
6603                goto not_found;
6604
6605        pr_stat("overriding event (%d) %s:%s with new print handler",
6606                event->id, event->system, event->name);
6607
6608        event->handler = func;
6609        event->context = context;
6610        return 0;
6611
6612 not_found:
6613        /* Save for later use. */
6614        handle = calloc(1, sizeof(*handle));
6615        if (!handle) {
6616                do_warning("Failed to allocate event handler");
6617                return PEVENT_ERRNO__MEM_ALLOC_FAILED;
6618        }
6619
6620        handle->id = id;
6621        if (event_name)
6622                handle->event_name = strdup(event_name);
6623        if (sys_name)
6624                handle->sys_name = strdup(sys_name);
6625
6626        if ((event_name && !handle->event_name) ||
6627            (sys_name && !handle->sys_name)) {
6628                do_warning("Failed to allocate event/sys name");
6629                free((void *)handle->event_name);
6630                free((void *)handle->sys_name);
6631                free(handle);
6632                return PEVENT_ERRNO__MEM_ALLOC_FAILED;
6633        }
6634
6635        handle->func = func;
6636        handle->next = pevent->handlers;
6637        pevent->handlers = handle;
6638        handle->context = context;
6639
6640        return -1;
6641}
6642
6643static int handle_matches(struct event_handler *handler, int id,
6644                          const char *sys_name, const char *event_name,
6645                          pevent_event_handler_func func, void *context)
6646{
6647        if (id >= 0 && id != handler->id)
6648                return 0;
6649
6650        if (event_name && (strcmp(event_name, handler->event_name) != 0))
6651                return 0;
6652
6653        if (sys_name && (strcmp(sys_name, handler->sys_name) != 0))
6654                return 0;
6655
6656        if (func != handler->func || context != handler->context)
6657                return 0;
6658
6659        return 1;
6660}
6661
6662/**
6663 * pevent_unregister_event_handler - unregister an existing event handler
6664 * @pevent: the handle to the pevent
6665 * @id: the id of the event to unregister
6666 * @sys_name: the system name the handler belongs to
6667 * @event_name: the name of the event handler
6668 * @func: the function to call to parse the event information
6669 * @context: the data to be passed to @func
6670 *
6671 * This function removes existing event handler (parser).
6672 *
6673 * If @id is >= 0, then it is used to find the event.
6674 * else @sys_name and @event_name are used.
6675 *
6676 * Returns 0 if handler was removed successfully, -1 if event was not found.
6677 */
6678int pevent_unregister_event_handler(struct pevent *pevent, int id,
6679                                    const char *sys_name, const char *event_name,
6680                                    pevent_event_handler_func func, void *context)
6681{
6682        struct event_format *event;
6683        struct event_handler *handle;
6684        struct event_handler **next;
6685
6686        event = pevent_search_event(pevent, id, sys_name, event_name);
6687        if (event == NULL)
6688                goto not_found;
6689
6690        if (event->handler == func && event->context == context) {
6691                pr_stat("removing override handler for event (%d) %s:%s. Going back to default handler.",
6692                        event->id, event->system, event->name);
6693
6694                event->handler = NULL;
6695                event->context = NULL;
6696                return 0;
6697        }
6698
6699not_found:
6700        for (next = &pevent->handlers; *next; next = &(*next)->next) {
6701                handle = *next;
6702                if (handle_matches(handle, id, sys_name, event_name,
6703                                   func, context))
6704                        break;
6705        }
6706
6707        if (!(*next))
6708                return -1;
6709
6710        *next = handle->next;
6711        free_handler(handle);
6712
6713        return 0;
6714}
6715
6716/**
6717 * pevent_alloc - create a pevent handle
6718 */
6719struct pevent *pevent_alloc(void)
6720{
6721        struct pevent *pevent = calloc(1, sizeof(*pevent));
6722
6723        if (pevent)
6724                pevent->ref_count = 1;
6725
6726        return pevent;
6727}
6728
6729void pevent_ref(struct pevent *pevent)
6730{
6731        pevent->ref_count++;
6732}
6733
6734void pevent_free_format_field(struct format_field *field)
6735{
6736        free(field->type);
6737        if (field->alias != field->name)
6738                free(field->alias);
6739        free(field->name);
6740        free(field);
6741}
6742
6743static void free_format_fields(struct format_field *field)
6744{
6745        struct format_field *next;
6746
6747        while (field) {
6748                next = field->next;
6749                pevent_free_format_field(field);
6750                field = next;
6751        }
6752}
6753
6754static void free_formats(struct format *format)
6755{
6756        free_format_fields(format->common_fields);
6757        free_format_fields(format->fields);
6758}
6759
6760void pevent_free_format(struct event_format *event)
6761{
6762        free(event->name);
6763        free(event->system);
6764
6765        free_formats(&event->format);
6766
6767        free(event->print_fmt.format);
6768        free_args(event->print_fmt.args);
6769
6770        free(event);
6771}
6772
6773/**
6774 * pevent_free - free a pevent handle
6775 * @pevent: the pevent handle to free
6776 */
6777void pevent_free(struct pevent *pevent)
6778{
6779        struct cmdline_list *cmdlist, *cmdnext;
6780        struct func_list *funclist, *funcnext;
6781        struct printk_list *printklist, *printknext;
6782        struct pevent_function_handler *func_handler;
6783        struct event_handler *handle;
6784        int i;
6785
6786        if (!pevent)
6787                return;
6788
6789        cmdlist = pevent->cmdlist;
6790        funclist = pevent->funclist;
6791        printklist = pevent->printklist;
6792
6793        pevent->ref_count--;
6794        if (pevent->ref_count)
6795                return;
6796
6797        if (pevent->cmdlines) {
6798                for (i = 0; i < pevent->cmdline_count; i++)
6799                        free(pevent->cmdlines[i].comm);
6800                free(pevent->cmdlines);
6801        }
6802
6803        while (cmdlist) {
6804                cmdnext = cmdlist->next;
6805                free(cmdlist->comm);
6806                free(cmdlist);
6807                cmdlist = cmdnext;
6808        }
6809
6810        if (pevent->func_map) {
6811                for (i = 0; i < (int)pevent->func_count; i++) {
6812                        free(pevent->func_map[i].func);
6813                        free(pevent->func_map[i].mod);
6814                }
6815                free(pevent->func_map);
6816        }
6817
6818        while (funclist) {
6819                funcnext = funclist->next;
6820                free(funclist->func);
6821                free(funclist->mod);
6822                free(funclist);
6823                funclist = funcnext;
6824        }
6825
6826        while (pevent->func_handlers) {
6827                func_handler = pevent->func_handlers;
6828                pevent->func_handlers = func_handler->next;
6829                free_func_handle(func_handler);
6830        }
6831
6832        if (pevent->printk_map) {
6833                for (i = 0; i < (int)pevent->printk_count; i++)
6834                        free(pevent->printk_map[i].printk);
6835                free(pevent->printk_map);
6836        }
6837
6838        while (printklist) {
6839                printknext = printklist->next;
6840                free(printklist->printk);
6841                free(printklist);
6842                printklist = printknext;
6843        }
6844
6845        for (i = 0; i < pevent->nr_events; i++)
6846                pevent_free_format(pevent->events[i]);
6847
6848        while (pevent->handlers) {
6849                handle = pevent->handlers;
6850                pevent->handlers = handle->next;
6851                free_handler(handle);
6852        }
6853
6854        free(pevent->trace_clock);
6855        free(pevent->events);
6856        free(pevent->sort_events);
6857        free(pevent->func_resolver);
6858
6859        free(pevent);
6860}
6861
6862void pevent_unref(struct pevent *pevent)
6863{
6864        pevent_free(pevent);
6865}
6866