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