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