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