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