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