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