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