1 /* 2 * probe-event.c : perf-probe definition to probe_events format converter 3 * 4 * Written by Masami Hiramatsu <mhiramat@redhat.com> 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; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 19 * 20 */ 21 22 #define _GNU_SOURCE 23 #include <sys/utsname.h> 24 #include <sys/types.h> 25 #include <sys/stat.h> 26 #include <fcntl.h> 27 #include <errno.h> 28 #include <stdio.h> 29 #include <unistd.h> 30 #include <stdlib.h> 31 #include <string.h> 32 #include <stdarg.h> 33 #include <limits.h> 34 #include <elf.h> 35 36 #undef _GNU_SOURCE 37 #include "util.h" 38 #include "event.h" 39 #include "string.h" 40 #include "strlist.h" 41 #include "debug.h" 42 #include "cache.h" 43 #include "color.h" 44 #include "symbol.h" 45 #include "thread.h" 46 #include "debugfs.h" 47 #include "trace-event.h" /* For __unused */ 48 #include "probe-event.h" 49 #include "probe-finder.h" 50 51 #define MAX_CMDLEN 256 52 #define MAX_PROBE_ARGS 128 53 #define PERFPROBE_GROUP "probe" 54 55 bool probe_event_dry_run; /* Dry run flag */ 56 57 #define semantic_error(msg ...) pr_err("Semantic error :" msg) 58 59 /* If there is no space to write, returns -E2BIG. */ 60 static int e_snprintf(char *str, size_t size, const char *format, ...) 61 __attribute__((format(printf, 3, 4))); 62 63 static int e_snprintf(char *str, size_t size, const char *format, ...) 64 { 65 int ret; 66 va_list ap; 67 va_start(ap, format); 68 ret = vsnprintf(str, size, format, ap); 69 va_end(ap); 70 if (ret >= (int)size) 71 ret = -E2BIG; 72 return ret; 73 } 74 75 static char *synthesize_perf_probe_point(struct perf_probe_point *pp); 76 static struct machine machine; 77 78 /* Initialize symbol maps and path of vmlinux/modules */ 79 static int init_vmlinux(void) 80 { 81 int ret; 82 83 symbol_conf.sort_by_name = true; 84 if (symbol_conf.vmlinux_name == NULL) 85 symbol_conf.try_vmlinux_path = true; 86 else 87 pr_debug("Use vmlinux: %s\n", symbol_conf.vmlinux_name); 88 ret = symbol__init(); 89 if (ret < 0) { 90 pr_debug("Failed to init symbol map.\n"); 91 goto out; 92 } 93 94 ret = machine__init(&machine, "", HOST_KERNEL_ID); 95 if (ret < 0) 96 goto out; 97 98 if (machine__create_kernel_maps(&machine) < 0) { 99 pr_debug("machine__create_kernel_maps() failed.\n"); 100 goto out; 101 } 102 out: 103 if (ret < 0) 104 pr_warning("Failed to init vmlinux path.\n"); 105 return ret; 106 } 107 108 static struct symbol *__find_kernel_function_by_name(const char *name, 109 struct map **mapp) 110 { 111 return machine__find_kernel_function_by_name(&machine, name, mapp, 112 NULL); 113 } 114 115 static struct map *kernel_get_module_map(const char *module) 116 { 117 struct rb_node *nd; 118 struct map_groups *grp = &machine.kmaps; 119 120 /* A file path -- this is an offline module */ 121 if (module && strchr(module, '/')) 122 return machine__new_module(&machine, 0, module); 123 124 if (!module) 125 module = "kernel"; 126 127 for (nd = rb_first(&grp->maps[MAP__FUNCTION]); nd; nd = rb_next(nd)) { 128 struct map *pos = rb_entry(nd, struct map, rb_node); 129 if (strncmp(pos->dso->short_name + 1, module, 130 pos->dso->short_name_len - 2) == 0) { 131 return pos; 132 } 133 } 134 return NULL; 135 } 136 137 static struct dso *kernel_get_module_dso(const char *module) 138 { 139 struct dso *dso; 140 struct map *map; 141 const char *vmlinux_name; 142 143 if (module) { 144 list_for_each_entry(dso, &machine.kernel_dsos, node) { 145 if (strncmp(dso->short_name + 1, module, 146 dso->short_name_len - 2) == 0) 147 goto found; 148 } 149 pr_debug("Failed to find module %s.\n", module); 150 return NULL; 151 } 152 153 map = machine.vmlinux_maps[MAP__FUNCTION]; 154 dso = map->dso; 155 156 vmlinux_name = symbol_conf.vmlinux_name; 157 if (vmlinux_name) { 158 if (dso__load_vmlinux(dso, map, vmlinux_name, NULL) <= 0) 159 return NULL; 160 } else { 161 if (dso__load_vmlinux_path(dso, map, NULL) <= 0) { 162 pr_debug("Failed to load kernel map.\n"); 163 return NULL; 164 } 165 } 166 found: 167 return dso; 168 } 169 170 const char *kernel_get_module_path(const char *module) 171 { 172 struct dso *dso = kernel_get_module_dso(module); 173 return (dso) ? dso->long_name : NULL; 174 } 175 176 #ifdef DWARF_SUPPORT 177 /* Open new debuginfo of given module */ 178 static struct debuginfo *open_debuginfo(const char *module) 179 { 180 const char *path; 181 182 /* A file path -- this is an offline module */ 183 if (module && strchr(module, '/')) 184 path = module; 185 else { 186 path = kernel_get_module_path(module); 187 188 if (!path) { 189 pr_err("Failed to find path of %s module.\n", 190 module ?: "kernel"); 191 return NULL; 192 } 193 } 194 return debuginfo__new(path); 195 } 196 197 /* 198 * Convert trace point to probe point with debuginfo 199 * Currently only handles kprobes. 200 */ 201 static int kprobe_convert_to_perf_probe(struct probe_trace_point *tp, 202 struct perf_probe_point *pp) 203 { 204 struct symbol *sym; 205 struct map *map; 206 u64 addr; 207 int ret = -ENOENT; 208 struct debuginfo *dinfo; 209 210 sym = __find_kernel_function_by_name(tp->symbol, &map); 211 if (sym) { 212 addr = map->unmap_ip(map, sym->start + tp->offset); 213 pr_debug("try to find %s+%ld@%" PRIx64 "\n", tp->symbol, 214 tp->offset, addr); 215 216 dinfo = debuginfo__new_online_kernel(addr); 217 if (dinfo) { 218 ret = debuginfo__find_probe_point(dinfo, 219 (unsigned long)addr, pp); 220 debuginfo__delete(dinfo); 221 } else { 222 pr_debug("Failed to open debuginfo at 0x%" PRIx64 "\n", 223 addr); 224 ret = -ENOENT; 225 } 226 } 227 if (ret <= 0) { 228 pr_debug("Failed to find corresponding probes from " 229 "debuginfo. Use kprobe event information.\n"); 230 pp->function = strdup(tp->symbol); 231 if (pp->function == NULL) 232 return -ENOMEM; 233 pp->offset = tp->offset; 234 } 235 pp->retprobe = tp->retprobe; 236 237 return 0; 238 } 239 240 static int add_module_to_probe_trace_events(struct probe_trace_event *tevs, 241 int ntevs, const char *module) 242 { 243 int i, ret = 0; 244 char *tmp; 245 246 if (!module) 247 return 0; 248 249 tmp = strrchr(module, '/'); 250 if (tmp) { 251 /* This is a module path -- get the module name */ 252 module = strdup(tmp + 1); 253 if (!module) 254 return -ENOMEM; 255 tmp = strchr(module, '.'); 256 if (tmp) 257 *tmp = '\0'; 258 tmp = (char *)module; /* For free() */ 259 } 260 261 for (i = 0; i < ntevs; i++) { 262 tevs[i].point.module = strdup(module); 263 if (!tevs[i].point.module) { 264 ret = -ENOMEM; 265 break; 266 } 267 } 268 269 if (tmp) 270 free(tmp); 271 272 return ret; 273 } 274 275 /* Try to find perf_probe_event with debuginfo */ 276 static int try_to_find_probe_trace_events(struct perf_probe_event *pev, 277 struct probe_trace_event **tevs, 278 int max_tevs, const char *module) 279 { 280 bool need_dwarf = perf_probe_event_need_dwarf(pev); 281 struct debuginfo *dinfo = open_debuginfo(module); 282 int ntevs, ret = 0; 283 284 if (!dinfo) { 285 if (need_dwarf) { 286 pr_warning("Failed to open debuginfo file.\n"); 287 return -ENOENT; 288 } 289 pr_debug("Could not open debuginfo. Try to use symbols.\n"); 290 return 0; 291 } 292 293 /* Searching trace events corresponding to a probe event */ 294 ntevs = debuginfo__find_trace_events(dinfo, pev, tevs, max_tevs); 295 296 debuginfo__delete(dinfo); 297 298 if (ntevs > 0) { /* Succeeded to find trace events */ 299 pr_debug("find %d probe_trace_events.\n", ntevs); 300 if (module) 301 ret = add_module_to_probe_trace_events(*tevs, ntevs, 302 module); 303 return ret < 0 ? ret : ntevs; 304 } 305 306 if (ntevs == 0) { /* No error but failed to find probe point. */ 307 pr_warning("Probe point '%s' not found.\n", 308 synthesize_perf_probe_point(&pev->point)); 309 return -ENOENT; 310 } 311 /* Error path : ntevs < 0 */ 312 pr_debug("An error occurred in debuginfo analysis (%d).\n", ntevs); 313 if (ntevs == -EBADF) { 314 pr_warning("Warning: No dwarf info found in the vmlinux - " 315 "please rebuild kernel with CONFIG_DEBUG_INFO=y.\n"); 316 if (!need_dwarf) { 317 pr_debug("Trying to use symbols.\n"); 318 return 0; 319 } 320 } 321 return ntevs; 322 } 323 324 /* 325 * Find a src file from a DWARF tag path. Prepend optional source path prefix 326 * and chop off leading directories that do not exist. Result is passed back as 327 * a newly allocated path on success. 328 * Return 0 if file was found and readable, -errno otherwise. 329 */ 330 static int get_real_path(const char *raw_path, const char *comp_dir, 331 char **new_path) 332 { 333 const char *prefix = symbol_conf.source_prefix; 334 335 if (!prefix) { 336 if (raw_path[0] != '/' && comp_dir) 337 /* If not an absolute path, try to use comp_dir */ 338 prefix = comp_dir; 339 else { 340 if (access(raw_path, R_OK) == 0) { 341 *new_path = strdup(raw_path); 342 return 0; 343 } else 344 return -errno; 345 } 346 } 347 348 *new_path = malloc((strlen(prefix) + strlen(raw_path) + 2)); 349 if (!*new_path) 350 return -ENOMEM; 351 352 for (;;) { 353 sprintf(*new_path, "%s/%s", prefix, raw_path); 354 355 if (access(*new_path, R_OK) == 0) 356 return 0; 357 358 if (!symbol_conf.source_prefix) 359 /* In case of searching comp_dir, don't retry */ 360 return -errno; 361 362 switch (errno) { 363 case ENAMETOOLONG: 364 case ENOENT: 365 case EROFS: 366 case EFAULT: 367 raw_path = strchr(++raw_path, '/'); 368 if (!raw_path) { 369 free(*new_path); 370 *new_path = NULL; 371 return -ENOENT; 372 } 373 continue; 374 375 default: 376 free(*new_path); 377 *new_path = NULL; 378 return -errno; 379 } 380 } 381 } 382 383 #define LINEBUF_SIZE 256 384 #define NR_ADDITIONAL_LINES 2 385 386 static int __show_one_line(FILE *fp, int l, bool skip, bool show_num) 387 { 388 char buf[LINEBUF_SIZE]; 389 const char *color = show_num ? "" : PERF_COLOR_BLUE; 390 const char *prefix = NULL; 391 392 do { 393 if (fgets(buf, LINEBUF_SIZE, fp) == NULL) 394 goto error; 395 if (skip) 396 continue; 397 if (!prefix) { 398 prefix = show_num ? "%7d " : " "; 399 color_fprintf(stdout, color, prefix, l); 400 } 401 color_fprintf(stdout, color, "%s", buf); 402 403 } while (strchr(buf, '\n') == NULL); 404 405 return 1; 406 error: 407 if (ferror(fp)) { 408 pr_warning("File read error: %s\n", strerror(errno)); 409 return -1; 410 } 411 return 0; 412 } 413 414 static int _show_one_line(FILE *fp, int l, bool skip, bool show_num) 415 { 416 int rv = __show_one_line(fp, l, skip, show_num); 417 if (rv == 0) { 418 pr_warning("Source file is shorter than expected.\n"); 419 rv = -1; 420 } 421 return rv; 422 } 423 424 #define show_one_line_with_num(f,l) _show_one_line(f,l,false,true) 425 #define show_one_line(f,l) _show_one_line(f,l,false,false) 426 #define skip_one_line(f,l) _show_one_line(f,l,true,false) 427 #define show_one_line_or_eof(f,l) __show_one_line(f,l,false,false) 428 429 /* 430 * Show line-range always requires debuginfo to find source file and 431 * line number. 432 */ 433 int show_line_range(struct line_range *lr, const char *module) 434 { 435 int l = 1; 436 struct line_node *ln; 437 struct debuginfo *dinfo; 438 FILE *fp; 439 int ret; 440 char *tmp; 441 442 /* Search a line range */ 443 ret = init_vmlinux(); 444 if (ret < 0) 445 return ret; 446 447 dinfo = open_debuginfo(module); 448 if (!dinfo) { 449 pr_warning("Failed to open debuginfo file.\n"); 450 return -ENOENT; 451 } 452 453 ret = debuginfo__find_line_range(dinfo, lr); 454 debuginfo__delete(dinfo); 455 if (ret == 0) { 456 pr_warning("Specified source line is not found.\n"); 457 return -ENOENT; 458 } else if (ret < 0) { 459 pr_warning("Debuginfo analysis failed. (%d)\n", ret); 460 return ret; 461 } 462 463 /* Convert source file path */ 464 tmp = lr->path; 465 ret = get_real_path(tmp, lr->comp_dir, &lr->path); 466 free(tmp); /* Free old path */ 467 if (ret < 0) { 468 pr_warning("Failed to find source file. (%d)\n", ret); 469 return ret; 470 } 471 472 setup_pager(); 473 474 if (lr->function) 475 fprintf(stdout, "<%s@%s:%d>\n", lr->function, lr->path, 476 lr->start - lr->offset); 477 else 478 fprintf(stdout, "<%s:%d>\n", lr->path, lr->start); 479 480 fp = fopen(lr->path, "r"); 481 if (fp == NULL) { 482 pr_warning("Failed to open %s: %s\n", lr->path, 483 strerror(errno)); 484 return -errno; 485 } 486 /* Skip to starting line number */ 487 while (l < lr->start) { 488 ret = skip_one_line(fp, l++); 489 if (ret < 0) 490 goto end; 491 } 492 493 list_for_each_entry(ln, &lr->line_list, list) { 494 for (; ln->line > l; l++) { 495 ret = show_one_line(fp, l - lr->offset); 496 if (ret < 0) 497 goto end; 498 } 499 ret = show_one_line_with_num(fp, l++ - lr->offset); 500 if (ret < 0) 501 goto end; 502 } 503 504 if (lr->end == INT_MAX) 505 lr->end = l + NR_ADDITIONAL_LINES; 506 while (l <= lr->end) { 507 ret = show_one_line_or_eof(fp, l++ - lr->offset); 508 if (ret <= 0) 509 break; 510 } 511 end: 512 fclose(fp); 513 return ret; 514 } 515 516 static int show_available_vars_at(struct debuginfo *dinfo, 517 struct perf_probe_event *pev, 518 int max_vls, struct strfilter *_filter, 519 bool externs) 520 { 521 char *buf; 522 int ret, i, nvars; 523 struct str_node *node; 524 struct variable_list *vls = NULL, *vl; 525 const char *var; 526 527 buf = synthesize_perf_probe_point(&pev->point); 528 if (!buf) 529 return -EINVAL; 530 pr_debug("Searching variables at %s\n", buf); 531 532 ret = debuginfo__find_available_vars_at(dinfo, pev, &vls, 533 max_vls, externs); 534 if (ret <= 0) { 535 pr_err("Failed to find variables at %s (%d)\n", buf, ret); 536 goto end; 537 } 538 /* Some variables are found */ 539 fprintf(stdout, "Available variables at %s\n", buf); 540 for (i = 0; i < ret; i++) { 541 vl = &vls[i]; 542 /* 543 * A probe point might be converted to 544 * several trace points. 545 */ 546 fprintf(stdout, "\t@<%s+%lu>\n", vl->point.symbol, 547 vl->point.offset); 548 free(vl->point.symbol); 549 nvars = 0; 550 if (vl->vars) { 551 strlist__for_each(node, vl->vars) { 552 var = strchr(node->s, '\t') + 1; 553 if (strfilter__compare(_filter, var)) { 554 fprintf(stdout, "\t\t%s\n", node->s); 555 nvars++; 556 } 557 } 558 strlist__delete(vl->vars); 559 } 560 if (nvars == 0) 561 fprintf(stdout, "\t\t(No matched variables)\n"); 562 } 563 free(vls); 564 end: 565 free(buf); 566 return ret; 567 } 568 569 /* Show available variables on given probe point */ 570 int show_available_vars(struct perf_probe_event *pevs, int npevs, 571 int max_vls, const char *module, 572 struct strfilter *_filter, bool externs) 573 { 574 int i, ret = 0; 575 struct debuginfo *dinfo; 576 577 ret = init_vmlinux(); 578 if (ret < 0) 579 return ret; 580 581 dinfo = open_debuginfo(module); 582 if (!dinfo) { 583 pr_warning("Failed to open debuginfo file.\n"); 584 return -ENOENT; 585 } 586 587 setup_pager(); 588 589 for (i = 0; i < npevs && ret >= 0; i++) 590 ret = show_available_vars_at(dinfo, &pevs[i], max_vls, _filter, 591 externs); 592 593 debuginfo__delete(dinfo); 594 return ret; 595 } 596 597 #else /* !DWARF_SUPPORT */ 598 599 static int kprobe_convert_to_perf_probe(struct probe_trace_point *tp, 600 struct perf_probe_point *pp) 601 { 602 struct symbol *sym; 603 604 sym = __find_kernel_function_by_name(tp->symbol, NULL); 605 if (!sym) { 606 pr_err("Failed to find symbol %s in kernel.\n", tp->symbol); 607 return -ENOENT; 608 } 609 pp->function = strdup(tp->symbol); 610 if (pp->function == NULL) 611 return -ENOMEM; 612 pp->offset = tp->offset; 613 pp->retprobe = tp->retprobe; 614 615 return 0; 616 } 617 618 static int try_to_find_probe_trace_events(struct perf_probe_event *pev, 619 struct probe_trace_event **tevs __unused, 620 int max_tevs __unused, const char *mod __unused) 621 { 622 if (perf_probe_event_need_dwarf(pev)) { 623 pr_warning("Debuginfo-analysis is not supported.\n"); 624 return -ENOSYS; 625 } 626 return 0; 627 } 628 629 int show_line_range(struct line_range *lr __unused, const char *module __unused) 630 { 631 pr_warning("Debuginfo-analysis is not supported.\n"); 632 return -ENOSYS; 633 } 634 635 int show_available_vars(struct perf_probe_event *pevs __unused, 636 int npevs __unused, int max_vls __unused, 637 const char *module __unused, 638 struct strfilter *filter __unused, 639 bool externs __unused) 640 { 641 pr_warning("Debuginfo-analysis is not supported.\n"); 642 return -ENOSYS; 643 } 644 #endif 645 646 static int parse_line_num(char **ptr, int *val, const char *what) 647 { 648 const char *start = *ptr; 649 650 errno = 0; 651 *val = strtol(*ptr, ptr, 0); 652 if (errno || *ptr == start) { 653 semantic_error("'%s' is not a valid number.\n", what); 654 return -EINVAL; 655 } 656 return 0; 657 } 658 659 /* 660 * Stuff 'lr' according to the line range described by 'arg'. 661 * The line range syntax is described by: 662 * 663 * SRC[:SLN[+NUM|-ELN]] 664 * FNC[@SRC][:SLN[+NUM|-ELN]] 665 */ 666 int parse_line_range_desc(const char *arg, struct line_range *lr) 667 { 668 char *range, *file, *name = strdup(arg); 669 int err; 670 671 if (!name) 672 return -ENOMEM; 673 674 lr->start = 0; 675 lr->end = INT_MAX; 676 677 range = strchr(name, ':'); 678 if (range) { 679 *range++ = '\0'; 680 681 err = parse_line_num(&range, &lr->start, "start line"); 682 if (err) 683 goto err; 684 685 if (*range == '+' || *range == '-') { 686 const char c = *range++; 687 688 err = parse_line_num(&range, &lr->end, "end line"); 689 if (err) 690 goto err; 691 692 if (c == '+') { 693 lr->end += lr->start; 694 /* 695 * Adjust the number of lines here. 696 * If the number of lines == 1, the 697 * the end of line should be equal to 698 * the start of line. 699 */ 700 lr->end--; 701 } 702 } 703 704 pr_debug("Line range is %d to %d\n", lr->start, lr->end); 705 706 err = -EINVAL; 707 if (lr->start > lr->end) { 708 semantic_error("Start line must be smaller" 709 " than end line.\n"); 710 goto err; 711 } 712 if (*range != '\0') { 713 semantic_error("Tailing with invalid str '%s'.\n", range); 714 goto err; 715 } 716 } 717 718 file = strchr(name, '@'); 719 if (file) { 720 *file = '\0'; 721 lr->file = strdup(++file); 722 if (lr->file == NULL) { 723 err = -ENOMEM; 724 goto err; 725 } 726 lr->function = name; 727 } else if (strchr(name, '.')) 728 lr->file = name; 729 else 730 lr->function = name; 731 732 return 0; 733 err: 734 free(name); 735 return err; 736 } 737 738 /* Check the name is good for event/group */ 739 static bool check_event_name(const char *name) 740 { 741 if (!isalpha(*name) && *name != '_') 742 return false; 743 while (*++name != '\0') { 744 if (!isalpha(*name) && !isdigit(*name) && *name != '_') 745 return false; 746 } 747 return true; 748 } 749 750 /* Parse probepoint definition. */ 751 static int parse_perf_probe_point(char *arg, struct perf_probe_event *pev) 752 { 753 struct perf_probe_point *pp = &pev->point; 754 char *ptr, *tmp; 755 char c, nc = 0; 756 /* 757 * <Syntax> 758 * perf probe [EVENT=]SRC[:LN|;PTN] 759 * perf probe [EVENT=]FUNC[@SRC][+OFFS|%return|:LN|;PAT] 760 * 761 * TODO:Group name support 762 */ 763 764 ptr = strpbrk(arg, ";=@+%"); 765 if (ptr && *ptr == '=') { /* Event name */ 766 *ptr = '\0'; 767 tmp = ptr + 1; 768 if (strchr(arg, ':')) { 769 semantic_error("Group name is not supported yet.\n"); 770 return -ENOTSUP; 771 } 772 if (!check_event_name(arg)) { 773 semantic_error("%s is bad for event name -it must " 774 "follow C symbol-naming rule.\n", arg); 775 return -EINVAL; 776 } 777 pev->event = strdup(arg); 778 if (pev->event == NULL) 779 return -ENOMEM; 780 pev->group = NULL; 781 arg = tmp; 782 } 783 784 ptr = strpbrk(arg, ";:+@%"); 785 if (ptr) { 786 nc = *ptr; 787 *ptr++ = '\0'; 788 } 789 790 tmp = strdup(arg); 791 if (tmp == NULL) 792 return -ENOMEM; 793 794 /* Check arg is function or file and copy it */ 795 if (strchr(tmp, '.')) /* File */ 796 pp->file = tmp; 797 else /* Function */ 798 pp->function = tmp; 799 800 /* Parse other options */ 801 while (ptr) { 802 arg = ptr; 803 c = nc; 804 if (c == ';') { /* Lazy pattern must be the last part */ 805 pp->lazy_line = strdup(arg); 806 if (pp->lazy_line == NULL) 807 return -ENOMEM; 808 break; 809 } 810 ptr = strpbrk(arg, ";:+@%"); 811 if (ptr) { 812 nc = *ptr; 813 *ptr++ = '\0'; 814 } 815 switch (c) { 816 case ':': /* Line number */ 817 pp->line = strtoul(arg, &tmp, 0); 818 if (*tmp != '\0') { 819 semantic_error("There is non-digit char" 820 " in line number.\n"); 821 return -EINVAL; 822 } 823 break; 824 case '+': /* Byte offset from a symbol */ 825 pp->offset = strtoul(arg, &tmp, 0); 826 if (*tmp != '\0') { 827 semantic_error("There is non-digit character" 828 " in offset.\n"); 829 return -EINVAL; 830 } 831 break; 832 case '@': /* File name */ 833 if (pp->file) { 834 semantic_error("SRC@SRC is not allowed.\n"); 835 return -EINVAL; 836 } 837 pp->file = strdup(arg); 838 if (pp->file == NULL) 839 return -ENOMEM; 840 break; 841 case '%': /* Probe places */ 842 if (strcmp(arg, "return") == 0) { 843 pp->retprobe = 1; 844 } else { /* Others not supported yet */ 845 semantic_error("%%%s is not supported.\n", arg); 846 return -ENOTSUP; 847 } 848 break; 849 default: /* Buggy case */ 850 pr_err("This program has a bug at %s:%d.\n", 851 __FILE__, __LINE__); 852 return -ENOTSUP; 853 break; 854 } 855 } 856 857 /* Exclusion check */ 858 if (pp->lazy_line && pp->line) { 859 semantic_error("Lazy pattern can't be used with" 860 " line number.\n"); 861 return -EINVAL; 862 } 863 864 if (pp->lazy_line && pp->offset) { 865 semantic_error("Lazy pattern can't be used with offset.\n"); 866 return -EINVAL; 867 } 868 869 if (pp->line && pp->offset) { 870 semantic_error("Offset can't be used with line number.\n"); 871 return -EINVAL; 872 } 873 874 if (!pp->line && !pp->lazy_line && pp->file && !pp->function) { 875 semantic_error("File always requires line number or " 876 "lazy pattern.\n"); 877 return -EINVAL; 878 } 879 880 if (pp->offset && !pp->function) { 881 semantic_error("Offset requires an entry function.\n"); 882 return -EINVAL; 883 } 884 885 if (pp->retprobe && !pp->function) { 886 semantic_error("Return probe requires an entry function.\n"); 887 return -EINVAL; 888 } 889 890 if ((pp->offset || pp->line || pp->lazy_line) && pp->retprobe) { 891 semantic_error("Offset/Line/Lazy pattern can't be used with " 892 "return probe.\n"); 893 return -EINVAL; 894 } 895 896 pr_debug("symbol:%s file:%s line:%d offset:%lu return:%d lazy:%s\n", 897 pp->function, pp->file, pp->line, pp->offset, pp->retprobe, 898 pp->lazy_line); 899 return 0; 900 } 901 902 /* Parse perf-probe event argument */ 903 static int parse_perf_probe_arg(char *str, struct perf_probe_arg *arg) 904 { 905 char *tmp, *goodname; 906 struct perf_probe_arg_field **fieldp; 907 908 pr_debug("parsing arg: %s into ", str); 909 910 tmp = strchr(str, '='); 911 if (tmp) { 912 arg->name = strndup(str, tmp - str); 913 if (arg->name == NULL) 914 return -ENOMEM; 915 pr_debug("name:%s ", arg->name); 916 str = tmp + 1; 917 } 918 919 tmp = strchr(str, ':'); 920 if (tmp) { /* Type setting */ 921 *tmp = '\0'; 922 arg->type = strdup(tmp + 1); 923 if (arg->type == NULL) 924 return -ENOMEM; 925 pr_debug("type:%s ", arg->type); 926 } 927 928 tmp = strpbrk(str, "-.["); 929 if (!is_c_varname(str) || !tmp) { 930 /* A variable, register, symbol or special value */ 931 arg->var = strdup(str); 932 if (arg->var == NULL) 933 return -ENOMEM; 934 pr_debug("%s\n", arg->var); 935 return 0; 936 } 937 938 /* Structure fields or array element */ 939 arg->var = strndup(str, tmp - str); 940 if (arg->var == NULL) 941 return -ENOMEM; 942 goodname = arg->var; 943 pr_debug("%s, ", arg->var); 944 fieldp = &arg->field; 945 946 do { 947 *fieldp = zalloc(sizeof(struct perf_probe_arg_field)); 948 if (*fieldp == NULL) 949 return -ENOMEM; 950 if (*tmp == '[') { /* Array */ 951 str = tmp; 952 (*fieldp)->index = strtol(str + 1, &tmp, 0); 953 (*fieldp)->ref = true; 954 if (*tmp != ']' || tmp == str + 1) { 955 semantic_error("Array index must be a" 956 " number.\n"); 957 return -EINVAL; 958 } 959 tmp++; 960 if (*tmp == '\0') 961 tmp = NULL; 962 } else { /* Structure */ 963 if (*tmp == '.') { 964 str = tmp + 1; 965 (*fieldp)->ref = false; 966 } else if (tmp[1] == '>') { 967 str = tmp + 2; 968 (*fieldp)->ref = true; 969 } else { 970 semantic_error("Argument parse error: %s\n", 971 str); 972 return -EINVAL; 973 } 974 tmp = strpbrk(str, "-.["); 975 } 976 if (tmp) { 977 (*fieldp)->name = strndup(str, tmp - str); 978 if ((*fieldp)->name == NULL) 979 return -ENOMEM; 980 if (*str != '[') 981 goodname = (*fieldp)->name; 982 pr_debug("%s(%d), ", (*fieldp)->name, (*fieldp)->ref); 983 fieldp = &(*fieldp)->next; 984 } 985 } while (tmp); 986 (*fieldp)->name = strdup(str); 987 if ((*fieldp)->name == NULL) 988 return -ENOMEM; 989 if (*str != '[') 990 goodname = (*fieldp)->name; 991 pr_debug("%s(%d)\n", (*fieldp)->name, (*fieldp)->ref); 992 993 /* If no name is specified, set the last field name (not array index)*/ 994 if (!arg->name) { 995 arg->name = strdup(goodname); 996 if (arg->name == NULL) 997 return -ENOMEM; 998 } 999 return 0; 1000 } 1001 1002 /* Parse perf-probe event command */ 1003 int parse_perf_probe_command(const char *cmd, struct perf_probe_event *pev) 1004 { 1005 char **argv; 1006 int argc, i, ret = 0; 1007 1008 argv = argv_split(cmd, &argc); 1009 if (!argv) { 1010 pr_debug("Failed to split arguments.\n"); 1011 return -ENOMEM; 1012 } 1013 if (argc - 1 > MAX_PROBE_ARGS) { 1014 semantic_error("Too many probe arguments (%d).\n", argc - 1); 1015 ret = -ERANGE; 1016 goto out; 1017 } 1018 /* Parse probe point */ 1019 ret = parse_perf_probe_point(argv[0], pev); 1020 if (ret < 0) 1021 goto out; 1022 1023 /* Copy arguments and ensure return probe has no C argument */ 1024 pev->nargs = argc - 1; 1025 pev->args = zalloc(sizeof(struct perf_probe_arg) * pev->nargs); 1026 if (pev->args == NULL) { 1027 ret = -ENOMEM; 1028 goto out; 1029 } 1030 for (i = 0; i < pev->nargs && ret >= 0; i++) { 1031 ret = parse_perf_probe_arg(argv[i + 1], &pev->args[i]); 1032 if (ret >= 0 && 1033 is_c_varname(pev->args[i].var) && pev->point.retprobe) { 1034 semantic_error("You can't specify local variable for" 1035 " kretprobe.\n"); 1036 ret = -EINVAL; 1037 } 1038 } 1039 out: 1040 argv_free(argv); 1041 1042 return ret; 1043 } 1044 1045 /* Return true if this perf_probe_event requires debuginfo */ 1046 bool perf_probe_event_need_dwarf(struct perf_probe_event *pev) 1047 { 1048 int i; 1049 1050 if (pev->point.file || pev->point.line || pev->point.lazy_line) 1051 return true; 1052 1053 for (i = 0; i < pev->nargs; i++) 1054 if (is_c_varname(pev->args[i].var)) 1055 return true; 1056 1057 return false; 1058 } 1059 1060 /* Parse probe_events event into struct probe_point */ 1061 static int parse_probe_trace_command(const char *cmd, 1062 struct probe_trace_event *tev) 1063 { 1064 struct probe_trace_point *tp = &tev->point; 1065 char pr; 1066 char *p; 1067 int ret, i, argc; 1068 char **argv; 1069 1070 pr_debug("Parsing probe_events: %s\n", cmd); 1071 argv = argv_split(cmd, &argc); 1072 if (!argv) { 1073 pr_debug("Failed to split arguments.\n"); 1074 return -ENOMEM; 1075 } 1076 if (argc < 2) { 1077 semantic_error("Too few probe arguments.\n"); 1078 ret = -ERANGE; 1079 goto out; 1080 } 1081 1082 /* Scan event and group name. */ 1083 ret = sscanf(argv[0], "%c:%a[^/ \t]/%a[^ \t]", 1084 &pr, (float *)(void *)&tev->group, 1085 (float *)(void *)&tev->event); 1086 if (ret != 3) { 1087 semantic_error("Failed to parse event name: %s\n", argv[0]); 1088 ret = -EINVAL; 1089 goto out; 1090 } 1091 pr_debug("Group:%s Event:%s probe:%c\n", tev->group, tev->event, pr); 1092 1093 tp->retprobe = (pr == 'r'); 1094 1095 /* Scan module name(if there), function name and offset */ 1096 p = strchr(argv[1], ':'); 1097 if (p) { 1098 tp->module = strndup(argv[1], p - argv[1]); 1099 p++; 1100 } else 1101 p = argv[1]; 1102 ret = sscanf(p, "%a[^+]+%lu", (float *)(void *)&tp->symbol, 1103 &tp->offset); 1104 if (ret == 1) 1105 tp->offset = 0; 1106 1107 tev->nargs = argc - 2; 1108 tev->args = zalloc(sizeof(struct probe_trace_arg) * tev->nargs); 1109 if (tev->args == NULL) { 1110 ret = -ENOMEM; 1111 goto out; 1112 } 1113 for (i = 0; i < tev->nargs; i++) { 1114 p = strchr(argv[i + 2], '='); 1115 if (p) /* We don't need which register is assigned. */ 1116 *p++ = '\0'; 1117 else 1118 p = argv[i + 2]; 1119 tev->args[i].name = strdup(argv[i + 2]); 1120 /* TODO: parse regs and offset */ 1121 tev->args[i].value = strdup(p); 1122 if (tev->args[i].name == NULL || tev->args[i].value == NULL) { 1123 ret = -ENOMEM; 1124 goto out; 1125 } 1126 } 1127 ret = 0; 1128 out: 1129 argv_free(argv); 1130 return ret; 1131 } 1132 1133 /* Compose only probe arg */ 1134 int synthesize_perf_probe_arg(struct perf_probe_arg *pa, char *buf, size_t len) 1135 { 1136 struct perf_probe_arg_field *field = pa->field; 1137 int ret; 1138 char *tmp = buf; 1139 1140 if (pa->name && pa->var) 1141 ret = e_snprintf(tmp, len, "%s=%s", pa->name, pa->var); 1142 else 1143 ret = e_snprintf(tmp, len, "%s", pa->name ? pa->name : pa->var); 1144 if (ret <= 0) 1145 goto error; 1146 tmp += ret; 1147 len -= ret; 1148 1149 while (field) { 1150 if (field->name[0] == '[') 1151 ret = e_snprintf(tmp, len, "%s", field->name); 1152 else 1153 ret = e_snprintf(tmp, len, "%s%s", 1154 field->ref ? "->" : ".", field->name); 1155 if (ret <= 0) 1156 goto error; 1157 tmp += ret; 1158 len -= ret; 1159 field = field->next; 1160 } 1161 1162 if (pa->type) { 1163 ret = e_snprintf(tmp, len, ":%s", pa->type); 1164 if (ret <= 0) 1165 goto error; 1166 tmp += ret; 1167 len -= ret; 1168 } 1169 1170 return tmp - buf; 1171 error: 1172 pr_debug("Failed to synthesize perf probe argument: %s\n", 1173 strerror(-ret)); 1174 return ret; 1175 } 1176 1177 /* Compose only probe point (not argument) */ 1178 static char *synthesize_perf_probe_point(struct perf_probe_point *pp) 1179 { 1180 char *buf, *tmp; 1181 char offs[32] = "", line[32] = "", file[32] = ""; 1182 int ret, len; 1183 1184 buf = zalloc(MAX_CMDLEN); 1185 if (buf == NULL) { 1186 ret = -ENOMEM; 1187 goto error; 1188 } 1189 if (pp->offset) { 1190 ret = e_snprintf(offs, 32, "+%lu", pp->offset); 1191 if (ret <= 0) 1192 goto error; 1193 } 1194 if (pp->line) { 1195 ret = e_snprintf(line, 32, ":%d", pp->line); 1196 if (ret <= 0) 1197 goto error; 1198 } 1199 if (pp->file) { 1200 tmp = pp->file; 1201 len = strlen(tmp); 1202 if (len > 30) { 1203 tmp = strchr(pp->file + len - 30, '/'); 1204 tmp = tmp ? tmp + 1 : pp->file + len - 30; 1205 } 1206 ret = e_snprintf(file, 32, "@%s", tmp); 1207 if (ret <= 0) 1208 goto error; 1209 } 1210 1211 if (pp->function) 1212 ret = e_snprintf(buf, MAX_CMDLEN, "%s%s%s%s%s", pp->function, 1213 offs, pp->retprobe ? "%return" : "", line, 1214 file); 1215 else 1216 ret = e_snprintf(buf, MAX_CMDLEN, "%s%s", file, line); 1217 if (ret <= 0) 1218 goto error; 1219 1220 return buf; 1221 error: 1222 pr_debug("Failed to synthesize perf probe point: %s\n", 1223 strerror(-ret)); 1224 if (buf) 1225 free(buf); 1226 return NULL; 1227 } 1228 1229 #if 0 1230 char *synthesize_perf_probe_command(struct perf_probe_event *pev) 1231 { 1232 char *buf; 1233 int i, len, ret; 1234 1235 buf = synthesize_perf_probe_point(&pev->point); 1236 if (!buf) 1237 return NULL; 1238 1239 len = strlen(buf); 1240 for (i = 0; i < pev->nargs; i++) { 1241 ret = e_snprintf(&buf[len], MAX_CMDLEN - len, " %s", 1242 pev->args[i].name); 1243 if (ret <= 0) { 1244 free(buf); 1245 return NULL; 1246 } 1247 len += ret; 1248 } 1249 1250 return buf; 1251 } 1252 #endif 1253 1254 static int __synthesize_probe_trace_arg_ref(struct probe_trace_arg_ref *ref, 1255 char **buf, size_t *buflen, 1256 int depth) 1257 { 1258 int ret; 1259 if (ref->next) { 1260 depth = __synthesize_probe_trace_arg_ref(ref->next, buf, 1261 buflen, depth + 1); 1262 if (depth < 0) 1263 goto out; 1264 } 1265 1266 ret = e_snprintf(*buf, *buflen, "%+ld(", ref->offset); 1267 if (ret < 0) 1268 depth = ret; 1269 else { 1270 *buf += ret; 1271 *buflen -= ret; 1272 } 1273 out: 1274 return depth; 1275 1276 } 1277 1278 static int synthesize_probe_trace_arg(struct probe_trace_arg *arg, 1279 char *buf, size_t buflen) 1280 { 1281 struct probe_trace_arg_ref *ref = arg->ref; 1282 int ret, depth = 0; 1283 char *tmp = buf; 1284 1285 /* Argument name or separator */ 1286 if (arg->name) 1287 ret = e_snprintf(buf, buflen, " %s=", arg->name); 1288 else 1289 ret = e_snprintf(buf, buflen, " "); 1290 if (ret < 0) 1291 return ret; 1292 buf += ret; 1293 buflen -= ret; 1294 1295 /* Special case: @XXX */ 1296 if (arg->value[0] == '@' && arg->ref) 1297 ref = ref->next; 1298 1299 /* Dereferencing arguments */ 1300 if (ref) { 1301 depth = __synthesize_probe_trace_arg_ref(ref, &buf, 1302 &buflen, 1); 1303 if (depth < 0) 1304 return depth; 1305 } 1306 1307 /* Print argument value */ 1308 if (arg->value[0] == '@' && arg->ref) 1309 ret = e_snprintf(buf, buflen, "%s%+ld", arg->value, 1310 arg->ref->offset); 1311 else 1312 ret = e_snprintf(buf, buflen, "%s", arg->value); 1313 if (ret < 0) 1314 return ret; 1315 buf += ret; 1316 buflen -= ret; 1317 1318 /* Closing */ 1319 while (depth--) { 1320 ret = e_snprintf(buf, buflen, ")"); 1321 if (ret < 0) 1322 return ret; 1323 buf += ret; 1324 buflen -= ret; 1325 } 1326 /* Print argument type */ 1327 if (arg->type) { 1328 ret = e_snprintf(buf, buflen, ":%s", arg->type); 1329 if (ret <= 0) 1330 return ret; 1331 buf += ret; 1332 } 1333 1334 return buf - tmp; 1335 } 1336 1337 char *synthesize_probe_trace_command(struct probe_trace_event *tev) 1338 { 1339 struct probe_trace_point *tp = &tev->point; 1340 char *buf; 1341 int i, len, ret; 1342 1343 buf = zalloc(MAX_CMDLEN); 1344 if (buf == NULL) 1345 return NULL; 1346 1347 len = e_snprintf(buf, MAX_CMDLEN, "%c:%s/%s %s%s%s+%lu", 1348 tp->retprobe ? 'r' : 'p', 1349 tev->group, tev->event, 1350 tp->module ?: "", tp->module ? ":" : "", 1351 tp->symbol, tp->offset); 1352 if (len <= 0) 1353 goto error; 1354 1355 for (i = 0; i < tev->nargs; i++) { 1356 ret = synthesize_probe_trace_arg(&tev->args[i], buf + len, 1357 MAX_CMDLEN - len); 1358 if (ret <= 0) 1359 goto error; 1360 len += ret; 1361 } 1362 1363 return buf; 1364 error: 1365 free(buf); 1366 return NULL; 1367 } 1368 1369 static int convert_to_perf_probe_event(struct probe_trace_event *tev, 1370 struct perf_probe_event *pev) 1371 { 1372 char buf[64] = ""; 1373 int i, ret; 1374 1375 /* Convert event/group name */ 1376 pev->event = strdup(tev->event); 1377 pev->group = strdup(tev->group); 1378 if (pev->event == NULL || pev->group == NULL) 1379 return -ENOMEM; 1380 1381 /* Convert trace_point to probe_point */ 1382 ret = kprobe_convert_to_perf_probe(&tev->point, &pev->point); 1383 if (ret < 0) 1384 return ret; 1385 1386 /* Convert trace_arg to probe_arg */ 1387 pev->nargs = tev->nargs; 1388 pev->args = zalloc(sizeof(struct perf_probe_arg) * pev->nargs); 1389 if (pev->args == NULL) 1390 return -ENOMEM; 1391 for (i = 0; i < tev->nargs && ret >= 0; i++) { 1392 if (tev->args[i].name) 1393 pev->args[i].name = strdup(tev->args[i].name); 1394 else { 1395 ret = synthesize_probe_trace_arg(&tev->args[i], 1396 buf, 64); 1397 pev->args[i].name = strdup(buf); 1398 } 1399 if (pev->args[i].name == NULL && ret >= 0) 1400 ret = -ENOMEM; 1401 } 1402 1403 if (ret < 0) 1404 clear_perf_probe_event(pev); 1405 1406 return ret; 1407 } 1408 1409 void clear_perf_probe_event(struct perf_probe_event *pev) 1410 { 1411 struct perf_probe_point *pp = &pev->point; 1412 struct perf_probe_arg_field *field, *next; 1413 int i; 1414 1415 if (pev->event) 1416 free(pev->event); 1417 if (pev->group) 1418 free(pev->group); 1419 if (pp->file) 1420 free(pp->file); 1421 if (pp->function) 1422 free(pp->function); 1423 if (pp->lazy_line) 1424 free(pp->lazy_line); 1425 for (i = 0; i < pev->nargs; i++) { 1426 if (pev->args[i].name) 1427 free(pev->args[i].name); 1428 if (pev->args[i].var) 1429 free(pev->args[i].var); 1430 if (pev->args[i].type) 1431 free(pev->args[i].type); 1432 field = pev->args[i].field; 1433 while (field) { 1434 next = field->next; 1435 if (field->name) 1436 free(field->name); 1437 free(field); 1438 field = next; 1439 } 1440 } 1441 if (pev->args) 1442 free(pev->args); 1443 memset(pev, 0, sizeof(*pev)); 1444 } 1445 1446 static void clear_probe_trace_event(struct probe_trace_event *tev) 1447 { 1448 struct probe_trace_arg_ref *ref, *next; 1449 int i; 1450 1451 if (tev->event) 1452 free(tev->event); 1453 if (tev->group) 1454 free(tev->group); 1455 if (tev->point.symbol) 1456 free(tev->point.symbol); 1457 if (tev->point.module) 1458 free(tev->point.module); 1459 for (i = 0; i < tev->nargs; i++) { 1460 if (tev->args[i].name) 1461 free(tev->args[i].name); 1462 if (tev->args[i].value) 1463 free(tev->args[i].value); 1464 if (tev->args[i].type) 1465 free(tev->args[i].type); 1466 ref = tev->args[i].ref; 1467 while (ref) { 1468 next = ref->next; 1469 free(ref); 1470 ref = next; 1471 } 1472 } 1473 if (tev->args) 1474 free(tev->args); 1475 memset(tev, 0, sizeof(*tev)); 1476 } 1477 1478 static int open_kprobe_events(bool readwrite) 1479 { 1480 char buf[PATH_MAX]; 1481 const char *__debugfs; 1482 int ret; 1483 1484 __debugfs = debugfs_find_mountpoint(); 1485 if (__debugfs == NULL) { 1486 pr_warning("Debugfs is not mounted.\n"); 1487 return -ENOENT; 1488 } 1489 1490 ret = e_snprintf(buf, PATH_MAX, "%stracing/kprobe_events", __debugfs); 1491 if (ret >= 0) { 1492 pr_debug("Opening %s write=%d\n", buf, readwrite); 1493 if (readwrite && !probe_event_dry_run) 1494 ret = open(buf, O_RDWR, O_APPEND); 1495 else 1496 ret = open(buf, O_RDONLY, 0); 1497 } 1498 1499 if (ret < 0) { 1500 if (errno == ENOENT) 1501 pr_warning("kprobe_events file does not exist - please" 1502 " rebuild kernel with CONFIG_KPROBE_EVENT.\n"); 1503 else 1504 pr_warning("Failed to open kprobe_events file: %s\n", 1505 strerror(errno)); 1506 } 1507 return ret; 1508 } 1509 1510 /* Get raw string list of current kprobe_events */ 1511 static struct strlist *get_probe_trace_command_rawlist(int fd) 1512 { 1513 int ret, idx; 1514 FILE *fp; 1515 char buf[MAX_CMDLEN]; 1516 char *p; 1517 struct strlist *sl; 1518 1519 sl = strlist__new(true, NULL); 1520 1521 fp = fdopen(dup(fd), "r"); 1522 while (!feof(fp)) { 1523 p = fgets(buf, MAX_CMDLEN, fp); 1524 if (!p) 1525 break; 1526 1527 idx = strlen(p) - 1; 1528 if (p[idx] == '\n') 1529 p[idx] = '\0'; 1530 ret = strlist__add(sl, buf); 1531 if (ret < 0) { 1532 pr_debug("strlist__add failed: %s\n", strerror(-ret)); 1533 strlist__delete(sl); 1534 return NULL; 1535 } 1536 } 1537 fclose(fp); 1538 1539 return sl; 1540 } 1541 1542 /* Show an event */ 1543 static int show_perf_probe_event(struct perf_probe_event *pev) 1544 { 1545 int i, ret; 1546 char buf[128]; 1547 char *place; 1548 1549 /* Synthesize only event probe point */ 1550 place = synthesize_perf_probe_point(&pev->point); 1551 if (!place) 1552 return -EINVAL; 1553 1554 ret = e_snprintf(buf, 128, "%s:%s", pev->group, pev->event); 1555 if (ret < 0) 1556 return ret; 1557 1558 printf(" %-20s (on %s", buf, place); 1559 1560 if (pev->nargs > 0) { 1561 printf(" with"); 1562 for (i = 0; i < pev->nargs; i++) { 1563 ret = synthesize_perf_probe_arg(&pev->args[i], 1564 buf, 128); 1565 if (ret < 0) 1566 break; 1567 printf(" %s", buf); 1568 } 1569 } 1570 printf(")\n"); 1571 free(place); 1572 return ret; 1573 } 1574 1575 /* List up current perf-probe events */ 1576 int show_perf_probe_events(void) 1577 { 1578 int fd, ret; 1579 struct probe_trace_event tev; 1580 struct perf_probe_event pev; 1581 struct strlist *rawlist; 1582 struct str_node *ent; 1583 1584 setup_pager(); 1585 ret = init_vmlinux(); 1586 if (ret < 0) 1587 return ret; 1588 1589 memset(&tev, 0, sizeof(tev)); 1590 memset(&pev, 0, sizeof(pev)); 1591 1592 fd = open_kprobe_events(false); 1593 if (fd < 0) 1594 return fd; 1595 1596 rawlist = get_probe_trace_command_rawlist(fd); 1597 close(fd); 1598 if (!rawlist) 1599 return -ENOENT; 1600 1601 strlist__for_each(ent, rawlist) { 1602 ret = parse_probe_trace_command(ent->s, &tev); 1603 if (ret >= 0) { 1604 ret = convert_to_perf_probe_event(&tev, &pev); 1605 if (ret >= 0) 1606 ret = show_perf_probe_event(&pev); 1607 } 1608 clear_perf_probe_event(&pev); 1609 clear_probe_trace_event(&tev); 1610 if (ret < 0) 1611 break; 1612 } 1613 strlist__delete(rawlist); 1614 1615 return ret; 1616 } 1617 1618 /* Get current perf-probe event names */ 1619 static struct strlist *get_probe_trace_event_names(int fd, bool include_group) 1620 { 1621 char buf[128]; 1622 struct strlist *sl, *rawlist; 1623 struct str_node *ent; 1624 struct probe_trace_event tev; 1625 int ret = 0; 1626 1627 memset(&tev, 0, sizeof(tev)); 1628 rawlist = get_probe_trace_command_rawlist(fd); 1629 sl = strlist__new(true, NULL); 1630 strlist__for_each(ent, rawlist) { 1631 ret = parse_probe_trace_command(ent->s, &tev); 1632 if (ret < 0) 1633 break; 1634 if (include_group) { 1635 ret = e_snprintf(buf, 128, "%s:%s", tev.group, 1636 tev.event); 1637 if (ret >= 0) 1638 ret = strlist__add(sl, buf); 1639 } else 1640 ret = strlist__add(sl, tev.event); 1641 clear_probe_trace_event(&tev); 1642 if (ret < 0) 1643 break; 1644 } 1645 strlist__delete(rawlist); 1646 1647 if (ret < 0) { 1648 strlist__delete(sl); 1649 return NULL; 1650 } 1651 return sl; 1652 } 1653 1654 static int write_probe_trace_event(int fd, struct probe_trace_event *tev) 1655 { 1656 int ret = 0; 1657 char *buf = synthesize_probe_trace_command(tev); 1658 1659 if (!buf) { 1660 pr_debug("Failed to synthesize probe trace event.\n"); 1661 return -EINVAL; 1662 } 1663 1664 pr_debug("Writing event: %s\n", buf); 1665 if (!probe_event_dry_run) { 1666 ret = write(fd, buf, strlen(buf)); 1667 if (ret <= 0) 1668 pr_warning("Failed to write event: %s\n", 1669 strerror(errno)); 1670 } 1671 free(buf); 1672 return ret; 1673 } 1674 1675 static int get_new_event_name(char *buf, size_t len, const char *base, 1676 struct strlist *namelist, bool allow_suffix) 1677 { 1678 int i, ret; 1679 1680 /* Try no suffix */ 1681 ret = e_snprintf(buf, len, "%s", base); 1682 if (ret < 0) { 1683 pr_debug("snprintf() failed: %s\n", strerror(-ret)); 1684 return ret; 1685 } 1686 if (!strlist__has_entry(namelist, buf)) 1687 return 0; 1688 1689 if (!allow_suffix) { 1690 pr_warning("Error: event \"%s\" already exists. " 1691 "(Use -f to force duplicates.)\n", base); 1692 return -EEXIST; 1693 } 1694 1695 /* Try to add suffix */ 1696 for (i = 1; i < MAX_EVENT_INDEX; i++) { 1697 ret = e_snprintf(buf, len, "%s_%d", base, i); 1698 if (ret < 0) { 1699 pr_debug("snprintf() failed: %s\n", strerror(-ret)); 1700 return ret; 1701 } 1702 if (!strlist__has_entry(namelist, buf)) 1703 break; 1704 } 1705 if (i == MAX_EVENT_INDEX) { 1706 pr_warning("Too many events are on the same function.\n"); 1707 ret = -ERANGE; 1708 } 1709 1710 return ret; 1711 } 1712 1713 static int __add_probe_trace_events(struct perf_probe_event *pev, 1714 struct probe_trace_event *tevs, 1715 int ntevs, bool allow_suffix) 1716 { 1717 int i, fd, ret; 1718 struct probe_trace_event *tev = NULL; 1719 char buf[64]; 1720 const char *event, *group; 1721 struct strlist *namelist; 1722 1723 fd = open_kprobe_events(true); 1724 if (fd < 0) 1725 return fd; 1726 /* Get current event names */ 1727 namelist = get_probe_trace_event_names(fd, false); 1728 if (!namelist) { 1729 pr_debug("Failed to get current event list.\n"); 1730 return -EIO; 1731 } 1732 1733 ret = 0; 1734 printf("Add new event%s\n", (ntevs > 1) ? "s:" : ":"); 1735 for (i = 0; i < ntevs; i++) { 1736 tev = &tevs[i]; 1737 if (pev->event) 1738 event = pev->event; 1739 else 1740 if (pev->point.function) 1741 event = pev->point.function; 1742 else 1743 event = tev->point.symbol; 1744 if (pev->group) 1745 group = pev->group; 1746 else 1747 group = PERFPROBE_GROUP; 1748 1749 /* Get an unused new event name */ 1750 ret = get_new_event_name(buf, 64, event, 1751 namelist, allow_suffix); 1752 if (ret < 0) 1753 break; 1754 event = buf; 1755 1756 tev->event = strdup(event); 1757 tev->group = strdup(group); 1758 if (tev->event == NULL || tev->group == NULL) { 1759 ret = -ENOMEM; 1760 break; 1761 } 1762 ret = write_probe_trace_event(fd, tev); 1763 if (ret < 0) 1764 break; 1765 /* Add added event name to namelist */ 1766 strlist__add(namelist, event); 1767 1768 /* Trick here - save current event/group */ 1769 event = pev->event; 1770 group = pev->group; 1771 pev->event = tev->event; 1772 pev->group = tev->group; 1773 show_perf_probe_event(pev); 1774 /* Trick here - restore current event/group */ 1775 pev->event = (char *)event; 1776 pev->group = (char *)group; 1777 1778 /* 1779 * Probes after the first probe which comes from same 1780 * user input are always allowed to add suffix, because 1781 * there might be several addresses corresponding to 1782 * one code line. 1783 */ 1784 allow_suffix = true; 1785 } 1786 1787 if (ret >= 0) { 1788 /* Show how to use the event. */ 1789 printf("\nYou can now use it on all perf tools, such as:\n\n"); 1790 printf("\tperf record -e %s:%s -aR sleep 1\n\n", tev->group, 1791 tev->event); 1792 } 1793 1794 strlist__delete(namelist); 1795 close(fd); 1796 return ret; 1797 } 1798 1799 static int convert_to_probe_trace_events(struct perf_probe_event *pev, 1800 struct probe_trace_event **tevs, 1801 int max_tevs, const char *module) 1802 { 1803 struct symbol *sym; 1804 int ret = 0, i; 1805 struct probe_trace_event *tev; 1806 1807 /* Convert perf_probe_event with debuginfo */ 1808 ret = try_to_find_probe_trace_events(pev, tevs, max_tevs, module); 1809 if (ret != 0) 1810 return ret; /* Found in debuginfo or got an error */ 1811 1812 /* Allocate trace event buffer */ 1813 tev = *tevs = zalloc(sizeof(struct probe_trace_event)); 1814 if (tev == NULL) 1815 return -ENOMEM; 1816 1817 /* Copy parameters */ 1818 tev->point.symbol = strdup(pev->point.function); 1819 if (tev->point.symbol == NULL) { 1820 ret = -ENOMEM; 1821 goto error; 1822 } 1823 tev->point.module = strdup(module); 1824 if (tev->point.module == NULL) { 1825 ret = -ENOMEM; 1826 goto error; 1827 } 1828 tev->point.offset = pev->point.offset; 1829 tev->point.retprobe = pev->point.retprobe; 1830 tev->nargs = pev->nargs; 1831 if (tev->nargs) { 1832 tev->args = zalloc(sizeof(struct probe_trace_arg) 1833 * tev->nargs); 1834 if (tev->args == NULL) { 1835 ret = -ENOMEM; 1836 goto error; 1837 } 1838 for (i = 0; i < tev->nargs; i++) { 1839 if (pev->args[i].name) { 1840 tev->args[i].name = strdup(pev->args[i].name); 1841 if (tev->args[i].name == NULL) { 1842 ret = -ENOMEM; 1843 goto error; 1844 } 1845 } 1846 tev->args[i].value = strdup(pev->args[i].var); 1847 if (tev->args[i].value == NULL) { 1848 ret = -ENOMEM; 1849 goto error; 1850 } 1851 if (pev->args[i].type) { 1852 tev->args[i].type = strdup(pev->args[i].type); 1853 if (tev->args[i].type == NULL) { 1854 ret = -ENOMEM; 1855 goto error; 1856 } 1857 } 1858 } 1859 } 1860 1861 /* Currently just checking function name from symbol map */ 1862 sym = __find_kernel_function_by_name(tev->point.symbol, NULL); 1863 if (!sym) { 1864 pr_warning("Kernel symbol \'%s\' not found.\n", 1865 tev->point.symbol); 1866 ret = -ENOENT; 1867 goto error; 1868 } 1869 1870 return 1; 1871 error: 1872 clear_probe_trace_event(tev); 1873 free(tev); 1874 *tevs = NULL; 1875 return ret; 1876 } 1877 1878 struct __event_package { 1879 struct perf_probe_event *pev; 1880 struct probe_trace_event *tevs; 1881 int ntevs; 1882 }; 1883 1884 int add_perf_probe_events(struct perf_probe_event *pevs, int npevs, 1885 int max_tevs, const char *module, bool force_add) 1886 { 1887 int i, j, ret; 1888 struct __event_package *pkgs; 1889 1890 pkgs = zalloc(sizeof(struct __event_package) * npevs); 1891 if (pkgs == NULL) 1892 return -ENOMEM; 1893 1894 /* Init vmlinux path */ 1895 ret = init_vmlinux(); 1896 if (ret < 0) { 1897 free(pkgs); 1898 return ret; 1899 } 1900 1901 /* Loop 1: convert all events */ 1902 for (i = 0; i < npevs; i++) { 1903 pkgs[i].pev = &pevs[i]; 1904 /* Convert with or without debuginfo */ 1905 ret = convert_to_probe_trace_events(pkgs[i].pev, 1906 &pkgs[i].tevs, 1907 max_tevs, 1908 module); 1909 if (ret < 0) 1910 goto end; 1911 pkgs[i].ntevs = ret; 1912 } 1913 1914 /* Loop 2: add all events */ 1915 for (i = 0; i < npevs; i++) { 1916 ret = __add_probe_trace_events(pkgs[i].pev, pkgs[i].tevs, 1917 pkgs[i].ntevs, force_add); 1918 if (ret < 0) 1919 break; 1920 } 1921 end: 1922 /* Loop 3: cleanup and free trace events */ 1923 for (i = 0; i < npevs; i++) { 1924 for (j = 0; j < pkgs[i].ntevs; j++) 1925 clear_probe_trace_event(&pkgs[i].tevs[j]); 1926 free(pkgs[i].tevs); 1927 } 1928 free(pkgs); 1929 1930 return ret; 1931 } 1932 1933 static int __del_trace_probe_event(int fd, struct str_node *ent) 1934 { 1935 char *p; 1936 char buf[128]; 1937 int ret; 1938 1939 /* Convert from perf-probe event to trace-probe event */ 1940 ret = e_snprintf(buf, 128, "-:%s", ent->s); 1941 if (ret < 0) 1942 goto error; 1943 1944 p = strchr(buf + 2, ':'); 1945 if (!p) { 1946 pr_debug("Internal error: %s should have ':' but not.\n", 1947 ent->s); 1948 ret = -ENOTSUP; 1949 goto error; 1950 } 1951 *p = '/'; 1952 1953 pr_debug("Writing event: %s\n", buf); 1954 ret = write(fd, buf, strlen(buf)); 1955 if (ret < 0) 1956 goto error; 1957 1958 printf("Remove event: %s\n", ent->s); 1959 return 0; 1960 error: 1961 pr_warning("Failed to delete event: %s\n", strerror(-ret)); 1962 return ret; 1963 } 1964 1965 static int del_trace_probe_event(int fd, const char *group, 1966 const char *event, struct strlist *namelist) 1967 { 1968 char buf[128]; 1969 struct str_node *ent, *n; 1970 int found = 0, ret = 0; 1971 1972 ret = e_snprintf(buf, 128, "%s:%s", group, event); 1973 if (ret < 0) { 1974 pr_err("Failed to copy event.\n"); 1975 return ret; 1976 } 1977 1978 if (strpbrk(buf, "*?")) { /* Glob-exp */ 1979 strlist__for_each_safe(ent, n, namelist) 1980 if (strglobmatch(ent->s, buf)) { 1981 found++; 1982 ret = __del_trace_probe_event(fd, ent); 1983 if (ret < 0) 1984 break; 1985 strlist__remove(namelist, ent); 1986 } 1987 } else { 1988 ent = strlist__find(namelist, buf); 1989 if (ent) { 1990 found++; 1991 ret = __del_trace_probe_event(fd, ent); 1992 if (ret >= 0) 1993 strlist__remove(namelist, ent); 1994 } 1995 } 1996 if (found == 0 && ret >= 0) 1997 pr_info("Info: Event \"%s\" does not exist.\n", buf); 1998 1999 return ret; 2000 } 2001 2002 int del_perf_probe_events(struct strlist *dellist) 2003 { 2004 int fd, ret = 0; 2005 const char *group, *event; 2006 char *p, *str; 2007 struct str_node *ent; 2008 struct strlist *namelist; 2009 2010 fd = open_kprobe_events(true); 2011 if (fd < 0) 2012 return fd; 2013 2014 /* Get current event names */ 2015 namelist = get_probe_trace_event_names(fd, true); 2016 if (namelist == NULL) 2017 return -EINVAL; 2018 2019 strlist__for_each(ent, dellist) { 2020 str = strdup(ent->s); 2021 if (str == NULL) { 2022 ret = -ENOMEM; 2023 break; 2024 } 2025 pr_debug("Parsing: %s\n", str); 2026 p = strchr(str, ':'); 2027 if (p) { 2028 group = str; 2029 *p = '\0'; 2030 event = p + 1; 2031 } else { 2032 group = "*"; 2033 event = str; 2034 } 2035 pr_debug("Group: %s, Event: %s\n", group, event); 2036 ret = del_trace_probe_event(fd, group, event, namelist); 2037 free(str); 2038 if (ret < 0) 2039 break; 2040 } 2041 strlist__delete(namelist); 2042 close(fd); 2043 2044 return ret; 2045 } 2046 /* TODO: don't use a global variable for filter ... */ 2047 static struct strfilter *available_func_filter; 2048 2049 /* 2050 * If a symbol corresponds to a function with global binding and 2051 * matches filter return 0. For all others return 1. 2052 */ 2053 static int filter_available_functions(struct map *map __unused, 2054 struct symbol *sym) 2055 { 2056 if (sym->binding == STB_GLOBAL && 2057 strfilter__compare(available_func_filter, sym->name)) 2058 return 0; 2059 return 1; 2060 } 2061 2062 int show_available_funcs(const char *module, struct strfilter *_filter) 2063 { 2064 struct map *map; 2065 int ret; 2066 2067 setup_pager(); 2068 2069 ret = init_vmlinux(); 2070 if (ret < 0) 2071 return ret; 2072 2073 map = kernel_get_module_map(module); 2074 if (!map) { 2075 pr_err("Failed to find %s map.\n", (module) ? : "kernel"); 2076 return -EINVAL; 2077 } 2078 available_func_filter = _filter; 2079 if (map__load(map, filter_available_functions)) { 2080 pr_err("Failed to load map.\n"); 2081 return -EINVAL; 2082 } 2083 if (!dso__sorted_by_name(map->dso, map->type)) 2084 dso__sort_by_name(map->dso, map->type); 2085 2086 dso__fprintf_symbols_by_name(map->dso, map->type, stdout); 2087 return 0; 2088 } 2089