1/* 2 * Copyright (C) 2009, Steven Rostedt <srostedt@redhat.com> 3 * 4 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; version 2 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 General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 * 19 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 20 * 21 * The parts for function graph printing was taken and modified from the 22 * Linux Kernel that were written by Frederic Weisbecker. 23 */ 24#define _GNU_SOURCE 25#include <stdio.h> 26#include <stdlib.h> 27#include <string.h> 28#include <ctype.h> 29#include <errno.h> 30 31#undef _GNU_SOURCE 32#include "../perf.h" 33#include "util.h" 34#include "trace-event.h" 35 36int header_page_ts_offset; 37int header_page_ts_size; 38int header_page_size_offset; 39int header_page_size_size; 40int header_page_overwrite_offset; 41int header_page_overwrite_size; 42int header_page_data_offset; 43int header_page_data_size; 44 45bool latency_format; 46 47static char *input_buf; 48static unsigned long long input_buf_ptr; 49static unsigned long long input_buf_siz; 50 51static int cpus; 52static int long_size; 53static int is_flag_field; 54static int is_symbolic_field; 55 56static struct format_field * 57find_any_field(struct event *event, const char *name); 58 59static void init_input_buf(char *buf, unsigned long long size) 60{ 61 input_buf = buf; 62 input_buf_siz = size; 63 input_buf_ptr = 0; 64} 65 66struct cmdline { 67 char *comm; 68 int pid; 69}; 70 71static struct cmdline *cmdlines; 72static int cmdline_count; 73 74static int cmdline_cmp(const void *a, const void *b) 75{ 76 const struct cmdline *ca = a; 77 const struct cmdline *cb = b; 78 79 if (ca->pid < cb->pid) 80 return -1; 81 if (ca->pid > cb->pid) 82 return 1; 83 84 return 0; 85} 86 87void parse_cmdlines(char *file, int size __unused) 88{ 89 struct cmdline_list { 90 struct cmdline_list *next; 91 char *comm; 92 int pid; 93 } *list = NULL, *item; 94 char *line; 95 char *next = NULL; 96 int i; 97 98 line = strtok_r(file, "\n", &next); 99 while (line) { 100 item = malloc_or_die(sizeof(*item)); 101 sscanf(line, "%d %as", &item->pid, 102 (float *)(void *)&item->comm); /* workaround gcc warning */ 103 item->next = list; 104 list = item; 105 line = strtok_r(NULL, "\n", &next); 106 cmdline_count++; 107 } 108 109 cmdlines = malloc_or_die(sizeof(*cmdlines) * cmdline_count); 110 111 i = 0; 112 while (list) { 113 cmdlines[i].pid = list->pid; 114 cmdlines[i].comm = list->comm; 115 i++; 116 item = list; 117 list = list->next; 118 free(item); 119 } 120 121 qsort(cmdlines, cmdline_count, sizeof(*cmdlines), cmdline_cmp); 122} 123 124static struct func_map { 125 unsigned long long addr; 126 char *func; 127 char *mod; 128} *func_list; 129static unsigned int func_count; 130 131static int func_cmp(const void *a, const void *b) 132{ 133 const struct func_map *fa = a; 134 const struct func_map *fb = b; 135 136 if (fa->addr < fb->addr) 137 return -1; 138 if (fa->addr > fb->addr) 139 return 1; 140 141 return 0; 142} 143 144void parse_proc_kallsyms(char *file, unsigned int size __unused) 145{ 146 struct func_list { 147 struct func_list *next; 148 unsigned long long addr; 149 char *func; 150 char *mod; 151 } *list = NULL, *item; 152 char *line; 153 char *next = NULL; 154 char *addr_str; 155 char ch; 156 int ret __used; 157 int i; 158 159 line = strtok_r(file, "\n", &next); 160 while (line) { 161 item = malloc_or_die(sizeof(*item)); 162 item->mod = NULL; 163 ret = sscanf(line, "%as %c %as\t[%as", 164 (float *)(void *)&addr_str, /* workaround gcc warning */ 165 &ch, 166 (float *)(void *)&item->func, 167 (float *)(void *)&item->mod); 168 item->addr = strtoull(addr_str, NULL, 16); 169 free(addr_str); 170 171 /* truncate the extra ']' */ 172 if (item->mod) 173 item->mod[strlen(item->mod) - 1] = 0; 174 175 176 item->next = list; 177 list = item; 178 line = strtok_r(NULL, "\n", &next); 179 func_count++; 180 } 181 182 func_list = malloc_or_die(sizeof(*func_list) * (func_count + 1)); 183 184 i = 0; 185 while (list) { 186 func_list[i].func = list->func; 187 func_list[i].addr = list->addr; 188 func_list[i].mod = list->mod; 189 i++; 190 item = list; 191 list = list->next; 192 free(item); 193 } 194 195 qsort(func_list, func_count, sizeof(*func_list), func_cmp); 196 197 /* 198 * Add a special record at the end. 199 */ 200 func_list[func_count].func = NULL; 201 func_list[func_count].addr = 0; 202 func_list[func_count].mod = NULL; 203} 204 205/* 206 * We are searching for a record in between, not an exact 207 * match. 208 */ 209static int func_bcmp(const void *a, const void *b) 210{ 211 const struct func_map *fa = a; 212 const struct func_map *fb = b; 213 214 if ((fa->addr == fb->addr) || 215 216 (fa->addr > fb->addr && 217 fa->addr < (fb+1)->addr)) 218 return 0; 219 220 if (fa->addr < fb->addr) 221 return -1; 222 223 return 1; 224} 225 226static struct func_map *find_func(unsigned long long addr) 227{ 228 struct func_map *func; 229 struct func_map key; 230 231 key.addr = addr; 232 233 func = bsearch(&key, func_list, func_count, sizeof(*func_list), 234 func_bcmp); 235 236 return func; 237} 238 239void print_funcs(void) 240{ 241 int i; 242 243 for (i = 0; i < (int)func_count; i++) { 244 printf("%016llx %s", 245 func_list[i].addr, 246 func_list[i].func); 247 if (func_list[i].mod) 248 printf(" [%s]\n", func_list[i].mod); 249 else 250 printf("\n"); 251 } 252} 253 254static struct printk_map { 255 unsigned long long addr; 256 char *printk; 257} *printk_list; 258static unsigned int printk_count; 259 260static int printk_cmp(const void *a, const void *b) 261{ 262 const struct func_map *fa = a; 263 const struct func_map *fb = b; 264 265 if (fa->addr < fb->addr) 266 return -1; 267 if (fa->addr > fb->addr) 268 return 1; 269 270 return 0; 271} 272 273static struct printk_map *find_printk(unsigned long long addr) 274{ 275 struct printk_map *printk; 276 struct printk_map key; 277 278 key.addr = addr; 279 280 printk = bsearch(&key, printk_list, printk_count, sizeof(*printk_list), 281 printk_cmp); 282 283 return printk; 284} 285 286void parse_ftrace_printk(char *file, unsigned int size __unused) 287{ 288 struct printk_list { 289 struct printk_list *next; 290 unsigned long long addr; 291 char *printk; 292 } *list = NULL, *item; 293 char *line; 294 char *next = NULL; 295 char *addr_str; 296 int i; 297 298 line = strtok_r(file, "\n", &next); 299 while (line) { 300 addr_str = strsep(&line, ":"); 301 if (!line) { 302 warning("error parsing print strings"); 303 break; 304 } 305 item = malloc_or_die(sizeof(*item)); 306 item->addr = strtoull(addr_str, NULL, 16); 307 /* fmt still has a space, skip it */ 308 item->printk = strdup(line+1); 309 item->next = list; 310 list = item; 311 line = strtok_r(NULL, "\n", &next); 312 printk_count++; 313 } 314 315 printk_list = malloc_or_die(sizeof(*printk_list) * printk_count + 1); 316 317 i = 0; 318 while (list) { 319 printk_list[i].printk = list->printk; 320 printk_list[i].addr = list->addr; 321 i++; 322 item = list; 323 list = list->next; 324 free(item); 325 } 326 327 qsort(printk_list, printk_count, sizeof(*printk_list), printk_cmp); 328} 329 330void print_printk(void) 331{ 332 int i; 333 334 for (i = 0; i < (int)printk_count; i++) { 335 printf("%016llx %s\n", 336 printk_list[i].addr, 337 printk_list[i].printk); 338 } 339} 340 341static struct event *alloc_event(void) 342{ 343 struct event *event; 344 345 event = malloc_or_die(sizeof(*event)); 346 memset(event, 0, sizeof(*event)); 347 348 return event; 349} 350 351enum event_type { 352 EVENT_ERROR, 353 EVENT_NONE, 354 EVENT_SPACE, 355 EVENT_NEWLINE, 356 EVENT_OP, 357 EVENT_DELIM, 358 EVENT_ITEM, 359 EVENT_DQUOTE, 360 EVENT_SQUOTE, 361}; 362 363static struct event *event_list; 364 365static void add_event(struct event *event) 366{ 367 event->next = event_list; 368 event_list = event; 369} 370 371static int event_item_type(enum event_type type) 372{ 373 switch (type) { 374 case EVENT_ITEM ... EVENT_SQUOTE: 375 return 1; 376 case EVENT_ERROR ... EVENT_DELIM: 377 default: 378 return 0; 379 } 380} 381 382static void free_arg(struct print_arg *arg) 383{ 384 if (!arg) 385 return; 386 387 switch (arg->type) { 388 case PRINT_ATOM: 389 if (arg->atom.atom) 390 free(arg->atom.atom); 391 break; 392 case PRINT_NULL: 393 case PRINT_FIELD ... PRINT_OP: 394 default: 395 /* todo */ 396 break; 397 } 398 399 free(arg); 400} 401 402static enum event_type get_type(int ch) 403{ 404 if (ch == '\n') 405 return EVENT_NEWLINE; 406 if (isspace(ch)) 407 return EVENT_SPACE; 408 if (isalnum(ch) || ch == '_') 409 return EVENT_ITEM; 410 if (ch == '\'') 411 return EVENT_SQUOTE; 412 if (ch == '"') 413 return EVENT_DQUOTE; 414 if (!isprint(ch)) 415 return EVENT_NONE; 416 if (ch == '(' || ch == ')' || ch == ',') 417 return EVENT_DELIM; 418 419 return EVENT_OP; 420} 421 422static int __read_char(void) 423{ 424 if (input_buf_ptr >= input_buf_siz) 425 return -1; 426 427 return input_buf[input_buf_ptr++]; 428} 429 430static int __peek_char(void) 431{ 432 if (input_buf_ptr >= input_buf_siz) 433 return -1; 434 435 return input_buf[input_buf_ptr]; 436} 437 438static enum event_type __read_token(char **tok) 439{ 440 char buf[BUFSIZ]; 441 int ch, last_ch, quote_ch, next_ch; 442 int i = 0; 443 int tok_size = 0; 444 enum event_type type; 445 446 *tok = NULL; 447 448 449 ch = __read_char(); 450 if (ch < 0) 451 return EVENT_NONE; 452 453 type = get_type(ch); 454 if (type == EVENT_NONE) 455 return type; 456 457 buf[i++] = ch; 458 459 switch (type) { 460 case EVENT_NEWLINE: 461 case EVENT_DELIM: 462 *tok = malloc_or_die(2); 463 (*tok)[0] = ch; 464 (*tok)[1] = 0; 465 return type; 466 467 case EVENT_OP: 468 switch (ch) { 469 case '-': 470 next_ch = __peek_char(); 471 if (next_ch == '>') { 472 buf[i++] = __read_char(); 473 break; 474 } 475 /* fall through */ 476 case '+': 477 case '|': 478 case '&': 479 case '>': 480 case '<': 481 last_ch = ch; 482 ch = __peek_char(); 483 if (ch != last_ch) 484 goto test_equal; 485 buf[i++] = __read_char(); 486 switch (last_ch) { 487 case '>': 488 case '<': 489 goto test_equal; 490 default: 491 break; 492 } 493 break; 494 case '!': 495 case '=': 496 goto test_equal; 497 default: /* what should we do instead? */ 498 break; 499 } 500 buf[i] = 0; 501 *tok = strdup(buf); 502 return type; 503 504 test_equal: 505 ch = __peek_char(); 506 if (ch == '=') 507 buf[i++] = __read_char(); 508 break; 509 510 case EVENT_DQUOTE: 511 case EVENT_SQUOTE: 512 /* don't keep quotes */ 513 i--; 514 quote_ch = ch; 515 last_ch = 0; 516 do { 517 if (i == (BUFSIZ - 1)) { 518 buf[i] = 0; 519 if (*tok) { 520 *tok = realloc(*tok, tok_size + BUFSIZ); 521 if (!*tok) 522 return EVENT_NONE; 523 strcat(*tok, buf); 524 } else 525 *tok = strdup(buf); 526 527 if (!*tok) 528 return EVENT_NONE; 529 tok_size += BUFSIZ; 530 i = 0; 531 } 532 last_ch = ch; 533 ch = __read_char(); 534 buf[i++] = ch; 535 /* the '\' '\' will cancel itself */ 536 if (ch == '\\' && last_ch == '\\') 537 last_ch = 0; 538 } while (ch != quote_ch || last_ch == '\\'); 539 /* remove the last quote */ 540 i--; 541 goto out; 542 543 case EVENT_ERROR ... EVENT_SPACE: 544 case EVENT_ITEM: 545 default: 546 break; 547 } 548 549 while (get_type(__peek_char()) == type) { 550 if (i == (BUFSIZ - 1)) { 551 buf[i] = 0; 552 if (*tok) { 553 *tok = realloc(*tok, tok_size + BUFSIZ); 554 if (!*tok) 555 return EVENT_NONE; 556 strcat(*tok, buf); 557 } else 558 *tok = strdup(buf); 559 560 if (!*tok) 561 return EVENT_NONE; 562 tok_size += BUFSIZ; 563 i = 0; 564 } 565 ch = __read_char(); 566 buf[i++] = ch; 567 } 568 569 out: 570 buf[i] = 0; 571 if (*tok) { 572 *tok = realloc(*tok, tok_size + i); 573 if (!*tok) 574 return EVENT_NONE; 575 strcat(*tok, buf); 576 } else 577 *tok = strdup(buf); 578 if (!*tok) 579 return EVENT_NONE; 580 581 return type; 582} 583 584static void free_token(char *tok) 585{ 586 if (tok) 587 free(tok); 588} 589 590static enum event_type read_token(char **tok) 591{ 592 enum event_type type; 593 594 for (;;) { 595 type = __read_token(tok); 596 if (type != EVENT_SPACE) 597 return type; 598 599 free_token(*tok); 600 } 601 602 /* not reached */ 603 return EVENT_NONE; 604} 605 606/* no newline */ 607static enum event_type read_token_item(char **tok) 608{ 609 enum event_type type; 610 611 for (;;) { 612 type = __read_token(tok); 613 if (type != EVENT_SPACE && type != EVENT_NEWLINE) 614 return type; 615 616 free_token(*tok); 617 } 618 619 /* not reached */ 620 return EVENT_NONE; 621} 622 623static int test_type(enum event_type type, enum event_type expect) 624{ 625 if (type != expect) { 626 warning("Error: expected type %d but read %d", 627 expect, type); 628 return -1; 629 } 630 return 0; 631} 632 633static int __test_type_token(enum event_type type, char *token, 634 enum event_type expect, const char *expect_tok, 635 bool warn) 636{ 637 if (type != expect) { 638 if (warn) 639 warning("Error: expected type %d but read %d", 640 expect, type); 641 return -1; 642 } 643 644 if (strcmp(token, expect_tok) != 0) { 645 if (warn) 646 warning("Error: expected '%s' but read '%s'", 647 expect_tok, token); 648 return -1; 649 } 650 return 0; 651} 652 653static int test_type_token(enum event_type type, char *token, 654 enum event_type expect, const char *expect_tok) 655{ 656 return __test_type_token(type, token, expect, expect_tok, true); 657} 658 659static int __read_expect_type(enum event_type expect, char **tok, int newline_ok) 660{ 661 enum event_type type; 662 663 if (newline_ok) 664 type = read_token(tok); 665 else 666 type = read_token_item(tok); 667 return test_type(type, expect); 668} 669 670static int read_expect_type(enum event_type expect, char **tok) 671{ 672 return __read_expect_type(expect, tok, 1); 673} 674 675static int __read_expected(enum event_type expect, const char *str, 676 int newline_ok, bool warn) 677{ 678 enum event_type type; 679 char *token; 680 int ret; 681 682 if (newline_ok) 683 type = read_token(&token); 684 else 685 type = read_token_item(&token); 686 687 ret = __test_type_token(type, token, expect, str, warn); 688 689 free_token(token); 690 691 return ret; 692} 693 694static int read_expected(enum event_type expect, const char *str) 695{ 696 return __read_expected(expect, str, 1, true); 697} 698 699static int read_expected_item(enum event_type expect, const char *str) 700{ 701 return __read_expected(expect, str, 0, true); 702} 703 704static char *event_read_name(void) 705{ 706 char *token; 707 708 if (read_expected(EVENT_ITEM, "name") < 0) 709 return NULL; 710 711 if (read_expected(EVENT_OP, ":") < 0) 712 return NULL; 713 714 if (read_expect_type(EVENT_ITEM, &token) < 0) 715 goto fail; 716 717 return token; 718 719 fail: 720 free_token(token); 721 return NULL; 722} 723 724static int event_read_id(void) 725{ 726 char *token; 727 int id; 728 729 if (read_expected_item(EVENT_ITEM, "ID") < 0) 730 return -1; 731 732 if (read_expected(EVENT_OP, ":") < 0) 733 return -1; 734 735 if (read_expect_type(EVENT_ITEM, &token) < 0) 736 goto fail; 737 738 id = strtoul(token, NULL, 0); 739 free_token(token); 740 return id; 741 742 fail: 743 free_token(token); 744 return -1; 745} 746 747static int field_is_string(struct format_field *field) 748{ 749 if ((field->flags & FIELD_IS_ARRAY) && 750 (!strstr(field->type, "char") || !strstr(field->type, "u8") || 751 !strstr(field->type, "s8"))) 752 return 1; 753 754 return 0; 755} 756 757static int field_is_dynamic(struct format_field *field) 758{ 759 if (!strncmp(field->type, "__data_loc", 10)) 760 return 1; 761 762 return 0; 763} 764 765static int event_read_fields(struct event *event, struct format_field **fields) 766{ 767 struct format_field *field = NULL; 768 enum event_type type; 769 char *token; 770 char *last_token; 771 int count = 0; 772 773 do { 774 type = read_token(&token); 775 if (type == EVENT_NEWLINE) { 776 free_token(token); 777 return count; 778 } 779 780 count++; 781 782 if (test_type_token(type, token, EVENT_ITEM, "field")) 783 goto fail; 784 free_token(token); 785 786 type = read_token(&token); 787 /* 788 * The ftrace fields may still use the "special" name. 789 * Just ignore it. 790 */ 791 if (event->flags & EVENT_FL_ISFTRACE && 792 type == EVENT_ITEM && strcmp(token, "special") == 0) { 793 free_token(token); 794 type = read_token(&token); 795 } 796 797 if (test_type_token(type, token, EVENT_OP, ":") < 0) 798 return -1; 799 800 if (read_expect_type(EVENT_ITEM, &token) < 0) 801 goto fail; 802 803 last_token = token; 804 805 field = malloc_or_die(sizeof(*field)); 806 memset(field, 0, sizeof(*field)); 807 808 /* read the rest of the type */ 809 for (;;) { 810 type = read_token(&token); 811 if (type == EVENT_ITEM || 812 (type == EVENT_OP && strcmp(token, "*") == 0) || 813 /* 814 * Some of the ftrace fields are broken and have 815 * an illegal "." in them. 816 */ 817 (event->flags & EVENT_FL_ISFTRACE && 818 type == EVENT_OP && strcmp(token, ".") == 0)) { 819 820 if (strcmp(token, "*") == 0) 821 field->flags |= FIELD_IS_POINTER; 822 823 if (field->type) { 824 field->type = realloc(field->type, 825 strlen(field->type) + 826 strlen(last_token) + 2); 827 strcat(field->type, " "); 828 strcat(field->type, last_token); 829 } else 830 field->type = last_token; 831 last_token = token; 832 continue; 833 } 834 835 break; 836 } 837 838 if (!field->type) { 839 die("no type found"); 840 goto fail; 841 } 842 field->name = last_token; 843 844 if (test_type(type, EVENT_OP)) 845 goto fail; 846 847 if (strcmp(token, "[") == 0) { 848 enum event_type last_type = type; 849 char *brackets = token; 850 int len; 851 852 field->flags |= FIELD_IS_ARRAY; 853 854 type = read_token(&token); 855 while (strcmp(token, "]") != 0) { 856 if (last_type == EVENT_ITEM && 857 type == EVENT_ITEM) 858 len = 2; 859 else 860 len = 1; 861 last_type = type; 862 863 brackets = realloc(brackets, 864 strlen(brackets) + 865 strlen(token) + len); 866 if (len == 2) 867 strcat(brackets, " "); 868 strcat(brackets, token); 869 free_token(token); 870 type = read_token(&token); 871 if (type == EVENT_NONE) { 872 die("failed to find token"); 873 goto fail; 874 } 875 } 876 877 free_token(token); 878 879 brackets = realloc(brackets, strlen(brackets) + 2); 880 strcat(brackets, "]"); 881 882 /* add brackets to type */ 883 884 type = read_token(&token); 885 /* 886 * If the next token is not an OP, then it is of 887 * the format: type [] item; 888 */ 889 if (type == EVENT_ITEM) { 890 field->type = realloc(field->type, 891 strlen(field->type) + 892 strlen(field->name) + 893 strlen(brackets) + 2); 894 strcat(field->type, " "); 895 strcat(field->type, field->name); 896 free_token(field->name); 897 strcat(field->type, brackets); 898 field->name = token; 899 type = read_token(&token); 900 } else { 901 field->type = realloc(field->type, 902 strlen(field->type) + 903 strlen(brackets) + 1); 904 strcat(field->type, brackets); 905 } 906 free(brackets); 907 } 908 909 if (field_is_string(field)) { 910 field->flags |= FIELD_IS_STRING; 911 if (field_is_dynamic(field)) 912 field->flags |= FIELD_IS_DYNAMIC; 913 } 914 915 if (test_type_token(type, token, EVENT_OP, ";")) 916 goto fail; 917 free_token(token); 918 919 if (read_expected(EVENT_ITEM, "offset") < 0) 920 goto fail_expect; 921 922 if (read_expected(EVENT_OP, ":") < 0) 923 goto fail_expect; 924 925 if (read_expect_type(EVENT_ITEM, &token)) 926 goto fail; 927 field->offset = strtoul(token, NULL, 0); 928 free_token(token); 929 930 if (read_expected(EVENT_OP, ";") < 0) 931 goto fail_expect; 932 933 if (read_expected(EVENT_ITEM, "size") < 0) 934 goto fail_expect; 935 936 if (read_expected(EVENT_OP, ":") < 0) 937 goto fail_expect; 938 939 if (read_expect_type(EVENT_ITEM, &token)) 940 goto fail; 941 field->size = strtoul(token, NULL, 0); 942 free_token(token); 943 944 if (read_expected(EVENT_OP, ";") < 0) 945 goto fail_expect; 946 947 type = read_token(&token); 948 if (type != EVENT_NEWLINE) { 949 /* newer versions of the kernel have a "signed" type */ 950 if (test_type_token(type, token, EVENT_ITEM, "signed")) 951 goto fail; 952 953 free_token(token); 954 955 if (read_expected(EVENT_OP, ":") < 0) 956 goto fail_expect; 957 958 if (read_expect_type(EVENT_ITEM, &token)) 959 goto fail; 960 961 if (strtoul(token, NULL, 0)) 962 field->flags |= FIELD_IS_SIGNED; 963 964 free_token(token); 965 if (read_expected(EVENT_OP, ";") < 0) 966 goto fail_expect; 967 968 if (read_expect_type(EVENT_NEWLINE, &token)) 969 goto fail; 970 } 971 972 free_token(token); 973 974 *fields = field; 975 fields = &field->next; 976 977 } while (1); 978 979 return 0; 980 981fail: 982 free_token(token); 983fail_expect: 984 if (field) 985 free(field); 986 return -1; 987} 988 989static int event_read_format(struct event *event) 990{ 991 char *token; 992 int ret; 993 994 if (read_expected_item(EVENT_ITEM, "format") < 0) 995 return -1; 996 997 if (read_expected(EVENT_OP, ":") < 0) 998 return -1; 999 1000 if (read_expect_type(EVENT_NEWLINE, &token)) 1001 goto fail; 1002 free_token(token); 1003 1004 ret = event_read_fields(event, &event->format.common_fields); 1005 if (ret < 0) 1006 return ret; 1007 event->format.nr_common = ret; 1008 1009 ret = event_read_fields(event, &event->format.fields); 1010 if (ret < 0) 1011 return ret; 1012 event->format.nr_fields = ret; 1013 1014 return 0; 1015 1016 fail: 1017 free_token(token); 1018 return -1; 1019} 1020 1021enum event_type 1022process_arg_token(struct event *event, struct print_arg *arg, 1023 char **tok, enum event_type type); 1024 1025static enum event_type 1026process_arg(struct event *event, struct print_arg *arg, char **tok) 1027{ 1028 enum event_type type; 1029 char *token; 1030 1031 type = read_token(&token); 1032 *tok = token; 1033 1034 return process_arg_token(event, arg, tok, type); 1035} 1036 1037static enum event_type 1038process_cond(struct event *event, struct print_arg *top, char **tok) 1039{ 1040 struct print_arg *arg, *left, *right; 1041 enum event_type type; 1042 char *token = NULL; 1043 1044 arg = malloc_or_die(sizeof(*arg)); 1045 memset(arg, 0, sizeof(*arg)); 1046 1047 left = malloc_or_die(sizeof(*left)); 1048 1049 right = malloc_or_die(sizeof(*right)); 1050 1051 arg->type = PRINT_OP; 1052 arg->op.left = left; 1053 arg->op.right = right; 1054 1055 *tok = NULL; 1056 type = process_arg(event, left, &token); 1057 if (test_type_token(type, token, EVENT_OP, ":")) 1058 goto out_free; 1059 1060 arg->op.op = token; 1061 1062 type = process_arg(event, right, &token); 1063 1064 top->op.right = arg; 1065 1066 *tok = token; 1067 return type; 1068 1069out_free: 1070 free_token(*tok); 1071 free(right); 1072 free(left); 1073 free_arg(arg); 1074 return EVENT_ERROR; 1075} 1076 1077static enum event_type 1078process_array(struct event *event, struct print_arg *top, char **tok) 1079{ 1080 struct print_arg *arg; 1081 enum event_type type; 1082 char *token = NULL; 1083 1084 arg = malloc_or_die(sizeof(*arg)); 1085 memset(arg, 0, sizeof(*arg)); 1086 1087 *tok = NULL; 1088 type = process_arg(event, arg, &token); 1089 if (test_type_token(type, token, EVENT_OP, "]")) 1090 goto out_free; 1091 1092 top->op.right = arg; 1093 1094 free_token(token); 1095 type = read_token_item(&token); 1096 *tok = token; 1097 1098 return type; 1099 1100out_free: 1101 free_token(*tok); 1102 free_arg(arg); 1103 return EVENT_ERROR; 1104} 1105 1106static int get_op_prio(char *op) 1107{ 1108 if (!op[1]) { 1109 switch (op[0]) { 1110 case '*': 1111 case '/': 1112 case '%': 1113 return 6; 1114 case '+': 1115 case '-': 1116 return 7; 1117 /* '>>' and '<<' are 8 */ 1118 case '<': 1119 case '>': 1120 return 9; 1121 /* '==' and '!=' are 10 */ 1122 case '&': 1123 return 11; 1124 case '^': 1125 return 12; 1126 case '|': 1127 return 13; 1128 case '?': 1129 return 16; 1130 default: 1131 die("unknown op '%c'", op[0]); 1132 return -1; 1133 } 1134 } else { 1135 if (strcmp(op, "++") == 0 || 1136 strcmp(op, "--") == 0) { 1137 return 3; 1138 } else if (strcmp(op, ">>") == 0 || 1139 strcmp(op, "<<") == 0) { 1140 return 8; 1141 } else if (strcmp(op, ">=") == 0 || 1142 strcmp(op, "<=") == 0) { 1143 return 9; 1144 } else if (strcmp(op, "==") == 0 || 1145 strcmp(op, "!=") == 0) { 1146 return 10; 1147 } else if (strcmp(op, "&&") == 0) { 1148 return 14; 1149 } else if (strcmp(op, "||") == 0) { 1150 return 15; 1151 } else { 1152 die("unknown op '%s'", op); 1153 return -1; 1154 } 1155 } 1156} 1157 1158static void set_op_prio(struct print_arg *arg) 1159{ 1160 1161 /* single ops are the greatest */ 1162 if (!arg->op.left || arg->op.left->type == PRINT_NULL) { 1163 arg->op.prio = 0; 1164 return; 1165 } 1166 1167 arg->op.prio = get_op_prio(arg->op.op); 1168} 1169 1170static enum event_type 1171process_op(struct event *event, struct print_arg *arg, char **tok) 1172{ 1173 struct print_arg *left, *right = NULL; 1174 enum event_type type; 1175 char *token; 1176 1177 /* the op is passed in via tok */ 1178 token = *tok; 1179 1180 if (arg->type == PRINT_OP && !arg->op.left) { 1181 /* handle single op */ 1182 if (token[1]) { 1183 die("bad op token %s", token); 1184 return EVENT_ERROR; 1185 } 1186 switch (token[0]) { 1187 case '!': 1188 case '+': 1189 case '-': 1190 break; 1191 default: 1192 die("bad op token %s", token); 1193 return EVENT_ERROR; 1194 } 1195 1196 /* make an empty left */ 1197 left = malloc_or_die(sizeof(*left)); 1198 left->type = PRINT_NULL; 1199 arg->op.left = left; 1200 1201 right = malloc_or_die(sizeof(*right)); 1202 arg->op.right = right; 1203 1204 type = process_arg(event, right, tok); 1205 1206 } else if (strcmp(token, "?") == 0) { 1207 1208 left = malloc_or_die(sizeof(*left)); 1209 /* copy the top arg to the left */ 1210 *left = *arg; 1211 1212 arg->type = PRINT_OP; 1213 arg->op.op = token; 1214 arg->op.left = left; 1215 arg->op.prio = 0; 1216 1217 type = process_cond(event, arg, tok); 1218 1219 } else if (strcmp(token, ">>") == 0 || 1220 strcmp(token, "<<") == 0 || 1221 strcmp(token, "&") == 0 || 1222 strcmp(token, "|") == 0 || 1223 strcmp(token, "&&") == 0 || 1224 strcmp(token, "||") == 0 || 1225 strcmp(token, "-") == 0 || 1226 strcmp(token, "+") == 0 || 1227 strcmp(token, "*") == 0 || 1228 strcmp(token, "^") == 0 || 1229 strcmp(token, "/") == 0 || 1230 strcmp(token, "<") == 0 || 1231 strcmp(token, ">") == 0 || 1232 strcmp(token, "==") == 0 || 1233 strcmp(token, "!=") == 0) { 1234 1235 left = malloc_or_die(sizeof(*left)); 1236 1237 /* copy the top arg to the left */ 1238 *left = *arg; 1239 1240 arg->type = PRINT_OP; 1241 arg->op.op = token; 1242 arg->op.left = left; 1243 1244 set_op_prio(arg); 1245 1246 right = malloc_or_die(sizeof(*right)); 1247 1248 type = read_token_item(&token); 1249 *tok = token; 1250 1251 /* could just be a type pointer */ 1252 if ((strcmp(arg->op.op, "*") == 0) && 1253 type == EVENT_DELIM && (strcmp(token, ")") == 0)) { 1254 if (left->type != PRINT_ATOM) 1255 die("bad pointer type"); 1256 left->atom.atom = realloc(left->atom.atom, 1257 sizeof(left->atom.atom) + 3); 1258 strcat(left->atom.atom, " *"); 1259 *arg = *left; 1260 free(arg); 1261 1262 return type; 1263 } 1264 1265 type = process_arg_token(event, right, tok, type); 1266 1267 arg->op.right = right; 1268 1269 } else if (strcmp(token, "[") == 0) { 1270 1271 left = malloc_or_die(sizeof(*left)); 1272 *left = *arg; 1273 1274 arg->type = PRINT_OP; 1275 arg->op.op = token; 1276 arg->op.left = left; 1277 1278 arg->op.prio = 0; 1279 type = process_array(event, arg, tok); 1280 1281 } else { 1282 warning("unknown op '%s'", token); 1283 event->flags |= EVENT_FL_FAILED; 1284 /* the arg is now the left side */ 1285 return EVENT_NONE; 1286 } 1287 1288 if (type == EVENT_OP) { 1289 int prio; 1290 1291 /* higher prios need to be closer to the root */ 1292 prio = get_op_prio(*tok); 1293 1294 if (prio > arg->op.prio) 1295 return process_op(event, arg, tok); 1296 1297 return process_op(event, right, tok); 1298 } 1299 1300 return type; 1301} 1302 1303static enum event_type 1304process_entry(struct event *event __unused, struct print_arg *arg, 1305 char **tok) 1306{ 1307 enum event_type type; 1308 char *field; 1309 char *token; 1310 1311 if (read_expected(EVENT_OP, "->") < 0) 1312 return EVENT_ERROR; 1313 1314 if (read_expect_type(EVENT_ITEM, &token) < 0) 1315 goto fail; 1316 field = token; 1317 1318 arg->type = PRINT_FIELD; 1319 arg->field.name = field; 1320 1321 if (is_flag_field) { 1322 arg->field.field = find_any_field(event, arg->field.name); 1323 arg->field.field->flags |= FIELD_IS_FLAG; 1324 is_flag_field = 0; 1325 } else if (is_symbolic_field) { 1326 arg->field.field = find_any_field(event, arg->field.name); 1327 arg->field.field->flags |= FIELD_IS_SYMBOLIC; 1328 is_symbolic_field = 0; 1329 } 1330 1331 type = read_token(&token); 1332 *tok = token; 1333 1334 return type; 1335 1336fail: 1337 free_token(token); 1338 return EVENT_ERROR; 1339} 1340 1341static char *arg_eval (struct print_arg *arg); 1342 1343static long long arg_num_eval(struct print_arg *arg) 1344{ 1345 long long left, right; 1346 long long val = 0; 1347 1348 switch (arg->type) { 1349 case PRINT_ATOM: 1350 val = strtoll(arg->atom.atom, NULL, 0); 1351 break; 1352 case PRINT_TYPE: 1353 val = arg_num_eval(arg->typecast.item); 1354 break; 1355 case PRINT_OP: 1356 switch (arg->op.op[0]) { 1357 case '|': 1358 left = arg_num_eval(arg->op.left); 1359 right = arg_num_eval(arg->op.right); 1360 if (arg->op.op[1]) 1361 val = left || right; 1362 else 1363 val = left | right; 1364 break; 1365 case '&': 1366 left = arg_num_eval(arg->op.left); 1367 right = arg_num_eval(arg->op.right); 1368 if (arg->op.op[1]) 1369 val = left && right; 1370 else 1371 val = left & right; 1372 break; 1373 case '<': 1374 left = arg_num_eval(arg->op.left); 1375 right = arg_num_eval(arg->op.right); 1376 switch (arg->op.op[1]) { 1377 case 0: 1378 val = left < right; 1379 break; 1380 case '<': 1381 val = left << right; 1382 break; 1383 case '=': 1384 val = left <= right; 1385 break; 1386 default: 1387 die("unknown op '%s'", arg->op.op); 1388 } 1389 break; 1390 case '>': 1391 left = arg_num_eval(arg->op.left); 1392 right = arg_num_eval(arg->op.right); 1393 switch (arg->op.op[1]) { 1394 case 0: 1395 val = left > right; 1396 break; 1397 case '>': 1398 val = left >> right; 1399 break; 1400 case '=': 1401 val = left >= right; 1402 break; 1403 default: 1404 die("unknown op '%s'", arg->op.op); 1405 } 1406 break; 1407 case '=': 1408 left = arg_num_eval(arg->op.left); 1409 right = arg_num_eval(arg->op.right); 1410 1411 if (arg->op.op[1] != '=') 1412 die("unknown op '%s'", arg->op.op); 1413 1414 val = left == right; 1415 break; 1416 case '!': 1417 left = arg_num_eval(arg->op.left); 1418 right = arg_num_eval(arg->op.right); 1419 1420 switch (arg->op.op[1]) { 1421 case '=': 1422 val = left != right; 1423 break; 1424 default: 1425 die("unknown op '%s'", arg->op.op); 1426 } 1427 break; 1428 default: 1429 die("unknown op '%s'", arg->op.op); 1430 } 1431 break; 1432 1433 case PRINT_NULL: 1434 case PRINT_FIELD ... PRINT_SYMBOL: 1435 case PRINT_STRING: 1436 default: 1437 die("invalid eval type %d", arg->type); 1438 1439 } 1440 return val; 1441} 1442 1443static char *arg_eval (struct print_arg *arg) 1444{ 1445 long long val; 1446 static char buf[20]; 1447 1448 switch (arg->type) { 1449 case PRINT_ATOM: 1450 return arg->atom.atom; 1451 case PRINT_TYPE: 1452 return arg_eval(arg->typecast.item); 1453 case PRINT_OP: 1454 val = arg_num_eval(arg); 1455 sprintf(buf, "%lld", val); 1456 return buf; 1457 1458 case PRINT_NULL: 1459 case PRINT_FIELD ... PRINT_SYMBOL: 1460 case PRINT_STRING: 1461 default: 1462 die("invalid eval type %d", arg->type); 1463 break; 1464 } 1465 1466 return NULL; 1467} 1468 1469static enum event_type 1470process_fields(struct event *event, struct print_flag_sym **list, char **tok) 1471{ 1472 enum event_type type; 1473 struct print_arg *arg = NULL; 1474 struct print_flag_sym *field; 1475 char *token = NULL; 1476 char *value; 1477 1478 do { 1479 free_token(token); 1480 type = read_token_item(&token); 1481 if (test_type_token(type, token, EVENT_OP, "{")) 1482 break; 1483 1484 arg = malloc_or_die(sizeof(*arg)); 1485 1486 free_token(token); 1487 type = process_arg(event, arg, &token); 1488 if (test_type_token(type, token, EVENT_DELIM, ",")) 1489 goto out_free; 1490 1491 field = malloc_or_die(sizeof(*field)); 1492 memset(field, 0, sizeof(*field)); 1493 1494 value = arg_eval(arg); 1495 field->value = strdup(value); 1496 1497 free_token(token); 1498 type = process_arg(event, arg, &token); 1499 if (test_type_token(type, token, EVENT_OP, "}")) 1500 goto out_free; 1501 1502 value = arg_eval(arg); 1503 field->str = strdup(value); 1504 free_arg(arg); 1505 arg = NULL; 1506 1507 *list = field; 1508 list = &field->next; 1509 1510 free_token(token); 1511 type = read_token_item(&token); 1512 } while (type == EVENT_DELIM && strcmp(token, ",") == 0); 1513 1514 *tok = token; 1515 return type; 1516 1517out_free: 1518 free_arg(arg); 1519 free_token(token); 1520 1521 return EVENT_ERROR; 1522} 1523 1524static enum event_type 1525process_flags(struct event *event, struct print_arg *arg, char **tok) 1526{ 1527 struct print_arg *field; 1528 enum event_type type; 1529 char *token; 1530 1531 memset(arg, 0, sizeof(*arg)); 1532 arg->type = PRINT_FLAGS; 1533 1534 if (read_expected_item(EVENT_DELIM, "(") < 0) 1535 return EVENT_ERROR; 1536 1537 field = malloc_or_die(sizeof(*field)); 1538 1539 type = process_arg(event, field, &token); 1540 if (test_type_token(type, token, EVENT_DELIM, ",")) 1541 goto out_free; 1542 1543 arg->flags.field = field; 1544 1545 type = read_token_item(&token); 1546 if (event_item_type(type)) { 1547 arg->flags.delim = token; 1548 type = read_token_item(&token); 1549 } 1550 1551 if (test_type_token(type, token, EVENT_DELIM, ",")) 1552 goto out_free; 1553 1554 type = process_fields(event, &arg->flags.flags, &token); 1555 if (test_type_token(type, token, EVENT_DELIM, ")")) 1556 goto out_free; 1557 1558 free_token(token); 1559 type = read_token_item(tok); 1560 return type; 1561 1562out_free: 1563 free_token(token); 1564 return EVENT_ERROR; 1565} 1566 1567static enum event_type 1568process_symbols(struct event *event, struct print_arg *arg, char **tok) 1569{ 1570 struct print_arg *field; 1571 enum event_type type; 1572 char *token; 1573 1574 memset(arg, 0, sizeof(*arg)); 1575 arg->type = PRINT_SYMBOL; 1576 1577 if (read_expected_item(EVENT_DELIM, "(") < 0) 1578 return EVENT_ERROR; 1579 1580 field = malloc_or_die(sizeof(*field)); 1581 1582 type = process_arg(event, field, &token); 1583 if (test_type_token(type, token, EVENT_DELIM, ",")) 1584 goto out_free; 1585 1586 arg->symbol.field = field; 1587 1588 type = process_fields(event, &arg->symbol.symbols, &token); 1589 if (test_type_token(type, token, EVENT_DELIM, ")")) 1590 goto out_free; 1591 1592 free_token(token); 1593 type = read_token_item(tok); 1594 return type; 1595 1596out_free: 1597 free_token(token); 1598 return EVENT_ERROR; 1599} 1600 1601static enum event_type 1602process_paren(struct event *event, struct print_arg *arg, char **tok) 1603{ 1604 struct print_arg *item_arg; 1605 enum event_type type; 1606 char *token; 1607 1608 type = process_arg(event, arg, &token); 1609 1610 if (type == EVENT_ERROR) 1611 return EVENT_ERROR; 1612 1613 if (type == EVENT_OP) 1614 type = process_op(event, arg, &token); 1615 1616 if (type == EVENT_ERROR) 1617 return EVENT_ERROR; 1618 1619 if (test_type_token(type, token, EVENT_DELIM, ")")) { 1620 free_token(token); 1621 return EVENT_ERROR; 1622 } 1623 1624 free_token(token); 1625 type = read_token_item(&token); 1626 1627 /* 1628 * If the next token is an item or another open paren, then 1629 * this was a typecast. 1630 */ 1631 if (event_item_type(type) || 1632 (type == EVENT_DELIM && strcmp(token, "(") == 0)) { 1633 1634 /* make this a typecast and contine */ 1635 1636 /* prevous must be an atom */ 1637 if (arg->type != PRINT_ATOM) 1638 die("previous needed to be PRINT_ATOM"); 1639 1640 item_arg = malloc_or_die(sizeof(*item_arg)); 1641 1642 arg->type = PRINT_TYPE; 1643 arg->typecast.type = arg->atom.atom; 1644 arg->typecast.item = item_arg; 1645 type = process_arg_token(event, item_arg, &token, type); 1646 1647 } 1648 1649 *tok = token; 1650 return type; 1651} 1652 1653 1654static enum event_type 1655process_str(struct event *event __unused, struct print_arg *arg, char **tok) 1656{ 1657 enum event_type type; 1658 char *token; 1659 1660 if (read_expected(EVENT_DELIM, "(") < 0) 1661 return EVENT_ERROR; 1662 1663 if (read_expect_type(EVENT_ITEM, &token) < 0) 1664 goto fail; 1665 1666 arg->type = PRINT_STRING; 1667 arg->string.string = token; 1668 arg->string.offset = -1; 1669 1670 if (read_expected(EVENT_DELIM, ")") < 0) 1671 return EVENT_ERROR; 1672 1673 type = read_token(&token); 1674 *tok = token; 1675 1676 return type; 1677fail: 1678 free_token(token); 1679 return EVENT_ERROR; 1680} 1681 1682enum event_type 1683process_arg_token(struct event *event, struct print_arg *arg, 1684 char **tok, enum event_type type) 1685{ 1686 char *token; 1687 char *atom; 1688 1689 token = *tok; 1690 1691 switch (type) { 1692 case EVENT_ITEM: 1693 if (strcmp(token, "REC") == 0) { 1694 free_token(token); 1695 type = process_entry(event, arg, &token); 1696 } else if (strcmp(token, "__print_flags") == 0) { 1697 free_token(token); 1698 is_flag_field = 1; 1699 type = process_flags(event, arg, &token); 1700 } else if (strcmp(token, "__print_symbolic") == 0) { 1701 free_token(token); 1702 is_symbolic_field = 1; 1703 type = process_symbols(event, arg, &token); 1704 } else if (strcmp(token, "__get_str") == 0) { 1705 free_token(token); 1706 type = process_str(event, arg, &token); 1707 } else { 1708 atom = token; 1709 /* test the next token */ 1710 type = read_token_item(&token); 1711 1712 /* atoms can be more than one token long */ 1713 while (type == EVENT_ITEM) { 1714 atom = realloc(atom, strlen(atom) + strlen(token) + 2); 1715 strcat(atom, " "); 1716 strcat(atom, token); 1717 free_token(token); 1718 type = read_token_item(&token); 1719 } 1720 1721 /* todo, test for function */ 1722 1723 arg->type = PRINT_ATOM; 1724 arg->atom.atom = atom; 1725 } 1726 break; 1727 case EVENT_DQUOTE: 1728 case EVENT_SQUOTE: 1729 arg->type = PRINT_ATOM; 1730 arg->atom.atom = token; 1731 type = read_token_item(&token); 1732 break; 1733 case EVENT_DELIM: 1734 if (strcmp(token, "(") == 0) { 1735 free_token(token); 1736 type = process_paren(event, arg, &token); 1737 break; 1738 } 1739 case EVENT_OP: 1740 /* handle single ops */ 1741 arg->type = PRINT_OP; 1742 arg->op.op = token; 1743 arg->op.left = NULL; 1744 type = process_op(event, arg, &token); 1745 1746 break; 1747 1748 case EVENT_ERROR ... EVENT_NEWLINE: 1749 default: 1750 die("unexpected type %d", type); 1751 } 1752 *tok = token; 1753 1754 return type; 1755} 1756 1757static int event_read_print_args(struct event *event, struct print_arg **list) 1758{ 1759 enum event_type type = EVENT_ERROR; 1760 struct print_arg *arg; 1761 char *token; 1762 int args = 0; 1763 1764 do { 1765 if (type == EVENT_NEWLINE) { 1766 free_token(token); 1767 type = read_token_item(&token); 1768 continue; 1769 } 1770 1771 arg = malloc_or_die(sizeof(*arg)); 1772 memset(arg, 0, sizeof(*arg)); 1773 1774 type = process_arg(event, arg, &token); 1775 1776 if (type == EVENT_ERROR) { 1777 free_arg(arg); 1778 return -1; 1779 } 1780 1781 *list = arg; 1782 args++; 1783 1784 if (type == EVENT_OP) { 1785 type = process_op(event, arg, &token); 1786 list = &arg->next; 1787 continue; 1788 } 1789 1790 if (type == EVENT_DELIM && strcmp(token, ",") == 0) { 1791 free_token(token); 1792 *list = arg; 1793 list = &arg->next; 1794 continue; 1795 } 1796 break; 1797 } while (type != EVENT_NONE); 1798 1799 if (type != EVENT_NONE) 1800 free_token(token); 1801 1802 return args; 1803} 1804 1805static int event_read_print(struct event *event) 1806{ 1807 enum event_type type; 1808 char *token; 1809 int ret; 1810 1811 if (read_expected_item(EVENT_ITEM, "print") < 0) 1812 return -1; 1813 1814 if (read_expected(EVENT_ITEM, "fmt") < 0) 1815 return -1; 1816 1817 if (read_expected(EVENT_OP, ":") < 0) 1818 return -1; 1819 1820 if (read_expect_type(EVENT_DQUOTE, &token) < 0) 1821 goto fail; 1822 1823 concat: 1824 event->print_fmt.format = token; 1825 event->print_fmt.args = NULL; 1826 1827 /* ok to have no arg */ 1828 type = read_token_item(&token); 1829 1830 if (type == EVENT_NONE) 1831 return 0; 1832 1833 /* Handle concatination of print lines */ 1834 if (type == EVENT_DQUOTE) { 1835 char *cat; 1836 1837 cat = malloc_or_die(strlen(event->print_fmt.format) + 1838 strlen(token) + 1); 1839 strcpy(cat, event->print_fmt.format); 1840 strcat(cat, token); 1841 free_token(token); 1842 free_token(event->print_fmt.format); 1843 event->print_fmt.format = NULL; 1844 token = cat; 1845 goto concat; 1846 } 1847 1848 if (test_type_token(type, token, EVENT_DELIM, ",")) 1849 goto fail; 1850 1851 free_token(token); 1852 1853 ret = event_read_print_args(event, &event->print_fmt.args); 1854 if (ret < 0) 1855 return -1; 1856 1857 return ret; 1858 1859 fail: 1860 free_token(token); 1861 return -1; 1862} 1863 1864static struct format_field * 1865find_common_field(struct event *event, const char *name) 1866{ 1867 struct format_field *format; 1868 1869 for (format = event->format.common_fields; 1870 format; format = format->next) { 1871 if (strcmp(format->name, name) == 0) 1872 break; 1873 } 1874 1875 return format; 1876} 1877 1878static struct format_field * 1879find_field(struct event *event, const char *name) 1880{ 1881 struct format_field *format; 1882 1883 for (format = event->format.fields; 1884 format; format = format->next) { 1885 if (strcmp(format->name, name) == 0) 1886 break; 1887 } 1888 1889 return format; 1890} 1891 1892static struct format_field * 1893find_any_field(struct event *event, const char *name) 1894{ 1895 struct format_field *format; 1896 1897 format = find_common_field(event, name); 1898 if (format) 1899 return format; 1900 return find_field(event, name); 1901} 1902 1903unsigned long long read_size(void *ptr, int size) 1904{ 1905 switch (size) { 1906 case 1: 1907 return *(unsigned char *)ptr; 1908 case 2: 1909 return data2host2(ptr); 1910 case 4: 1911 return data2host4(ptr); 1912 case 8: 1913 return data2host8(ptr); 1914 default: 1915 /* BUG! */ 1916 return 0; 1917 } 1918} 1919 1920unsigned long long 1921raw_field_value(struct event *event, const char *name, void *data) 1922{ 1923 struct format_field *field; 1924 1925 field = find_any_field(event, name); 1926 if (!field) 1927 return 0ULL; 1928 1929 return read_size(data + field->offset, field->size); 1930} 1931 1932void *raw_field_ptr(struct event *event, const char *name, void *data) 1933{ 1934 struct format_field *field; 1935 1936 field = find_any_field(event, name); 1937 if (!field) 1938 return NULL; 1939 1940 if (field->flags & FIELD_IS_DYNAMIC) { 1941 int offset; 1942 1943 offset = *(int *)(data + field->offset); 1944 offset &= 0xffff; 1945 1946 return data + offset; 1947 } 1948 1949 return data + field->offset; 1950} 1951 1952static int get_common_info(const char *type, int *offset, int *size) 1953{ 1954 struct event *event; 1955 struct format_field *field; 1956 1957 /* 1958 * All events should have the same common elements. 1959 * Pick any event to find where the type is; 1960 */ 1961 if (!event_list) 1962 die("no event_list!"); 1963 1964 event = event_list; 1965 field = find_common_field(event, type); 1966 if (!field) 1967 die("field '%s' not found", type); 1968 1969 *offset = field->offset; 1970 *size = field->size; 1971 1972 return 0; 1973} 1974 1975static int __parse_common(void *data, int *size, int *offset, 1976 const char *name) 1977{ 1978 int ret; 1979 1980 if (!*size) { 1981 ret = get_common_info(name, offset, size); 1982 if (ret < 0) 1983 return ret; 1984 } 1985 return read_size(data + *offset, *size); 1986} 1987 1988int trace_parse_common_type(void *data) 1989{ 1990 static int type_offset; 1991 static int type_size; 1992 1993 return __parse_common(data, &type_size, &type_offset, 1994 "common_type"); 1995} 1996 1997int trace_parse_common_pid(void *data) 1998{ 1999 static int pid_offset; 2000 static int pid_size; 2001 2002 return __parse_common(data, &pid_size, &pid_offset, 2003 "common_pid"); 2004} 2005 2006int parse_common_pc(void *data) 2007{ 2008 static int pc_offset; 2009 static int pc_size; 2010 2011 return __parse_common(data, &pc_size, &pc_offset, 2012 "common_preempt_count"); 2013} 2014 2015int parse_common_flags(void *data) 2016{ 2017 static int flags_offset; 2018 static int flags_size; 2019 2020 return __parse_common(data, &flags_size, &flags_offset, 2021 "common_flags"); 2022} 2023 2024int parse_common_lock_depth(void *data) 2025{ 2026 static int ld_offset; 2027 static int ld_size; 2028 int ret; 2029 2030 ret = __parse_common(data, &ld_size, &ld_offset, 2031 "common_lock_depth"); 2032 if (ret < 0) 2033 return -1; 2034 2035 return ret; 2036} 2037 2038struct event *trace_find_event(int id) 2039{ 2040 struct event *event; 2041 2042 for (event = event_list; event; event = event->next) { 2043 if (event->id == id) 2044 break; 2045 } 2046 return event; 2047} 2048 2049struct event *trace_find_next_event(struct event *event) 2050{ 2051 if (!event) 2052 return event_list; 2053 2054 return event->next; 2055} 2056 2057static unsigned long long eval_num_arg(void *data, int size, 2058 struct event *event, struct print_arg *arg) 2059{ 2060 unsigned long long val = 0; 2061 unsigned long long left, right; 2062 struct print_arg *larg; 2063 2064 switch (arg->type) { 2065 case PRINT_NULL: 2066 /* ?? */ 2067 return 0; 2068 case PRINT_ATOM: 2069 return strtoull(arg->atom.atom, NULL, 0); 2070 case PRINT_FIELD: 2071 if (!arg->field.field) { 2072 arg->field.field = find_any_field(event, arg->field.name); 2073 if (!arg->field.field) 2074 die("field %s not found", arg->field.name); 2075 } 2076 /* must be a number */ 2077 val = read_size(data + arg->field.field->offset, 2078 arg->field.field->size); 2079 break; 2080 case PRINT_FLAGS: 2081 case PRINT_SYMBOL: 2082 break; 2083 case PRINT_TYPE: 2084 return eval_num_arg(data, size, event, arg->typecast.item); 2085 case PRINT_STRING: 2086 return 0; 2087 break; 2088 case PRINT_OP: 2089 if (strcmp(arg->op.op, "[") == 0) { 2090 /* 2091 * Arrays are special, since we don't want 2092 * to read the arg as is. 2093 */ 2094 if (arg->op.left->type != PRINT_FIELD) 2095 goto default_op; /* oops, all bets off */ 2096 larg = arg->op.left; 2097 if (!larg->field.field) { 2098 larg->field.field = 2099 find_any_field(event, larg->field.name); 2100 if (!larg->field.field) 2101 die("field %s not found", larg->field.name); 2102 } 2103 right = eval_num_arg(data, size, event, arg->op.right); 2104 val = read_size(data + larg->field.field->offset + 2105 right * long_size, long_size); 2106 break; 2107 } 2108 default_op: 2109 left = eval_num_arg(data, size, event, arg->op.left); 2110 right = eval_num_arg(data, size, event, arg->op.right); 2111 switch (arg->op.op[0]) { 2112 case '|': 2113 if (arg->op.op[1]) 2114 val = left || right; 2115 else 2116 val = left | right; 2117 break; 2118 case '&': 2119 if (arg->op.op[1]) 2120 val = left && right; 2121 else 2122 val = left & right; 2123 break; 2124 case '<': 2125 switch (arg->op.op[1]) { 2126 case 0: 2127 val = left < right; 2128 break; 2129 case '<': 2130 val = left << right; 2131 break; 2132 case '=': 2133 val = left <= right; 2134 break; 2135 default: 2136 die("unknown op '%s'", arg->op.op); 2137 } 2138 break; 2139 case '>': 2140 switch (arg->op.op[1]) { 2141 case 0: 2142 val = left > right; 2143 break; 2144 case '>': 2145 val = left >> right; 2146 break; 2147 case '=': 2148 val = left >= right; 2149 break; 2150 default: 2151 die("unknown op '%s'", arg->op.op); 2152 } 2153 break; 2154 case '=': 2155 if (arg->op.op[1] != '=') 2156 die("unknown op '%s'", arg->op.op); 2157 val = left == right; 2158 break; 2159 case '-': 2160 val = left - right; 2161 break; 2162 case '+': 2163 val = left + right; 2164 break; 2165 default: 2166 die("unknown op '%s'", arg->op.op); 2167 } 2168 break; 2169 default: /* not sure what to do there */ 2170 return 0; 2171 } 2172 return val; 2173} 2174 2175struct flag { 2176 const char *name; 2177 unsigned long long value; 2178}; 2179 2180static const struct flag flags[] = { 2181 { "HI_SOFTIRQ", 0 }, 2182 { "TIMER_SOFTIRQ", 1 }, 2183 { "NET_TX_SOFTIRQ", 2 }, 2184 { "NET_RX_SOFTIRQ", 3 }, 2185 { "BLOCK_SOFTIRQ", 4 }, 2186 { "BLOCK_IOPOLL_SOFTIRQ", 5 }, 2187 { "TASKLET_SOFTIRQ", 6 }, 2188 { "SCHED_SOFTIRQ", 7 }, 2189 { "HRTIMER_SOFTIRQ", 8 }, 2190 { "RCU_SOFTIRQ", 9 }, 2191 2192 { "HRTIMER_NORESTART", 0 }, 2193 { "HRTIMER_RESTART", 1 }, 2194}; 2195 2196unsigned long long eval_flag(const char *flag) 2197{ 2198 int i; 2199 2200 /* 2201 * Some flags in the format files do not get converted. 2202 * If the flag is not numeric, see if it is something that 2203 * we already know about. 2204 */ 2205 if (isdigit(flag[0])) 2206 return strtoull(flag, NULL, 0); 2207 2208 for (i = 0; i < (int)(sizeof(flags)/sizeof(flags[0])); i++) 2209 if (strcmp(flags[i].name, flag) == 0) 2210 return flags[i].value; 2211 2212 return 0; 2213} 2214 2215static void print_str_arg(void *data, int size, 2216 struct event *event, struct print_arg *arg) 2217{ 2218 struct print_flag_sym *flag; 2219 unsigned long long val, fval; 2220 char *str; 2221 int print; 2222 2223 switch (arg->type) { 2224 case PRINT_NULL: 2225 /* ?? */ 2226 return; 2227 case PRINT_ATOM: 2228 printf("%s", arg->atom.atom); 2229 return; 2230 case PRINT_FIELD: 2231 if (!arg->field.field) { 2232 arg->field.field = find_any_field(event, arg->field.name); 2233 if (!arg->field.field) 2234 die("field %s not found", arg->field.name); 2235 } 2236 str = malloc_or_die(arg->field.field->size + 1); 2237 memcpy(str, data + arg->field.field->offset, 2238 arg->field.field->size); 2239 str[arg->field.field->size] = 0; 2240 printf("%s", str); 2241 free(str); 2242 break; 2243 case PRINT_FLAGS: 2244 val = eval_num_arg(data, size, event, arg->flags.field); 2245 print = 0; 2246 for (flag = arg->flags.flags; flag; flag = flag->next) { 2247 fval = eval_flag(flag->value); 2248 if (!val && !fval) { 2249 printf("%s", flag->str); 2250 break; 2251 } 2252 if (fval && (val & fval) == fval) { 2253 if (print && arg->flags.delim) 2254 printf("%s", arg->flags.delim); 2255 printf("%s", flag->str); 2256 print = 1; 2257 val &= ~fval; 2258 } 2259 } 2260 break; 2261 case PRINT_SYMBOL: 2262 val = eval_num_arg(data, size, event, arg->symbol.field); 2263 for (flag = arg->symbol.symbols; flag; flag = flag->next) { 2264 fval = eval_flag(flag->value); 2265 if (val == fval) { 2266 printf("%s", flag->str); 2267 break; 2268 } 2269 } 2270 break; 2271 2272 case PRINT_TYPE: 2273 break; 2274 case PRINT_STRING: { 2275 int str_offset; 2276 2277 if (arg->string.offset == -1) { 2278 struct format_field *f; 2279 2280 f = find_any_field(event, arg->string.string); 2281 arg->string.offset = f->offset; 2282 } 2283 str_offset = *(int *)(data + arg->string.offset); 2284 str_offset &= 0xffff; 2285 printf("%s", ((char *)data) + str_offset); 2286 break; 2287 } 2288 case PRINT_OP: 2289 /* 2290 * The only op for string should be ? : 2291 */ 2292 if (arg->op.op[0] != '?') 2293 return; 2294 val = eval_num_arg(data, size, event, arg->op.left); 2295 if (val) 2296 print_str_arg(data, size, event, arg->op.right->op.left); 2297 else 2298 print_str_arg(data, size, event, arg->op.right->op.right); 2299 break; 2300 default: 2301 /* well... */ 2302 break; 2303 } 2304} 2305 2306static struct print_arg *make_bprint_args(char *fmt, void *data, int size, struct event *event) 2307{ 2308 static struct format_field *field, *ip_field; 2309 struct print_arg *args, *arg, **next; 2310 unsigned long long ip, val; 2311 char *ptr; 2312 void *bptr; 2313 2314 if (!field) { 2315 field = find_field(event, "buf"); 2316 if (!field) 2317 die("can't find buffer field for binary printk"); 2318 ip_field = find_field(event, "ip"); 2319 if (!ip_field) 2320 die("can't find ip field for binary printk"); 2321 } 2322 2323 ip = read_size(data + ip_field->offset, ip_field->size); 2324 2325 /* 2326 * The first arg is the IP pointer. 2327 */ 2328 args = malloc_or_die(sizeof(*args)); 2329 arg = args; 2330 arg->next = NULL; 2331 next = &arg->next; 2332 2333 arg->type = PRINT_ATOM; 2334 arg->atom.atom = malloc_or_die(32); 2335 sprintf(arg->atom.atom, "%lld", ip); 2336 2337 /* skip the first "%pf : " */ 2338 for (ptr = fmt + 6, bptr = data + field->offset; 2339 bptr < data + size && *ptr; ptr++) { 2340 int ls = 0; 2341 2342 if (*ptr == '%') { 2343 process_again: 2344 ptr++; 2345 switch (*ptr) { 2346 case '%': 2347 break; 2348 case 'l': 2349 ls++; 2350 goto process_again; 2351 case 'L': 2352 ls = 2; 2353 goto process_again; 2354 case '0' ... '9': 2355 goto process_again; 2356 case 'p': 2357 ls = 1; 2358 /* fall through */ 2359 case 'd': 2360 case 'u': 2361 case 'x': 2362 case 'i': 2363 /* the pointers are always 4 bytes aligned */ 2364 bptr = (void *)(((unsigned long)bptr + 3) & 2365 ~3); 2366 switch (ls) { 2367 case 0: 2368 case 1: 2369 ls = long_size; 2370 break; 2371 case 2: 2372 ls = 8; 2373 default: 2374 break; 2375 } 2376 val = read_size(bptr, ls); 2377 bptr += ls; 2378 arg = malloc_or_die(sizeof(*arg)); 2379 arg->next = NULL; 2380 arg->type = PRINT_ATOM; 2381 arg->atom.atom = malloc_or_die(32); 2382 sprintf(arg->atom.atom, "%lld", val); 2383 *next = arg; 2384 next = &arg->next; 2385 break; 2386 case 's': 2387 arg = malloc_or_die(sizeof(*arg)); 2388 arg->next = NULL; 2389 arg->type = PRINT_STRING; 2390 arg->string.string = strdup(bptr); 2391 bptr += strlen(bptr) + 1; 2392 *next = arg; 2393 next = &arg->next; 2394 default: 2395 break; 2396 } 2397 } 2398 } 2399 2400 return args; 2401} 2402 2403static void free_args(struct print_arg *args) 2404{ 2405 struct print_arg *next; 2406 2407 while (args) { 2408 next = args->next; 2409 2410 if (args->type == PRINT_ATOM) 2411 free(args->atom.atom); 2412 else 2413 free(args->string.string); 2414 free(args); 2415 args = next; 2416 } 2417} 2418 2419static char *get_bprint_format(void *data, int size __unused, struct event *event) 2420{ 2421 unsigned long long addr; 2422 static struct format_field *field; 2423 struct printk_map *printk; 2424 char *format; 2425 char *p; 2426 2427 if (!field) { 2428 field = find_field(event, "fmt"); 2429 if (!field) 2430 die("can't find format field for binary printk"); 2431 printf("field->offset = %d size=%d\n", field->offset, field->size); 2432 } 2433 2434 addr = read_size(data + field->offset, field->size); 2435 2436 printk = find_printk(addr); 2437 if (!printk) { 2438 format = malloc_or_die(45); 2439 sprintf(format, "%%pf : (NO FORMAT FOUND at %llx)\n", 2440 addr); 2441 return format; 2442 } 2443 2444 p = printk->printk; 2445 /* Remove any quotes. */ 2446 if (*p == '"') 2447 p++; 2448 format = malloc_or_die(strlen(p) + 10); 2449 sprintf(format, "%s : %s", "%pf", p); 2450 /* remove ending quotes and new line since we will add one too */ 2451 p = format + strlen(format) - 1; 2452 if (*p == '"') 2453 *p = 0; 2454 2455 p -= 2; 2456 if (strcmp(p, "\\n") == 0) 2457 *p = 0; 2458 2459 return format; 2460} 2461 2462static void pretty_print(void *data, int size, struct event *event) 2463{ 2464 struct print_fmt *print_fmt = &event->print_fmt; 2465 struct print_arg *arg = print_fmt->args; 2466 struct print_arg *args = NULL; 2467 const char *ptr = print_fmt->format; 2468 unsigned long long val; 2469 struct func_map *func; 2470 const char *saveptr; 2471 char *bprint_fmt = NULL; 2472 char format[32]; 2473 int show_func; 2474 int len; 2475 int ls; 2476 2477 if (event->flags & EVENT_FL_ISFUNC) 2478 ptr = " %pF <-- %pF"; 2479 2480 if (event->flags & EVENT_FL_ISBPRINT) { 2481 bprint_fmt = get_bprint_format(data, size, event); 2482 args = make_bprint_args(bprint_fmt, data, size, event); 2483 arg = args; 2484 ptr = bprint_fmt; 2485 } 2486 2487 for (; *ptr; ptr++) { 2488 ls = 0; 2489 if (*ptr == '\\') { 2490 ptr++; 2491 switch (*ptr) { 2492 case 'n': 2493 printf("\n"); 2494 break; 2495 case 't': 2496 printf("\t"); 2497 break; 2498 case 'r': 2499 printf("\r"); 2500 break; 2501 case '\\': 2502 printf("\\"); 2503 break; 2504 default: 2505 printf("%c", *ptr); 2506 break; 2507 } 2508 2509 } else if (*ptr == '%') { 2510 saveptr = ptr; 2511 show_func = 0; 2512 cont_process: 2513 ptr++; 2514 switch (*ptr) { 2515 case '%': 2516 printf("%%"); 2517 break; 2518 case 'l': 2519 ls++; 2520 goto cont_process; 2521 case 'L': 2522 ls = 2; 2523 goto cont_process; 2524 case 'z': 2525 case 'Z': 2526 case '0' ... '9': 2527 goto cont_process; 2528 case 'p': 2529 if (long_size == 4) 2530 ls = 1; 2531 else 2532 ls = 2; 2533 2534 if (*(ptr+1) == 'F' || 2535 *(ptr+1) == 'f') { 2536 ptr++; 2537 show_func = *ptr; 2538 } 2539 2540 /* fall through */ 2541 case 'd': 2542 case 'i': 2543 case 'x': 2544 case 'X': 2545 case 'u': 2546 if (!arg) 2547 die("no argument match"); 2548 2549 len = ((unsigned long)ptr + 1) - 2550 (unsigned long)saveptr; 2551 2552 /* should never happen */ 2553 if (len > 32) 2554 die("bad format!"); 2555 2556 memcpy(format, saveptr, len); 2557 format[len] = 0; 2558 2559 val = eval_num_arg(data, size, event, arg); 2560 arg = arg->next; 2561 2562 if (show_func) { 2563 func = find_func(val); 2564 if (func) { 2565 printf("%s", func->func); 2566 if (show_func == 'F') 2567 printf("+0x%llx", 2568 val - func->addr); 2569 break; 2570 } 2571 } 2572 switch (ls) { 2573 case 0: 2574 printf(format, (int)val); 2575 break; 2576 case 1: 2577 printf(format, (long)val); 2578 break; 2579 case 2: 2580 printf(format, (long long)val); 2581 break; 2582 default: 2583 die("bad count (%d)", ls); 2584 } 2585 break; 2586 case 's': 2587 if (!arg) 2588 die("no matching argument"); 2589 2590 print_str_arg(data, size, event, arg); 2591 arg = arg->next; 2592 break; 2593 default: 2594 printf(">%c<", *ptr); 2595 2596 } 2597 } else 2598 printf("%c", *ptr); 2599 } 2600 2601 if (args) { 2602 free_args(args); 2603 free(bprint_fmt); 2604 } 2605} 2606 2607static inline int log10_cpu(int nb) 2608{ 2609 if (nb / 100) 2610 return 3; 2611 if (nb / 10) 2612 return 2; 2613 return 1; 2614} 2615 2616static void print_lat_fmt(void *data, int size __unused) 2617{ 2618 unsigned int lat_flags; 2619 unsigned int pc; 2620 int lock_depth; 2621 int hardirq; 2622 int softirq; 2623 2624 lat_flags = parse_common_flags(data); 2625 pc = parse_common_pc(data); 2626 lock_depth = parse_common_lock_depth(data); 2627 2628 hardirq = lat_flags & TRACE_FLAG_HARDIRQ; 2629 softirq = lat_flags & TRACE_FLAG_SOFTIRQ; 2630 2631 printf("%c%c%c", 2632 (lat_flags & TRACE_FLAG_IRQS_OFF) ? 'd' : 2633 (lat_flags & TRACE_FLAG_IRQS_NOSUPPORT) ? 2634 'X' : '.', 2635 (lat_flags & TRACE_FLAG_NEED_RESCHED) ? 2636 'N' : '.', 2637 (hardirq && softirq) ? 'H' : 2638 hardirq ? 'h' : softirq ? 's' : '.'); 2639 2640 if (pc) 2641 printf("%x", pc); 2642 else 2643 printf("."); 2644 2645 if (lock_depth < 0) 2646 printf(". "); 2647 else 2648 printf("%d ", lock_depth); 2649} 2650 2651#define TRACE_GRAPH_INDENT 2 2652 2653static struct record * 2654get_return_for_leaf(int cpu, int cur_pid, unsigned long long cur_func, 2655 struct record *next) 2656{ 2657 struct format_field *field; 2658 struct event *event; 2659 unsigned long val; 2660 int type; 2661 int pid; 2662 2663 type = trace_parse_common_type(next->data); 2664 event = trace_find_event(type); 2665 if (!event) 2666 return NULL; 2667 2668 if (!(event->flags & EVENT_FL_ISFUNCRET)) 2669 return NULL; 2670 2671 pid = trace_parse_common_pid(next->data); 2672 field = find_field(event, "func"); 2673 if (!field) 2674 die("function return does not have field func"); 2675 2676 val = read_size(next->data + field->offset, field->size); 2677 2678 if (cur_pid != pid || cur_func != val) 2679 return NULL; 2680 2681 /* this is a leaf, now advance the iterator */ 2682 return trace_read_data(cpu); 2683} 2684 2685/* Signal a overhead of time execution to the output */ 2686static void print_graph_overhead(unsigned long long duration) 2687{ 2688 /* Non nested entry or return */ 2689 if (duration == ~0ULL) 2690 return (void)printf(" "); 2691 2692 /* Duration exceeded 100 msecs */ 2693 if (duration > 100000ULL) 2694 return (void)printf("! "); 2695 2696 /* Duration exceeded 10 msecs */ 2697 if (duration > 10000ULL) 2698 return (void)printf("+ "); 2699 2700 printf(" "); 2701} 2702 2703static void print_graph_duration(unsigned long long duration) 2704{ 2705 unsigned long usecs = duration / 1000; 2706 unsigned long nsecs_rem = duration % 1000; 2707 /* log10(ULONG_MAX) + '\0' */ 2708 char msecs_str[21]; 2709 char nsecs_str[5]; 2710 int len; 2711 int i; 2712 2713 sprintf(msecs_str, "%lu", usecs); 2714 2715 /* Print msecs */ 2716 len = printf("%lu", usecs); 2717 2718 /* Print nsecs (we don't want to exceed 7 numbers) */ 2719 if (len < 7) { 2720 snprintf(nsecs_str, 8 - len, "%03lu", nsecs_rem); 2721 len += printf(".%s", nsecs_str); 2722 } 2723 2724 printf(" us "); 2725 2726 /* Print remaining spaces to fit the row's width */ 2727 for (i = len; i < 7; i++) 2728 printf(" "); 2729 2730 printf("| "); 2731} 2732 2733static void 2734print_graph_entry_leaf(struct event *event, void *data, struct record *ret_rec) 2735{ 2736 unsigned long long rettime, calltime; 2737 unsigned long long duration, depth; 2738 unsigned long long val; 2739 struct format_field *field; 2740 struct func_map *func; 2741 struct event *ret_event; 2742 int type; 2743 int i; 2744 2745 type = trace_parse_common_type(ret_rec->data); 2746 ret_event = trace_find_event(type); 2747 2748 field = find_field(ret_event, "rettime"); 2749 if (!field) 2750 die("can't find rettime in return graph"); 2751 rettime = read_size(ret_rec->data + field->offset, field->size); 2752 2753 field = find_field(ret_event, "calltime"); 2754 if (!field) 2755 die("can't find rettime in return graph"); 2756 calltime = read_size(ret_rec->data + field->offset, field->size); 2757 2758 duration = rettime - calltime; 2759 2760 /* Overhead */ 2761 print_graph_overhead(duration); 2762 2763 /* Duration */ 2764 print_graph_duration(duration); 2765 2766 field = find_field(event, "depth"); 2767 if (!field) 2768 die("can't find depth in entry graph"); 2769 depth = read_size(data + field->offset, field->size); 2770 2771 /* Function */ 2772 for (i = 0; i < (int)(depth * TRACE_GRAPH_INDENT); i++) 2773 printf(" "); 2774 2775 field = find_field(event, "func"); 2776 if (!field) 2777 die("can't find func in entry graph"); 2778 val = read_size(data + field->offset, field->size); 2779 func = find_func(val); 2780 2781 if (func) 2782 printf("%s();", func->func); 2783 else 2784 printf("%llx();", val); 2785} 2786 2787static void print_graph_nested(struct event *event, void *data) 2788{ 2789 struct format_field *field; 2790 unsigned long long depth; 2791 unsigned long long val; 2792 struct func_map *func; 2793 int i; 2794 2795 /* No overhead */ 2796 print_graph_overhead(-1); 2797 2798 /* No time */ 2799 printf(" | "); 2800 2801 field = find_field(event, "depth"); 2802 if (!field) 2803 die("can't find depth in entry graph"); 2804 depth = read_size(data + field->offset, field->size); 2805 2806 /* Function */ 2807 for (i = 0; i < (int)(depth * TRACE_GRAPH_INDENT); i++) 2808 printf(" "); 2809 2810 field = find_field(event, "func"); 2811 if (!field) 2812 die("can't find func in entry graph"); 2813 val = read_size(data + field->offset, field->size); 2814 func = find_func(val); 2815 2816 if (func) 2817 printf("%s() {", func->func); 2818 else 2819 printf("%llx() {", val); 2820} 2821 2822static void 2823pretty_print_func_ent(void *data, int size, struct event *event, 2824 int cpu, int pid) 2825{ 2826 struct format_field *field; 2827 struct record *rec; 2828 void *copy_data; 2829 unsigned long val; 2830 2831 if (latency_format) { 2832 print_lat_fmt(data, size); 2833 printf(" | "); 2834 } 2835 2836 field = find_field(event, "func"); 2837 if (!field) 2838 die("function entry does not have func field"); 2839 2840 val = read_size(data + field->offset, field->size); 2841 2842 /* 2843 * peek_data may unmap the data pointer. Copy it first. 2844 */ 2845 copy_data = malloc_or_die(size); 2846 memcpy(copy_data, data, size); 2847 data = copy_data; 2848 2849 rec = trace_peek_data(cpu); 2850 if (rec) { 2851 rec = get_return_for_leaf(cpu, pid, val, rec); 2852 if (rec) { 2853 print_graph_entry_leaf(event, data, rec); 2854 goto out_free; 2855 } 2856 } 2857 print_graph_nested(event, data); 2858out_free: 2859 free(data); 2860} 2861 2862static void 2863pretty_print_func_ret(void *data, int size __unused, struct event *event) 2864{ 2865 unsigned long long rettime, calltime; 2866 unsigned long long duration, depth; 2867 struct format_field *field; 2868 int i; 2869 2870 if (latency_format) { 2871 print_lat_fmt(data, size); 2872 printf(" | "); 2873 } 2874 2875 field = find_field(event, "rettime"); 2876 if (!field) 2877 die("can't find rettime in return graph"); 2878 rettime = read_size(data + field->offset, field->size); 2879 2880 field = find_field(event, "calltime"); 2881 if (!field) 2882 die("can't find calltime in return graph"); 2883 calltime = read_size(data + field->offset, field->size); 2884 2885 duration = rettime - calltime; 2886 2887 /* Overhead */ 2888 print_graph_overhead(duration); 2889 2890 /* Duration */ 2891 print_graph_duration(duration); 2892 2893 field = find_field(event, "depth"); 2894 if (!field) 2895 die("can't find depth in entry graph"); 2896 depth = read_size(data + field->offset, field->size); 2897 2898 /* Function */ 2899 for (i = 0; i < (int)(depth * TRACE_GRAPH_INDENT); i++) 2900 printf(" "); 2901 2902 printf("}"); 2903} 2904 2905static void 2906pretty_print_func_graph(void *data, int size, struct event *event, 2907 int cpu, int pid) 2908{ 2909 if (event->flags & EVENT_FL_ISFUNCENT) 2910 pretty_print_func_ent(data, size, event, cpu, pid); 2911 else if (event->flags & EVENT_FL_ISFUNCRET) 2912 pretty_print_func_ret(data, size, event); 2913 printf("\n"); 2914} 2915 2916void print_trace_event(int cpu, void *data, int size) 2917{ 2918 struct event *event; 2919 int type; 2920 int pid; 2921 2922 type = trace_parse_common_type(data); 2923 2924 event = trace_find_event(type); 2925 if (!event) { 2926 warning("ug! no event found for type %d", type); 2927 return; 2928 } 2929 2930 pid = trace_parse_common_pid(data); 2931 2932 if (event->flags & (EVENT_FL_ISFUNCENT | EVENT_FL_ISFUNCRET)) 2933 return pretty_print_func_graph(data, size, event, cpu, pid); 2934 2935 if (latency_format) 2936 print_lat_fmt(data, size); 2937 2938 if (event->flags & EVENT_FL_FAILED) { 2939 printf("EVENT '%s' FAILED TO PARSE\n", 2940 event->name); 2941 return; 2942 } 2943 2944 pretty_print(data, size, event); 2945} 2946 2947static void print_fields(struct print_flag_sym *field) 2948{ 2949 printf("{ %s, %s }", field->value, field->str); 2950 if (field->next) { 2951 printf(", "); 2952 print_fields(field->next); 2953 } 2954} 2955 2956static void print_args(struct print_arg *args) 2957{ 2958 int print_paren = 1; 2959 2960 switch (args->type) { 2961 case PRINT_NULL: 2962 printf("null"); 2963 break; 2964 case PRINT_ATOM: 2965 printf("%s", args->atom.atom); 2966 break; 2967 case PRINT_FIELD: 2968 printf("REC->%s", args->field.name); 2969 break; 2970 case PRINT_FLAGS: 2971 printf("__print_flags("); 2972 print_args(args->flags.field); 2973 printf(", %s, ", args->flags.delim); 2974 print_fields(args->flags.flags); 2975 printf(")"); 2976 break; 2977 case PRINT_SYMBOL: 2978 printf("__print_symbolic("); 2979 print_args(args->symbol.field); 2980 printf(", "); 2981 print_fields(args->symbol.symbols); 2982 printf(")"); 2983 break; 2984 case PRINT_STRING: 2985 printf("__get_str(%s)", args->string.string); 2986 break; 2987 case PRINT_TYPE: 2988 printf("(%s)", args->typecast.type); 2989 print_args(args->typecast.item); 2990 break; 2991 case PRINT_OP: 2992 if (strcmp(args->op.op, ":") == 0) 2993 print_paren = 0; 2994 if (print_paren) 2995 printf("("); 2996 print_args(args->op.left); 2997 printf(" %s ", args->op.op); 2998 print_args(args->op.right); 2999 if (print_paren) 3000 printf(")"); 3001 break; 3002 default: 3003 /* we should warn... */ 3004 return; 3005 } 3006 if (args->next) { 3007 printf("\n"); 3008 print_args(args->next); 3009 } 3010} 3011 3012int parse_ftrace_file(char *buf, unsigned long size) 3013{ 3014 struct format_field *field; 3015 struct print_arg *arg, **list; 3016 struct event *event; 3017 int ret; 3018 3019 init_input_buf(buf, size); 3020 3021 event = alloc_event(); 3022 if (!event) 3023 return -ENOMEM; 3024 3025 event->flags |= EVENT_FL_ISFTRACE; 3026 3027 event->name = event_read_name(); 3028 if (!event->name) 3029 die("failed to read ftrace event name"); 3030 3031 if (strcmp(event->name, "function") == 0) 3032 event->flags |= EVENT_FL_ISFUNC; 3033 3034 else if (strcmp(event->name, "funcgraph_entry") == 0) 3035 event->flags |= EVENT_FL_ISFUNCENT; 3036 3037 else if (strcmp(event->name, "funcgraph_exit") == 0) 3038 event->flags |= EVENT_FL_ISFUNCRET; 3039 3040 else if (strcmp(event->name, "bprint") == 0) 3041 event->flags |= EVENT_FL_ISBPRINT; 3042 3043 event->id = event_read_id(); 3044 if (event->id < 0) 3045 die("failed to read ftrace event id"); 3046 3047 add_event(event); 3048 3049 ret = event_read_format(event); 3050 if (ret < 0) 3051 die("failed to read ftrace event format"); 3052 3053 ret = event_read_print(event); 3054 if (ret < 0) 3055 die("failed to read ftrace event print fmt"); 3056 3057 /* New ftrace handles args */ 3058 if (ret > 0) 3059 return 0; 3060 /* 3061 * The arguments for ftrace files are parsed by the fields. 3062 * Set up the fields as their arguments. 3063 */ 3064 list = &event->print_fmt.args; 3065 for (field = event->format.fields; field; field = field->next) { 3066 arg = malloc_or_die(sizeof(*arg)); 3067 memset(arg, 0, sizeof(*arg)); 3068 *list = arg; 3069 list = &arg->next; 3070 arg->type = PRINT_FIELD; 3071 arg->field.name = field->name; 3072 arg->field.field = field; 3073 } 3074 return 0; 3075} 3076 3077int parse_event_file(char *buf, unsigned long size, char *sys) 3078{ 3079 struct event *event; 3080 int ret; 3081 3082 init_input_buf(buf, size); 3083 3084 event = alloc_event(); 3085 if (!event) 3086 return -ENOMEM; 3087 3088 event->name = event_read_name(); 3089 if (!event->name) 3090 die("failed to read event name"); 3091 3092 event->id = event_read_id(); 3093 if (event->id < 0) 3094 die("failed to read event id"); 3095 3096 ret = event_read_format(event); 3097 if (ret < 0) { 3098 warning("failed to read event format for %s", event->name); 3099 goto event_failed; 3100 } 3101 3102 ret = event_read_print(event); 3103 if (ret < 0) { 3104 warning("failed to read event print fmt for %s", event->name); 3105 goto event_failed; 3106 } 3107 3108 event->system = strdup(sys); 3109 3110#define PRINT_ARGS 0 3111 if (PRINT_ARGS && event->print_fmt.args) 3112 print_args(event->print_fmt.args); 3113 3114 add_event(event); 3115 return 0; 3116 3117 event_failed: 3118 event->flags |= EVENT_FL_FAILED; 3119 /* still add it even if it failed */ 3120 add_event(event); 3121 return -1; 3122} 3123 3124void parse_set_info(int nr_cpus, int long_sz) 3125{ 3126 cpus = nr_cpus; 3127 long_size = long_sz; 3128} 3129 3130int common_pc(struct scripting_context *context) 3131{ 3132 return parse_common_pc(context->event_data); 3133} 3134 3135int common_flags(struct scripting_context *context) 3136{ 3137 return parse_common_flags(context->event_data); 3138} 3139 3140int common_lock_depth(struct scripting_context *context) 3141{ 3142 return parse_common_lock_depth(context->event_data); 3143} 3144