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 #include <sys/utsname.h> 23 #include <sys/types.h> 24 #include <sys/stat.h> 25 #include <fcntl.h> 26 #include <errno.h> 27 #include <stdio.h> 28 #include <unistd.h> 29 #include <stdlib.h> 30 #include <string.h> 31 #include <stdarg.h> 32 #include <limits.h> 33 #include <elf.h> 34 35 #include "util.h" 36 #include "event.h" 37 #include "strlist.h" 38 #include "debug.h" 39 #include "cache.h" 40 #include "color.h" 41 #include "symbol.h" 42 #include "thread.h" 43 #include <api/fs/debugfs.h> 44 #include <api/fs/tracefs.h> 45 #include "trace-event.h" /* For __maybe_unused */ 46 #include "probe-event.h" 47 #include "probe-finder.h" 48 #include "probe-file.h" 49 #include "session.h" 50 51 #define MAX_CMDLEN 256 52 #define PERFPROBE_GROUP "probe" 53 54 bool probe_event_dry_run; /* Dry run flag */ 55 struct probe_conf probe_conf; 56 57 #define semantic_error(msg ...) pr_err("Semantic error :" msg) 58 59 int e_snprintf(char *str, size_t size, const char *format, ...) 60 { 61 int ret; 62 va_list ap; 63 va_start(ap, format); 64 ret = vsnprintf(str, size, format, ap); 65 va_end(ap); 66 if (ret >= (int)size) 67 ret = -E2BIG; 68 return ret; 69 } 70 71 static char *synthesize_perf_probe_point(struct perf_probe_point *pp); 72 static struct machine *host_machine; 73 74 /* Initialize symbol maps and path of vmlinux/modules */ 75 static int init_symbol_maps(bool user_only) 76 { 77 int ret; 78 79 symbol_conf.sort_by_name = true; 80 symbol_conf.allow_aliases = true; 81 ret = symbol__init(NULL); 82 if (ret < 0) { 83 pr_debug("Failed to init symbol map.\n"); 84 goto out; 85 } 86 87 if (host_machine || user_only) /* already initialized */ 88 return 0; 89 90 if (symbol_conf.vmlinux_name) 91 pr_debug("Use vmlinux: %s\n", symbol_conf.vmlinux_name); 92 93 host_machine = machine__new_host(); 94 if (!host_machine) { 95 pr_debug("machine__new_host() failed.\n"); 96 symbol__exit(); 97 ret = -1; 98 } 99 out: 100 if (ret < 0) 101 pr_warning("Failed to init vmlinux path.\n"); 102 return ret; 103 } 104 105 static void exit_symbol_maps(void) 106 { 107 if (host_machine) { 108 machine__delete(host_machine); 109 host_machine = NULL; 110 } 111 symbol__exit(); 112 } 113 114 static struct symbol *__find_kernel_function_by_name(const char *name, 115 struct map **mapp) 116 { 117 return machine__find_kernel_function_by_name(host_machine, name, mapp, 118 NULL); 119 } 120 121 static struct symbol *__find_kernel_function(u64 addr, struct map **mapp) 122 { 123 return machine__find_kernel_function(host_machine, addr, mapp, NULL); 124 } 125 126 static struct ref_reloc_sym *kernel_get_ref_reloc_sym(void) 127 { 128 /* kmap->ref_reloc_sym should be set if host_machine is initialized */ 129 struct kmap *kmap; 130 131 if (map__load(host_machine->vmlinux_maps[MAP__FUNCTION], NULL) < 0) 132 return NULL; 133 134 kmap = map__kmap(host_machine->vmlinux_maps[MAP__FUNCTION]); 135 if (!kmap) 136 return NULL; 137 return kmap->ref_reloc_sym; 138 } 139 140 static u64 kernel_get_symbol_address_by_name(const char *name, bool reloc) 141 { 142 struct ref_reloc_sym *reloc_sym; 143 struct symbol *sym; 144 struct map *map; 145 146 /* ref_reloc_sym is just a label. Need a special fix*/ 147 reloc_sym = kernel_get_ref_reloc_sym(); 148 if (reloc_sym && strcmp(name, reloc_sym->name) == 0) 149 return (reloc) ? reloc_sym->addr : reloc_sym->unrelocated_addr; 150 else { 151 sym = __find_kernel_function_by_name(name, &map); 152 if (sym) 153 return map->unmap_ip(map, sym->start) - 154 ((reloc) ? 0 : map->reloc); 155 } 156 return 0; 157 } 158 159 static struct map *kernel_get_module_map(const char *module) 160 { 161 struct map_groups *grp = &host_machine->kmaps; 162 struct maps *maps = &grp->maps[MAP__FUNCTION]; 163 struct map *pos; 164 165 /* A file path -- this is an offline module */ 166 if (module && strchr(module, '/')) 167 return machine__findnew_module_map(host_machine, 0, module); 168 169 if (!module) 170 module = "kernel"; 171 172 for (pos = maps__first(maps); pos; pos = map__next(pos)) { 173 if (strncmp(pos->dso->short_name + 1, module, 174 pos->dso->short_name_len - 2) == 0) { 175 return pos; 176 } 177 } 178 return NULL; 179 } 180 181 static struct map *get_target_map(const char *target, bool user) 182 { 183 /* Init maps of given executable or kernel */ 184 if (user) 185 return dso__new_map(target); 186 else 187 return kernel_get_module_map(target); 188 } 189 190 static void put_target_map(struct map *map, bool user) 191 { 192 if (map && user) { 193 /* Only the user map needs to be released */ 194 map__put(map); 195 } 196 } 197 198 199 static int convert_exec_to_group(const char *exec, char **result) 200 { 201 char *ptr1, *ptr2, *exec_copy; 202 char buf[64]; 203 int ret; 204 205 exec_copy = strdup(exec); 206 if (!exec_copy) 207 return -ENOMEM; 208 209 ptr1 = basename(exec_copy); 210 if (!ptr1) { 211 ret = -EINVAL; 212 goto out; 213 } 214 215 ptr2 = strpbrk(ptr1, "-._"); 216 if (ptr2) 217 *ptr2 = '\0'; 218 ret = e_snprintf(buf, 64, "%s_%s", PERFPROBE_GROUP, ptr1); 219 if (ret < 0) 220 goto out; 221 222 *result = strdup(buf); 223 ret = *result ? 0 : -ENOMEM; 224 225 out: 226 free(exec_copy); 227 return ret; 228 } 229 230 static void clear_perf_probe_point(struct perf_probe_point *pp) 231 { 232 free(pp->file); 233 free(pp->function); 234 free(pp->lazy_line); 235 } 236 237 static void clear_probe_trace_events(struct probe_trace_event *tevs, int ntevs) 238 { 239 int i; 240 241 for (i = 0; i < ntevs; i++) 242 clear_probe_trace_event(tevs + i); 243 } 244 245 static bool kprobe_blacklist__listed(unsigned long address); 246 static bool kprobe_warn_out_range(const char *symbol, unsigned long address) 247 { 248 u64 etext_addr; 249 250 /* Get the address of _etext for checking non-probable text symbol */ 251 etext_addr = kernel_get_symbol_address_by_name("_etext", false); 252 253 if (etext_addr != 0 && etext_addr < address) 254 pr_warning("%s is out of .text, skip it.\n", symbol); 255 else if (kprobe_blacklist__listed(address)) 256 pr_warning("%s is blacklisted function, skip it.\n", symbol); 257 else 258 return false; 259 260 return true; 261 } 262 263 #ifdef HAVE_DWARF_SUPPORT 264 265 static int kernel_get_module_dso(const char *module, struct dso **pdso) 266 { 267 struct dso *dso; 268 struct map *map; 269 const char *vmlinux_name; 270 int ret = 0; 271 272 if (module) { 273 list_for_each_entry(dso, &host_machine->dsos.head, node) { 274 if (!dso->kernel) 275 continue; 276 if (strncmp(dso->short_name + 1, module, 277 dso->short_name_len - 2) == 0) 278 goto found; 279 } 280 pr_debug("Failed to find module %s.\n", module); 281 return -ENOENT; 282 } 283 284 map = host_machine->vmlinux_maps[MAP__FUNCTION]; 285 dso = map->dso; 286 287 vmlinux_name = symbol_conf.vmlinux_name; 288 dso->load_errno = 0; 289 if (vmlinux_name) 290 ret = dso__load_vmlinux(dso, map, vmlinux_name, false, NULL); 291 else 292 ret = dso__load_vmlinux_path(dso, map, NULL); 293 found: 294 *pdso = dso; 295 return ret; 296 } 297 298 /* 299 * Some binaries like glibc have special symbols which are on the symbol 300 * table, but not in the debuginfo. If we can find the address of the 301 * symbol from map, we can translate the address back to the probe point. 302 */ 303 static int find_alternative_probe_point(struct debuginfo *dinfo, 304 struct perf_probe_point *pp, 305 struct perf_probe_point *result, 306 const char *target, bool uprobes) 307 { 308 struct map *map = NULL; 309 struct symbol *sym; 310 u64 address = 0; 311 int ret = -ENOENT; 312 313 /* This can work only for function-name based one */ 314 if (!pp->function || pp->file) 315 return -ENOTSUP; 316 317 map = get_target_map(target, uprobes); 318 if (!map) 319 return -EINVAL; 320 321 /* Find the address of given function */ 322 map__for_each_symbol_by_name(map, pp->function, sym) { 323 if (uprobes) 324 address = sym->start; 325 else 326 address = map->unmap_ip(map, sym->start); 327 break; 328 } 329 if (!address) { 330 ret = -ENOENT; 331 goto out; 332 } 333 pr_debug("Symbol %s address found : %" PRIx64 "\n", 334 pp->function, address); 335 336 ret = debuginfo__find_probe_point(dinfo, (unsigned long)address, 337 result); 338 if (ret <= 0) 339 ret = (!ret) ? -ENOENT : ret; 340 else { 341 result->offset += pp->offset; 342 result->line += pp->line; 343 result->retprobe = pp->retprobe; 344 ret = 0; 345 } 346 347 out: 348 put_target_map(map, uprobes); 349 return ret; 350 351 } 352 353 static int get_alternative_probe_event(struct debuginfo *dinfo, 354 struct perf_probe_event *pev, 355 struct perf_probe_point *tmp) 356 { 357 int ret; 358 359 memcpy(tmp, &pev->point, sizeof(*tmp)); 360 memset(&pev->point, 0, sizeof(pev->point)); 361 ret = find_alternative_probe_point(dinfo, tmp, &pev->point, 362 pev->target, pev->uprobes); 363 if (ret < 0) 364 memcpy(&pev->point, tmp, sizeof(*tmp)); 365 366 return ret; 367 } 368 369 static int get_alternative_line_range(struct debuginfo *dinfo, 370 struct line_range *lr, 371 const char *target, bool user) 372 { 373 struct perf_probe_point pp = { .function = lr->function, 374 .file = lr->file, 375 .line = lr->start }; 376 struct perf_probe_point result; 377 int ret, len = 0; 378 379 memset(&result, 0, sizeof(result)); 380 381 if (lr->end != INT_MAX) 382 len = lr->end - lr->start; 383 ret = find_alternative_probe_point(dinfo, &pp, &result, 384 target, user); 385 if (!ret) { 386 lr->function = result.function; 387 lr->file = result.file; 388 lr->start = result.line; 389 if (lr->end != INT_MAX) 390 lr->end = lr->start + len; 391 clear_perf_probe_point(&pp); 392 } 393 return ret; 394 } 395 396 /* Open new debuginfo of given module */ 397 static struct debuginfo *open_debuginfo(const char *module, bool silent) 398 { 399 const char *path = module; 400 char reason[STRERR_BUFSIZE]; 401 struct debuginfo *ret = NULL; 402 struct dso *dso = NULL; 403 int err; 404 405 if (!module || !strchr(module, '/')) { 406 err = kernel_get_module_dso(module, &dso); 407 if (err < 0) { 408 if (!dso || dso->load_errno == 0) { 409 if (!strerror_r(-err, reason, STRERR_BUFSIZE)) 410 strcpy(reason, "(unknown)"); 411 } else 412 dso__strerror_load(dso, reason, STRERR_BUFSIZE); 413 if (!silent) 414 pr_err("Failed to find the path for %s: %s\n", 415 module ?: "kernel", reason); 416 return NULL; 417 } 418 path = dso->long_name; 419 } 420 ret = debuginfo__new(path); 421 if (!ret && !silent) { 422 pr_warning("The %s file has no debug information.\n", path); 423 if (!module || !strtailcmp(path, ".ko")) 424 pr_warning("Rebuild with CONFIG_DEBUG_INFO=y, "); 425 else 426 pr_warning("Rebuild with -g, "); 427 pr_warning("or install an appropriate debuginfo package.\n"); 428 } 429 return ret; 430 } 431 432 /* For caching the last debuginfo */ 433 static struct debuginfo *debuginfo_cache; 434 static char *debuginfo_cache_path; 435 436 static struct debuginfo *debuginfo_cache__open(const char *module, bool silent) 437 { 438 if ((debuginfo_cache_path && !strcmp(debuginfo_cache_path, module)) || 439 (!debuginfo_cache_path && !module && debuginfo_cache)) 440 goto out; 441 442 /* Copy module path */ 443 free(debuginfo_cache_path); 444 if (module) { 445 debuginfo_cache_path = strdup(module); 446 if (!debuginfo_cache_path) { 447 debuginfo__delete(debuginfo_cache); 448 debuginfo_cache = NULL; 449 goto out; 450 } 451 } 452 453 debuginfo_cache = open_debuginfo(module, silent); 454 if (!debuginfo_cache) 455 zfree(&debuginfo_cache_path); 456 out: 457 return debuginfo_cache; 458 } 459 460 static void debuginfo_cache__exit(void) 461 { 462 debuginfo__delete(debuginfo_cache); 463 debuginfo_cache = NULL; 464 zfree(&debuginfo_cache_path); 465 } 466 467 468 static int get_text_start_address(const char *exec, unsigned long *address) 469 { 470 Elf *elf; 471 GElf_Ehdr ehdr; 472 GElf_Shdr shdr; 473 int fd, ret = -ENOENT; 474 475 fd = open(exec, O_RDONLY); 476 if (fd < 0) 477 return -errno; 478 479 elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL); 480 if (elf == NULL) 481 return -EINVAL; 482 483 if (gelf_getehdr(elf, &ehdr) == NULL) 484 goto out; 485 486 if (!elf_section_by_name(elf, &ehdr, &shdr, ".text", NULL)) 487 goto out; 488 489 *address = shdr.sh_addr - shdr.sh_offset; 490 ret = 0; 491 out: 492 elf_end(elf); 493 return ret; 494 } 495 496 /* 497 * Convert trace point to probe point with debuginfo 498 */ 499 static int find_perf_probe_point_from_dwarf(struct probe_trace_point *tp, 500 struct perf_probe_point *pp, 501 bool is_kprobe) 502 { 503 struct debuginfo *dinfo = NULL; 504 unsigned long stext = 0; 505 u64 addr = tp->address; 506 int ret = -ENOENT; 507 508 /* convert the address to dwarf address */ 509 if (!is_kprobe) { 510 if (!addr) { 511 ret = -EINVAL; 512 goto error; 513 } 514 ret = get_text_start_address(tp->module, &stext); 515 if (ret < 0) 516 goto error; 517 addr += stext; 518 } else if (tp->symbol) { 519 addr = kernel_get_symbol_address_by_name(tp->symbol, false); 520 if (addr == 0) 521 goto error; 522 addr += tp->offset; 523 } 524 525 pr_debug("try to find information at %" PRIx64 " in %s\n", addr, 526 tp->module ? : "kernel"); 527 528 dinfo = debuginfo_cache__open(tp->module, verbose == 0); 529 if (dinfo) 530 ret = debuginfo__find_probe_point(dinfo, 531 (unsigned long)addr, pp); 532 else 533 ret = -ENOENT; 534 535 if (ret > 0) { 536 pp->retprobe = tp->retprobe; 537 return 0; 538 } 539 error: 540 pr_debug("Failed to find corresponding probes from debuginfo.\n"); 541 return ret ? : -ENOENT; 542 } 543 544 static int add_exec_to_probe_trace_events(struct probe_trace_event *tevs, 545 int ntevs, const char *exec) 546 { 547 int i, ret = 0; 548 unsigned long stext = 0; 549 550 if (!exec) 551 return 0; 552 553 ret = get_text_start_address(exec, &stext); 554 if (ret < 0) 555 return ret; 556 557 for (i = 0; i < ntevs && ret >= 0; i++) { 558 /* point.address is the addres of point.symbol + point.offset */ 559 tevs[i].point.address -= stext; 560 tevs[i].point.module = strdup(exec); 561 if (!tevs[i].point.module) { 562 ret = -ENOMEM; 563 break; 564 } 565 tevs[i].uprobes = true; 566 } 567 568 return ret; 569 } 570 571 static int add_module_to_probe_trace_events(struct probe_trace_event *tevs, 572 int ntevs, const char *module) 573 { 574 int i, ret = 0; 575 char *tmp; 576 577 if (!module) 578 return 0; 579 580 tmp = strrchr(module, '/'); 581 if (tmp) { 582 /* This is a module path -- get the module name */ 583 module = strdup(tmp + 1); 584 if (!module) 585 return -ENOMEM; 586 tmp = strchr(module, '.'); 587 if (tmp) 588 *tmp = '\0'; 589 tmp = (char *)module; /* For free() */ 590 } 591 592 for (i = 0; i < ntevs; i++) { 593 tevs[i].point.module = strdup(module); 594 if (!tevs[i].point.module) { 595 ret = -ENOMEM; 596 break; 597 } 598 } 599 600 free(tmp); 601 return ret; 602 } 603 604 /* Post processing the probe events */ 605 static int post_process_probe_trace_events(struct probe_trace_event *tevs, 606 int ntevs, const char *module, 607 bool uprobe) 608 { 609 struct ref_reloc_sym *reloc_sym; 610 char *tmp; 611 int i, skipped = 0; 612 613 if (uprobe) 614 return add_exec_to_probe_trace_events(tevs, ntevs, module); 615 616 /* Note that currently ref_reloc_sym based probe is not for drivers */ 617 if (module) 618 return add_module_to_probe_trace_events(tevs, ntevs, module); 619 620 reloc_sym = kernel_get_ref_reloc_sym(); 621 if (!reloc_sym) { 622 pr_warning("Relocated base symbol is not found!\n"); 623 return -EINVAL; 624 } 625 626 for (i = 0; i < ntevs; i++) { 627 if (!tevs[i].point.address || tevs[i].point.retprobe) 628 continue; 629 /* If we found a wrong one, mark it by NULL symbol */ 630 if (kprobe_warn_out_range(tevs[i].point.symbol, 631 tevs[i].point.address)) { 632 tmp = NULL; 633 skipped++; 634 } else { 635 tmp = strdup(reloc_sym->name); 636 if (!tmp) 637 return -ENOMEM; 638 } 639 /* If we have no realname, use symbol for it */ 640 if (!tevs[i].point.realname) 641 tevs[i].point.realname = tevs[i].point.symbol; 642 else 643 free(tevs[i].point.symbol); 644 tevs[i].point.symbol = tmp; 645 tevs[i].point.offset = tevs[i].point.address - 646 reloc_sym->unrelocated_addr; 647 } 648 return skipped; 649 } 650 651 /* Try to find perf_probe_event with debuginfo */ 652 static int try_to_find_probe_trace_events(struct perf_probe_event *pev, 653 struct probe_trace_event **tevs) 654 { 655 bool need_dwarf = perf_probe_event_need_dwarf(pev); 656 struct perf_probe_point tmp; 657 struct debuginfo *dinfo; 658 int ntevs, ret = 0; 659 660 dinfo = open_debuginfo(pev->target, !need_dwarf); 661 if (!dinfo) { 662 if (need_dwarf) 663 return -ENOENT; 664 pr_debug("Could not open debuginfo. Try to use symbols.\n"); 665 return 0; 666 } 667 668 pr_debug("Try to find probe point from debuginfo.\n"); 669 /* Searching trace events corresponding to a probe event */ 670 ntevs = debuginfo__find_trace_events(dinfo, pev, tevs); 671 672 if (ntevs == 0) { /* Not found, retry with an alternative */ 673 ret = get_alternative_probe_event(dinfo, pev, &tmp); 674 if (!ret) { 675 ntevs = debuginfo__find_trace_events(dinfo, pev, tevs); 676 /* 677 * Write back to the original probe_event for 678 * setting appropriate (user given) event name 679 */ 680 clear_perf_probe_point(&pev->point); 681 memcpy(&pev->point, &tmp, sizeof(tmp)); 682 } 683 } 684 685 debuginfo__delete(dinfo); 686 687 if (ntevs > 0) { /* Succeeded to find trace events */ 688 pr_debug("Found %d probe_trace_events.\n", ntevs); 689 ret = post_process_probe_trace_events(*tevs, ntevs, 690 pev->target, pev->uprobes); 691 if (ret < 0 || ret == ntevs) { 692 clear_probe_trace_events(*tevs, ntevs); 693 zfree(tevs); 694 } 695 if (ret != ntevs) 696 return ret < 0 ? ret : ntevs; 697 ntevs = 0; 698 /* Fall through */ 699 } 700 701 if (ntevs == 0) { /* No error but failed to find probe point. */ 702 pr_warning("Probe point '%s' not found.\n", 703 synthesize_perf_probe_point(&pev->point)); 704 return -ENOENT; 705 } 706 /* Error path : ntevs < 0 */ 707 pr_debug("An error occurred in debuginfo analysis (%d).\n", ntevs); 708 if (ntevs < 0) { 709 if (ntevs == -EBADF) 710 pr_warning("Warning: No dwarf info found in the vmlinux - " 711 "please rebuild kernel with CONFIG_DEBUG_INFO=y.\n"); 712 if (!need_dwarf) { 713 pr_debug("Trying to use symbols.\n"); 714 return 0; 715 } 716 } 717 return ntevs; 718 } 719 720 #define LINEBUF_SIZE 256 721 #define NR_ADDITIONAL_LINES 2 722 723 static int __show_one_line(FILE *fp, int l, bool skip, bool show_num) 724 { 725 char buf[LINEBUF_SIZE], sbuf[STRERR_BUFSIZE]; 726 const char *color = show_num ? "" : PERF_COLOR_BLUE; 727 const char *prefix = NULL; 728 729 do { 730 if (fgets(buf, LINEBUF_SIZE, fp) == NULL) 731 goto error; 732 if (skip) 733 continue; 734 if (!prefix) { 735 prefix = show_num ? "%7d " : " "; 736 color_fprintf(stdout, color, prefix, l); 737 } 738 color_fprintf(stdout, color, "%s", buf); 739 740 } while (strchr(buf, '\n') == NULL); 741 742 return 1; 743 error: 744 if (ferror(fp)) { 745 pr_warning("File read error: %s\n", 746 strerror_r(errno, sbuf, sizeof(sbuf))); 747 return -1; 748 } 749 return 0; 750 } 751 752 static int _show_one_line(FILE *fp, int l, bool skip, bool show_num) 753 { 754 int rv = __show_one_line(fp, l, skip, show_num); 755 if (rv == 0) { 756 pr_warning("Source file is shorter than expected.\n"); 757 rv = -1; 758 } 759 return rv; 760 } 761 762 #define show_one_line_with_num(f,l) _show_one_line(f,l,false,true) 763 #define show_one_line(f,l) _show_one_line(f,l,false,false) 764 #define skip_one_line(f,l) _show_one_line(f,l,true,false) 765 #define show_one_line_or_eof(f,l) __show_one_line(f,l,false,false) 766 767 /* 768 * Show line-range always requires debuginfo to find source file and 769 * line number. 770 */ 771 static int __show_line_range(struct line_range *lr, const char *module, 772 bool user) 773 { 774 int l = 1; 775 struct int_node *ln; 776 struct debuginfo *dinfo; 777 FILE *fp; 778 int ret; 779 char *tmp; 780 char sbuf[STRERR_BUFSIZE]; 781 782 /* Search a line range */ 783 dinfo = open_debuginfo(module, false); 784 if (!dinfo) 785 return -ENOENT; 786 787 ret = debuginfo__find_line_range(dinfo, lr); 788 if (!ret) { /* Not found, retry with an alternative */ 789 ret = get_alternative_line_range(dinfo, lr, module, user); 790 if (!ret) 791 ret = debuginfo__find_line_range(dinfo, lr); 792 } 793 debuginfo__delete(dinfo); 794 if (ret == 0 || ret == -ENOENT) { 795 pr_warning("Specified source line is not found.\n"); 796 return -ENOENT; 797 } else if (ret < 0) { 798 pr_warning("Debuginfo analysis failed.\n"); 799 return ret; 800 } 801 802 /* Convert source file path */ 803 tmp = lr->path; 804 ret = get_real_path(tmp, lr->comp_dir, &lr->path); 805 806 /* Free old path when new path is assigned */ 807 if (tmp != lr->path) 808 free(tmp); 809 810 if (ret < 0) { 811 pr_warning("Failed to find source file path.\n"); 812 return ret; 813 } 814 815 setup_pager(); 816 817 if (lr->function) 818 fprintf(stdout, "<%s@%s:%d>\n", lr->function, lr->path, 819 lr->start - lr->offset); 820 else 821 fprintf(stdout, "<%s:%d>\n", lr->path, lr->start); 822 823 fp = fopen(lr->path, "r"); 824 if (fp == NULL) { 825 pr_warning("Failed to open %s: %s\n", lr->path, 826 strerror_r(errno, sbuf, sizeof(sbuf))); 827 return -errno; 828 } 829 /* Skip to starting line number */ 830 while (l < lr->start) { 831 ret = skip_one_line(fp, l++); 832 if (ret < 0) 833 goto end; 834 } 835 836 intlist__for_each(ln, lr->line_list) { 837 for (; ln->i > l; l++) { 838 ret = show_one_line(fp, l - lr->offset); 839 if (ret < 0) 840 goto end; 841 } 842 ret = show_one_line_with_num(fp, l++ - lr->offset); 843 if (ret < 0) 844 goto end; 845 } 846 847 if (lr->end == INT_MAX) 848 lr->end = l + NR_ADDITIONAL_LINES; 849 while (l <= lr->end) { 850 ret = show_one_line_or_eof(fp, l++ - lr->offset); 851 if (ret <= 0) 852 break; 853 } 854 end: 855 fclose(fp); 856 return ret; 857 } 858 859 int show_line_range(struct line_range *lr, const char *module, bool user) 860 { 861 int ret; 862 863 ret = init_symbol_maps(user); 864 if (ret < 0) 865 return ret; 866 ret = __show_line_range(lr, module, user); 867 exit_symbol_maps(); 868 869 return ret; 870 } 871 872 static int show_available_vars_at(struct debuginfo *dinfo, 873 struct perf_probe_event *pev, 874 struct strfilter *_filter) 875 { 876 char *buf; 877 int ret, i, nvars; 878 struct str_node *node; 879 struct variable_list *vls = NULL, *vl; 880 struct perf_probe_point tmp; 881 const char *var; 882 883 buf = synthesize_perf_probe_point(&pev->point); 884 if (!buf) 885 return -EINVAL; 886 pr_debug("Searching variables at %s\n", buf); 887 888 ret = debuginfo__find_available_vars_at(dinfo, pev, &vls); 889 if (!ret) { /* Not found, retry with an alternative */ 890 ret = get_alternative_probe_event(dinfo, pev, &tmp); 891 if (!ret) { 892 ret = debuginfo__find_available_vars_at(dinfo, pev, 893 &vls); 894 /* Release the old probe_point */ 895 clear_perf_probe_point(&tmp); 896 } 897 } 898 if (ret <= 0) { 899 if (ret == 0 || ret == -ENOENT) { 900 pr_err("Failed to find the address of %s\n", buf); 901 ret = -ENOENT; 902 } else 903 pr_warning("Debuginfo analysis failed.\n"); 904 goto end; 905 } 906 907 /* Some variables are found */ 908 fprintf(stdout, "Available variables at %s\n", buf); 909 for (i = 0; i < ret; i++) { 910 vl = &vls[i]; 911 /* 912 * A probe point might be converted to 913 * several trace points. 914 */ 915 fprintf(stdout, "\t@<%s+%lu>\n", vl->point.symbol, 916 vl->point.offset); 917 zfree(&vl->point.symbol); 918 nvars = 0; 919 if (vl->vars) { 920 strlist__for_each(node, vl->vars) { 921 var = strchr(node->s, '\t') + 1; 922 if (strfilter__compare(_filter, var)) { 923 fprintf(stdout, "\t\t%s\n", node->s); 924 nvars++; 925 } 926 } 927 strlist__delete(vl->vars); 928 } 929 if (nvars == 0) 930 fprintf(stdout, "\t\t(No matched variables)\n"); 931 } 932 free(vls); 933 end: 934 free(buf); 935 return ret; 936 } 937 938 /* Show available variables on given probe point */ 939 int show_available_vars(struct perf_probe_event *pevs, int npevs, 940 struct strfilter *_filter) 941 { 942 int i, ret = 0; 943 struct debuginfo *dinfo; 944 945 ret = init_symbol_maps(pevs->uprobes); 946 if (ret < 0) 947 return ret; 948 949 dinfo = open_debuginfo(pevs->target, false); 950 if (!dinfo) { 951 ret = -ENOENT; 952 goto out; 953 } 954 955 setup_pager(); 956 957 for (i = 0; i < npevs && ret >= 0; i++) 958 ret = show_available_vars_at(dinfo, &pevs[i], _filter); 959 960 debuginfo__delete(dinfo); 961 out: 962 exit_symbol_maps(); 963 return ret; 964 } 965 966 #else /* !HAVE_DWARF_SUPPORT */ 967 968 static void debuginfo_cache__exit(void) 969 { 970 } 971 972 static int 973 find_perf_probe_point_from_dwarf(struct probe_trace_point *tp __maybe_unused, 974 struct perf_probe_point *pp __maybe_unused, 975 bool is_kprobe __maybe_unused) 976 { 977 return -ENOSYS; 978 } 979 980 static int try_to_find_probe_trace_events(struct perf_probe_event *pev, 981 struct probe_trace_event **tevs __maybe_unused) 982 { 983 if (perf_probe_event_need_dwarf(pev)) { 984 pr_warning("Debuginfo-analysis is not supported.\n"); 985 return -ENOSYS; 986 } 987 988 return 0; 989 } 990 991 int show_line_range(struct line_range *lr __maybe_unused, 992 const char *module __maybe_unused, 993 bool user __maybe_unused) 994 { 995 pr_warning("Debuginfo-analysis is not supported.\n"); 996 return -ENOSYS; 997 } 998 999 int show_available_vars(struct perf_probe_event *pevs __maybe_unused, 1000 int npevs __maybe_unused, 1001 struct strfilter *filter __maybe_unused) 1002 { 1003 pr_warning("Debuginfo-analysis is not supported.\n"); 1004 return -ENOSYS; 1005 } 1006 #endif 1007 1008 void line_range__clear(struct line_range *lr) 1009 { 1010 free(lr->function); 1011 free(lr->file); 1012 free(lr->path); 1013 free(lr->comp_dir); 1014 intlist__delete(lr->line_list); 1015 memset(lr, 0, sizeof(*lr)); 1016 } 1017 1018 int line_range__init(struct line_range *lr) 1019 { 1020 memset(lr, 0, sizeof(*lr)); 1021 lr->line_list = intlist__new(NULL); 1022 if (!lr->line_list) 1023 return -ENOMEM; 1024 else 1025 return 0; 1026 } 1027 1028 static int parse_line_num(char **ptr, int *val, const char *what) 1029 { 1030 const char *start = *ptr; 1031 1032 errno = 0; 1033 *val = strtol(*ptr, ptr, 0); 1034 if (errno || *ptr == start) { 1035 semantic_error("'%s' is not a valid number.\n", what); 1036 return -EINVAL; 1037 } 1038 return 0; 1039 } 1040 1041 /* Check the name is good for event, group or function */ 1042 static bool is_c_func_name(const char *name) 1043 { 1044 if (!isalpha(*name) && *name != '_') 1045 return false; 1046 while (*++name != '\0') { 1047 if (!isalpha(*name) && !isdigit(*name) && *name != '_') 1048 return false; 1049 } 1050 return true; 1051 } 1052 1053 /* 1054 * Stuff 'lr' according to the line range described by 'arg'. 1055 * The line range syntax is described by: 1056 * 1057 * SRC[:SLN[+NUM|-ELN]] 1058 * FNC[@SRC][:SLN[+NUM|-ELN]] 1059 */ 1060 int parse_line_range_desc(const char *arg, struct line_range *lr) 1061 { 1062 char *range, *file, *name = strdup(arg); 1063 int err; 1064 1065 if (!name) 1066 return -ENOMEM; 1067 1068 lr->start = 0; 1069 lr->end = INT_MAX; 1070 1071 range = strchr(name, ':'); 1072 if (range) { 1073 *range++ = '\0'; 1074 1075 err = parse_line_num(&range, &lr->start, "start line"); 1076 if (err) 1077 goto err; 1078 1079 if (*range == '+' || *range == '-') { 1080 const char c = *range++; 1081 1082 err = parse_line_num(&range, &lr->end, "end line"); 1083 if (err) 1084 goto err; 1085 1086 if (c == '+') { 1087 lr->end += lr->start; 1088 /* 1089 * Adjust the number of lines here. 1090 * If the number of lines == 1, the 1091 * the end of line should be equal to 1092 * the start of line. 1093 */ 1094 lr->end--; 1095 } 1096 } 1097 1098 pr_debug("Line range is %d to %d\n", lr->start, lr->end); 1099 1100 err = -EINVAL; 1101 if (lr->start > lr->end) { 1102 semantic_error("Start line must be smaller" 1103 " than end line.\n"); 1104 goto err; 1105 } 1106 if (*range != '\0') { 1107 semantic_error("Tailing with invalid str '%s'.\n", range); 1108 goto err; 1109 } 1110 } 1111 1112 file = strchr(name, '@'); 1113 if (file) { 1114 *file = '\0'; 1115 lr->file = strdup(++file); 1116 if (lr->file == NULL) { 1117 err = -ENOMEM; 1118 goto err; 1119 } 1120 lr->function = name; 1121 } else if (strchr(name, '/') || strchr(name, '.')) 1122 lr->file = name; 1123 else if (is_c_func_name(name))/* We reuse it for checking funcname */ 1124 lr->function = name; 1125 else { /* Invalid name */ 1126 semantic_error("'%s' is not a valid function name.\n", name); 1127 err = -EINVAL; 1128 goto err; 1129 } 1130 1131 return 0; 1132 err: 1133 free(name); 1134 return err; 1135 } 1136 1137 /* Parse probepoint definition. */ 1138 static int parse_perf_probe_point(char *arg, struct perf_probe_event *pev) 1139 { 1140 struct perf_probe_point *pp = &pev->point; 1141 char *ptr, *tmp; 1142 char c, nc = 0; 1143 bool file_spec = false; 1144 /* 1145 * <Syntax> 1146 * perf probe [EVENT=]SRC[:LN|;PTN] 1147 * perf probe [EVENT=]FUNC[@SRC][+OFFS|%return|:LN|;PAT] 1148 * 1149 * TODO:Group name support 1150 */ 1151 if (!arg) 1152 return -EINVAL; 1153 1154 ptr = strpbrk(arg, ";=@+%"); 1155 if (ptr && *ptr == '=') { /* Event name */ 1156 *ptr = '\0'; 1157 tmp = ptr + 1; 1158 if (strchr(arg, ':')) { 1159 semantic_error("Group name is not supported yet.\n"); 1160 return -ENOTSUP; 1161 } 1162 if (!is_c_func_name(arg)) { 1163 semantic_error("%s is bad for event name -it must " 1164 "follow C symbol-naming rule.\n", arg); 1165 return -EINVAL; 1166 } 1167 pev->event = strdup(arg); 1168 if (pev->event == NULL) 1169 return -ENOMEM; 1170 pev->group = NULL; 1171 arg = tmp; 1172 } 1173 1174 /* 1175 * Check arg is function or file name and copy it. 1176 * 1177 * We consider arg to be a file spec if and only if it satisfies 1178 * all of the below criteria:: 1179 * - it does not include any of "+@%", 1180 * - it includes one of ":;", and 1181 * - it has a period '.' in the name. 1182 * 1183 * Otherwise, we consider arg to be a function specification. 1184 */ 1185 if (!strpbrk(arg, "+@%") && (ptr = strpbrk(arg, ";:")) != NULL) { 1186 /* This is a file spec if it includes a '.' before ; or : */ 1187 if (memchr(arg, '.', ptr - arg)) 1188 file_spec = true; 1189 } 1190 1191 ptr = strpbrk(arg, ";:+@%"); 1192 if (ptr) { 1193 nc = *ptr; 1194 *ptr++ = '\0'; 1195 } 1196 1197 if (arg[0] == '\0') 1198 tmp = NULL; 1199 else { 1200 tmp = strdup(arg); 1201 if (tmp == NULL) 1202 return -ENOMEM; 1203 } 1204 1205 if (file_spec) 1206 pp->file = tmp; 1207 else { 1208 pp->function = tmp; 1209 1210 /* 1211 * Keep pp->function even if this is absolute address, 1212 * so it can mark whether abs_address is valid. 1213 * Which make 'perf probe lib.bin 0x0' possible. 1214 * 1215 * Note that checking length of tmp is not needed 1216 * because when we access tmp[1] we know tmp[0] is '0', 1217 * so tmp[1] should always valid (but could be '\0'). 1218 */ 1219 if (tmp && !strncmp(tmp, "0x", 2)) { 1220 pp->abs_address = strtoul(pp->function, &tmp, 0); 1221 if (*tmp != '\0') { 1222 semantic_error("Invalid absolute address.\n"); 1223 return -EINVAL; 1224 } 1225 } 1226 } 1227 1228 /* Parse other options */ 1229 while (ptr) { 1230 arg = ptr; 1231 c = nc; 1232 if (c == ';') { /* Lazy pattern must be the last part */ 1233 pp->lazy_line = strdup(arg); 1234 if (pp->lazy_line == NULL) 1235 return -ENOMEM; 1236 break; 1237 } 1238 ptr = strpbrk(arg, ";:+@%"); 1239 if (ptr) { 1240 nc = *ptr; 1241 *ptr++ = '\0'; 1242 } 1243 switch (c) { 1244 case ':': /* Line number */ 1245 pp->line = strtoul(arg, &tmp, 0); 1246 if (*tmp != '\0') { 1247 semantic_error("There is non-digit char" 1248 " in line number.\n"); 1249 return -EINVAL; 1250 } 1251 break; 1252 case '+': /* Byte offset from a symbol */ 1253 pp->offset = strtoul(arg, &tmp, 0); 1254 if (*tmp != '\0') { 1255 semantic_error("There is non-digit character" 1256 " in offset.\n"); 1257 return -EINVAL; 1258 } 1259 break; 1260 case '@': /* File name */ 1261 if (pp->file) { 1262 semantic_error("SRC@SRC is not allowed.\n"); 1263 return -EINVAL; 1264 } 1265 pp->file = strdup(arg); 1266 if (pp->file == NULL) 1267 return -ENOMEM; 1268 break; 1269 case '%': /* Probe places */ 1270 if (strcmp(arg, "return") == 0) { 1271 pp->retprobe = 1; 1272 } else { /* Others not supported yet */ 1273 semantic_error("%%%s is not supported.\n", arg); 1274 return -ENOTSUP; 1275 } 1276 break; 1277 default: /* Buggy case */ 1278 pr_err("This program has a bug at %s:%d.\n", 1279 __FILE__, __LINE__); 1280 return -ENOTSUP; 1281 break; 1282 } 1283 } 1284 1285 /* Exclusion check */ 1286 if (pp->lazy_line && pp->line) { 1287 semantic_error("Lazy pattern can't be used with" 1288 " line number.\n"); 1289 return -EINVAL; 1290 } 1291 1292 if (pp->lazy_line && pp->offset) { 1293 semantic_error("Lazy pattern can't be used with offset.\n"); 1294 return -EINVAL; 1295 } 1296 1297 if (pp->line && pp->offset) { 1298 semantic_error("Offset can't be used with line number.\n"); 1299 return -EINVAL; 1300 } 1301 1302 if (!pp->line && !pp->lazy_line && pp->file && !pp->function) { 1303 semantic_error("File always requires line number or " 1304 "lazy pattern.\n"); 1305 return -EINVAL; 1306 } 1307 1308 if (pp->offset && !pp->function) { 1309 semantic_error("Offset requires an entry function.\n"); 1310 return -EINVAL; 1311 } 1312 1313 if (pp->retprobe && !pp->function) { 1314 semantic_error("Return probe requires an entry function.\n"); 1315 return -EINVAL; 1316 } 1317 1318 if ((pp->offset || pp->line || pp->lazy_line) && pp->retprobe) { 1319 semantic_error("Offset/Line/Lazy pattern can't be used with " 1320 "return probe.\n"); 1321 return -EINVAL; 1322 } 1323 1324 pr_debug("symbol:%s file:%s line:%d offset:%lu return:%d lazy:%s\n", 1325 pp->function, pp->file, pp->line, pp->offset, pp->retprobe, 1326 pp->lazy_line); 1327 return 0; 1328 } 1329 1330 /* Parse perf-probe event argument */ 1331 static int parse_perf_probe_arg(char *str, struct perf_probe_arg *arg) 1332 { 1333 char *tmp, *goodname; 1334 struct perf_probe_arg_field **fieldp; 1335 1336 pr_debug("parsing arg: %s into ", str); 1337 1338 tmp = strchr(str, '='); 1339 if (tmp) { 1340 arg->name = strndup(str, tmp - str); 1341 if (arg->name == NULL) 1342 return -ENOMEM; 1343 pr_debug("name:%s ", arg->name); 1344 str = tmp + 1; 1345 } 1346 1347 tmp = strchr(str, ':'); 1348 if (tmp) { /* Type setting */ 1349 *tmp = '\0'; 1350 arg->type = strdup(tmp + 1); 1351 if (arg->type == NULL) 1352 return -ENOMEM; 1353 pr_debug("type:%s ", arg->type); 1354 } 1355 1356 tmp = strpbrk(str, "-.["); 1357 if (!is_c_varname(str) || !tmp) { 1358 /* A variable, register, symbol or special value */ 1359 arg->var = strdup(str); 1360 if (arg->var == NULL) 1361 return -ENOMEM; 1362 pr_debug("%s\n", arg->var); 1363 return 0; 1364 } 1365 1366 /* Structure fields or array element */ 1367 arg->var = strndup(str, tmp - str); 1368 if (arg->var == NULL) 1369 return -ENOMEM; 1370 goodname = arg->var; 1371 pr_debug("%s, ", arg->var); 1372 fieldp = &arg->field; 1373 1374 do { 1375 *fieldp = zalloc(sizeof(struct perf_probe_arg_field)); 1376 if (*fieldp == NULL) 1377 return -ENOMEM; 1378 if (*tmp == '[') { /* Array */ 1379 str = tmp; 1380 (*fieldp)->index = strtol(str + 1, &tmp, 0); 1381 (*fieldp)->ref = true; 1382 if (*tmp != ']' || tmp == str + 1) { 1383 semantic_error("Array index must be a" 1384 " number.\n"); 1385 return -EINVAL; 1386 } 1387 tmp++; 1388 if (*tmp == '\0') 1389 tmp = NULL; 1390 } else { /* Structure */ 1391 if (*tmp == '.') { 1392 str = tmp + 1; 1393 (*fieldp)->ref = false; 1394 } else if (tmp[1] == '>') { 1395 str = tmp + 2; 1396 (*fieldp)->ref = true; 1397 } else { 1398 semantic_error("Argument parse error: %s\n", 1399 str); 1400 return -EINVAL; 1401 } 1402 tmp = strpbrk(str, "-.["); 1403 } 1404 if (tmp) { 1405 (*fieldp)->name = strndup(str, tmp - str); 1406 if ((*fieldp)->name == NULL) 1407 return -ENOMEM; 1408 if (*str != '[') 1409 goodname = (*fieldp)->name; 1410 pr_debug("%s(%d), ", (*fieldp)->name, (*fieldp)->ref); 1411 fieldp = &(*fieldp)->next; 1412 } 1413 } while (tmp); 1414 (*fieldp)->name = strdup(str); 1415 if ((*fieldp)->name == NULL) 1416 return -ENOMEM; 1417 if (*str != '[') 1418 goodname = (*fieldp)->name; 1419 pr_debug("%s(%d)\n", (*fieldp)->name, (*fieldp)->ref); 1420 1421 /* If no name is specified, set the last field name (not array index)*/ 1422 if (!arg->name) { 1423 arg->name = strdup(goodname); 1424 if (arg->name == NULL) 1425 return -ENOMEM; 1426 } 1427 return 0; 1428 } 1429 1430 /* Parse perf-probe event command */ 1431 int parse_perf_probe_command(const char *cmd, struct perf_probe_event *pev) 1432 { 1433 char **argv; 1434 int argc, i, ret = 0; 1435 1436 argv = argv_split(cmd, &argc); 1437 if (!argv) { 1438 pr_debug("Failed to split arguments.\n"); 1439 return -ENOMEM; 1440 } 1441 if (argc - 1 > MAX_PROBE_ARGS) { 1442 semantic_error("Too many probe arguments (%d).\n", argc - 1); 1443 ret = -ERANGE; 1444 goto out; 1445 } 1446 /* Parse probe point */ 1447 ret = parse_perf_probe_point(argv[0], pev); 1448 if (ret < 0) 1449 goto out; 1450 1451 /* Copy arguments and ensure return probe has no C argument */ 1452 pev->nargs = argc - 1; 1453 pev->args = zalloc(sizeof(struct perf_probe_arg) * pev->nargs); 1454 if (pev->args == NULL) { 1455 ret = -ENOMEM; 1456 goto out; 1457 } 1458 for (i = 0; i < pev->nargs && ret >= 0; i++) { 1459 ret = parse_perf_probe_arg(argv[i + 1], &pev->args[i]); 1460 if (ret >= 0 && 1461 is_c_varname(pev->args[i].var) && pev->point.retprobe) { 1462 semantic_error("You can't specify local variable for" 1463 " kretprobe.\n"); 1464 ret = -EINVAL; 1465 } 1466 } 1467 out: 1468 argv_free(argv); 1469 1470 return ret; 1471 } 1472 1473 /* Return true if this perf_probe_event requires debuginfo */ 1474 bool perf_probe_event_need_dwarf(struct perf_probe_event *pev) 1475 { 1476 int i; 1477 1478 if (pev->point.file || pev->point.line || pev->point.lazy_line) 1479 return true; 1480 1481 for (i = 0; i < pev->nargs; i++) 1482 if (is_c_varname(pev->args[i].var)) 1483 return true; 1484 1485 return false; 1486 } 1487 1488 /* Parse probe_events event into struct probe_point */ 1489 int parse_probe_trace_command(const char *cmd, struct probe_trace_event *tev) 1490 { 1491 struct probe_trace_point *tp = &tev->point; 1492 char pr; 1493 char *p; 1494 char *argv0_str = NULL, *fmt, *fmt1_str, *fmt2_str, *fmt3_str; 1495 int ret, i, argc; 1496 char **argv; 1497 1498 pr_debug("Parsing probe_events: %s\n", cmd); 1499 argv = argv_split(cmd, &argc); 1500 if (!argv) { 1501 pr_debug("Failed to split arguments.\n"); 1502 return -ENOMEM; 1503 } 1504 if (argc < 2) { 1505 semantic_error("Too few probe arguments.\n"); 1506 ret = -ERANGE; 1507 goto out; 1508 } 1509 1510 /* Scan event and group name. */ 1511 argv0_str = strdup(argv[0]); 1512 if (argv0_str == NULL) { 1513 ret = -ENOMEM; 1514 goto out; 1515 } 1516 fmt1_str = strtok_r(argv0_str, ":", &fmt); 1517 fmt2_str = strtok_r(NULL, "/", &fmt); 1518 fmt3_str = strtok_r(NULL, " \t", &fmt); 1519 if (fmt1_str == NULL || strlen(fmt1_str) != 1 || fmt2_str == NULL 1520 || fmt3_str == NULL) { 1521 semantic_error("Failed to parse event name: %s\n", argv[0]); 1522 ret = -EINVAL; 1523 goto out; 1524 } 1525 pr = fmt1_str[0]; 1526 tev->group = strdup(fmt2_str); 1527 tev->event = strdup(fmt3_str); 1528 if (tev->group == NULL || tev->event == NULL) { 1529 ret = -ENOMEM; 1530 goto out; 1531 } 1532 pr_debug("Group:%s Event:%s probe:%c\n", tev->group, tev->event, pr); 1533 1534 tp->retprobe = (pr == 'r'); 1535 1536 /* Scan module name(if there), function name and offset */ 1537 p = strchr(argv[1], ':'); 1538 if (p) { 1539 tp->module = strndup(argv[1], p - argv[1]); 1540 p++; 1541 } else 1542 p = argv[1]; 1543 fmt1_str = strtok_r(p, "+", &fmt); 1544 /* only the address started with 0x */ 1545 if (fmt1_str[0] == '0') { 1546 /* 1547 * Fix a special case: 1548 * if address == 0, kernel reports something like: 1549 * p:probe_libc/abs_0 /lib/libc-2.18.so:0x (null) arg1=%ax 1550 * Newer kernel may fix that, but we want to 1551 * support old kernel also. 1552 */ 1553 if (strcmp(fmt1_str, "0x") == 0) { 1554 if (!argv[2] || strcmp(argv[2], "(null)")) { 1555 ret = -EINVAL; 1556 goto out; 1557 } 1558 tp->address = 0; 1559 1560 free(argv[2]); 1561 for (i = 2; argv[i + 1] != NULL; i++) 1562 argv[i] = argv[i + 1]; 1563 1564 argv[i] = NULL; 1565 argc -= 1; 1566 } else 1567 tp->address = strtoul(fmt1_str, NULL, 0); 1568 } else { 1569 /* Only the symbol-based probe has offset */ 1570 tp->symbol = strdup(fmt1_str); 1571 if (tp->symbol == NULL) { 1572 ret = -ENOMEM; 1573 goto out; 1574 } 1575 fmt2_str = strtok_r(NULL, "", &fmt); 1576 if (fmt2_str == NULL) 1577 tp->offset = 0; 1578 else 1579 tp->offset = strtoul(fmt2_str, NULL, 10); 1580 } 1581 1582 tev->nargs = argc - 2; 1583 tev->args = zalloc(sizeof(struct probe_trace_arg) * tev->nargs); 1584 if (tev->args == NULL) { 1585 ret = -ENOMEM; 1586 goto out; 1587 } 1588 for (i = 0; i < tev->nargs; i++) { 1589 p = strchr(argv[i + 2], '='); 1590 if (p) /* We don't need which register is assigned. */ 1591 *p++ = '\0'; 1592 else 1593 p = argv[i + 2]; 1594 tev->args[i].name = strdup(argv[i + 2]); 1595 /* TODO: parse regs and offset */ 1596 tev->args[i].value = strdup(p); 1597 if (tev->args[i].name == NULL || tev->args[i].value == NULL) { 1598 ret = -ENOMEM; 1599 goto out; 1600 } 1601 } 1602 ret = 0; 1603 out: 1604 free(argv0_str); 1605 argv_free(argv); 1606 return ret; 1607 } 1608 1609 /* Compose only probe arg */ 1610 int synthesize_perf_probe_arg(struct perf_probe_arg *pa, char *buf, size_t len) 1611 { 1612 struct perf_probe_arg_field *field = pa->field; 1613 int ret; 1614 char *tmp = buf; 1615 1616 if (pa->name && pa->var) 1617 ret = e_snprintf(tmp, len, "%s=%s", pa->name, pa->var); 1618 else 1619 ret = e_snprintf(tmp, len, "%s", pa->name ? pa->name : pa->var); 1620 if (ret <= 0) 1621 goto error; 1622 tmp += ret; 1623 len -= ret; 1624 1625 while (field) { 1626 if (field->name[0] == '[') 1627 ret = e_snprintf(tmp, len, "%s", field->name); 1628 else 1629 ret = e_snprintf(tmp, len, "%s%s", 1630 field->ref ? "->" : ".", field->name); 1631 if (ret <= 0) 1632 goto error; 1633 tmp += ret; 1634 len -= ret; 1635 field = field->next; 1636 } 1637 1638 if (pa->type) { 1639 ret = e_snprintf(tmp, len, ":%s", pa->type); 1640 if (ret <= 0) 1641 goto error; 1642 tmp += ret; 1643 len -= ret; 1644 } 1645 1646 return tmp - buf; 1647 error: 1648 pr_debug("Failed to synthesize perf probe argument: %d\n", ret); 1649 return ret; 1650 } 1651 1652 /* Compose only probe point (not argument) */ 1653 static char *synthesize_perf_probe_point(struct perf_probe_point *pp) 1654 { 1655 char *buf, *tmp; 1656 char offs[32] = "", line[32] = "", file[32] = ""; 1657 int ret, len; 1658 1659 buf = zalloc(MAX_CMDLEN); 1660 if (buf == NULL) { 1661 ret = -ENOMEM; 1662 goto error; 1663 } 1664 if (pp->offset) { 1665 ret = e_snprintf(offs, 32, "+%lu", pp->offset); 1666 if (ret <= 0) 1667 goto error; 1668 } 1669 if (pp->line) { 1670 ret = e_snprintf(line, 32, ":%d", pp->line); 1671 if (ret <= 0) 1672 goto error; 1673 } 1674 if (pp->file) { 1675 tmp = pp->file; 1676 len = strlen(tmp); 1677 if (len > 30) { 1678 tmp = strchr(pp->file + len - 30, '/'); 1679 tmp = tmp ? tmp + 1 : pp->file + len - 30; 1680 } 1681 ret = e_snprintf(file, 32, "@%s", tmp); 1682 if (ret <= 0) 1683 goto error; 1684 } 1685 1686 if (pp->function) 1687 ret = e_snprintf(buf, MAX_CMDLEN, "%s%s%s%s%s", pp->function, 1688 offs, pp->retprobe ? "%return" : "", line, 1689 file); 1690 else 1691 ret = e_snprintf(buf, MAX_CMDLEN, "%s%s", file, line); 1692 if (ret <= 0) 1693 goto error; 1694 1695 return buf; 1696 error: 1697 pr_debug("Failed to synthesize perf probe point: %d\n", ret); 1698 free(buf); 1699 return NULL; 1700 } 1701 1702 #if 0 1703 char *synthesize_perf_probe_command(struct perf_probe_event *pev) 1704 { 1705 char *buf; 1706 int i, len, ret; 1707 1708 buf = synthesize_perf_probe_point(&pev->point); 1709 if (!buf) 1710 return NULL; 1711 1712 len = strlen(buf); 1713 for (i = 0; i < pev->nargs; i++) { 1714 ret = e_snprintf(&buf[len], MAX_CMDLEN - len, " %s", 1715 pev->args[i].name); 1716 if (ret <= 0) { 1717 free(buf); 1718 return NULL; 1719 } 1720 len += ret; 1721 } 1722 1723 return buf; 1724 } 1725 #endif 1726 1727 static int __synthesize_probe_trace_arg_ref(struct probe_trace_arg_ref *ref, 1728 char **buf, size_t *buflen, 1729 int depth) 1730 { 1731 int ret; 1732 if (ref->next) { 1733 depth = __synthesize_probe_trace_arg_ref(ref->next, buf, 1734 buflen, depth + 1); 1735 if (depth < 0) 1736 goto out; 1737 } 1738 1739 ret = e_snprintf(*buf, *buflen, "%+ld(", ref->offset); 1740 if (ret < 0) 1741 depth = ret; 1742 else { 1743 *buf += ret; 1744 *buflen -= ret; 1745 } 1746 out: 1747 return depth; 1748 1749 } 1750 1751 static int synthesize_probe_trace_arg(struct probe_trace_arg *arg, 1752 char *buf, size_t buflen) 1753 { 1754 struct probe_trace_arg_ref *ref = arg->ref; 1755 int ret, depth = 0; 1756 char *tmp = buf; 1757 1758 /* Argument name or separator */ 1759 if (arg->name) 1760 ret = e_snprintf(buf, buflen, " %s=", arg->name); 1761 else 1762 ret = e_snprintf(buf, buflen, " "); 1763 if (ret < 0) 1764 return ret; 1765 buf += ret; 1766 buflen -= ret; 1767 1768 /* Special case: @XXX */ 1769 if (arg->value[0] == '@' && arg->ref) 1770 ref = ref->next; 1771 1772 /* Dereferencing arguments */ 1773 if (ref) { 1774 depth = __synthesize_probe_trace_arg_ref(ref, &buf, 1775 &buflen, 1); 1776 if (depth < 0) 1777 return depth; 1778 } 1779 1780 /* Print argument value */ 1781 if (arg->value[0] == '@' && arg->ref) 1782 ret = e_snprintf(buf, buflen, "%s%+ld", arg->value, 1783 arg->ref->offset); 1784 else 1785 ret = e_snprintf(buf, buflen, "%s", arg->value); 1786 if (ret < 0) 1787 return ret; 1788 buf += ret; 1789 buflen -= ret; 1790 1791 /* Closing */ 1792 while (depth--) { 1793 ret = e_snprintf(buf, buflen, ")"); 1794 if (ret < 0) 1795 return ret; 1796 buf += ret; 1797 buflen -= ret; 1798 } 1799 /* Print argument type */ 1800 if (arg->type) { 1801 ret = e_snprintf(buf, buflen, ":%s", arg->type); 1802 if (ret <= 0) 1803 return ret; 1804 buf += ret; 1805 } 1806 1807 return buf - tmp; 1808 } 1809 1810 char *synthesize_probe_trace_command(struct probe_trace_event *tev) 1811 { 1812 struct probe_trace_point *tp = &tev->point; 1813 char *buf; 1814 int i, len, ret; 1815 1816 buf = zalloc(MAX_CMDLEN); 1817 if (buf == NULL) 1818 return NULL; 1819 1820 len = e_snprintf(buf, MAX_CMDLEN, "%c:%s/%s ", tp->retprobe ? 'r' : 'p', 1821 tev->group, tev->event); 1822 if (len <= 0) 1823 goto error; 1824 1825 /* Uprobes must have tp->module */ 1826 if (tev->uprobes && !tp->module) 1827 goto error; 1828 /* 1829 * If tp->address == 0, then this point must be a 1830 * absolute address uprobe. 1831 * try_to_find_absolute_address() should have made 1832 * tp->symbol to "0x0". 1833 */ 1834 if (tev->uprobes && !tp->address) { 1835 if (!tp->symbol || strcmp(tp->symbol, "0x0")) 1836 goto error; 1837 } 1838 1839 /* Use the tp->address for uprobes */ 1840 if (tev->uprobes) 1841 ret = e_snprintf(buf + len, MAX_CMDLEN - len, "%s:0x%lx", 1842 tp->module, tp->address); 1843 else if (!strncmp(tp->symbol, "0x", 2)) 1844 /* Absolute address. See try_to_find_absolute_address() */ 1845 ret = e_snprintf(buf + len, MAX_CMDLEN - len, "%s%s0x%lx", 1846 tp->module ?: "", tp->module ? ":" : "", 1847 tp->address); 1848 else 1849 ret = e_snprintf(buf + len, MAX_CMDLEN - len, "%s%s%s+%lu", 1850 tp->module ?: "", tp->module ? ":" : "", 1851 tp->symbol, tp->offset); 1852 1853 if (ret <= 0) 1854 goto error; 1855 len += ret; 1856 1857 for (i = 0; i < tev->nargs; i++) { 1858 ret = synthesize_probe_trace_arg(&tev->args[i], buf + len, 1859 MAX_CMDLEN - len); 1860 if (ret <= 0) 1861 goto error; 1862 len += ret; 1863 } 1864 1865 return buf; 1866 error: 1867 free(buf); 1868 return NULL; 1869 } 1870 1871 static int find_perf_probe_point_from_map(struct probe_trace_point *tp, 1872 struct perf_probe_point *pp, 1873 bool is_kprobe) 1874 { 1875 struct symbol *sym = NULL; 1876 struct map *map; 1877 u64 addr = tp->address; 1878 int ret = -ENOENT; 1879 1880 if (!is_kprobe) { 1881 map = dso__new_map(tp->module); 1882 if (!map) 1883 goto out; 1884 sym = map__find_symbol(map, addr, NULL); 1885 } else { 1886 if (tp->symbol) 1887 addr = kernel_get_symbol_address_by_name(tp->symbol, true); 1888 if (addr) { 1889 addr += tp->offset; 1890 sym = __find_kernel_function(addr, &map); 1891 } 1892 } 1893 if (!sym) 1894 goto out; 1895 1896 pp->retprobe = tp->retprobe; 1897 pp->offset = addr - map->unmap_ip(map, sym->start); 1898 pp->function = strdup(sym->name); 1899 ret = pp->function ? 0 : -ENOMEM; 1900 1901 out: 1902 if (map && !is_kprobe) { 1903 map__put(map); 1904 } 1905 1906 return ret; 1907 } 1908 1909 static int convert_to_perf_probe_point(struct probe_trace_point *tp, 1910 struct perf_probe_point *pp, 1911 bool is_kprobe) 1912 { 1913 char buf[128]; 1914 int ret; 1915 1916 ret = find_perf_probe_point_from_dwarf(tp, pp, is_kprobe); 1917 if (!ret) 1918 return 0; 1919 ret = find_perf_probe_point_from_map(tp, pp, is_kprobe); 1920 if (!ret) 1921 return 0; 1922 1923 pr_debug("Failed to find probe point from both of dwarf and map.\n"); 1924 1925 if (tp->symbol) { 1926 pp->function = strdup(tp->symbol); 1927 pp->offset = tp->offset; 1928 } else { 1929 ret = e_snprintf(buf, 128, "0x%" PRIx64, (u64)tp->address); 1930 if (ret < 0) 1931 return ret; 1932 pp->function = strdup(buf); 1933 pp->offset = 0; 1934 } 1935 if (pp->function == NULL) 1936 return -ENOMEM; 1937 1938 pp->retprobe = tp->retprobe; 1939 1940 return 0; 1941 } 1942 1943 static int convert_to_perf_probe_event(struct probe_trace_event *tev, 1944 struct perf_probe_event *pev, bool is_kprobe) 1945 { 1946 char buf[64] = ""; 1947 int i, ret; 1948 1949 /* Convert event/group name */ 1950 pev->event = strdup(tev->event); 1951 pev->group = strdup(tev->group); 1952 if (pev->event == NULL || pev->group == NULL) 1953 return -ENOMEM; 1954 1955 /* Convert trace_point to probe_point */ 1956 ret = convert_to_perf_probe_point(&tev->point, &pev->point, is_kprobe); 1957 if (ret < 0) 1958 return ret; 1959 1960 /* Convert trace_arg to probe_arg */ 1961 pev->nargs = tev->nargs; 1962 pev->args = zalloc(sizeof(struct perf_probe_arg) * pev->nargs); 1963 if (pev->args == NULL) 1964 return -ENOMEM; 1965 for (i = 0; i < tev->nargs && ret >= 0; i++) { 1966 if (tev->args[i].name) 1967 pev->args[i].name = strdup(tev->args[i].name); 1968 else { 1969 ret = synthesize_probe_trace_arg(&tev->args[i], 1970 buf, 64); 1971 pev->args[i].name = strdup(buf); 1972 } 1973 if (pev->args[i].name == NULL && ret >= 0) 1974 ret = -ENOMEM; 1975 } 1976 1977 if (ret < 0) 1978 clear_perf_probe_event(pev); 1979 1980 return ret; 1981 } 1982 1983 void clear_perf_probe_event(struct perf_probe_event *pev) 1984 { 1985 struct perf_probe_arg_field *field, *next; 1986 int i; 1987 1988 free(pev->event); 1989 free(pev->group); 1990 free(pev->target); 1991 clear_perf_probe_point(&pev->point); 1992 1993 for (i = 0; i < pev->nargs; i++) { 1994 free(pev->args[i].name); 1995 free(pev->args[i].var); 1996 free(pev->args[i].type); 1997 field = pev->args[i].field; 1998 while (field) { 1999 next = field->next; 2000 zfree(&field->name); 2001 free(field); 2002 field = next; 2003 } 2004 } 2005 free(pev->args); 2006 memset(pev, 0, sizeof(*pev)); 2007 } 2008 2009 void clear_probe_trace_event(struct probe_trace_event *tev) 2010 { 2011 struct probe_trace_arg_ref *ref, *next; 2012 int i; 2013 2014 free(tev->event); 2015 free(tev->group); 2016 free(tev->point.symbol); 2017 free(tev->point.realname); 2018 free(tev->point.module); 2019 for (i = 0; i < tev->nargs; i++) { 2020 free(tev->args[i].name); 2021 free(tev->args[i].value); 2022 free(tev->args[i].type); 2023 ref = tev->args[i].ref; 2024 while (ref) { 2025 next = ref->next; 2026 free(ref); 2027 ref = next; 2028 } 2029 } 2030 free(tev->args); 2031 memset(tev, 0, sizeof(*tev)); 2032 } 2033 2034 struct kprobe_blacklist_node { 2035 struct list_head list; 2036 unsigned long start; 2037 unsigned long end; 2038 char *symbol; 2039 }; 2040 2041 static void kprobe_blacklist__delete(struct list_head *blacklist) 2042 { 2043 struct kprobe_blacklist_node *node; 2044 2045 while (!list_empty(blacklist)) { 2046 node = list_first_entry(blacklist, 2047 struct kprobe_blacklist_node, list); 2048 list_del(&node->list); 2049 free(node->symbol); 2050 free(node); 2051 } 2052 } 2053 2054 static int kprobe_blacklist__load(struct list_head *blacklist) 2055 { 2056 struct kprobe_blacklist_node *node; 2057 const char *__debugfs = debugfs_find_mountpoint(); 2058 char buf[PATH_MAX], *p; 2059 FILE *fp; 2060 int ret; 2061 2062 if (__debugfs == NULL) 2063 return -ENOTSUP; 2064 2065 ret = e_snprintf(buf, PATH_MAX, "%s/kprobes/blacklist", __debugfs); 2066 if (ret < 0) 2067 return ret; 2068 2069 fp = fopen(buf, "r"); 2070 if (!fp) 2071 return -errno; 2072 2073 ret = 0; 2074 while (fgets(buf, PATH_MAX, fp)) { 2075 node = zalloc(sizeof(*node)); 2076 if (!node) { 2077 ret = -ENOMEM; 2078 break; 2079 } 2080 INIT_LIST_HEAD(&node->list); 2081 list_add_tail(&node->list, blacklist); 2082 if (sscanf(buf, "0x%lx-0x%lx", &node->start, &node->end) != 2) { 2083 ret = -EINVAL; 2084 break; 2085 } 2086 p = strchr(buf, '\t'); 2087 if (p) { 2088 p++; 2089 if (p[strlen(p) - 1] == '\n') 2090 p[strlen(p) - 1] = '\0'; 2091 } else 2092 p = (char *)"unknown"; 2093 node->symbol = strdup(p); 2094 if (!node->symbol) { 2095 ret = -ENOMEM; 2096 break; 2097 } 2098 pr_debug2("Blacklist: 0x%lx-0x%lx, %s\n", 2099 node->start, node->end, node->symbol); 2100 ret++; 2101 } 2102 if (ret < 0) 2103 kprobe_blacklist__delete(blacklist); 2104 fclose(fp); 2105 2106 return ret; 2107 } 2108 2109 static struct kprobe_blacklist_node * 2110 kprobe_blacklist__find_by_address(struct list_head *blacklist, 2111 unsigned long address) 2112 { 2113 struct kprobe_blacklist_node *node; 2114 2115 list_for_each_entry(node, blacklist, list) { 2116 if (node->start <= address && address <= node->end) 2117 return node; 2118 } 2119 2120 return NULL; 2121 } 2122 2123 static LIST_HEAD(kprobe_blacklist); 2124 2125 static void kprobe_blacklist__init(void) 2126 { 2127 if (!list_empty(&kprobe_blacklist)) 2128 return; 2129 2130 if (kprobe_blacklist__load(&kprobe_blacklist) < 0) 2131 pr_debug("No kprobe blacklist support, ignored\n"); 2132 } 2133 2134 static void kprobe_blacklist__release(void) 2135 { 2136 kprobe_blacklist__delete(&kprobe_blacklist); 2137 } 2138 2139 static bool kprobe_blacklist__listed(unsigned long address) 2140 { 2141 return !!kprobe_blacklist__find_by_address(&kprobe_blacklist, address); 2142 } 2143 2144 static int perf_probe_event__sprintf(const char *group, const char *event, 2145 struct perf_probe_event *pev, 2146 const char *module, 2147 struct strbuf *result) 2148 { 2149 int i, ret; 2150 char buf[128]; 2151 char *place; 2152 2153 /* Synthesize only event probe point */ 2154 place = synthesize_perf_probe_point(&pev->point); 2155 if (!place) 2156 return -EINVAL; 2157 2158 ret = e_snprintf(buf, 128, "%s:%s", group, event); 2159 if (ret < 0) 2160 goto out; 2161 2162 strbuf_addf(result, " %-20s (on %s", buf, place); 2163 if (module) 2164 strbuf_addf(result, " in %s", module); 2165 2166 if (pev->nargs > 0) { 2167 strbuf_addstr(result, " with"); 2168 for (i = 0; i < pev->nargs; i++) { 2169 ret = synthesize_perf_probe_arg(&pev->args[i], 2170 buf, 128); 2171 if (ret < 0) 2172 goto out; 2173 strbuf_addf(result, " %s", buf); 2174 } 2175 } 2176 strbuf_addch(result, ')'); 2177 out: 2178 free(place); 2179 return ret; 2180 } 2181 2182 /* Show an event */ 2183 static int show_perf_probe_event(const char *group, const char *event, 2184 struct perf_probe_event *pev, 2185 const char *module, bool use_stdout) 2186 { 2187 struct strbuf buf = STRBUF_INIT; 2188 int ret; 2189 2190 ret = perf_probe_event__sprintf(group, event, pev, module, &buf); 2191 if (ret >= 0) { 2192 if (use_stdout) 2193 printf("%s\n", buf.buf); 2194 else 2195 pr_info("%s\n", buf.buf); 2196 } 2197 strbuf_release(&buf); 2198 2199 return ret; 2200 } 2201 2202 static bool filter_probe_trace_event(struct probe_trace_event *tev, 2203 struct strfilter *filter) 2204 { 2205 char tmp[128]; 2206 2207 /* At first, check the event name itself */ 2208 if (strfilter__compare(filter, tev->event)) 2209 return true; 2210 2211 /* Next, check the combination of name and group */ 2212 if (e_snprintf(tmp, 128, "%s:%s", tev->group, tev->event) < 0) 2213 return false; 2214 return strfilter__compare(filter, tmp); 2215 } 2216 2217 static int __show_perf_probe_events(int fd, bool is_kprobe, 2218 struct strfilter *filter) 2219 { 2220 int ret = 0; 2221 struct probe_trace_event tev; 2222 struct perf_probe_event pev; 2223 struct strlist *rawlist; 2224 struct str_node *ent; 2225 2226 memset(&tev, 0, sizeof(tev)); 2227 memset(&pev, 0, sizeof(pev)); 2228 2229 rawlist = probe_file__get_rawlist(fd); 2230 if (!rawlist) 2231 return -ENOMEM; 2232 2233 strlist__for_each(ent, rawlist) { 2234 ret = parse_probe_trace_command(ent->s, &tev); 2235 if (ret >= 0) { 2236 if (!filter_probe_trace_event(&tev, filter)) 2237 goto next; 2238 ret = convert_to_perf_probe_event(&tev, &pev, 2239 is_kprobe); 2240 if (ret < 0) 2241 goto next; 2242 ret = show_perf_probe_event(pev.group, pev.event, 2243 &pev, tev.point.module, 2244 true); 2245 } 2246 next: 2247 clear_perf_probe_event(&pev); 2248 clear_probe_trace_event(&tev); 2249 if (ret < 0) 2250 break; 2251 } 2252 strlist__delete(rawlist); 2253 /* Cleanup cached debuginfo if needed */ 2254 debuginfo_cache__exit(); 2255 2256 return ret; 2257 } 2258 2259 /* List up current perf-probe events */ 2260 int show_perf_probe_events(struct strfilter *filter) 2261 { 2262 int kp_fd, up_fd, ret; 2263 2264 setup_pager(); 2265 2266 ret = init_symbol_maps(false); 2267 if (ret < 0) 2268 return ret; 2269 2270 ret = probe_file__open_both(&kp_fd, &up_fd, 0); 2271 if (ret < 0) 2272 return ret; 2273 2274 if (kp_fd >= 0) 2275 ret = __show_perf_probe_events(kp_fd, true, filter); 2276 if (up_fd >= 0 && ret >= 0) 2277 ret = __show_perf_probe_events(up_fd, false, filter); 2278 if (kp_fd > 0) 2279 close(kp_fd); 2280 if (up_fd > 0) 2281 close(up_fd); 2282 exit_symbol_maps(); 2283 2284 return ret; 2285 } 2286 2287 static int get_new_event_name(char *buf, size_t len, const char *base, 2288 struct strlist *namelist, bool allow_suffix) 2289 { 2290 int i, ret; 2291 char *p; 2292 2293 if (*base == '.') 2294 base++; 2295 2296 /* Try no suffix */ 2297 ret = e_snprintf(buf, len, "%s", base); 2298 if (ret < 0) { 2299 pr_debug("snprintf() failed: %d\n", ret); 2300 return ret; 2301 } 2302 /* Cut off the postfixes (e.g. .const, .isra)*/ 2303 p = strchr(buf, '.'); 2304 if (p && p != buf) 2305 *p = '\0'; 2306 if (!strlist__has_entry(namelist, buf)) 2307 return 0; 2308 2309 if (!allow_suffix) { 2310 pr_warning("Error: event \"%s\" already exists. " 2311 "(Use -f to force duplicates.)\n", base); 2312 return -EEXIST; 2313 } 2314 2315 /* Try to add suffix */ 2316 for (i = 1; i < MAX_EVENT_INDEX; i++) { 2317 ret = e_snprintf(buf, len, "%s_%d", base, i); 2318 if (ret < 0) { 2319 pr_debug("snprintf() failed: %d\n", ret); 2320 return ret; 2321 } 2322 if (!strlist__has_entry(namelist, buf)) 2323 break; 2324 } 2325 if (i == MAX_EVENT_INDEX) { 2326 pr_warning("Too many events are on the same function.\n"); 2327 ret = -ERANGE; 2328 } 2329 2330 return ret; 2331 } 2332 2333 /* Warn if the current kernel's uprobe implementation is old */ 2334 static void warn_uprobe_event_compat(struct probe_trace_event *tev) 2335 { 2336 int i; 2337 char *buf = synthesize_probe_trace_command(tev); 2338 2339 /* Old uprobe event doesn't support memory dereference */ 2340 if (!tev->uprobes || tev->nargs == 0 || !buf) 2341 goto out; 2342 2343 for (i = 0; i < tev->nargs; i++) 2344 if (strglobmatch(tev->args[i].value, "[$@+-]*")) { 2345 pr_warning("Please upgrade your kernel to at least " 2346 "3.14 to have access to feature %s\n", 2347 tev->args[i].value); 2348 break; 2349 } 2350 out: 2351 free(buf); 2352 } 2353 2354 /* Set new name from original perf_probe_event and namelist */ 2355 static int probe_trace_event__set_name(struct probe_trace_event *tev, 2356 struct perf_probe_event *pev, 2357 struct strlist *namelist, 2358 bool allow_suffix) 2359 { 2360 const char *event, *group; 2361 char buf[64]; 2362 int ret; 2363 2364 if (pev->event) 2365 event = pev->event; 2366 else 2367 if (pev->point.function && 2368 (strncmp(pev->point.function, "0x", 2) != 0) && 2369 !strisglob(pev->point.function)) 2370 event = pev->point.function; 2371 else 2372 event = tev->point.realname; 2373 if (pev->group) 2374 group = pev->group; 2375 else 2376 group = PERFPROBE_GROUP; 2377 2378 /* Get an unused new event name */ 2379 ret = get_new_event_name(buf, 64, event, 2380 namelist, allow_suffix); 2381 if (ret < 0) 2382 return ret; 2383 2384 event = buf; 2385 2386 tev->event = strdup(event); 2387 tev->group = strdup(group); 2388 if (tev->event == NULL || tev->group == NULL) 2389 return -ENOMEM; 2390 2391 /* Add added event name to namelist */ 2392 strlist__add(namelist, event); 2393 return 0; 2394 } 2395 2396 static int __add_probe_trace_events(struct perf_probe_event *pev, 2397 struct probe_trace_event *tevs, 2398 int ntevs, bool allow_suffix) 2399 { 2400 int i, fd, ret; 2401 struct probe_trace_event *tev = NULL; 2402 const char *event = NULL, *group = NULL; 2403 struct strlist *namelist; 2404 2405 fd = probe_file__open(PF_FL_RW | (pev->uprobes ? PF_FL_UPROBE : 0)); 2406 if (fd < 0) 2407 return fd; 2408 2409 /* Get current event names */ 2410 namelist = probe_file__get_namelist(fd); 2411 if (!namelist) { 2412 pr_debug("Failed to get current event list.\n"); 2413 ret = -ENOMEM; 2414 goto close_out; 2415 } 2416 2417 ret = 0; 2418 pr_info("Added new event%s\n", (ntevs > 1) ? "s:" : ":"); 2419 for (i = 0; i < ntevs; i++) { 2420 tev = &tevs[i]; 2421 /* Skip if the symbol is out of .text or blacklisted */ 2422 if (!tev->point.symbol) 2423 continue; 2424 2425 /* Set new name for tev (and update namelist) */ 2426 ret = probe_trace_event__set_name(tev, pev, namelist, 2427 allow_suffix); 2428 if (ret < 0) 2429 break; 2430 2431 ret = probe_file__add_event(fd, tev); 2432 if (ret < 0) 2433 break; 2434 2435 /* We use tev's name for showing new events */ 2436 show_perf_probe_event(tev->group, tev->event, pev, 2437 tev->point.module, false); 2438 /* Save the last valid name */ 2439 event = tev->event; 2440 group = tev->group; 2441 2442 /* 2443 * Probes after the first probe which comes from same 2444 * user input are always allowed to add suffix, because 2445 * there might be several addresses corresponding to 2446 * one code line. 2447 */ 2448 allow_suffix = true; 2449 } 2450 if (ret == -EINVAL && pev->uprobes) 2451 warn_uprobe_event_compat(tev); 2452 2453 /* Note that it is possible to skip all events because of blacklist */ 2454 if (ret >= 0 && event) { 2455 /* Show how to use the event. */ 2456 pr_info("\nYou can now use it in all perf tools, such as:\n\n"); 2457 pr_info("\tperf record -e %s:%s -aR sleep 1\n\n", group, event); 2458 } 2459 2460 strlist__delete(namelist); 2461 close_out: 2462 close(fd); 2463 return ret; 2464 } 2465 2466 static int find_probe_functions(struct map *map, char *name, 2467 struct symbol **syms) 2468 { 2469 int found = 0; 2470 struct symbol *sym; 2471 struct rb_node *tmp; 2472 2473 if (map__load(map, NULL) < 0) 2474 return 0; 2475 2476 map__for_each_symbol(map, sym, tmp) { 2477 if (strglobmatch(sym->name, name)) { 2478 found++; 2479 if (syms && found < probe_conf.max_probes) 2480 syms[found - 1] = sym; 2481 } 2482 } 2483 2484 return found; 2485 } 2486 2487 #define strdup_or_goto(str, label) \ 2488 ({ char *__p = strdup(str); if (!__p) goto label; __p; }) 2489 2490 void __weak arch__fix_tev_from_maps(struct perf_probe_event *pev __maybe_unused, 2491 struct probe_trace_event *tev __maybe_unused, 2492 struct map *map __maybe_unused) { } 2493 2494 /* 2495 * Find probe function addresses from map. 2496 * Return an error or the number of found probe_trace_event 2497 */ 2498 static int find_probe_trace_events_from_map(struct perf_probe_event *pev, 2499 struct probe_trace_event **tevs) 2500 { 2501 struct map *map = NULL; 2502 struct ref_reloc_sym *reloc_sym = NULL; 2503 struct symbol *sym; 2504 struct symbol **syms = NULL; 2505 struct probe_trace_event *tev; 2506 struct perf_probe_point *pp = &pev->point; 2507 struct probe_trace_point *tp; 2508 int num_matched_functions; 2509 int ret, i, j, skipped = 0; 2510 2511 map = get_target_map(pev->target, pev->uprobes); 2512 if (!map) { 2513 ret = -EINVAL; 2514 goto out; 2515 } 2516 2517 syms = malloc(sizeof(struct symbol *) * probe_conf.max_probes); 2518 if (!syms) { 2519 ret = -ENOMEM; 2520 goto out; 2521 } 2522 2523 /* 2524 * Load matched symbols: Since the different local symbols may have 2525 * same name but different addresses, this lists all the symbols. 2526 */ 2527 num_matched_functions = find_probe_functions(map, pp->function, syms); 2528 if (num_matched_functions == 0) { 2529 pr_err("Failed to find symbol %s in %s\n", pp->function, 2530 pev->target ? : "kernel"); 2531 ret = -ENOENT; 2532 goto out; 2533 } else if (num_matched_functions > probe_conf.max_probes) { 2534 pr_err("Too many functions matched in %s\n", 2535 pev->target ? : "kernel"); 2536 ret = -E2BIG; 2537 goto out; 2538 } 2539 2540 if (!pev->uprobes && !pp->retprobe) { 2541 reloc_sym = kernel_get_ref_reloc_sym(); 2542 if (!reloc_sym) { 2543 pr_warning("Relocated base symbol is not found!\n"); 2544 ret = -EINVAL; 2545 goto out; 2546 } 2547 } 2548 2549 /* Setup result trace-probe-events */ 2550 *tevs = zalloc(sizeof(*tev) * num_matched_functions); 2551 if (!*tevs) { 2552 ret = -ENOMEM; 2553 goto out; 2554 } 2555 2556 ret = 0; 2557 2558 for (j = 0; j < num_matched_functions; j++) { 2559 sym = syms[j]; 2560 2561 tev = (*tevs) + ret; 2562 tp = &tev->point; 2563 if (ret == num_matched_functions) { 2564 pr_warning("Too many symbols are listed. Skip it.\n"); 2565 break; 2566 } 2567 ret++; 2568 2569 if (pp->offset > sym->end - sym->start) { 2570 pr_warning("Offset %ld is bigger than the size of %s\n", 2571 pp->offset, sym->name); 2572 ret = -ENOENT; 2573 goto err_out; 2574 } 2575 /* Add one probe point */ 2576 tp->address = map->unmap_ip(map, sym->start) + pp->offset; 2577 /* If we found a wrong one, mark it by NULL symbol */ 2578 if (!pev->uprobes && 2579 kprobe_warn_out_range(sym->name, tp->address)) { 2580 tp->symbol = NULL; /* Skip it */ 2581 skipped++; 2582 } else if (reloc_sym) { 2583 tp->symbol = strdup_or_goto(reloc_sym->name, nomem_out); 2584 tp->offset = tp->address - reloc_sym->addr; 2585 } else { 2586 tp->symbol = strdup_or_goto(sym->name, nomem_out); 2587 tp->offset = pp->offset; 2588 } 2589 tp->realname = strdup_or_goto(sym->name, nomem_out); 2590 2591 tp->retprobe = pp->retprobe; 2592 if (pev->target) 2593 tev->point.module = strdup_or_goto(pev->target, 2594 nomem_out); 2595 tev->uprobes = pev->uprobes; 2596 tev->nargs = pev->nargs; 2597 if (tev->nargs) { 2598 tev->args = zalloc(sizeof(struct probe_trace_arg) * 2599 tev->nargs); 2600 if (tev->args == NULL) 2601 goto nomem_out; 2602 } 2603 for (i = 0; i < tev->nargs; i++) { 2604 if (pev->args[i].name) 2605 tev->args[i].name = 2606 strdup_or_goto(pev->args[i].name, 2607 nomem_out); 2608 2609 tev->args[i].value = strdup_or_goto(pev->args[i].var, 2610 nomem_out); 2611 if (pev->args[i].type) 2612 tev->args[i].type = 2613 strdup_or_goto(pev->args[i].type, 2614 nomem_out); 2615 } 2616 arch__fix_tev_from_maps(pev, tev, map); 2617 } 2618 if (ret == skipped) { 2619 ret = -ENOENT; 2620 goto err_out; 2621 } 2622 2623 out: 2624 put_target_map(map, pev->uprobes); 2625 free(syms); 2626 return ret; 2627 2628 nomem_out: 2629 ret = -ENOMEM; 2630 err_out: 2631 clear_probe_trace_events(*tevs, num_matched_functions); 2632 zfree(tevs); 2633 goto out; 2634 } 2635 2636 static int try_to_find_absolute_address(struct perf_probe_event *pev, 2637 struct probe_trace_event **tevs) 2638 { 2639 struct perf_probe_point *pp = &pev->point; 2640 struct probe_trace_event *tev; 2641 struct probe_trace_point *tp; 2642 int i, err; 2643 2644 if (!(pev->point.function && !strncmp(pev->point.function, "0x", 2))) 2645 return -EINVAL; 2646 if (perf_probe_event_need_dwarf(pev)) 2647 return -EINVAL; 2648 2649 /* 2650 * This is 'perf probe /lib/libc.so 0xabcd'. Try to probe at 2651 * absolute address. 2652 * 2653 * Only one tev can be generated by this. 2654 */ 2655 *tevs = zalloc(sizeof(*tev)); 2656 if (!*tevs) 2657 return -ENOMEM; 2658 2659 tev = *tevs; 2660 tp = &tev->point; 2661 2662 /* 2663 * Don't use tp->offset, use address directly, because 2664 * in synthesize_probe_trace_command() address cannot be 2665 * zero. 2666 */ 2667 tp->address = pev->point.abs_address; 2668 tp->retprobe = pp->retprobe; 2669 tev->uprobes = pev->uprobes; 2670 2671 err = -ENOMEM; 2672 /* 2673 * Give it a '0x' leading symbol name. 2674 * In __add_probe_trace_events, a NULL symbol is interpreted as 2675 * invalud. 2676 */ 2677 if (asprintf(&tp->symbol, "0x%lx", tp->address) < 0) 2678 goto errout; 2679 2680 /* For kprobe, check range */ 2681 if ((!tev->uprobes) && 2682 (kprobe_warn_out_range(tev->point.symbol, 2683 tev->point.address))) { 2684 err = -EACCES; 2685 goto errout; 2686 } 2687 2688 if (asprintf(&tp->realname, "abs_%lx", tp->address) < 0) 2689 goto errout; 2690 2691 if (pev->target) { 2692 tp->module = strdup(pev->target); 2693 if (!tp->module) 2694 goto errout; 2695 } 2696 2697 if (tev->group) { 2698 tev->group = strdup(pev->group); 2699 if (!tev->group) 2700 goto errout; 2701 } 2702 2703 if (pev->event) { 2704 tev->event = strdup(pev->event); 2705 if (!tev->event) 2706 goto errout; 2707 } 2708 2709 tev->nargs = pev->nargs; 2710 tev->args = zalloc(sizeof(struct probe_trace_arg) * tev->nargs); 2711 if (!tev->args) { 2712 err = -ENOMEM; 2713 goto errout; 2714 } 2715 for (i = 0; i < tev->nargs; i++) 2716 copy_to_probe_trace_arg(&tev->args[i], &pev->args[i]); 2717 2718 return 1; 2719 2720 errout: 2721 if (*tevs) { 2722 clear_probe_trace_events(*tevs, 1); 2723 *tevs = NULL; 2724 } 2725 return err; 2726 } 2727 2728 bool __weak arch__prefers_symtab(void) { return false; } 2729 2730 static int convert_to_probe_trace_events(struct perf_probe_event *pev, 2731 struct probe_trace_event **tevs) 2732 { 2733 int ret; 2734 2735 if (pev->uprobes && !pev->group) { 2736 /* Replace group name if not given */ 2737 ret = convert_exec_to_group(pev->target, &pev->group); 2738 if (ret != 0) { 2739 pr_warning("Failed to make a group name.\n"); 2740 return ret; 2741 } 2742 } 2743 2744 ret = try_to_find_absolute_address(pev, tevs); 2745 if (ret > 0) 2746 return ret; 2747 2748 if (arch__prefers_symtab() && !perf_probe_event_need_dwarf(pev)) { 2749 ret = find_probe_trace_events_from_map(pev, tevs); 2750 if (ret > 0) 2751 return ret; /* Found in symbol table */ 2752 } 2753 2754 /* Convert perf_probe_event with debuginfo */ 2755 ret = try_to_find_probe_trace_events(pev, tevs); 2756 if (ret != 0) 2757 return ret; /* Found in debuginfo or got an error */ 2758 2759 return find_probe_trace_events_from_map(pev, tevs); 2760 } 2761 2762 struct __event_package { 2763 struct perf_probe_event *pev; 2764 struct probe_trace_event *tevs; 2765 int ntevs; 2766 }; 2767 2768 int add_perf_probe_events(struct perf_probe_event *pevs, int npevs) 2769 { 2770 int i, j, ret; 2771 struct __event_package *pkgs; 2772 2773 ret = 0; 2774 pkgs = zalloc(sizeof(struct __event_package) * npevs); 2775 2776 if (pkgs == NULL) 2777 return -ENOMEM; 2778 2779 ret = init_symbol_maps(pevs->uprobes); 2780 if (ret < 0) { 2781 free(pkgs); 2782 return ret; 2783 } 2784 2785 /* Loop 1: convert all events */ 2786 for (i = 0; i < npevs; i++) { 2787 pkgs[i].pev = &pevs[i]; 2788 /* Init kprobe blacklist if needed */ 2789 if (!pkgs[i].pev->uprobes) 2790 kprobe_blacklist__init(); 2791 /* Convert with or without debuginfo */ 2792 ret = convert_to_probe_trace_events(pkgs[i].pev, 2793 &pkgs[i].tevs); 2794 if (ret < 0) 2795 goto end; 2796 pkgs[i].ntevs = ret; 2797 } 2798 /* This just release blacklist only if allocated */ 2799 kprobe_blacklist__release(); 2800 2801 /* Loop 2: add all events */ 2802 for (i = 0; i < npevs; i++) { 2803 ret = __add_probe_trace_events(pkgs[i].pev, pkgs[i].tevs, 2804 pkgs[i].ntevs, 2805 probe_conf.force_add); 2806 if (ret < 0) 2807 break; 2808 } 2809 end: 2810 /* Loop 3: cleanup and free trace events */ 2811 for (i = 0; i < npevs; i++) { 2812 for (j = 0; j < pkgs[i].ntevs; j++) 2813 clear_probe_trace_event(&pkgs[i].tevs[j]); 2814 zfree(&pkgs[i].tevs); 2815 } 2816 free(pkgs); 2817 exit_symbol_maps(); 2818 2819 return ret; 2820 } 2821 2822 int del_perf_probe_events(struct strfilter *filter) 2823 { 2824 int ret, ret2, ufd = -1, kfd = -1; 2825 char *str = strfilter__string(filter); 2826 2827 if (!str) 2828 return -EINVAL; 2829 2830 pr_debug("Delete filter: \'%s\'\n", str); 2831 2832 /* Get current event names */ 2833 ret = probe_file__open_both(&kfd, &ufd, PF_FL_RW); 2834 if (ret < 0) 2835 goto out; 2836 2837 ret = probe_file__del_events(kfd, filter); 2838 if (ret < 0 && ret != -ENOENT) 2839 goto error; 2840 2841 ret2 = probe_file__del_events(ufd, filter); 2842 if (ret2 < 0 && ret2 != -ENOENT) { 2843 ret = ret2; 2844 goto error; 2845 } 2846 if (ret == -ENOENT && ret2 == -ENOENT) 2847 pr_debug("\"%s\" does not hit any event.\n", str); 2848 /* Note that this is silently ignored */ 2849 ret = 0; 2850 2851 error: 2852 if (kfd >= 0) 2853 close(kfd); 2854 if (ufd >= 0) 2855 close(ufd); 2856 out: 2857 free(str); 2858 2859 return ret; 2860 } 2861 2862 /* TODO: don't use a global variable for filter ... */ 2863 static struct strfilter *available_func_filter; 2864 2865 /* 2866 * If a symbol corresponds to a function with global binding and 2867 * matches filter return 0. For all others return 1. 2868 */ 2869 static int filter_available_functions(struct map *map __maybe_unused, 2870 struct symbol *sym) 2871 { 2872 if (strfilter__compare(available_func_filter, sym->name)) 2873 return 0; 2874 return 1; 2875 } 2876 2877 int show_available_funcs(const char *target, struct strfilter *_filter, 2878 bool user) 2879 { 2880 struct map *map; 2881 int ret; 2882 2883 ret = init_symbol_maps(user); 2884 if (ret < 0) 2885 return ret; 2886 2887 /* Get a symbol map */ 2888 if (user) 2889 map = dso__new_map(target); 2890 else 2891 map = kernel_get_module_map(target); 2892 if (!map) { 2893 pr_err("Failed to get a map for %s\n", (target) ? : "kernel"); 2894 return -EINVAL; 2895 } 2896 2897 /* Load symbols with given filter */ 2898 available_func_filter = _filter; 2899 if (map__load(map, filter_available_functions)) { 2900 pr_err("Failed to load symbols in %s\n", (target) ? : "kernel"); 2901 goto end; 2902 } 2903 if (!dso__sorted_by_name(map->dso, map->type)) 2904 dso__sort_by_name(map->dso, map->type); 2905 2906 /* Show all (filtered) symbols */ 2907 setup_pager(); 2908 dso__fprintf_symbols_by_name(map->dso, map->type, stdout); 2909 end: 2910 if (user) { 2911 map__put(map); 2912 } 2913 exit_symbol_maps(); 2914 2915 return ret; 2916 } 2917 2918 int copy_to_probe_trace_arg(struct probe_trace_arg *tvar, 2919 struct perf_probe_arg *pvar) 2920 { 2921 tvar->value = strdup(pvar->var); 2922 if (tvar->value == NULL) 2923 return -ENOMEM; 2924 if (pvar->type) { 2925 tvar->type = strdup(pvar->type); 2926 if (tvar->type == NULL) 2927 return -ENOMEM; 2928 } 2929 if (pvar->name) { 2930 tvar->name = strdup(pvar->name); 2931 if (tvar->name == NULL) 2932 return -ENOMEM; 2933 } else 2934 tvar->name = NULL; 2935 return 0; 2936 } 2937