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