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 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        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        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, int size,
3935                               struct event_format *event)
3936{
3937        struct format_field *field;
3938        unsigned long long val;
3939        unsigned int offset, len, i;
3940
3941        field = event->format.fields;
3942        while (field) {
3943                trace_seq_printf(s, " %s=", field->name);
3944                if (field->flags & FIELD_IS_ARRAY) {
3945                        offset = field->offset;
3946                        len = field->size;
3947                        if (field->flags & FIELD_IS_DYNAMIC) {
3948                                val = pevent_read_number(event->pevent, data + offset, len);
3949                                offset = val;
3950                                len = offset >> 16;
3951                                offset &= 0xffff;
3952                        }
3953                        if (field->flags & FIELD_IS_STRING &&
3954                            is_printable_array(data + offset, len)) {
3955                                trace_seq_printf(s, "%s", (char *)data + offset);
3956                        } else {
3957                                trace_seq_puts(s, "ARRAY[");
3958                                for (i = 0; i < len; i++) {
3959                                        if (i)
3960                                                trace_seq_puts(s, ", ");
3961                                        trace_seq_printf(s, "%02x",
3962                                                         *((unsigned char *)data + offset + i));
3963                                }
3964                                trace_seq_putc(s, ']');
3965                                field->flags &= ~FIELD_IS_STRING;
3966                        }
3967                } else {
3968                        val = pevent_read_number(event->pevent, data + field->offset,
3969                                                 field->size);
3970                        if (field->flags & FIELD_IS_POINTER) {
3971                                trace_seq_printf(s, "0x%llx", val);
3972                        } else if (field->flags & FIELD_IS_SIGNED) {
3973                                switch (field->size) {
3974                                case 4:
3975                                        /*
3976                                         * If field is long then print it in hex.
3977                                         * A long usually stores pointers.
3978                                         */
3979                                        if (field->flags & FIELD_IS_LONG)
3980                                                trace_seq_printf(s, "0x%x", (int)val);
3981                                        else
3982                                                trace_seq_printf(s, "%d", (int)val);
3983                                        break;
3984                                case 2:
3985                                        trace_seq_printf(s, "%2d", (short)val);
3986                                        break;
3987                                case 1:
3988                                        trace_seq_printf(s, "%1d", (char)val);
3989                                        break;
3990                                default:
3991                                        trace_seq_printf(s, "%lld", val);
3992                                }
3993                        } else {
3994                                if (field->flags & FIELD_IS_LONG)
3995                                        trace_seq_printf(s, "0x%llx", val);
3996                                else
3997                                        trace_seq_printf(s, "%llu", val);
3998                        }
3999                }
4000                field = field->next;
4001        }
4002}
4003
4004static void pretty_print(struct trace_seq *s, void *data, int size, struct event_format *event)
4005{
4006        struct pevent *pevent = event->pevent;
4007        struct print_fmt *print_fmt = &event->print_fmt;
4008        struct print_arg *arg = print_fmt->args;
4009        struct print_arg *args = NULL;
4010        const char *ptr = print_fmt->format;
4011        unsigned long long val;
4012        struct func_map *func;
4013        const char *saveptr;
4014        char *bprint_fmt = NULL;
4015        char format[32];
4016        int show_func;
4017        int len_as_arg;
4018        int len_arg;
4019        int len;
4020        int ls;
4021
4022        if (event->flags & EVENT_FL_FAILED) {
4023                trace_seq_printf(s, "[FAILED TO PARSE]");
4024                print_event_fields(s, data, size, event);
4025                return;
4026        }
4027
4028        if (event->flags & EVENT_FL_ISBPRINT) {
4029                bprint_fmt = get_bprint_format(data, size, event);
4030                args = make_bprint_args(bprint_fmt, data, size, event);
4031                arg = args;
4032                ptr = bprint_fmt;
4033        }
4034
4035        for (; *ptr; ptr++) {
4036                ls = 0;
4037                if (*ptr == '\\') {
4038                        ptr++;
4039                        switch (*ptr) {
4040                        case 'n':
4041                                trace_seq_putc(s, '\n');
4042                                break;
4043                        case 't':
4044                                trace_seq_putc(s, '\t');
4045                                break;
4046                        case 'r':
4047                                trace_seq_putc(s, '\r');
4048                                break;
4049                        case '\\':
4050                                trace_seq_putc(s, '\\');
4051                                break;
4052                        default:
4053                                trace_seq_putc(s, *ptr);
4054                                break;
4055                        }
4056
4057                } else if (*ptr == '%') {
4058                        saveptr = ptr;
4059                        show_func = 0;
4060                        len_as_arg = 0;
4061 cont_process:
4062                        ptr++;
4063                        switch (*ptr) {
4064                        case '%':
4065                                trace_seq_putc(s, '%');
4066                                break;
4067                        case '#':
4068                                /* FIXME: need to handle properly */
4069                                goto cont_process;
4070                        case 'h':
4071                                ls--;
4072                                goto cont_process;
4073                        case 'l':
4074                                ls++;
4075                                goto cont_process;
4076                        case 'L':
4077                                ls = 2;
4078                                goto cont_process;
4079                        case '*':
4080                                /* The argument is the length. */
4081                                if (!arg) {
4082                                        do_warning("no argument match");
4083                                        event->flags |= EVENT_FL_FAILED;
4084                                        goto out_failed;
4085                                }
4086                                len_arg = eval_num_arg(data, size, event, arg);
4087                                len_as_arg = 1;
4088                                arg = arg->next;
4089                                goto cont_process;
4090                        case '.':
4091                        case 'z':
4092                        case 'Z':
4093                        case '0' ... '9':
4094                                goto cont_process;
4095                        case 'p':
4096                                if (pevent->long_size == 4)
4097                                        ls = 1;
4098                                else
4099                                        ls = 2;
4100
4101                                if (*(ptr+1) == 'F' ||
4102                                    *(ptr+1) == 'f') {
4103                                        ptr++;
4104                                        show_func = *ptr;
4105                                } else if (*(ptr+1) == 'M' || *(ptr+1) == 'm') {
4106                                        print_mac_arg(s, *(ptr+1), data, size, event, arg);
4107                                        ptr++;
4108                                        arg = arg->next;
4109                                        break;
4110                                }
4111
4112                                /* fall through */
4113                        case 'd':
4114                        case 'i':
4115                        case 'x':
4116                        case 'X':
4117                        case 'u':
4118                                if (!arg) {
4119                                        do_warning("no argument match");
4120                                        event->flags |= EVENT_FL_FAILED;
4121                                        goto out_failed;
4122                                }
4123
4124                                len = ((unsigned long)ptr + 1) -
4125                                        (unsigned long)saveptr;
4126
4127                                /* should never happen */
4128                                if (len > 31) {
4129                                        do_warning("bad format!");
4130                                        event->flags |= EVENT_FL_FAILED;
4131                                        len = 31;
4132                                }
4133
4134                                memcpy(format, saveptr, len);
4135                                format[len] = 0;
4136
4137                                val = eval_num_arg(data, size, event, arg);
4138                                arg = arg->next;
4139
4140                                if (show_func) {
4141                                        func = find_func(pevent, val);
4142                                        if (func) {
4143                                                trace_seq_puts(s, func->func);
4144                                                if (show_func == 'F')
4145                                                        trace_seq_printf(s,
4146                                                               "+0x%llx",
4147                                                               val - func->addr);
4148                                                break;
4149                                        }
4150                                }
4151                                if (pevent->long_size == 8 && ls &&
4152                                    sizeof(long) != 8) {
4153                                        char *p;
4154
4155                                        ls = 2;
4156                                        /* make %l into %ll */
4157                                        p = strchr(format, 'l');
4158                                        if (p)
4159                                                memmove(p+1, p, strlen(p)+1);
4160                                        else if (strcmp(format, "%p") == 0)
4161                                                strcpy(format, "0x%llx");
4162                                }
4163                                switch (ls) {
4164                                case -2:
4165                                        if (len_as_arg)
4166                                                trace_seq_printf(s, format, len_arg, (char)val);
4167                                        else
4168                                                trace_seq_printf(s, format, (char)val);
4169                                        break;
4170                                case -1:
4171                                        if (len_as_arg)
4172                                                trace_seq_printf(s, format, len_arg, (short)val);
4173                                        else
4174                                                trace_seq_printf(s, format, (short)val);
4175                                        break;
4176                                case 0:
4177                                        if (len_as_arg)
4178                                                trace_seq_printf(s, format, len_arg, (int)val);
4179                                        else
4180                                                trace_seq_printf(s, format, (int)val);
4181                                        break;
4182                                case 1:
4183                                        if (len_as_arg)
4184                                                trace_seq_printf(s, format, len_arg, (long)val);
4185                                        else
4186                                                trace_seq_printf(s, format, (long)val);
4187                                        break;
4188                                case 2:
4189                                        if (len_as_arg)
4190                                                trace_seq_printf(s, format, len_arg,
4191                                                                 (long long)val);
4192                                        else
4193                                                trace_seq_printf(s, format, (long long)val);
4194                                        break;
4195                                default:
4196                                        do_warning("bad count (%d)", ls);
4197                                        event->flags |= EVENT_FL_FAILED;
4198                                }
4199                                break;
4200                        case 's':
4201                                if (!arg) {
4202                                        do_warning("no matching argument");
4203                                        event->flags |= EVENT_FL_FAILED;
4204                                        goto out_failed;
4205                                }
4206
4207                                len = ((unsigned long)ptr + 1) -
4208                                        (unsigned long)saveptr;
4209
4210                                /* should never happen */
4211                                if (len > 31) {
4212                                        do_warning("bad format!");
4213                                        event->flags |= EVENT_FL_FAILED;
4214                                        len = 31;
4215                                }
4216
4217                                memcpy(format, saveptr, len);
4218                                format[len] = 0;
4219                                if (!len_as_arg)
4220                                        len_arg = -1;
4221                                print_str_arg(s, data, size, event,
4222                                              format, len_arg, arg);
4223                                arg = arg->next;
4224                                break;
4225                        default:
4226                                trace_seq_printf(s, ">%c<", *ptr);
4227
4228                        }
4229                } else
4230                        trace_seq_putc(s, *ptr);
4231        }
4232
4233        if (event->flags & EVENT_FL_FAILED) {
4234out_failed:
4235                trace_seq_printf(s, "[FAILED TO PARSE]");
4236        }
4237
4238        if (args) {
4239                free_args(args);
4240                free(bprint_fmt);
4241        }
4242}
4243
4244/**
4245 * pevent_data_lat_fmt - parse the data for the latency format
4246 * @pevent: a handle to the pevent
4247 * @s: the trace_seq to write to
4248 * @record: the record to read from
4249 *
4250 * This parses out the Latency format (interrupts disabled,
4251 * need rescheduling, in hard/soft interrupt, preempt count
4252 * and lock depth) and places it into the trace_seq.
4253 */
4254void pevent_data_lat_fmt(struct pevent *pevent,
4255                         struct trace_seq *s, struct pevent_record *record)
4256{
4257        static int check_lock_depth = 1;
4258        static int check_migrate_disable = 1;
4259        static int lock_depth_exists;
4260        static int migrate_disable_exists;
4261        unsigned int lat_flags;
4262        unsigned int pc;
4263        int lock_depth;
4264        int migrate_disable;
4265        int hardirq;
4266        int softirq;
4267        void *data = record->data;
4268
4269        lat_flags = parse_common_flags(pevent, data);
4270        pc = parse_common_pc(pevent, data);
4271        /* lock_depth may not always exist */
4272        if (lock_depth_exists)
4273                lock_depth = parse_common_lock_depth(pevent, data);
4274        else if (check_lock_depth) {
4275                lock_depth = parse_common_lock_depth(pevent, data);
4276                if (lock_depth < 0)
4277                        check_lock_depth = 0;
4278                else
4279                        lock_depth_exists = 1;
4280        }
4281
4282        /* migrate_disable may not always exist */
4283        if (migrate_disable_exists)
4284                migrate_disable = parse_common_migrate_disable(pevent, data);
4285        else if (check_migrate_disable) {
4286                migrate_disable = parse_common_migrate_disable(pevent, data);
4287                if (migrate_disable < 0)
4288                        check_migrate_disable = 0;
4289                else
4290                        migrate_disable_exists = 1;
4291        }
4292
4293        hardirq = lat_flags & TRACE_FLAG_HARDIRQ;
4294        softirq = lat_flags & TRACE_FLAG_SOFTIRQ;
4295
4296        trace_seq_printf(s, "%c%c%c",
4297               (lat_flags & TRACE_FLAG_IRQS_OFF) ? 'd' :
4298               (lat_flags & TRACE_FLAG_IRQS_NOSUPPORT) ?
4299               'X' : '.',
4300               (lat_flags & TRACE_FLAG_NEED_RESCHED) ?
4301               'N' : '.',
4302               (hardirq && softirq) ? 'H' :
4303               hardirq ? 'h' : softirq ? 's' : '.');
4304
4305        if (pc)
4306                trace_seq_printf(s, "%x", pc);
4307        else
4308                trace_seq_putc(s, '.');
4309
4310        if (migrate_disable_exists) {
4311                if (migrate_disable < 0)
4312                        trace_seq_putc(s, '.');
4313                else
4314                        trace_seq_printf(s, "%d", migrate_disable);
4315        }
4316
4317        if (lock_depth_exists) {
4318                if (lock_depth < 0)
4319                        trace_seq_putc(s, '.');
4320                else
4321                        trace_seq_printf(s, "%d", lock_depth);
4322        }
4323
4324        trace_seq_terminate(s);
4325}
4326
4327/**
4328 * pevent_data_type - parse out the given event type
4329 * @pevent: a handle to the pevent
4330 * @rec: the record to read from
4331 *
4332 * This returns the event id from the @rec.
4333 */
4334int pevent_data_type(struct pevent *pevent, struct pevent_record *rec)
4335{
4336        return trace_parse_common_type(pevent, rec->data);
4337}
4338
4339/**
4340 * pevent_data_event_from_type - find the event by a given type
4341 * @pevent: a handle to the pevent
4342 * @type: the type of the event.
4343 *
4344 * This returns the event form a given @type;
4345 */
4346struct event_format *pevent_data_event_from_type(struct pevent *pevent, int type)
4347{
4348        return pevent_find_event(pevent, type);
4349}
4350
4351/**
4352 * pevent_data_pid - parse the PID from raw data
4353 * @pevent: a handle to the pevent
4354 * @rec: the record to parse
4355 *
4356 * This returns the PID from a raw data.
4357 */
4358int pevent_data_pid(struct pevent *pevent, struct pevent_record *rec)
4359{
4360        return parse_common_pid(pevent, rec->data);
4361}
4362
4363/**
4364 * pevent_data_comm_from_pid - return the command line from PID
4365 * @pevent: a handle to the pevent
4366 * @pid: the PID of the task to search for
4367 *
4368 * This returns a pointer to the command line that has the given
4369 * @pid.
4370 */
4371const char *pevent_data_comm_from_pid(struct pevent *pevent, int pid)
4372{
4373        const char *comm;
4374
4375        comm = find_cmdline(pevent, pid);
4376        return comm;
4377}
4378
4379/**
4380 * pevent_data_comm_from_pid - parse the data into the print format
4381 * @s: the trace_seq to write to
4382 * @event: the handle to the event
4383 * @record: the record to read from
4384 *
4385 * This parses the raw @data using the given @event information and
4386 * writes the print format into the trace_seq.
4387 */
4388void pevent_event_info(struct trace_seq *s, struct event_format *event,
4389                       struct pevent_record *record)
4390{
4391        int print_pretty = 1;
4392
4393        if (event->pevent->print_raw)
4394                print_event_fields(s, record->data, record->size, event);
4395        else {
4396
4397                if (event->handler)
4398                        print_pretty = event->handler(s, record, event,
4399                                                      event->context);
4400
4401                if (print_pretty)
4402                        pretty_print(s, record->data, record->size, event);
4403        }
4404
4405        trace_seq_terminate(s);
4406}
4407
4408void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
4409                        struct pevent_record *record)
4410{
4411        static char *spaces = "                    "; /* 20 spaces */
4412        struct event_format *event;
4413        unsigned long secs;
4414        unsigned long usecs;
4415        unsigned long nsecs;
4416        const char *comm;
4417        void *data = record->data;
4418        int type;
4419        int pid;
4420        int len;
4421        int p;
4422
4423        secs = record->ts / NSECS_PER_SEC;
4424        nsecs = record->ts - secs * NSECS_PER_SEC;
4425
4426        if (record->size < 0) {
4427                do_warning("ug! negative record size %d", record->size);
4428                return;
4429        }
4430
4431        type = trace_parse_common_type(pevent, data);
4432
4433        event = pevent_find_event(pevent, type);
4434        if (!event) {
4435                do_warning("ug! no event found for type %d", type);
4436                return;
4437        }
4438
4439        pid = parse_common_pid(pevent, data);
4440        comm = find_cmdline(pevent, pid);
4441
4442        if (pevent->latency_format) {
4443                trace_seq_printf(s, "%8.8s-%-5d %3d",
4444                       comm, pid, record->cpu);
4445                pevent_data_lat_fmt(pevent, s, record);
4446        } else
4447                trace_seq_printf(s, "%16s-%-5d [%03d]", comm, pid, record->cpu);
4448
4449        if (pevent->flags & PEVENT_NSEC_OUTPUT) {
4450                usecs = nsecs;
4451                p = 9;
4452        } else {
4453                usecs = (nsecs + 500) / NSECS_PER_USEC;
4454                p = 6;
4455        }
4456
4457        trace_seq_printf(s, " %5lu.%0*lu: %s: ", secs, p, usecs, event->name);
4458
4459        /* Space out the event names evenly. */
4460        len = strlen(event->name);
4461        if (len < 20)
4462                trace_seq_printf(s, "%.*s", 20 - len, spaces);
4463
4464        pevent_event_info(s, event, record);
4465}
4466
4467static int events_id_cmp(const void *a, const void *b)
4468{
4469        struct event_format * const * ea = a;
4470        struct event_format * const * eb = b;
4471
4472        if ((*ea)->id < (*eb)->id)
4473                return -1;
4474
4475        if ((*ea)->id > (*eb)->id)
4476                return 1;
4477
4478        return 0;
4479}
4480
4481static int events_name_cmp(const void *a, const void *b)
4482{
4483        struct event_format * const * ea = a;
4484        struct event_format * const * eb = b;
4485        int res;
4486
4487        res = strcmp((*ea)->name, (*eb)->name);
4488        if (res)
4489                return res;
4490
4491        res = strcmp((*ea)->system, (*eb)->system);
4492        if (res)
4493                return res;
4494
4495        return events_id_cmp(a, b);
4496}
4497
4498static int events_system_cmp(const void *a, const void *b)
4499{
4500        struct event_format * const * ea = a;
4501        struct event_format * const * eb = b;
4502        int res;
4503
4504        res = strcmp((*ea)->system, (*eb)->system);
4505        if (res)
4506                return res;
4507
4508        res = strcmp((*ea)->name, (*eb)->name);
4509        if (res)
4510                return res;
4511
4512        return events_id_cmp(a, b);
4513}
4514
4515struct event_format **pevent_list_events(struct pevent *pevent, enum event_sort_type sort_type)
4516{
4517        struct event_format **events;
4518        int (*sort)(const void *a, const void *b);
4519
4520        events = pevent->sort_events;
4521
4522        if (events && pevent->last_type == sort_type)
4523                return events;
4524
4525        if (!events) {
4526                events = malloc(sizeof(*events) * (pevent->nr_events + 1));
4527                if (!events)
4528                        return NULL;
4529
4530                memcpy(events, pevent->events, sizeof(*events) * pevent->nr_events);
4531                events[pevent->nr_events] = NULL;
4532
4533                pevent->sort_events = events;
4534
4535                /* the internal events are sorted by id */
4536                if (sort_type == EVENT_SORT_ID) {
4537                        pevent->last_type = sort_type;
4538                        return events;
4539                }
4540        }
4541
4542        switch (sort_type) {
4543        case EVENT_SORT_ID:
4544                sort = events_id_cmp;
4545                break;
4546        case EVENT_SORT_NAME:
4547                sort = events_name_cmp;
4548                break;
4549        case EVENT_SORT_SYSTEM:
4550                sort = events_system_cmp;
4551                break;
4552        default:
4553                return events;
4554        }
4555
4556        qsort(events, pevent->nr_events, sizeof(*events), sort);
4557        pevent->last_type = sort_type;
4558
4559        return events;
4560}
4561
4562static struct format_field **
4563get_event_fields(const char *type, const char *name,
4564                 int count, struct format_field *list)
4565{
4566        struct format_field **fields;
4567        struct format_field *field;
4568        int i = 0;
4569
4570        fields = malloc(sizeof(*fields) * (count + 1));
4571        if (!fields)
4572                return NULL;
4573
4574        for (field = list; field; field = field->next) {
4575                fields[i++] = field;
4576                if (i == count + 1) {
4577                        do_warning("event %s has more %s fields than specified",
4578                                name, type);
4579                        i--;
4580                        break;
4581                }
4582        }
4583
4584        if (i != count)
4585                do_warning("event %s has less %s fields than specified",
4586                        name, type);
4587
4588        fields[i] = NULL;
4589
4590        return fields;
4591}
4592
4593/**
4594 * pevent_event_common_fields - return a list of common fields for an event
4595 * @event: the event to return the common fields of.
4596 *
4597 * Returns an allocated array of fields. The last item in the array is NULL.
4598 * The array must be freed with free().
4599 */
4600struct format_field **pevent_event_common_fields(struct event_format *event)
4601{
4602        return get_event_fields("common", event->name,
4603                                event->format.nr_common,
4604                                event->format.common_fields);
4605}
4606
4607/**
4608 * pevent_event_fields - return a list of event specific fields for an event
4609 * @event: the event to return the fields of.
4610 *
4611 * Returns an allocated array of fields. The last item in the array is NULL.
4612 * The array must be freed with free().
4613 */
4614struct format_field **pevent_event_fields(struct event_format *event)
4615{
4616        return get_event_fields("event", event->name,
4617                                event->format.nr_fields,
4618                                event->format.fields);
4619}
4620
4621static void print_fields(struct trace_seq *s, struct print_flag_sym *field)
4622{
4623        trace_seq_printf(s, "{ %s, %s }", field->value, field->str);
4624        if (field->next) {
4625                trace_seq_puts(s, ", ");
4626                print_fields(s, field->next);
4627        }
4628}
4629
4630/* for debugging */
4631static void print_args(struct print_arg *args)
4632{
4633        int print_paren = 1;
4634        struct trace_seq s;
4635
4636        switch (args->type) {
4637        case PRINT_NULL:
4638                printf("null");
4639                break;
4640        case PRINT_ATOM:
4641                printf("%s", args->atom.atom);
4642                break;
4643        case PRINT_FIELD:
4644                printf("REC->%s", args->field.name);
4645                break;
4646        case PRINT_FLAGS:
4647                printf("__print_flags(");
4648                print_args(args->flags.field);
4649                printf(", %s, ", args->flags.delim);
4650                trace_seq_init(&s);
4651                print_fields(&s, args->flags.flags);
4652                trace_seq_do_printf(&s);
4653                trace_seq_destroy(&s);
4654                printf(")");
4655                break;
4656        case PRINT_SYMBOL:
4657                printf("__print_symbolic(");
4658                print_args(args->symbol.field);
4659                printf(", ");
4660                trace_seq_init(&s);
4661                print_fields(&s, args->symbol.symbols);
4662                trace_seq_do_printf(&s);
4663                trace_seq_destroy(&s);
4664                printf(")");
4665                break;
4666        case PRINT_HEX:
4667                printf("__print_hex(");
4668                print_args(args->hex.field);
4669                printf(", ");
4670                print_args(args->hex.size);
4671                printf(")");
4672                break;
4673        case PRINT_STRING:
4674        case PRINT_BSTRING:
4675                printf("__get_str(%s)", args->string.string);
4676                break;
4677        case PRINT_TYPE:
4678                printf("(%s)", args->typecast.type);
4679                print_args(args->typecast.item);
4680                break;
4681        case PRINT_OP:
4682                if (strcmp(args->op.op, ":") == 0)
4683                        print_paren = 0;
4684                if (print_paren)
4685                        printf("(");
4686                print_args(args->op.left);
4687                printf(" %s ", args->op.op);
4688                print_args(args->op.right);
4689                if (print_paren)
4690                        printf(")");
4691                break;
4692        default:
4693                /* we should warn... */
4694                return;
4695        }
4696        if (args->next) {
4697                printf("\n");
4698                print_args(args->next);
4699        }
4700}
4701
4702static void parse_header_field(const char *field,
4703                               int *offset, int *size, int mandatory)
4704{
4705        unsigned long long save_input_buf_ptr;
4706        unsigned long long save_input_buf_siz;
4707        char *token;
4708        int type;
4709
4710        save_input_buf_ptr = input_buf_ptr;
4711        save_input_buf_siz = input_buf_siz;
4712
4713        if (read_expected(EVENT_ITEM, "field") < 0)
4714                return;
4715        if (read_expected(EVENT_OP, ":") < 0)
4716                return;
4717
4718        /* type */
4719        if (read_expect_type(EVENT_ITEM, &token) < 0)
4720                goto fail;
4721        free_token(token);
4722
4723        /*
4724         * If this is not a mandatory field, then test it first.
4725         */
4726        if (mandatory) {
4727                if (read_expected(EVENT_ITEM, field) < 0)
4728                        return;
4729        } else {
4730                if (read_expect_type(EVENT_ITEM, &token) < 0)
4731                        goto fail;
4732                if (strcmp(token, field) != 0)
4733                        goto discard;
4734                free_token(token);
4735        }
4736
4737        if (read_expected(EVENT_OP, ";") < 0)
4738                return;
4739        if (read_expected(EVENT_ITEM, "offset") < 0)
4740                return;
4741        if (read_expected(EVENT_OP, ":") < 0)
4742                return;
4743        if (read_expect_type(EVENT_ITEM, &token) < 0)
4744                goto fail;
4745        *offset = atoi(token);
4746        free_token(token);
4747        if (read_expected(EVENT_OP, ";") < 0)
4748                return;
4749        if (read_expected(EVENT_ITEM, "size") < 0)
4750                return;
4751        if (read_expected(EVENT_OP, ":") < 0)
4752                return;
4753        if (read_expect_type(EVENT_ITEM, &token) < 0)
4754                goto fail;
4755        *size = atoi(token);
4756        free_token(token);
4757        if (read_expected(EVENT_OP, ";") < 0)
4758                return;
4759        type = read_token(&token);
4760        if (type != EVENT_NEWLINE) {
4761                /* newer versions of the kernel have a "signed" type */
4762                if (type != EVENT_ITEM)
4763                        goto fail;
4764
4765                if (strcmp(token, "signed") != 0)
4766                        goto fail;
4767
4768                free_token(token);
4769
4770                if (read_expected(EVENT_OP, ":") < 0)
4771                        return;
4772
4773                if (read_expect_type(EVENT_ITEM, &token))
4774                        goto fail;
4775
4776                free_token(token);
4777                if (read_expected(EVENT_OP, ";") < 0)
4778                        return;
4779
4780                if (read_expect_type(EVENT_NEWLINE, &token))
4781                        goto fail;
4782        }
4783 fail:
4784        free_token(token);
4785        return;
4786
4787 discard:
4788        input_buf_ptr = save_input_buf_ptr;
4789        input_buf_siz = save_input_buf_siz;
4790        *offset = 0;
4791        *size = 0;
4792        free_token(token);
4793}
4794
4795/**
4796 * pevent_parse_header_page - parse the data stored in the header page
4797 * @pevent: the handle to the pevent
4798 * @buf: the buffer storing the header page format string
4799 * @size: the size of @buf
4800 * @long_size: the long size to use if there is no header
4801 *
4802 * This parses the header page format for information on the
4803 * ring buffer used. The @buf should be copied from
4804 *
4805 * /sys/kernel/debug/tracing/events/header_page
4806 */
4807int pevent_parse_header_page(struct pevent *pevent, char *buf, unsigned long size,
4808                             int long_size)
4809{
4810        int ignore;
4811
4812        if (!size) {
4813                /*
4814                 * Old kernels did not have header page info.
4815                 * Sorry but we just use what we find here in user space.
4816                 */
4817                pevent->header_page_ts_size = sizeof(long long);
4818                pevent->header_page_size_size = long_size;
4819                pevent->header_page_data_offset = sizeof(long long) + long_size;
4820                pevent->old_format = 1;
4821                return -1;
4822        }
4823        init_input_buf(buf, size);
4824
4825        parse_header_field("timestamp", &pevent->header_page_ts_offset,
4826                           &pevent->header_page_ts_size, 1);
4827        parse_header_field("commit", &pevent->header_page_size_offset,
4828                           &pevent->header_page_size_size, 1);
4829        parse_header_field("overwrite", &pevent->header_page_overwrite,
4830                           &ignore, 0);
4831        parse_header_field("data", &pevent->header_page_data_offset,
4832                           &pevent->header_page_data_size, 1);
4833
4834        return 0;
4835}
4836
4837static int event_matches(struct event_format *event,
4838                         int id, const char *sys_name,
4839                         const char *event_name)
4840{
4841        if (id >= 0 && id != event->id)
4842                return 0;
4843
4844        if (event_name && (strcmp(event_name, event->name) != 0))
4845                return 0;
4846
4847        if (sys_name && (strcmp(sys_name, event->system) != 0))
4848                return 0;
4849
4850        return 1;
4851}
4852
4853static void free_handler(struct event_handler *handle)
4854{
4855        free((void *)handle->sys_name);
4856        free((void *)handle->event_name);
4857        free(handle);
4858}
4859
4860static int find_event_handle(struct pevent *pevent, struct event_format *event)
4861{
4862        struct event_handler *handle, **next;
4863
4864        for (next = &pevent->handlers; *next;
4865             next = &(*next)->next) {
4866                handle = *next;
4867                if (event_matches(event, handle->id,
4868                                  handle->sys_name,
4869                                  handle->event_name))
4870                        break;
4871        }
4872
4873        if (!(*next))
4874                return 0;
4875
4876        pr_stat("overriding event (%d) %s:%s with new print handler",
4877                event->id, event->system, event->name);
4878
4879        event->handler = handle->func;
4880        event->context = handle->context;
4881
4882        *next = handle->next;
4883        free_handler(handle);
4884
4885        return 1;
4886}
4887
4888/**
4889 * __pevent_parse_format - parse the event format
4890 * @buf: the buffer storing the event format string
4891 * @size: the size of @buf
4892 * @sys: the system the event belongs to
4893 *
4894 * This parses the event format and creates an event structure
4895 * to quickly parse raw data for a given event.
4896 *
4897 * These files currently come from:
4898 *
4899 * /sys/kernel/debug/tracing/events/.../.../format
4900 */
4901enum pevent_errno __pevent_parse_format(struct event_format **eventp,
4902                                        struct pevent *pevent, const char *buf,
4903                                        unsigned long size, const char *sys)
4904{
4905        struct event_format *event;
4906        int ret;
4907
4908        init_input_buf(buf, size);
4909
4910        *eventp = event = alloc_event();
4911        if (!event)
4912                return PEVENT_ERRNO__MEM_ALLOC_FAILED;
4913
4914        event->name = event_read_name();
4915        if (!event->name) {
4916                /* Bad event? */
4917                ret = PEVENT_ERRNO__MEM_ALLOC_FAILED;
4918                goto event_alloc_failed;
4919        }
4920
4921        if (strcmp(sys, "ftrace") == 0) {
4922                event->flags |= EVENT_FL_ISFTRACE;
4923
4924                if (strcmp(event->name, "bprint") == 0)
4925                        event->flags |= EVENT_FL_ISBPRINT;
4926        }
4927                
4928        event->id = event_read_id();
4929        if (event->id < 0) {
4930                ret = PEVENT_ERRNO__READ_ID_FAILED;
4931                /*
4932                 * This isn't an allocation error actually.
4933                 * But as the ID is critical, just bail out.
4934                 */
4935                goto event_alloc_failed;
4936        }
4937
4938        event->system = strdup(sys);
4939        if (!event->system) {
4940                ret = PEVENT_ERRNO__MEM_ALLOC_FAILED;
4941                goto event_alloc_failed;
4942        }
4943
4944        /* Add pevent to event so that it can be referenced */
4945        event->pevent = pevent;
4946
4947        ret = event_read_format(event);
4948        if (ret < 0) {
4949                ret = PEVENT_ERRNO__READ_FORMAT_FAILED;
4950                goto event_parse_failed;
4951        }
4952
4953        /*
4954         * If the event has an override, don't print warnings if the event
4955         * print format fails to parse.
4956         */
4957        if (pevent && find_event_handle(pevent, event))
4958                show_warning = 0;
4959
4960        ret = event_read_print(event);
4961        show_warning = 1;
4962
4963        if (ret < 0) {
4964                ret = PEVENT_ERRNO__READ_PRINT_FAILED;
4965                goto event_parse_failed;
4966        }
4967
4968        if (!ret && (event->flags & EVENT_FL_ISFTRACE)) {
4969                struct format_field *field;
4970                struct print_arg *arg, **list;
4971
4972                /* old ftrace had no args */
4973                list = &event->print_fmt.args;
4974                for (field = event->format.fields; field; field = field->next) {
4975                        arg = alloc_arg();
4976                        if (!arg) {
4977                                event->flags |= EVENT_FL_FAILED;
4978                                return PEVENT_ERRNO__OLD_FTRACE_ARG_FAILED;
4979                        }
4980                        arg->type = PRINT_FIELD;
4981                        arg->field.name = strdup(field->name);
4982                        if (!arg->field.name) {
4983                                event->flags |= EVENT_FL_FAILED;
4984                                free_arg(arg);
4985                                return PEVENT_ERRNO__OLD_FTRACE_ARG_FAILED;
4986                        }
4987                        arg->field.field = field;
4988                        *list = arg;
4989                        list = &arg->next;
4990                }
4991                return 0;
4992        }
4993
4994        return 0;
4995
4996 event_parse_failed:
4997        event->flags |= EVENT_FL_FAILED;
4998        return ret;
4999
5000 event_alloc_failed:
5001        free(event->system);
5002        free(event->name);
5003        free(event);
5004        *eventp = NULL;
5005        return ret;
5006}
5007
5008/**
5009 * pevent_parse_format - parse the event format
5010 * @buf: the buffer storing the event format string
5011 * @size: the size of @buf
5012 * @sys: the system the event belongs to
5013 *
5014 * This parses the event format and creates an event structure
5015 * to quickly parse raw data for a given event.
5016 *
5017 * These files currently come from:
5018 *
5019 * /sys/kernel/debug/tracing/events/.../.../format
5020 */
5021enum pevent_errno pevent_parse_format(struct event_format **eventp, const char *buf,
5022                                      unsigned long size, const char *sys)
5023{
5024        return __pevent_parse_format(eventp, NULL, buf, size, sys);
5025}
5026
5027/**
5028 * pevent_parse_event - parse the event format
5029 * @pevent: the handle to the pevent
5030 * @buf: the buffer storing the event format string
5031 * @size: the size of @buf
5032 * @sys: the system the event belongs to
5033 *
5034 * This parses the event format and creates an event structure
5035 * to quickly parse raw data for a given event.
5036 *
5037 * These files currently come from:
5038 *
5039 * /sys/kernel/debug/tracing/events/.../.../format
5040 */
5041enum pevent_errno pevent_parse_event(struct pevent *pevent, const char *buf,
5042                                     unsigned long size, const char *sys)
5043{
5044        struct event_format *event = NULL;
5045        int ret = __pevent_parse_format(&event, pevent, buf, size, sys);
5046
5047        if (event == NULL)
5048                return ret;
5049
5050        if (add_event(pevent, event)) {
5051                ret = PEVENT_ERRNO__MEM_ALLOC_FAILED;
5052                goto event_add_failed;
5053        }
5054
5055#define PRINT_ARGS 0
5056        if (PRINT_ARGS && event->print_fmt.args)
5057                print_args(event->print_fmt.args);
5058
5059        return 0;
5060
5061event_add_failed:
5062        pevent_free_format(event);
5063        return ret;
5064}
5065
5066#undef _PE
5067#define _PE(code, str) str
5068static const char * const pevent_error_str[] = {
5069        PEVENT_ERRORS
5070};
5071#undef _PE
5072
5073int pevent_strerror(struct pevent *pevent, enum pevent_errno errnum,
5074                    char *buf, size_t buflen)
5075{
5076        int idx;
5077        const char *msg;
5078
5079        if (errnum >= 0) {
5080                msg = strerror_r(errnum, buf, buflen);
5081                if (msg != buf) {
5082                        size_t len = strlen(msg);
5083                        memcpy(buf, msg, min(buflen - 1, len));
5084                        *(buf + min(buflen - 1, len)) = '\0';
5085                }
5086                return 0;
5087        }
5088
5089        if (errnum <= __PEVENT_ERRNO__START ||
5090            errnum >= __PEVENT_ERRNO__END)
5091                return -1;
5092
5093        idx = errnum - __PEVENT_ERRNO__START - 1;
5094        msg = pevent_error_str[idx];
5095
5096        switch (errnum) {
5097        case PEVENT_ERRNO__MEM_ALLOC_FAILED:
5098        case PEVENT_ERRNO__PARSE_EVENT_FAILED:
5099        case PEVENT_ERRNO__READ_ID_FAILED:
5100        case PEVENT_ERRNO__READ_FORMAT_FAILED:
5101        case PEVENT_ERRNO__READ_PRINT_FAILED:
5102        case PEVENT_ERRNO__OLD_FTRACE_ARG_FAILED:
5103                snprintf(buf, buflen, "%s", msg);
5104                break;
5105
5106        default:
5107                /* cannot reach here */
5108                break;
5109        }
5110
5111        return 0;
5112}
5113
5114int get_field_val(struct trace_seq *s, struct format_field *field,
5115                  const char *name, struct pevent_record *record,
5116                  unsigned long long *val, int err)
5117{
5118        if (!field) {
5119                if (err)
5120                        trace_seq_printf(s, "<CANT FIND FIELD %s>", name);
5121                return -1;
5122        }
5123
5124        if (pevent_read_number_field(field, record->data, val)) {
5125                if (err)
5126                        trace_seq_printf(s, " %s=INVALID", name);
5127                return -1;
5128        }
5129
5130        return 0;
5131}
5132
5133/**
5134 * pevent_get_field_raw - return the raw pointer into the data field
5135 * @s: The seq to print to on error
5136 * @event: the event that the field is for
5137 * @name: The name of the field
5138 * @record: The record with the field name.
5139 * @len: place to store the field length.
5140 * @err: print default error if failed.
5141 *
5142 * Returns a pointer into record->data of the field and places
5143 * the length of the field in @len.
5144 *
5145 * On failure, it returns NULL.
5146 */
5147void *pevent_get_field_raw(struct trace_seq *s, struct event_format *event,
5148                           const char *name, struct pevent_record *record,
5149                           int *len, int err)
5150{
5151        struct format_field *field;
5152        void *data = record->data;
5153        unsigned offset;
5154        int dummy;
5155
5156        if (!event)
5157                return NULL;
5158
5159        field = pevent_find_field(event, name);
5160
5161        if (!field) {
5162                if (err)
5163                        trace_seq_printf(s, "<CANT FIND FIELD %s>", name);
5164                return NULL;
5165        }
5166
5167        /* Allow @len to be NULL */
5168        if (!len)
5169                len = &dummy;
5170
5171        offset = field->offset;
5172        if (field->flags & FIELD_IS_DYNAMIC) {
5173                offset = pevent_read_number(event->pevent,
5174                                            data + offset, field->size);
5175                *len = offset >> 16;
5176                offset &= 0xffff;
5177        } else
5178                *len = field->size;
5179
5180        return data + offset;
5181}
5182
5183/**
5184 * pevent_get_field_val - find a field and return its value
5185 * @s: The seq to print to on error
5186 * @event: the event that the field is for
5187 * @name: The name of the field
5188 * @record: The record with the field name.
5189 * @val: place to store the value of the field.
5190 * @err: print default error if failed.
5191 *
5192 * Returns 0 on success -1 on field not found.
5193 */
5194int pevent_get_field_val(struct trace_seq *s, struct event_format *event,
5195                         const char *name, struct pevent_record *record,
5196                         unsigned long long *val, int err)
5197{
5198        struct format_field *field;
5199
5200        if (!event)
5201                return -1;
5202
5203        field = pevent_find_field(event, name);
5204
5205        return get_field_val(s, field, name, record, val, err);
5206}
5207
5208/**
5209 * pevent_get_common_field_val - find a common field and return its value
5210 * @s: The seq to print to on error
5211 * @event: the event that the field is for
5212 * @name: The name of the field
5213 * @record: The record with the field name.
5214 * @val: place to store the value of the field.
5215 * @err: print default error if failed.
5216 *
5217 * Returns 0 on success -1 on field not found.
5218 */
5219int pevent_get_common_field_val(struct trace_seq *s, struct event_format *event,
5220                                const char *name, struct pevent_record *record,
5221                                unsigned long long *val, int err)
5222{
5223        struct format_field *field;
5224
5225        if (!event)
5226                return -1;
5227
5228        field = pevent_find_common_field(event, name);
5229
5230        return get_field_val(s, field, name, record, val, err);
5231}
5232
5233/**
5234 * pevent_get_any_field_val - find a any field and return its value
5235 * @s: The seq to print to on error
5236 * @event: the event that the field is for
5237 * @name: The name of the field
5238 * @record: The record with the field name.
5239 * @val: place to store the value of the field.
5240 * @err: print default error if failed.
5241 *
5242 * Returns 0 on success -1 on field not found.
5243 */
5244int pevent_get_any_field_val(struct trace_seq *s, struct event_format *event,
5245                             const char *name, struct pevent_record *record,
5246                             unsigned long long *val, int err)
5247{
5248        struct format_field *field;
5249
5250        if (!event)
5251                return -1;
5252
5253        field = pevent_find_any_field(event, name);
5254
5255        return get_field_val(s, field, name, record, val, err);
5256}
5257
5258/**
5259 * pevent_print_num_field - print a field and a format
5260 * @s: The seq to print to
5261 * @fmt: The printf format to print the field with.
5262 * @event: the event that the field is for
5263 * @name: The name of the field
5264 * @record: The record with the field name.
5265 * @err: print default error if failed.
5266 *
5267 * Returns: 0 on success, -1 field not found, or 1 if buffer is full.
5268 */
5269int pevent_print_num_field(struct trace_seq *s, const char *fmt,
5270                           struct event_format *event, const char *name,
5271                           struct pevent_record *record, int err)
5272{
5273        struct format_field *field = pevent_find_field(event, name);
5274        unsigned long long val;
5275
5276        if (!field)
5277                goto failed;
5278
5279        if (pevent_read_number_field(field, record->data, &val))
5280                goto failed;
5281
5282        return trace_seq_printf(s, fmt, val);
5283
5284 failed:
5285        if (err)
5286                trace_seq_printf(s, "CAN'T FIND FIELD \"%s\"", name);
5287        return -1;
5288}
5289
5290static void free_func_handle(struct pevent_function_handler *func)
5291{
5292        struct pevent_func_params *params;
5293
5294        free(func->name);
5295
5296        while (func->params) {
5297                params = func->params;
5298                func->params = params->next;
5299                free(params);
5300        }
5301
5302        free(func);
5303}
5304
5305/**
5306 * pevent_register_print_function - register a helper function
5307 * @pevent: the handle to the pevent
5308 * @func: the function to process the helper function
5309 * @ret_type: the return type of the helper function
5310 * @name: the name of the helper function
5311 * @parameters: A list of enum pevent_func_arg_type
5312 *
5313 * Some events may have helper functions in the print format arguments.
5314 * This allows a plugin to dynamically create a way to process one
5315 * of these functions.
5316 *
5317 * The @parameters is a variable list of pevent_func_arg_type enums that
5318 * must end with PEVENT_FUNC_ARG_VOID.
5319 */
5320int pevent_register_print_function(struct pevent *pevent,
5321                                   pevent_func_handler func,
5322                                   enum pevent_func_arg_type ret_type,
5323                                   char *name, ...)
5324{
5325        struct pevent_function_handler *func_handle;
5326        struct pevent_func_params **next_param;
5327        struct pevent_func_params *param;
5328        enum pevent_func_arg_type type;
5329        va_list ap;
5330        int ret;
5331
5332        func_handle = find_func_handler(pevent, name);
5333        if (func_handle) {
5334                /*
5335                 * This is most like caused by the users own
5336                 * plugins updating the function. This overrides the
5337                 * system defaults.
5338                 */
5339                pr_stat("override of function helper '%s'", name);
5340                remove_func_handler(pevent, name);
5341        }
5342
5343        func_handle = calloc(1, sizeof(*func_handle));
5344        if (!func_handle) {
5345                do_warning("Failed to allocate function handler");
5346                return PEVENT_ERRNO__MEM_ALLOC_FAILED;
5347        }
5348
5349        func_handle->ret_type = ret_type;
5350        func_handle->name = strdup(name);
5351        func_handle->func = func;
5352        if (!func_handle->name) {
5353                do_warning("Failed to allocate function name");
5354                free(func_handle);
5355                return PEVENT_ERRNO__MEM_ALLOC_FAILED;
5356        }
5357
5358        next_param = &(func_handle->params);
5359        va_start(ap, name);
5360        for (;;) {
5361                type = va_arg(ap, enum pevent_func_arg_type);
5362                if (type == PEVENT_FUNC_ARG_VOID)
5363                        break;
5364
5365                if (type < 0 || type >= PEVENT_FUNC_ARG_MAX_TYPES) {
5366                        do_warning("Invalid argument type %d", type);
5367                        ret = PEVENT_ERRNO__INVALID_ARG_TYPE;
5368                        goto out_free;
5369                }
5370
5371                param = malloc(sizeof(*param));
5372                if (!param) {
5373                        do_warning("Failed to allocate function param");
5374                        ret = PEVENT_ERRNO__MEM_ALLOC_FAILED;
5375                        goto out_free;
5376                }
5377                param->type = type;
5378                param->next = NULL;
5379
5380                *next_param = param;
5381                next_param = &(param->next);
5382
5383                func_handle->nr_args++;
5384        }
5385        va_end(ap);
5386
5387        func_handle->next = pevent->func_handlers;
5388        pevent->func_handlers = func_handle;
5389
5390        return 0;
5391 out_free:
5392        va_end(ap);
5393        free_func_handle(func_handle);
5394        return ret;
5395}
5396
5397/**
5398 * pevent_register_event_handler - register a way to parse an event
5399 * @pevent: the handle to the pevent
5400 * @id: the id of the event to register
5401 * @sys_name: the system name the event belongs to
5402 * @event_name: the name of the event
5403 * @func: the function to call to parse the event information
5404 * @context: the data to be passed to @func
5405 *
5406 * This function allows a developer to override the parsing of
5407 * a given event. If for some reason the default print format
5408 * is not sufficient, this function will register a function
5409 * for an event to be used to parse the data instead.
5410 *
5411 * If @id is >= 0, then it is used to find the event.
5412 * else @sys_name and @event_name are used.
5413 */
5414int pevent_register_event_handler(struct pevent *pevent,
5415                                  int id, char *sys_name, char *event_name,
5416                                  pevent_event_handler_func func,
5417                                  void *context)
5418{
5419        struct event_format *event;
5420        struct event_handler *handle;
5421
5422        if (id >= 0) {
5423                /* search by id */
5424                event = pevent_find_event(pevent, id);
5425                if (!event)
5426                        goto not_found;
5427                if (event_name && (strcmp(event_name, event->name) != 0))
5428                        goto not_found;
5429                if (sys_name && (strcmp(sys_name, event->system) != 0))
5430                        goto not_found;
5431        } else {
5432                event = pevent_find_event_by_name(pevent, sys_name, event_name);
5433                if (!event)
5434                        goto not_found;
5435        }
5436
5437        pr_stat("overriding event (%d) %s:%s with new print handler",
5438                event->id, event->system, event->name);
5439
5440        event->handler = func;
5441        event->context = context;
5442        return 0;
5443
5444 not_found:
5445        /* Save for later use. */
5446        handle = calloc(1, sizeof(*handle));
5447        if (!handle) {
5448                do_warning("Failed to allocate event handler");
5449                return PEVENT_ERRNO__MEM_ALLOC_FAILED;
5450        }
5451
5452        handle->id = id;
5453        if (event_name)
5454                handle->event_name = strdup(event_name);
5455        if (sys_name)
5456                handle->sys_name = strdup(sys_name);
5457
5458        if ((event_name && !handle->event_name) ||
5459            (sys_name && !handle->sys_name)) {
5460                do_warning("Failed to allocate event/sys name");
5461                free((void *)handle->event_name);
5462                free((void *)handle->sys_name);
5463                free(handle);
5464                return PEVENT_ERRNO__MEM_ALLOC_FAILED;
5465        }
5466
5467        handle->func = func;
5468        handle->next = pevent->handlers;
5469        pevent->handlers = handle;
5470        handle->context = context;
5471
5472        return -1;
5473}
5474
5475/**
5476 * pevent_alloc - create a pevent handle
5477 */
5478struct pevent *pevent_alloc(void)
5479{
5480        struct pevent *pevent = calloc(1, sizeof(*pevent));
5481
5482        if (pevent)
5483                pevent->ref_count = 1;
5484
5485        return pevent;
5486}
5487
5488void pevent_ref(struct pevent *pevent)
5489{
5490        pevent->ref_count++;
5491}
5492
5493static void free_format_fields(struct format_field *field)
5494{
5495        struct format_field *next;
5496
5497        while (field) {
5498                next = field->next;
5499                free(field->type);
5500                free(field->name);
5501                free(field);
5502                field = next;
5503        }
5504}
5505
5506static void free_formats(struct format *format)
5507{
5508        free_format_fields(format->common_fields);
5509        free_format_fields(format->fields);
5510}
5511
5512void pevent_free_format(struct event_format *event)
5513{
5514        free(event->name);
5515        free(event->system);
5516
5517        free_formats(&event->format);
5518
5519        free(event->print_fmt.format);
5520        free_args(event->print_fmt.args);
5521
5522        free(event);
5523}
5524
5525/**
5526 * pevent_free - free a pevent handle
5527 * @pevent: the pevent handle to free
5528 */
5529void pevent_free(struct pevent *pevent)
5530{
5531        struct cmdline_list *cmdlist, *cmdnext;
5532        struct func_list *funclist, *funcnext;
5533        struct printk_list *printklist, *printknext;
5534        struct pevent_function_handler *func_handler;
5535        struct event_handler *handle;
5536        int i;
5537
5538        if (!pevent)
5539                return;
5540
5541        cmdlist = pevent->cmdlist;
5542        funclist = pevent->funclist;
5543        printklist = pevent->printklist;
5544
5545        pevent->ref_count--;
5546        if (pevent->ref_count)
5547                return;
5548
5549        if (pevent->cmdlines) {
5550                for (i = 0; i < pevent->cmdline_count; i++)
5551                        free(pevent->cmdlines[i].comm);
5552                free(pevent->cmdlines);
5553        }
5554
5555        while (cmdlist) {
5556                cmdnext = cmdlist->next;
5557                free(cmdlist->comm);
5558                free(cmdlist);
5559                cmdlist = cmdnext;
5560        }
5561
5562        if (pevent->func_map) {
5563                for (i = 0; i < pevent->func_count; i++) {
5564                        free(pevent->func_map[i].func);
5565                        free(pevent->func_map[i].mod);
5566                }
5567                free(pevent->func_map);
5568        }
5569
5570        while (funclist) {
5571                funcnext = funclist->next;
5572                free(funclist->func);
5573                free(funclist->mod);
5574                free(funclist);
5575                funclist = funcnext;
5576        }
5577
5578        while (pevent->func_handlers) {
5579                func_handler = pevent->func_handlers;
5580                pevent->func_handlers = func_handler->next;
5581                free_func_handle(func_handler);
5582        }
5583
5584        if (pevent->printk_map) {
5585                for (i = 0; i < pevent->printk_count; i++)
5586                        free(pevent->printk_map[i].printk);
5587                free(pevent->printk_map);
5588        }
5589
5590        while (printklist) {
5591                printknext = printklist->next;
5592                free(printklist->printk);
5593                free(printklist);
5594                printklist = printknext;
5595        }
5596
5597        for (i = 0; i < pevent->nr_events; i++)
5598                pevent_free_format(pevent->events[i]);
5599
5600        while (pevent->handlers) {
5601                handle = pevent->handlers;
5602                pevent->handlers = handle->next;
5603                free_handler(handle);
5604        }
5605
5606        free(pevent->events);
5607        free(pevent->sort_events);
5608
5609        free(pevent);
5610}
5611
5612void pevent_unref(struct pevent *pevent)
5613{
5614        pevent_free(pevent);
5615}
5616