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