1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * probe-event.c : perf-probe definition to probe_events format converter 4 * 5 * Written by Masami Hiramatsu <mhiramat@redhat.com> 6 */ 7 8#include <inttypes.h> 9#include <sys/utsname.h> 10#include <sys/types.h> 11#include <sys/stat.h> 12#include <fcntl.h> 13#include <errno.h> 14#include <stdio.h> 15#include <unistd.h> 16#include <stdlib.h> 17#include <string.h> 18#include <stdarg.h> 19#include <limits.h> 20#include <elf.h> 21 22#include "build-id.h" 23#include "event.h" 24#include "namespaces.h" 25#include "strlist.h" 26#include "strfilter.h" 27#include "debug.h" 28#include "dso.h" 29#include "color.h" 30#include "map.h" 31#include "maps.h" 32#include "symbol.h" 33#include <api/fs/fs.h> 34#include "trace-event.h" /* For __maybe_unused */ 35#include "probe-event.h" 36#include "probe-finder.h" 37#include "probe-file.h" 38#include "session.h" 39#include "string2.h" 40#include "strbuf.h" 41 42#include <subcmd/pager.h> 43#include <linux/ctype.h> 44#include <linux/zalloc.h> 45 46#ifdef HAVE_DEBUGINFOD_SUPPORT 47#include <elfutils/debuginfod.h> 48#endif 49 50#define PERFPROBE_GROUP "probe" 51 52bool probe_event_dry_run; /* Dry run flag */ 53struct probe_conf probe_conf = { .magic_num = DEFAULT_PROBE_MAGIC_NUM }; 54 55#define semantic_error(msg ...) pr_err("Semantic error :" msg) 56 57int e_snprintf(char *str, size_t size, const char *format, ...) 58{ 59 int ret; 60 va_list ap; 61 va_start(ap, format); 62 ret = vsnprintf(str, size, format, ap); 63 va_end(ap); 64 if (ret >= (int)size) 65 ret = -E2BIG; 66 return ret; 67} 68 69static struct machine *host_machine; 70 71/* Initialize symbol maps and path of vmlinux/modules */ 72int init_probe_symbol_maps(bool user_only) 73{ 74 int ret; 75 76 symbol_conf.sort_by_name = true; 77 symbol_conf.allow_aliases = true; 78 ret = symbol__init(NULL); 79 if (ret < 0) { 80 pr_debug("Failed to init symbol map.\n"); 81 goto out; 82 } 83 84 if (host_machine || user_only) /* already initialized */ 85 return 0; 86 87 if (symbol_conf.vmlinux_name) 88 pr_debug("Use vmlinux: %s\n", symbol_conf.vmlinux_name); 89 90 host_machine = machine__new_host(); 91 if (!host_machine) { 92 pr_debug("machine__new_host() failed.\n"); 93 symbol__exit(); 94 ret = -1; 95 } 96out: 97 if (ret < 0) 98 pr_warning("Failed to init vmlinux path.\n"); 99 return ret; 100} 101 102void exit_probe_symbol_maps(void) 103{ 104 machine__delete(host_machine); 105 host_machine = NULL; 106 symbol__exit(); 107} 108 109static struct ref_reloc_sym *kernel_get_ref_reloc_sym(struct map **pmap) 110{ 111 /* kmap->ref_reloc_sym should be set if host_machine is initialized */ 112 struct kmap *kmap; 113 struct map *map = machine__kernel_map(host_machine); 114 115 if (map__load(map) < 0) 116 return NULL; 117 118 kmap = map__kmap(map); 119 if (!kmap) 120 return NULL; 121 122 if (pmap) 123 *pmap = map; 124 125 return kmap->ref_reloc_sym; 126} 127 128static int kernel_get_symbol_address_by_name(const char *name, u64 *addr, 129 bool reloc, bool reladdr) 130{ 131 struct ref_reloc_sym *reloc_sym; 132 struct symbol *sym; 133 struct map *map; 134 135 /* ref_reloc_sym is just a label. Need a special fix*/ 136 reloc_sym = kernel_get_ref_reloc_sym(&map); 137 if (reloc_sym && strcmp(name, reloc_sym->name) == 0) 138 *addr = (!map->reloc || reloc) ? reloc_sym->addr : 139 reloc_sym->unrelocated_addr; 140 else { 141 sym = machine__find_kernel_symbol_by_name(host_machine, name, &map); 142 if (!sym) 143 return -ENOENT; 144 *addr = map->unmap_ip(map, sym->start) - 145 ((reloc) ? 0 : map->reloc) - 146 ((reladdr) ? map->start : 0); 147 } 148 return 0; 149} 150 151static struct map *kernel_get_module_map(const char *module) 152{ 153 struct maps *maps = machine__kernel_maps(host_machine); 154 struct map *pos; 155 156 /* A file path -- this is an offline module */ 157 if (module && strchr(module, '/')) 158 return dso__new_map(module); 159 160 if (!module) { 161 pos = machine__kernel_map(host_machine); 162 return map__get(pos); 163 } 164 165 maps__for_each_entry(maps, pos) { 166 /* short_name is "[module]" */ 167 if (strncmp(pos->dso->short_name + 1, module, 168 pos->dso->short_name_len - 2) == 0 && 169 module[pos->dso->short_name_len - 2] == '\0') { 170 return map__get(pos); 171 } 172 } 173 return NULL; 174} 175 176struct map *get_target_map(const char *target, struct nsinfo *nsi, bool user) 177{ 178 /* Init maps of given executable or kernel */ 179 if (user) { 180 struct map *map; 181 182 map = dso__new_map(target); 183 if (map && map->dso) { 184 nsinfo__put(map->dso->nsinfo); 185 map->dso->nsinfo = nsinfo__get(nsi); 186 } 187 return map; 188 } else { 189 return kernel_get_module_map(target); 190 } 191} 192 193static int convert_exec_to_group(const char *exec, char **result) 194{ 195 char *ptr1, *ptr2, *exec_copy; 196 char buf[64]; 197 int ret; 198 199 exec_copy = strdup(exec); 200 if (!exec_copy) 201 return -ENOMEM; 202 203 ptr1 = basename(exec_copy); 204 if (!ptr1) { 205 ret = -EINVAL; 206 goto out; 207 } 208 209 for (ptr2 = ptr1; *ptr2 != '\0'; ptr2++) { 210 if (!isalnum(*ptr2) && *ptr2 != '_') { 211 *ptr2 = '\0'; 212 break; 213 } 214 } 215 216 ret = e_snprintf(buf, 64, "%s_%s", PERFPROBE_GROUP, ptr1); 217 if (ret < 0) 218 goto out; 219 220 *result = strdup(buf); 221 ret = *result ? 0 : -ENOMEM; 222 223out: 224 free(exec_copy); 225 return ret; 226} 227 228static void clear_perf_probe_point(struct perf_probe_point *pp) 229{ 230 zfree(&pp->file); 231 zfree(&pp->function); 232 zfree(&pp->lazy_line); 233} 234 235static void clear_probe_trace_events(struct probe_trace_event *tevs, int ntevs) 236{ 237 int i; 238 239 for (i = 0; i < ntevs; i++) 240 clear_probe_trace_event(tevs + i); 241} 242 243static bool kprobe_blacklist__listed(unsigned long address); 244static bool kprobe_warn_out_range(const char *symbol, unsigned long address) 245{ 246 struct map *map; 247 bool ret = false; 248 249 map = kernel_get_module_map(NULL); 250 if (map) { 251 ret = address <= map->start || map->end < address; 252 if (ret) 253 pr_warning("%s is out of .text, skip it.\n", symbol); 254 map__put(map); 255 } 256 if (!ret && kprobe_blacklist__listed(address)) { 257 pr_warning("%s is blacklisted function, skip it.\n", symbol); 258 ret = true; 259 } 260 261 return ret; 262} 263 264/* 265 * @module can be module name of module file path. In case of path, 266 * inspect elf and find out what is actual module name. 267 * Caller has to free mod_name after using it. 268 */ 269static char *find_module_name(const char *module) 270{ 271 int fd; 272 Elf *elf; 273 GElf_Ehdr ehdr; 274 GElf_Shdr shdr; 275 Elf_Data *data; 276 Elf_Scn *sec; 277 char *mod_name = NULL; 278 int name_offset; 279 280 fd = open(module, O_RDONLY); 281 if (fd < 0) 282 return NULL; 283 284 elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL); 285 if (elf == NULL) 286 goto elf_err; 287 288 if (gelf_getehdr(elf, &ehdr) == NULL) 289 goto ret_err; 290 291 sec = elf_section_by_name(elf, &ehdr, &shdr, 292 ".gnu.linkonce.this_module", NULL); 293 if (!sec) 294 goto ret_err; 295 296 data = elf_getdata(sec, NULL); 297 if (!data || !data->d_buf) 298 goto ret_err; 299 300 /* 301 * NOTE: 302 * '.gnu.linkonce.this_module' section of kernel module elf directly 303 * maps to 'struct module' from linux/module.h. This section contains 304 * actual module name which will be used by kernel after loading it. 305 * But, we cannot use 'struct module' here since linux/module.h is not 306 * exposed to user-space. Offset of 'name' has remained same from long 307 * time, so hardcoding it here. 308 */ 309 if (ehdr.e_ident[EI_CLASS] == ELFCLASS32) 310 name_offset = 12; 311 else /* expect ELFCLASS64 by default */ 312 name_offset = 24; 313 314 mod_name = strdup((char *)data->d_buf + name_offset); 315 316ret_err: 317 elf_end(elf); 318elf_err: 319 close(fd); 320 return mod_name; 321} 322 323#ifdef HAVE_DWARF_SUPPORT 324 325static int kernel_get_module_dso(const char *module, struct dso **pdso) 326{ 327 struct dso *dso; 328 struct map *map; 329 const char *vmlinux_name; 330 int ret = 0; 331 332 if (module) { 333 char module_name[128]; 334 335 snprintf(module_name, sizeof(module_name), "[%s]", module); 336 map = maps__find_by_name(&host_machine->kmaps, module_name); 337 if (map) { 338 dso = map->dso; 339 goto found; 340 } 341 pr_debug("Failed to find module %s.\n", module); 342 return -ENOENT; 343 } 344 345 map = machine__kernel_map(host_machine); 346 dso = map->dso; 347 if (!dso->has_build_id) 348 dso__read_running_kernel_build_id(dso, host_machine); 349 350 vmlinux_name = symbol_conf.vmlinux_name; 351 dso->load_errno = 0; 352 if (vmlinux_name) 353 ret = dso__load_vmlinux(dso, map, vmlinux_name, false); 354 else 355 ret = dso__load_vmlinux_path(dso, map); 356found: 357 *pdso = dso; 358 return ret; 359} 360 361/* 362 * Some binaries like glibc have special symbols which are on the symbol 363 * table, but not in the debuginfo. If we can find the address of the 364 * symbol from map, we can translate the address back to the probe point. 365 */ 366static int find_alternative_probe_point(struct debuginfo *dinfo, 367 struct perf_probe_point *pp, 368 struct perf_probe_point *result, 369 const char *target, struct nsinfo *nsi, 370 bool uprobes) 371{ 372 struct map *map = NULL; 373 struct symbol *sym; 374 u64 address = 0; 375 int ret = -ENOENT; 376 377 /* This can work only for function-name based one */ 378 if (!pp->function || pp->file) 379 return -ENOTSUP; 380 381 map = get_target_map(target, nsi, uprobes); 382 if (!map) 383 return -EINVAL; 384 385 /* Find the address of given function */ 386 map__for_each_symbol_by_name(map, pp->function, sym) { 387 if (uprobes) { 388 address = sym->start; 389 if (sym->type == STT_GNU_IFUNC) 390 pr_warning("Warning: The probe function (%s) is a GNU indirect function.\n" 391 "Consider identifying the final function used at run time and set the probe directly on that.\n", 392 pp->function); 393 } else 394 address = map->unmap_ip(map, sym->start) - map->reloc; 395 break; 396 } 397 if (!address) { 398 ret = -ENOENT; 399 goto out; 400 } 401 pr_debug("Symbol %s address found : %" PRIx64 "\n", 402 pp->function, address); 403 404 ret = debuginfo__find_probe_point(dinfo, (unsigned long)address, 405 result); 406 if (ret <= 0) 407 ret = (!ret) ? -ENOENT : ret; 408 else { 409 result->offset += pp->offset; 410 result->line += pp->line; 411 result->retprobe = pp->retprobe; 412 ret = 0; 413 } 414 415out: 416 map__put(map); 417 return ret; 418 419} 420 421static int get_alternative_probe_event(struct debuginfo *dinfo, 422 struct perf_probe_event *pev, 423 struct perf_probe_point *tmp) 424{ 425 int ret; 426 427 memcpy(tmp, &pev->point, sizeof(*tmp)); 428 memset(&pev->point, 0, sizeof(pev->point)); 429 ret = find_alternative_probe_point(dinfo, tmp, &pev->point, pev->target, 430 pev->nsi, pev->uprobes); 431 if (ret < 0) 432 memcpy(&pev->point, tmp, sizeof(*tmp)); 433 434 return ret; 435} 436 437static int get_alternative_line_range(struct debuginfo *dinfo, 438 struct line_range *lr, 439 const char *target, bool user) 440{ 441 struct perf_probe_point pp = { .function = lr->function, 442 .file = lr->file, 443 .line = lr->start }; 444 struct perf_probe_point result; 445 int ret, len = 0; 446 447 memset(&result, 0, sizeof(result)); 448 449 if (lr->end != INT_MAX) 450 len = lr->end - lr->start; 451 ret = find_alternative_probe_point(dinfo, &pp, &result, 452 target, NULL, user); 453 if (!ret) { 454 lr->function = result.function; 455 lr->file = result.file; 456 lr->start = result.line; 457 if (lr->end != INT_MAX) 458 lr->end = lr->start + len; 459 clear_perf_probe_point(&pp); 460 } 461 return ret; 462} 463 464#ifdef HAVE_DEBUGINFOD_SUPPORT 465static struct debuginfo *open_from_debuginfod(struct dso *dso, struct nsinfo *nsi, 466 bool silent) 467{ 468 debuginfod_client *c = debuginfod_begin(); 469 char sbuild_id[SBUILD_ID_SIZE + 1]; 470 struct debuginfo *ret = NULL; 471 struct nscookie nsc; 472 char *path; 473 int fd; 474 475 if (!c) 476 return NULL; 477 478 build_id__sprintf(&dso->bid, sbuild_id); 479 fd = debuginfod_find_debuginfo(c, (const unsigned char *)sbuild_id, 480 0, &path); 481 if (fd >= 0) 482 close(fd); 483 debuginfod_end(c); 484 if (fd < 0) { 485 if (!silent) 486 pr_debug("Failed to find debuginfo in debuginfod.\n"); 487 return NULL; 488 } 489 if (!silent) 490 pr_debug("Load debuginfo from debuginfod (%s)\n", path); 491 492 nsinfo__mountns_enter(nsi, &nsc); 493 ret = debuginfo__new((const char *)path); 494 nsinfo__mountns_exit(&nsc); 495 return ret; 496} 497#else 498static inline 499struct debuginfo *open_from_debuginfod(struct dso *dso __maybe_unused, 500 struct nsinfo *nsi __maybe_unused, 501 bool silent __maybe_unused) 502{ 503 return NULL; 504} 505#endif 506 507/* Open new debuginfo of given module */ 508static struct debuginfo *open_debuginfo(const char *module, struct nsinfo *nsi, 509 bool silent) 510{ 511 const char *path = module; 512 char reason[STRERR_BUFSIZE]; 513 struct debuginfo *ret = NULL; 514 struct dso *dso = NULL; 515 struct nscookie nsc; 516 int err; 517 518 if (!module || !strchr(module, '/')) { 519 err = kernel_get_module_dso(module, &dso); 520 if (err < 0) { 521 if (!dso || dso->load_errno == 0) { 522 if (!str_error_r(-err, reason, STRERR_BUFSIZE)) 523 strcpy(reason, "(unknown)"); 524 } else 525 dso__strerror_load(dso, reason, STRERR_BUFSIZE); 526 if (dso) 527 ret = open_from_debuginfod(dso, nsi, silent); 528 if (ret) 529 return ret; 530 if (!silent) { 531 if (module) 532 pr_err("Module %s is not loaded, please specify its full path name.\n", module); 533 else 534 pr_err("Failed to find the path for the kernel: %s\n", reason); 535 } 536 return NULL; 537 } 538 path = dso->long_name; 539 } 540 nsinfo__mountns_enter(nsi, &nsc); 541 ret = debuginfo__new(path); 542 if (!ret && !silent) { 543 pr_warning("The %s file has no debug information.\n", path); 544 if (!module || !strtailcmp(path, ".ko")) 545 pr_warning("Rebuild with CONFIG_DEBUG_INFO=y, "); 546 else 547 pr_warning("Rebuild with -g, "); 548 pr_warning("or install an appropriate debuginfo package.\n"); 549 } 550 nsinfo__mountns_exit(&nsc); 551 return ret; 552} 553 554/* For caching the last debuginfo */ 555static struct debuginfo *debuginfo_cache; 556static char *debuginfo_cache_path; 557 558static struct debuginfo *debuginfo_cache__open(const char *module, bool silent) 559{ 560 const char *path = module; 561 562 /* If the module is NULL, it should be the kernel. */ 563 if (!module) 564 path = "kernel"; 565 566 if (debuginfo_cache_path && !strcmp(debuginfo_cache_path, path)) 567 goto out; 568 569 /* Copy module path */ 570 free(debuginfo_cache_path); 571 debuginfo_cache_path = strdup(path); 572 if (!debuginfo_cache_path) { 573 debuginfo__delete(debuginfo_cache); 574 debuginfo_cache = NULL; 575 goto out; 576 } 577 578 debuginfo_cache = open_debuginfo(module, NULL, silent); 579 if (!debuginfo_cache) 580 zfree(&debuginfo_cache_path); 581out: 582 return debuginfo_cache; 583} 584 585static void debuginfo_cache__exit(void) 586{ 587 debuginfo__delete(debuginfo_cache); 588 debuginfo_cache = NULL; 589 zfree(&debuginfo_cache_path); 590} 591 592 593static int get_text_start_address(const char *exec, unsigned long *address, 594 struct nsinfo *nsi) 595{ 596 Elf *elf; 597 GElf_Ehdr ehdr; 598 GElf_Shdr shdr; 599 int fd, ret = -ENOENT; 600 struct nscookie nsc; 601 602 nsinfo__mountns_enter(nsi, &nsc); 603 fd = open(exec, O_RDONLY); 604 nsinfo__mountns_exit(&nsc); 605 if (fd < 0) 606 return -errno; 607 608 elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL); 609 if (elf == NULL) { 610 ret = -EINVAL; 611 goto out_close; 612 } 613 614 if (gelf_getehdr(elf, &ehdr) == NULL) 615 goto out; 616 617 if (!elf_section_by_name(elf, &ehdr, &shdr, ".text", NULL)) 618 goto out; 619 620 *address = shdr.sh_addr - shdr.sh_offset; 621 ret = 0; 622out: 623 elf_end(elf); 624out_close: 625 close(fd); 626 627 return ret; 628} 629 630/* 631 * Convert trace point to probe point with debuginfo 632 */ 633static int find_perf_probe_point_from_dwarf(struct probe_trace_point *tp, 634 struct perf_probe_point *pp, 635 bool is_kprobe) 636{ 637 struct debuginfo *dinfo = NULL; 638 unsigned long stext = 0; 639 u64 addr = tp->address; 640 int ret = -ENOENT; 641 642 /* convert the address to dwarf address */ 643 if (!is_kprobe) { 644 if (!addr) { 645 ret = -EINVAL; 646 goto error; 647 } 648 ret = get_text_start_address(tp->module, &stext, NULL); 649 if (ret < 0) 650 goto error; 651 addr += stext; 652 } else if (tp->symbol) { 653 /* If the module is given, this returns relative address */ 654 ret = kernel_get_symbol_address_by_name(tp->symbol, &addr, 655 false, !!tp->module); 656 if (ret != 0) 657 goto error; 658 addr += tp->offset; 659 } 660 661 pr_debug("try to find information at %" PRIx64 " in %s\n", addr, 662 tp->module ? : "kernel"); 663 664 dinfo = debuginfo_cache__open(tp->module, verbose <= 0); 665 if (dinfo) 666 ret = debuginfo__find_probe_point(dinfo, 667 (unsigned long)addr, pp); 668 else 669 ret = -ENOENT; 670 671 if (ret > 0) { 672 pp->retprobe = tp->retprobe; 673 return 0; 674 } 675error: 676 pr_debug("Failed to find corresponding probes from debuginfo.\n"); 677 return ret ? : -ENOENT; 678} 679 680/* Adjust symbol name and address */ 681static int post_process_probe_trace_point(struct probe_trace_point *tp, 682 struct map *map, unsigned long offs) 683{ 684 struct symbol *sym; 685 u64 addr = tp->address - offs; 686 687 sym = map__find_symbol(map, addr); 688 if (!sym) 689 return -ENOENT; 690 691 if (strcmp(sym->name, tp->symbol)) { 692 /* If we have no realname, use symbol for it */ 693 if (!tp->realname) 694 tp->realname = tp->symbol; 695 else 696 free(tp->symbol); 697 tp->symbol = strdup(sym->name); 698 if (!tp->symbol) 699 return -ENOMEM; 700 } 701 tp->offset = addr - sym->start; 702 tp->address -= offs; 703 704 return 0; 705} 706 707/* 708 * Rename DWARF symbols to ELF symbols -- gcc sometimes optimizes functions 709 * and generate new symbols with suffixes such as .constprop.N or .isra.N 710 * etc. Since those symbols are not recorded in DWARF, we have to find 711 * correct generated symbols from offline ELF binary. 712 * For online kernel or uprobes we don't need this because those are 713 * rebased on _text, or already a section relative address. 714 */ 715static int 716post_process_offline_probe_trace_events(struct probe_trace_event *tevs, 717 int ntevs, const char *pathname) 718{ 719 struct map *map; 720 unsigned long stext = 0; 721 int i, ret = 0; 722 723 /* Prepare a map for offline binary */ 724 map = dso__new_map(pathname); 725 if (!map || get_text_start_address(pathname, &stext, NULL) < 0) { 726 pr_warning("Failed to get ELF symbols for %s\n", pathname); 727 return -EINVAL; 728 } 729 730 for (i = 0; i < ntevs; i++) { 731 ret = post_process_probe_trace_point(&tevs[i].point, 732 map, stext); 733 if (ret < 0) 734 break; 735 } 736 map__put(map); 737 738 return ret; 739} 740 741static int add_exec_to_probe_trace_events(struct probe_trace_event *tevs, 742 int ntevs, const char *exec, 743 struct nsinfo *nsi) 744{ 745 int i, ret = 0; 746 unsigned long stext = 0; 747 748 if (!exec) 749 return 0; 750 751 ret = get_text_start_address(exec, &stext, nsi); 752 if (ret < 0) 753 return ret; 754 755 for (i = 0; i < ntevs && ret >= 0; i++) { 756 /* point.address is the address of point.symbol + point.offset */ 757 tevs[i].point.address -= stext; 758 tevs[i].point.module = strdup(exec); 759 if (!tevs[i].point.module) { 760 ret = -ENOMEM; 761 break; 762 } 763 tevs[i].uprobes = true; 764 } 765 766 return ret; 767} 768 769static int 770post_process_module_probe_trace_events(struct probe_trace_event *tevs, 771 int ntevs, const char *module, 772 struct debuginfo *dinfo) 773{ 774 Dwarf_Addr text_offs = 0; 775 int i, ret = 0; 776 char *mod_name = NULL; 777 struct map *map; 778 779 if (!module) 780 return 0; 781 782 map = get_target_map(module, NULL, false); 783 if (!map || debuginfo__get_text_offset(dinfo, &text_offs, true) < 0) { 784 pr_warning("Failed to get ELF symbols for %s\n", module); 785 return -EINVAL; 786 } 787 788 mod_name = find_module_name(module); 789 for (i = 0; i < ntevs; i++) { 790 ret = post_process_probe_trace_point(&tevs[i].point, 791 map, (unsigned long)text_offs); 792 if (ret < 0) 793 break; 794 tevs[i].point.module = 795 strdup(mod_name ? mod_name : module); 796 if (!tevs[i].point.module) { 797 ret = -ENOMEM; 798 break; 799 } 800 } 801 802 free(mod_name); 803 map__put(map); 804 805 return ret; 806} 807 808static int 809post_process_kernel_probe_trace_events(struct probe_trace_event *tevs, 810 int ntevs) 811{ 812 struct ref_reloc_sym *reloc_sym; 813 struct map *map; 814 char *tmp; 815 int i, skipped = 0; 816 817 /* Skip post process if the target is an offline kernel */ 818 if (symbol_conf.ignore_vmlinux_buildid) 819 return post_process_offline_probe_trace_events(tevs, ntevs, 820 symbol_conf.vmlinux_name); 821 822 reloc_sym = kernel_get_ref_reloc_sym(&map); 823 if (!reloc_sym) { 824 pr_warning("Relocated base symbol is not found!\n"); 825 return -EINVAL; 826 } 827 828 for (i = 0; i < ntevs; i++) { 829 if (!tevs[i].point.address) 830 continue; 831 if (tevs[i].point.retprobe && !kretprobe_offset_is_supported()) 832 continue; 833 /* 834 * If we found a wrong one, mark it by NULL symbol. 835 * Since addresses in debuginfo is same as objdump, we need 836 * to convert it to addresses on memory. 837 */ 838 if (kprobe_warn_out_range(tevs[i].point.symbol, 839 map__objdump_2mem(map, tevs[i].point.address))) { 840 tmp = NULL; 841 skipped++; 842 } else { 843 tmp = strdup(reloc_sym->name); 844 if (!tmp) 845 return -ENOMEM; 846 } 847 /* If we have no realname, use symbol for it */ 848 if (!tevs[i].point.realname) 849 tevs[i].point.realname = tevs[i].point.symbol; 850 else 851 free(tevs[i].point.symbol); 852 tevs[i].point.symbol = tmp; 853 tevs[i].point.offset = tevs[i].point.address - 854 (map->reloc ? reloc_sym->unrelocated_addr : 855 reloc_sym->addr); 856 } 857 return skipped; 858} 859 860void __weak 861arch__post_process_probe_trace_events(struct perf_probe_event *pev __maybe_unused, 862 int ntevs __maybe_unused) 863{ 864} 865 866/* Post processing the probe events */ 867static int post_process_probe_trace_events(struct perf_probe_event *pev, 868 struct probe_trace_event *tevs, 869 int ntevs, const char *module, 870 bool uprobe, struct debuginfo *dinfo) 871{ 872 int ret; 873 874 if (uprobe) 875 ret = add_exec_to_probe_trace_events(tevs, ntevs, module, 876 pev->nsi); 877 else if (module) 878 /* Currently ref_reloc_sym based probe is not for drivers */ 879 ret = post_process_module_probe_trace_events(tevs, ntevs, 880 module, dinfo); 881 else 882 ret = post_process_kernel_probe_trace_events(tevs, ntevs); 883 884 if (ret >= 0) 885 arch__post_process_probe_trace_events(pev, ntevs); 886 887 return ret; 888} 889 890/* Try to find perf_probe_event with debuginfo */ 891static int try_to_find_probe_trace_events(struct perf_probe_event *pev, 892 struct probe_trace_event **tevs) 893{ 894 bool need_dwarf = perf_probe_event_need_dwarf(pev); 895 struct perf_probe_point tmp; 896 struct debuginfo *dinfo; 897 int ntevs, ret = 0; 898 899 dinfo = open_debuginfo(pev->target, pev->nsi, !need_dwarf); 900 if (!dinfo) { 901 if (need_dwarf) 902 return -ENOENT; 903 pr_debug("Could not open debuginfo. Try to use symbols.\n"); 904 return 0; 905 } 906 907 pr_debug("Try to find probe point from debuginfo.\n"); 908 /* Searching trace events corresponding to a probe event */ 909 ntevs = debuginfo__find_trace_events(dinfo, pev, tevs); 910 911 if (ntevs == 0) { /* Not found, retry with an alternative */ 912 ret = get_alternative_probe_event(dinfo, pev, &tmp); 913 if (!ret) { 914 ntevs = debuginfo__find_trace_events(dinfo, pev, tevs); 915 /* 916 * Write back to the original probe_event for 917 * setting appropriate (user given) event name 918 */ 919 clear_perf_probe_point(&pev->point); 920 memcpy(&pev->point, &tmp, sizeof(tmp)); 921 } 922 } 923 924 if (ntevs > 0) { /* Succeeded to find trace events */ 925 pr_debug("Found %d probe_trace_events.\n", ntevs); 926 ret = post_process_probe_trace_events(pev, *tevs, ntevs, 927 pev->target, pev->uprobes, dinfo); 928 if (ret < 0 || ret == ntevs) { 929 pr_debug("Post processing failed or all events are skipped. (%d)\n", ret); 930 clear_probe_trace_events(*tevs, ntevs); 931 zfree(tevs); 932 ntevs = 0; 933 } 934 } 935 936 debuginfo__delete(dinfo); 937 938 if (ntevs == 0) { /* No error but failed to find probe point. */ 939 pr_warning("Probe point '%s' not found.\n", 940 synthesize_perf_probe_point(&pev->point)); 941 return -ENOENT; 942 } else if (ntevs < 0) { 943 /* Error path : ntevs < 0 */ 944 pr_debug("An error occurred in debuginfo analysis (%d).\n", ntevs); 945 if (ntevs == -EBADF) 946 pr_warning("Warning: No dwarf info found in the vmlinux - " 947 "please rebuild kernel with CONFIG_DEBUG_INFO=y.\n"); 948 if (!need_dwarf) { 949 pr_debug("Trying to use symbols.\n"); 950 return 0; 951 } 952 } 953 return ntevs; 954} 955 956#define LINEBUF_SIZE 256 957#define NR_ADDITIONAL_LINES 2 958 959static int __show_one_line(FILE *fp, int l, bool skip, bool show_num) 960{ 961 char buf[LINEBUF_SIZE], sbuf[STRERR_BUFSIZE]; 962 const char *color = show_num ? "" : PERF_COLOR_BLUE; 963 const char *prefix = NULL; 964 965 do { 966 if (fgets(buf, LINEBUF_SIZE, fp) == NULL) 967 goto error; 968 if (skip) 969 continue; 970 if (!prefix) { 971 prefix = show_num ? "%7d " : " "; 972 color_fprintf(stdout, color, prefix, l); 973 } 974 color_fprintf(stdout, color, "%s", buf); 975 976 } while (strchr(buf, '\n') == NULL); 977 978 return 1; 979error: 980 if (ferror(fp)) { 981 pr_warning("File read error: %s\n", 982 str_error_r(errno, sbuf, sizeof(sbuf))); 983 return -1; 984 } 985 return 0; 986} 987 988static int _show_one_line(FILE *fp, int l, bool skip, bool show_num) 989{ 990 int rv = __show_one_line(fp, l, skip, show_num); 991 if (rv == 0) { 992 pr_warning("Source file is shorter than expected.\n"); 993 rv = -1; 994 } 995 return rv; 996} 997 998#define show_one_line_with_num(f,l) _show_one_line(f,l,false,true) 999#define show_one_line(f,l) _show_one_line(f,l,false,false) 1000#define skip_one_line(f,l) _show_one_line(f,l,true,false) 1001#define show_one_line_or_eof(f,l) __show_one_line(f,l,false,false) 1002 1003/* 1004 * Show line-range always requires debuginfo to find source file and 1005 * line number. 1006 */ 1007static int __show_line_range(struct line_range *lr, const char *module, 1008 bool user) 1009{ 1010 struct build_id bid; 1011 int l = 1; 1012 struct int_node *ln; 1013 struct debuginfo *dinfo; 1014 FILE *fp; 1015 int ret; 1016 char *tmp; 1017 char sbuf[STRERR_BUFSIZE]; 1018 char sbuild_id[SBUILD_ID_SIZE] = ""; 1019 1020 /* Search a line range */ 1021 dinfo = open_debuginfo(module, NULL, false); 1022 if (!dinfo) 1023 return -ENOENT; 1024 1025 ret = debuginfo__find_line_range(dinfo, lr); 1026 if (!ret) { /* Not found, retry with an alternative */ 1027 ret = get_alternative_line_range(dinfo, lr, module, user); 1028 if (!ret) 1029 ret = debuginfo__find_line_range(dinfo, lr); 1030 } 1031 if (dinfo->build_id) { 1032 build_id__init(&bid, dinfo->build_id, BUILD_ID_SIZE); 1033 build_id__sprintf(&bid, sbuild_id); 1034 } 1035 debuginfo__delete(dinfo); 1036 if (ret == 0 || ret == -ENOENT) { 1037 pr_warning("Specified source line is not found.\n"); 1038 return -ENOENT; 1039 } else if (ret < 0) { 1040 pr_warning("Debuginfo analysis failed.\n"); 1041 return ret; 1042 } 1043 1044 /* Convert source file path */ 1045 tmp = lr->path; 1046 ret = find_source_path(tmp, sbuild_id, lr->comp_dir, &lr->path); 1047 1048 /* Free old path when new path is assigned */ 1049 if (tmp != lr->path) 1050 free(tmp); 1051 1052 if (ret < 0) { 1053 pr_warning("Failed to find source file path.\n"); 1054 return ret; 1055 } 1056 1057 setup_pager(); 1058 1059 if (lr->function) 1060 fprintf(stdout, "<%s@%s:%d>\n", lr->function, lr->path, 1061 lr->start - lr->offset); 1062 else 1063 fprintf(stdout, "<%s:%d>\n", lr->path, lr->start); 1064 1065 fp = fopen(lr->path, "r"); 1066 if (fp == NULL) { 1067 pr_warning("Failed to open %s: %s\n", lr->path, 1068 str_error_r(errno, sbuf, sizeof(sbuf))); 1069 return -errno; 1070 } 1071 /* Skip to starting line number */ 1072 while (l < lr->start) { 1073 ret = skip_one_line(fp, l++); 1074 if (ret < 0) 1075 goto end; 1076 } 1077 1078 intlist__for_each_entry(ln, lr->line_list) { 1079 for (; ln->i > l; l++) { 1080 ret = show_one_line(fp, l - lr->offset); 1081 if (ret < 0) 1082 goto end; 1083 } 1084 ret = show_one_line_with_num(fp, l++ - lr->offset); 1085 if (ret < 0) 1086 goto end; 1087 } 1088 1089 if (lr->end == INT_MAX) 1090 lr->end = l + NR_ADDITIONAL_LINES; 1091 while (l <= lr->end) { 1092 ret = show_one_line_or_eof(fp, l++ - lr->offset); 1093 if (ret <= 0) 1094 break; 1095 } 1096end: 1097 fclose(fp); 1098 return ret; 1099} 1100 1101int show_line_range(struct line_range *lr, const char *module, 1102 struct nsinfo *nsi, bool user) 1103{ 1104 int ret; 1105 struct nscookie nsc; 1106 1107 ret = init_probe_symbol_maps(user); 1108 if (ret < 0) 1109 return ret; 1110 nsinfo__mountns_enter(nsi, &nsc); 1111 ret = __show_line_range(lr, module, user); 1112 nsinfo__mountns_exit(&nsc); 1113 exit_probe_symbol_maps(); 1114 1115 return ret; 1116} 1117 1118static int show_available_vars_at(struct debuginfo *dinfo, 1119 struct perf_probe_event *pev, 1120 struct strfilter *_filter) 1121{ 1122 char *buf; 1123 int ret, i, nvars; 1124 struct str_node *node; 1125 struct variable_list *vls = NULL, *vl; 1126 struct perf_probe_point tmp; 1127 const char *var; 1128 1129 buf = synthesize_perf_probe_point(&pev->point); 1130 if (!buf) 1131 return -EINVAL; 1132 pr_debug("Searching variables at %s\n", buf); 1133 1134 ret = debuginfo__find_available_vars_at(dinfo, pev, &vls); 1135 if (!ret) { /* Not found, retry with an alternative */ 1136 ret = get_alternative_probe_event(dinfo, pev, &tmp); 1137 if (!ret) { 1138 ret = debuginfo__find_available_vars_at(dinfo, pev, 1139 &vls); 1140 /* Release the old probe_point */ 1141 clear_perf_probe_point(&tmp); 1142 } 1143 } 1144 if (ret <= 0) { 1145 if (ret == 0 || ret == -ENOENT) { 1146 pr_err("Failed to find the address of %s\n", buf); 1147 ret = -ENOENT; 1148 } else 1149 pr_warning("Debuginfo analysis failed.\n"); 1150 goto end; 1151 } 1152 1153 /* Some variables are found */ 1154 fprintf(stdout, "Available variables at %s\n", buf); 1155 for (i = 0; i < ret; i++) { 1156 vl = &vls[i]; 1157 /* 1158 * A probe point might be converted to 1159 * several trace points. 1160 */ 1161 fprintf(stdout, "\t@<%s+%lu>\n", vl->point.symbol, 1162 vl->point.offset); 1163 zfree(&vl->point.symbol); 1164 nvars = 0; 1165 if (vl->vars) { 1166 strlist__for_each_entry(node, vl->vars) { 1167 var = strchr(node->s, '\t') + 1; 1168 if (strfilter__compare(_filter, var)) { 1169 fprintf(stdout, "\t\t%s\n", node->s); 1170 nvars++; 1171 } 1172 } 1173 strlist__delete(vl->vars); 1174 } 1175 if (nvars == 0) 1176 fprintf(stdout, "\t\t(No matched variables)\n"); 1177 } 1178 free(vls); 1179end: 1180 free(buf); 1181 return ret; 1182} 1183 1184/* Show available variables on given probe point */ 1185int show_available_vars(struct perf_probe_event *pevs, int npevs, 1186 struct strfilter *_filter) 1187{ 1188 int i, ret = 0; 1189 struct debuginfo *dinfo; 1190 1191 ret = init_probe_symbol_maps(pevs->uprobes); 1192 if (ret < 0) 1193 return ret; 1194 1195 dinfo = open_debuginfo(pevs->target, pevs->nsi, false); 1196 if (!dinfo) { 1197 ret = -ENOENT; 1198 goto out; 1199 } 1200 1201 setup_pager(); 1202 1203 for (i = 0; i < npevs && ret >= 0; i++) 1204 ret = show_available_vars_at(dinfo, &pevs[i], _filter); 1205 1206 debuginfo__delete(dinfo); 1207out: 1208 exit_probe_symbol_maps(); 1209 return ret; 1210} 1211 1212#else /* !HAVE_DWARF_SUPPORT */ 1213 1214static void debuginfo_cache__exit(void) 1215{ 1216} 1217 1218static int 1219find_perf_probe_point_from_dwarf(struct probe_trace_point *tp __maybe_unused, 1220 struct perf_probe_point *pp __maybe_unused, 1221 bool is_kprobe __maybe_unused) 1222{ 1223 return -ENOSYS; 1224} 1225 1226static int try_to_find_probe_trace_events(struct perf_probe_event *pev, 1227 struct probe_trace_event **tevs __maybe_unused) 1228{ 1229 if (perf_probe_event_need_dwarf(pev)) { 1230 pr_warning("Debuginfo-analysis is not supported.\n"); 1231 return -ENOSYS; 1232 } 1233 1234 return 0; 1235} 1236 1237int show_line_range(struct line_range *lr __maybe_unused, 1238 const char *module __maybe_unused, 1239 struct nsinfo *nsi __maybe_unused, 1240 bool user __maybe_unused) 1241{ 1242 pr_warning("Debuginfo-analysis is not supported.\n"); 1243 return -ENOSYS; 1244} 1245 1246int show_available_vars(struct perf_probe_event *pevs __maybe_unused, 1247 int npevs __maybe_unused, 1248 struct strfilter *filter __maybe_unused) 1249{ 1250 pr_warning("Debuginfo-analysis is not supported.\n"); 1251 return -ENOSYS; 1252} 1253#endif 1254 1255void line_range__clear(struct line_range *lr) 1256{ 1257 zfree(&lr->function); 1258 zfree(&lr->file); 1259 zfree(&lr->path); 1260 zfree(&lr->comp_dir); 1261 intlist__delete(lr->line_list); 1262} 1263 1264int line_range__init(struct line_range *lr) 1265{ 1266 memset(lr, 0, sizeof(*lr)); 1267 lr->line_list = intlist__new(NULL); 1268 if (!lr->line_list) 1269 return -ENOMEM; 1270 else 1271 return 0; 1272} 1273 1274static int parse_line_num(char **ptr, int *val, const char *what) 1275{ 1276 const char *start = *ptr; 1277 1278 errno = 0; 1279 *val = strtol(*ptr, ptr, 0); 1280 if (errno || *ptr == start) { 1281 semantic_error("'%s' is not a valid number.\n", what); 1282 return -EINVAL; 1283 } 1284 return 0; 1285} 1286 1287/* Check the name is good for event, group or function */ 1288static bool is_c_func_name(const char *name) 1289{ 1290 if (!isalpha(*name) && *name != '_') 1291 return false; 1292 while (*++name != '\0') { 1293 if (!isalpha(*name) && !isdigit(*name) && *name != '_') 1294 return false; 1295 } 1296 return true; 1297} 1298 1299/* 1300 * Stuff 'lr' according to the line range described by 'arg'. 1301 * The line range syntax is described by: 1302 * 1303 * SRC[:SLN[+NUM|-ELN]] 1304 * FNC[@SRC][:SLN[+NUM|-ELN]] 1305 */ 1306int parse_line_range_desc(const char *arg, struct line_range *lr) 1307{ 1308 char *range, *file, *name = strdup(arg); 1309 int err; 1310 1311 if (!name) 1312 return -ENOMEM; 1313 1314 lr->start = 0; 1315 lr->end = INT_MAX; 1316 1317 range = strchr(name, ':'); 1318 if (range) { 1319 *range++ = '\0'; 1320 1321 err = parse_line_num(&range, &lr->start, "start line"); 1322 if (err) 1323 goto err; 1324 1325 if (*range == '+' || *range == '-') { 1326 const char c = *range++; 1327 1328 err = parse_line_num(&range, &lr->end, "end line"); 1329 if (err) 1330 goto err; 1331 1332 if (c == '+') { 1333 lr->end += lr->start; 1334 /* 1335 * Adjust the number of lines here. 1336 * If the number of lines == 1, the 1337 * the end of line should be equal to 1338 * the start of line. 1339 */ 1340 lr->end--; 1341 } 1342 } 1343 1344 pr_debug("Line range is %d to %d\n", lr->start, lr->end); 1345 1346 err = -EINVAL; 1347 if (lr->start > lr->end) { 1348 semantic_error("Start line must be smaller" 1349 " than end line.\n"); 1350 goto err; 1351 } 1352 if (*range != '\0') { 1353 semantic_error("Tailing with invalid str '%s'.\n", range); 1354 goto err; 1355 } 1356 } 1357 1358 file = strchr(name, '@'); 1359 if (file) { 1360 *file = '\0'; 1361 lr->file = strdup(++file); 1362 if (lr->file == NULL) { 1363 err = -ENOMEM; 1364 goto err; 1365 } 1366 lr->function = name; 1367 } else if (strchr(name, '/') || strchr(name, '.')) 1368 lr->file = name; 1369 else if (is_c_func_name(name))/* We reuse it for checking funcname */ 1370 lr->function = name; 1371 else { /* Invalid name */ 1372 semantic_error("'%s' is not a valid function name.\n", name); 1373 err = -EINVAL; 1374 goto err; 1375 } 1376 1377 return 0; 1378err: 1379 free(name); 1380 return err; 1381} 1382 1383static int parse_perf_probe_event_name(char **arg, struct perf_probe_event *pev) 1384{ 1385 char *ptr; 1386 1387 ptr = strpbrk_esc(*arg, ":"); 1388 if (ptr) { 1389 *ptr = '\0'; 1390 if (!pev->sdt && !is_c_func_name(*arg)) 1391 goto ng_name; 1392 pev->group = strdup_esc(*arg); 1393 if (!pev->group) 1394 return -ENOMEM; 1395 *arg = ptr + 1; 1396 } else 1397 pev->group = NULL; 1398 1399 pev->event = strdup_esc(*arg); 1400 if (pev->event == NULL) 1401 return -ENOMEM; 1402 1403 if (!pev->sdt && !is_c_func_name(pev->event)) { 1404 zfree(&pev->event); 1405ng_name: 1406 zfree(&pev->group); 1407 semantic_error("%s is bad for event name -it must " 1408 "follow C symbol-naming rule.\n", *arg); 1409 return -EINVAL; 1410 } 1411 return 0; 1412} 1413 1414/* Parse probepoint definition. */ 1415static int parse_perf_probe_point(char *arg, struct perf_probe_event *pev) 1416{ 1417 struct perf_probe_point *pp = &pev->point; 1418 char *ptr, *tmp; 1419 char c, nc = 0; 1420 bool file_spec = false; 1421 int ret; 1422 1423 /* 1424 * <Syntax> 1425 * perf probe [GRP:][EVENT=]SRC[:LN|;PTN] 1426 * perf probe [GRP:][EVENT=]FUNC[@SRC][+OFFS|%return|:LN|;PAT] 1427 * perf probe %[GRP:]SDT_EVENT 1428 */ 1429 if (!arg) 1430 return -EINVAL; 1431 1432 if (is_sdt_event(arg)) { 1433 pev->sdt = true; 1434 if (arg[0] == '%') 1435 arg++; 1436 } 1437 1438 ptr = strpbrk_esc(arg, ";=@+%"); 1439 if (pev->sdt) { 1440 if (ptr) { 1441 if (*ptr != '@') { 1442 semantic_error("%s must be an SDT name.\n", 1443 arg); 1444 return -EINVAL; 1445 } 1446 /* This must be a target file name or build id */ 1447 tmp = build_id_cache__complement(ptr + 1); 1448 if (tmp) { 1449 pev->target = build_id_cache__origname(tmp); 1450 free(tmp); 1451 } else 1452 pev->target = strdup_esc(ptr + 1); 1453 if (!pev->target) 1454 return -ENOMEM; 1455 *ptr = '\0'; 1456 } 1457 ret = parse_perf_probe_event_name(&arg, pev); 1458 if (ret == 0) { 1459 if (asprintf(&pev->point.function, "%%%s", pev->event) < 0) 1460 ret = -errno; 1461 } 1462 return ret; 1463 } 1464 1465 if (ptr && *ptr == '=') { /* Event name */ 1466 *ptr = '\0'; 1467 tmp = ptr + 1; 1468 ret = parse_perf_probe_event_name(&arg, pev); 1469 if (ret < 0) 1470 return ret; 1471 1472 arg = tmp; 1473 } 1474 1475 /* 1476 * Check arg is function or file name and copy it. 1477 * 1478 * We consider arg to be a file spec if and only if it satisfies 1479 * all of the below criteria:: 1480 * - it does not include any of "+@%", 1481 * - it includes one of ":;", and 1482 * - it has a period '.' in the name. 1483 * 1484 * Otherwise, we consider arg to be a function specification. 1485 */ 1486 if (!strpbrk_esc(arg, "+@%")) { 1487 ptr = strpbrk_esc(arg, ";:"); 1488 /* This is a file spec if it includes a '.' before ; or : */ 1489 if (ptr && memchr(arg, '.', ptr - arg)) 1490 file_spec = true; 1491 } 1492 1493 ptr = strpbrk_esc(arg, ";:+@%"); 1494 if (ptr) { 1495 nc = *ptr; 1496 *ptr++ = '\0'; 1497 } 1498 1499 if (arg[0] == '\0') 1500 tmp = NULL; 1501 else { 1502 tmp = strdup_esc(arg); 1503 if (tmp == NULL) 1504 return -ENOMEM; 1505 } 1506 1507 if (file_spec) 1508 pp->file = tmp; 1509 else { 1510 pp->function = tmp; 1511 1512 /* 1513 * Keep pp->function even if this is absolute address, 1514 * so it can mark whether abs_address is valid. 1515 * Which make 'perf probe lib.bin 0x0' possible. 1516 * 1517 * Note that checking length of tmp is not needed 1518 * because when we access tmp[1] we know tmp[0] is '0', 1519 * so tmp[1] should always valid (but could be '\0'). 1520 */ 1521 if (tmp && !strncmp(tmp, "0x", 2)) { 1522 pp->abs_address = strtoul(pp->function, &tmp, 0); 1523 if (*tmp != '\0') { 1524 semantic_error("Invalid absolute address.\n"); 1525 return -EINVAL; 1526 } 1527 } 1528 } 1529 1530 /* Parse other options */ 1531 while (ptr) { 1532 arg = ptr; 1533 c = nc; 1534 if (c == ';') { /* Lazy pattern must be the last part */ 1535 pp->lazy_line = strdup(arg); /* let leave escapes */ 1536 if (pp->lazy_line == NULL) 1537 return -ENOMEM; 1538 break; 1539 } 1540 ptr = strpbrk_esc(arg, ";:+@%"); 1541 if (ptr) { 1542 nc = *ptr; 1543 *ptr++ = '\0'; 1544 } 1545 switch (c) { 1546 case ':': /* Line number */ 1547 pp->line = strtoul(arg, &tmp, 0); 1548 if (*tmp != '\0') { 1549 semantic_error("There is non-digit char" 1550 " in line number.\n"); 1551 return -EINVAL; 1552 } 1553 break; 1554 case '+': /* Byte offset from a symbol */ 1555 pp->offset = strtoul(arg, &tmp, 0); 1556 if (*tmp != '\0') { 1557 semantic_error("There is non-digit character" 1558 " in offset.\n"); 1559 return -EINVAL; 1560 } 1561 break; 1562 case '@': /* File name */ 1563 if (pp->file) { 1564 semantic_error("SRC@SRC is not allowed.\n"); 1565 return -EINVAL; 1566 } 1567 pp->file = strdup_esc(arg); 1568 if (pp->file == NULL) 1569 return -ENOMEM; 1570 break; 1571 case '%': /* Probe places */ 1572 if (strcmp(arg, "return") == 0) { 1573 pp->retprobe = 1; 1574 } else { /* Others not supported yet */ 1575 semantic_error("%%%s is not supported.\n", arg); 1576 return -ENOTSUP; 1577 } 1578 break; 1579 default: /* Buggy case */ 1580 pr_err("This program has a bug at %s:%d.\n", 1581 __FILE__, __LINE__); 1582 return -ENOTSUP; 1583 break; 1584 } 1585 } 1586 1587 /* Exclusion check */ 1588 if (pp->lazy_line && pp->line) { 1589 semantic_error("Lazy pattern can't be used with" 1590 " line number.\n"); 1591 return -EINVAL; 1592 } 1593 1594 if (pp->lazy_line && pp->offset) { 1595 semantic_error("Lazy pattern can't be used with offset.\n"); 1596 return -EINVAL; 1597 } 1598 1599 if (pp->line && pp->offset) { 1600 semantic_error("Offset can't be used with line number.\n"); 1601 return -EINVAL; 1602 } 1603 1604 if (!pp->line && !pp->lazy_line && pp->file && !pp->function) { 1605 semantic_error("File always requires line number or " 1606 "lazy pattern.\n"); 1607 return -EINVAL; 1608 } 1609 1610 if (pp->offset && !pp->function) { 1611 semantic_error("Offset requires an entry function.\n"); 1612 return -EINVAL; 1613 } 1614 1615 if ((pp->offset || pp->line || pp->lazy_line) && pp->retprobe) { 1616 semantic_error("Offset/Line/Lazy pattern can't be used with " 1617 "return probe.\n"); 1618 return -EINVAL; 1619 } 1620 1621 pr_debug("symbol:%s file:%s line:%d offset:%lu return:%d lazy:%s\n", 1622 pp->function, pp->file, pp->line, pp->offset, pp->retprobe, 1623 pp->lazy_line); 1624 return 0; 1625} 1626 1627/* Parse perf-probe event argument */ 1628static int parse_perf_probe_arg(char *str, struct perf_probe_arg *arg) 1629{ 1630 char *tmp, *goodname; 1631 struct perf_probe_arg_field **fieldp; 1632 1633 pr_debug("parsing arg: %s into ", str); 1634 1635 tmp = strchr(str, '='); 1636 if (tmp) { 1637 arg->name = strndup(str, tmp - str); 1638 if (arg->name == NULL) 1639 return -ENOMEM; 1640 pr_debug("name:%s ", arg->name); 1641 str = tmp + 1; 1642 } 1643 1644 tmp = strchr(str, '@'); 1645 if (tmp && tmp != str && !strcmp(tmp + 1, "user")) { /* user attr */ 1646 if (!user_access_is_supported()) { 1647 semantic_error("ftrace does not support user access\n"); 1648 return -EINVAL; 1649 } 1650 *tmp = '\0'; 1651 arg->user_access = true; 1652 pr_debug("user_access "); 1653 } 1654 1655 tmp = strchr(str, ':'); 1656 if (tmp) { /* Type setting */ 1657 *tmp = '\0'; 1658 arg->type = strdup(tmp + 1); 1659 if (arg->type == NULL) 1660 return -ENOMEM; 1661 pr_debug("type:%s ", arg->type); 1662 } 1663 1664 tmp = strpbrk(str, "-.["); 1665 if (!is_c_varname(str) || !tmp) { 1666 /* A variable, register, symbol or special value */ 1667 arg->var = strdup(str); 1668 if (arg->var == NULL) 1669 return -ENOMEM; 1670 pr_debug("%s\n", arg->var); 1671 return 0; 1672 } 1673 1674 /* Structure fields or array element */ 1675 arg->var = strndup(str, tmp - str); 1676 if (arg->var == NULL) 1677 return -ENOMEM; 1678 goodname = arg->var; 1679 pr_debug("%s, ", arg->var); 1680 fieldp = &arg->field; 1681 1682 do { 1683 *fieldp = zalloc(sizeof(struct perf_probe_arg_field)); 1684 if (*fieldp == NULL) 1685 return -ENOMEM; 1686 if (*tmp == '[') { /* Array */ 1687 str = tmp; 1688 (*fieldp)->index = strtol(str + 1, &tmp, 0); 1689 (*fieldp)->ref = true; 1690 if (*tmp != ']' || tmp == str + 1) { 1691 semantic_error("Array index must be a" 1692 " number.\n"); 1693 return -EINVAL; 1694 } 1695 tmp++; 1696 if (*tmp == '\0') 1697 tmp = NULL; 1698 } else { /* Structure */ 1699 if (*tmp == '.') { 1700 str = tmp + 1; 1701 (*fieldp)->ref = false; 1702 } else if (tmp[1] == '>') { 1703 str = tmp + 2; 1704 (*fieldp)->ref = true; 1705 } else { 1706 semantic_error("Argument parse error: %s\n", 1707 str); 1708 return -EINVAL; 1709 } 1710 tmp = strpbrk(str, "-.["); 1711 } 1712 if (tmp) { 1713 (*fieldp)->name = strndup(str, tmp - str); 1714 if ((*fieldp)->name == NULL) 1715 return -ENOMEM; 1716 if (*str != '[') 1717 goodname = (*fieldp)->name; 1718 pr_debug("%s(%d), ", (*fieldp)->name, (*fieldp)->ref); 1719 fieldp = &(*fieldp)->next; 1720 } 1721 } while (tmp); 1722 (*fieldp)->name = strdup(str); 1723 if ((*fieldp)->name == NULL) 1724 return -ENOMEM; 1725 if (*str != '[') 1726 goodname = (*fieldp)->name; 1727 pr_debug("%s(%d)\n", (*fieldp)->name, (*fieldp)->ref); 1728 1729 /* If no name is specified, set the last field name (not array index)*/ 1730 if (!arg->name) { 1731 arg->name = strdup(goodname); 1732 if (arg->name == NULL) 1733 return -ENOMEM; 1734 } 1735 return 0; 1736} 1737 1738/* Parse perf-probe event command */ 1739int parse_perf_probe_command(const char *cmd, struct perf_probe_event *pev) 1740{ 1741 char **argv; 1742 int argc, i, ret = 0; 1743 1744 argv = argv_split(cmd, &argc); 1745 if (!argv) { 1746 pr_debug("Failed to split arguments.\n"); 1747 return -ENOMEM; 1748 } 1749 if (argc - 1 > MAX_PROBE_ARGS) { 1750 semantic_error("Too many probe arguments (%d).\n", argc - 1); 1751 ret = -ERANGE; 1752 goto out; 1753 } 1754 /* Parse probe point */ 1755 ret = parse_perf_probe_point(argv[0], pev); 1756 if (ret < 0) 1757 goto out; 1758 1759 /* Generate event name if needed */ 1760 if (!pev->event && pev->point.function && pev->point.line 1761 && !pev->point.lazy_line && !pev->point.offset) { 1762 if (asprintf(&pev->event, "%s_L%d", pev->point.function, 1763 pev->point.line) < 0) { 1764 ret = -ENOMEM; 1765 goto out; 1766 } 1767 } 1768 1769 /* Copy arguments and ensure return probe has no C argument */ 1770 pev->nargs = argc - 1; 1771 pev->args = zalloc(sizeof(struct perf_probe_arg) * pev->nargs); 1772 if (pev->args == NULL) { 1773 ret = -ENOMEM; 1774 goto out; 1775 } 1776 for (i = 0; i < pev->nargs && ret >= 0; i++) { 1777 ret = parse_perf_probe_arg(argv[i + 1], &pev->args[i]); 1778 if (ret >= 0 && 1779 is_c_varname(pev->args[i].var) && pev->point.retprobe) { 1780 semantic_error("You can't specify local variable for" 1781 " kretprobe.\n"); 1782 ret = -EINVAL; 1783 } 1784 } 1785out: 1786 argv_free(argv); 1787 1788 return ret; 1789} 1790 1791/* Returns true if *any* ARG is either C variable, $params or $vars. */ 1792bool perf_probe_with_var(struct perf_probe_event *pev) 1793{ 1794 int i = 0; 1795 1796 for (i = 0; i < pev->nargs; i++) 1797 if (is_c_varname(pev->args[i].var) || 1798 !strcmp(pev->args[i].var, PROBE_ARG_PARAMS) || 1799 !strcmp(pev->args[i].var, PROBE_ARG_VARS)) 1800 return true; 1801 return false; 1802} 1803 1804/* Return true if this perf_probe_event requires debuginfo */ 1805bool perf_probe_event_need_dwarf(struct perf_probe_event *pev) 1806{ 1807 if (pev->point.file || pev->point.line || pev->point.lazy_line) 1808 return true; 1809 1810 if (perf_probe_with_var(pev)) 1811 return true; 1812 1813 return false; 1814} 1815 1816/* Parse probe_events event into struct probe_point */ 1817int parse_probe_trace_command(const char *cmd, struct probe_trace_event *tev) 1818{ 1819 struct probe_trace_point *tp = &tev->point; 1820 char pr; 1821 char *p; 1822 char *argv0_str = NULL, *fmt, *fmt1_str, *fmt2_str, *fmt3_str; 1823 int ret, i, argc; 1824 char **argv; 1825 1826 pr_debug("Parsing probe_events: %s\n", cmd); 1827 argv = argv_split(cmd, &argc); 1828 if (!argv) { 1829 pr_debug("Failed to split arguments.\n"); 1830 return -ENOMEM; 1831 } 1832 if (argc < 2) { 1833 semantic_error("Too few probe arguments.\n"); 1834 ret = -ERANGE; 1835 goto out; 1836 } 1837 1838 /* Scan event and group name. */ 1839 argv0_str = strdup(argv[0]); 1840 if (argv0_str == NULL) { 1841 ret = -ENOMEM; 1842 goto out; 1843 } 1844 fmt1_str = strtok_r(argv0_str, ":", &fmt); 1845 fmt2_str = strtok_r(NULL, "/", &fmt); 1846 fmt3_str = strtok_r(NULL, " \t", &fmt); 1847 if (fmt1_str == NULL || fmt2_str == NULL || fmt3_str == NULL) { 1848 semantic_error("Failed to parse event name: %s\n", argv[0]); 1849 ret = -EINVAL; 1850 goto out; 1851 } 1852 pr = fmt1_str[0]; 1853 tev->group = strdup(fmt2_str); 1854 tev->event = strdup(fmt3_str); 1855 if (tev->group == NULL || tev->event == NULL) { 1856 ret = -ENOMEM; 1857 goto out; 1858 } 1859 pr_debug("Group:%s Event:%s probe:%c\n", tev->group, tev->event, pr); 1860 1861 tp->retprobe = (pr == 'r'); 1862 1863 /* Scan module name(if there), function name and offset */ 1864 p = strchr(argv[1], ':'); 1865 if (p) { 1866 tp->module = strndup(argv[1], p - argv[1]); 1867 if (!tp->module) { 1868 ret = -ENOMEM; 1869 goto out; 1870 } 1871 tev->uprobes = (tp->module[0] == '/'); 1872 p++; 1873 } else 1874 p = argv[1]; 1875 fmt1_str = strtok_r(p, "+", &fmt); 1876 /* only the address started with 0x */ 1877 if (fmt1_str[0] == '0') { 1878 /* 1879 * Fix a special case: 1880 * if address == 0, kernel reports something like: 1881 * p:probe_libc/abs_0 /lib/libc-2.18.so:0x (null) arg1=%ax 1882 * Newer kernel may fix that, but we want to 1883 * support old kernel also. 1884 */ 1885 if (strcmp(fmt1_str, "0x") == 0) { 1886 if (!argv[2] || strcmp(argv[2], "(null)")) { 1887 ret = -EINVAL; 1888 goto out; 1889 } 1890 tp->address = 0; 1891 1892 free(argv[2]); 1893 for (i = 2; argv[i + 1] != NULL; i++) 1894 argv[i] = argv[i + 1]; 1895 1896 argv[i] = NULL; 1897 argc -= 1; 1898 } else 1899 tp->address = strtoul(fmt1_str, NULL, 0); 1900 } else { 1901 /* Only the symbol-based probe has offset */ 1902 tp->symbol = strdup(fmt1_str); 1903 if (tp->symbol == NULL) { 1904 ret = -ENOMEM; 1905 goto out; 1906 } 1907 fmt2_str = strtok_r(NULL, "", &fmt); 1908 if (fmt2_str == NULL) 1909 tp->offset = 0; 1910 else 1911 tp->offset = strtoul(fmt2_str, NULL, 10); 1912 } 1913 1914 if (tev->uprobes) { 1915 fmt2_str = strchr(p, '('); 1916 if (fmt2_str) 1917 tp->ref_ctr_offset = strtoul(fmt2_str + 1, NULL, 0); 1918 } 1919 1920 tev->nargs = argc - 2; 1921 tev->args = zalloc(sizeof(struct probe_trace_arg) * tev->nargs); 1922 if (tev->args == NULL) { 1923 ret = -ENOMEM; 1924 goto out; 1925 } 1926 for (i = 0; i < tev->nargs; i++) { 1927 p = strchr(argv[i + 2], '='); 1928 if (p) /* We don't need which register is assigned. */ 1929 *p++ = '\0'; 1930 else 1931 p = argv[i + 2]; 1932 tev->args[i].name = strdup(argv[i + 2]); 1933 /* TODO: parse regs and offset */ 1934 tev->args[i].value = strdup(p); 1935 if (tev->args[i].name == NULL || tev->args[i].value == NULL) { 1936 ret = -ENOMEM; 1937 goto out; 1938 } 1939 } 1940 ret = 0; 1941out: 1942 free(argv0_str); 1943 argv_free(argv); 1944 return ret; 1945} 1946 1947/* Compose only probe arg */ 1948char *synthesize_perf_probe_arg(struct perf_probe_arg *pa) 1949{ 1950 struct perf_probe_arg_field *field = pa->field; 1951 struct strbuf buf; 1952 char *ret = NULL; 1953 int err; 1954 1955 if (strbuf_init(&buf, 64) < 0) 1956 return NULL; 1957 1958 if (pa->name && pa->var) 1959 err = strbuf_addf(&buf, "%s=%s", pa->name, pa->var); 1960 else 1961 err = strbuf_addstr(&buf, pa->name ?: pa->var); 1962 if (err) 1963 goto out; 1964 1965 while (field) { 1966 if (field->name[0] == '[') 1967 err = strbuf_addstr(&buf, field->name); 1968 else 1969 err = strbuf_addf(&buf, "%s%s", field->ref ? "->" : ".", 1970 field->name); 1971 field = field->next; 1972 if (err) 1973 goto out; 1974 } 1975 1976 if (pa->type) 1977 if (strbuf_addf(&buf, ":%s", pa->type) < 0) 1978 goto out; 1979 1980 ret = strbuf_detach(&buf, NULL); 1981out: 1982 strbuf_release(&buf); 1983 return ret; 1984} 1985 1986/* Compose only probe point (not argument) */ 1987char *synthesize_perf_probe_point(struct perf_probe_point *pp) 1988{ 1989 struct strbuf buf; 1990 char *tmp, *ret = NULL; 1991 int len, err = 0; 1992 1993 if (strbuf_init(&buf, 64) < 0) 1994 return NULL; 1995 1996 if (pp->function) { 1997 if (strbuf_addstr(&buf, pp->function) < 0) 1998 goto out; 1999 if (pp->offset) 2000 err = strbuf_addf(&buf, "+%lu", pp->offset); 2001 else if (pp->line) 2002 err = strbuf_addf(&buf, ":%d", pp->line); 2003 else if (pp->retprobe) 2004 err = strbuf_addstr(&buf, "%return"); 2005 if (err) 2006 goto out; 2007 } 2008 if (pp->file) { 2009 tmp = pp->file; 2010 len = strlen(tmp); 2011 if (len > 30) { 2012 tmp = strchr(pp->file + len - 30, '/'); 2013 tmp = tmp ? tmp + 1 : pp->file + len - 30; 2014 } 2015 err = strbuf_addf(&buf, "@%s", tmp); 2016 if (!err && !pp->function && pp->line) 2017 err = strbuf_addf(&buf, ":%d", pp->line); 2018 } 2019 if (!err) 2020 ret = strbuf_detach(&buf, NULL); 2021out: 2022 strbuf_release(&buf); 2023 return ret; 2024} 2025 2026char *synthesize_perf_probe_command(struct perf_probe_event *pev) 2027{ 2028 struct strbuf buf; 2029 char *tmp, *ret = NULL; 2030 int i; 2031 2032 if (strbuf_init(&buf, 64)) 2033 return NULL; 2034 if (pev->event) 2035 if (strbuf_addf(&buf, "%s:%s=", pev->group ?: PERFPROBE_GROUP, 2036 pev->event) < 0) 2037 goto out; 2038 2039 tmp = synthesize_perf_probe_point(&pev->point); 2040 if (!tmp || strbuf_addstr(&buf, tmp) < 0) 2041 goto out; 2042 free(tmp); 2043 2044 for (i = 0; i < pev->nargs; i++) { 2045 tmp = synthesize_perf_probe_arg(pev->args + i); 2046 if (!tmp || strbuf_addf(&buf, " %s", tmp) < 0) 2047 goto out; 2048 free(tmp); 2049 } 2050 2051 ret = strbuf_detach(&buf, NULL); 2052out: 2053 strbuf_release(&buf); 2054 return ret; 2055} 2056 2057static int __synthesize_probe_trace_arg_ref(struct probe_trace_arg_ref *ref, 2058 struct strbuf *buf, int depth) 2059{ 2060 int err; 2061 if (ref->next) { 2062 depth = __synthesize_probe_trace_arg_ref(ref->next, buf, 2063 depth + 1); 2064 if (depth < 0) 2065 return depth; 2066 } 2067 if (ref->user_access) 2068 err = strbuf_addf(buf, "%s%ld(", "+u", ref->offset); 2069 else 2070 err = strbuf_addf(buf, "%+ld(", ref->offset); 2071 return (err < 0) ? err : depth; 2072} 2073 2074static int synthesize_probe_trace_arg(struct probe_trace_arg *arg, 2075 struct strbuf *buf) 2076{ 2077 struct probe_trace_arg_ref *ref = arg->ref; 2078 int depth = 0, err; 2079 2080 /* Argument name or separator */ 2081 if (arg->name) 2082 err = strbuf_addf(buf, " %s=", arg->name); 2083 else 2084 err = strbuf_addch(buf, ' '); 2085 if (err) 2086 return err; 2087 2088 /* Special case: @XXX */ 2089 if (arg->value[0] == '@' && arg->ref) 2090 ref = ref->next; 2091 2092 /* Dereferencing arguments */ 2093 if (ref) { 2094 depth = __synthesize_probe_trace_arg_ref(ref, buf, 1); 2095 if (depth < 0) 2096 return depth; 2097 } 2098 2099 /* Print argument value */ 2100 if (arg->value[0] == '@' && arg->ref) 2101 err = strbuf_addf(buf, "%s%+ld", arg->value, arg->ref->offset); 2102 else 2103 err = strbuf_addstr(buf, arg->value); 2104 2105 /* Closing */ 2106 while (!err && depth--) 2107 err = strbuf_addch(buf, ')'); 2108 2109 /* Print argument type */ 2110 if (!err && arg->type) 2111 err = strbuf_addf(buf, ":%s", arg->type); 2112 2113 return err; 2114} 2115 2116static int 2117synthesize_uprobe_trace_def(struct probe_trace_event *tev, struct strbuf *buf) 2118{ 2119 struct probe_trace_point *tp = &tev->point; 2120 int err; 2121 2122 err = strbuf_addf(buf, "%s:0x%lx", tp->module, tp->address); 2123 2124 if (err >= 0 && tp->ref_ctr_offset) { 2125 if (!uprobe_ref_ctr_is_supported()) 2126 return -1; 2127 err = strbuf_addf(buf, "(0x%lx)", tp->ref_ctr_offset); 2128 } 2129 return err >= 0 ? 0 : -1; 2130} 2131 2132char *synthesize_probe_trace_command(struct probe_trace_event *tev) 2133{ 2134 struct probe_trace_point *tp = &tev->point; 2135 struct strbuf buf; 2136 char *ret = NULL; 2137 int i, err; 2138 2139 /* Uprobes must have tp->module */ 2140 if (tev->uprobes && !tp->module) 2141 return NULL; 2142 2143 if (strbuf_init(&buf, 32) < 0) 2144 return NULL; 2145 2146 if (strbuf_addf(&buf, "%c:%s/%s ", tp->retprobe ? 'r' : 'p', 2147 tev->group, tev->event) < 0) 2148 goto error; 2149 /* 2150 * If tp->address == 0, then this point must be a 2151 * absolute address uprobe. 2152 * try_to_find_absolute_address() should have made 2153 * tp->symbol to "0x0". 2154 */ 2155 if (tev->uprobes && !tp->address) { 2156 if (!tp->symbol || strcmp(tp->symbol, "0x0")) 2157 goto error; 2158 } 2159 2160 /* Use the tp->address for uprobes */ 2161 if (tev->uprobes) { 2162 err = synthesize_uprobe_trace_def(tev, &buf); 2163 } else if (!strncmp(tp->symbol, "0x", 2)) { 2164 /* Absolute address. See try_to_find_absolute_address() */ 2165 err = strbuf_addf(&buf, "%s%s0x%lx", tp->module ?: "", 2166 tp->module ? ":" : "", tp->address); 2167 } else { 2168 err = strbuf_addf(&buf, "%s%s%s+%lu", tp->module ?: "", 2169 tp->module ? ":" : "", tp->symbol, tp->offset); 2170 } 2171 2172 if (err) 2173 goto error; 2174 2175 for (i = 0; i < tev->nargs; i++) 2176 if (synthesize_probe_trace_arg(&tev->args[i], &buf) < 0) 2177 goto error; 2178 2179 ret = strbuf_detach(&buf, NULL); 2180error: 2181 strbuf_release(&buf); 2182 return ret; 2183} 2184 2185static int find_perf_probe_point_from_map(struct probe_trace_point *tp, 2186 struct perf_probe_point *pp, 2187 bool is_kprobe) 2188{ 2189 struct symbol *sym = NULL; 2190 struct map *map = NULL; 2191 u64 addr = tp->address; 2192 int ret = -ENOENT; 2193 2194 if (!is_kprobe) { 2195 map = dso__new_map(tp->module); 2196 if (!map) 2197 goto out; 2198 sym = map__find_symbol(map, addr); 2199 } else { 2200 if (tp->symbol && !addr) { 2201 if (kernel_get_symbol_address_by_name(tp->symbol, 2202 &addr, true, false) < 0) 2203 goto out; 2204 } 2205 if (addr) { 2206 addr += tp->offset; 2207 sym = machine__find_kernel_symbol(host_machine, addr, &map); 2208 } 2209 } 2210 2211 if (!sym) 2212 goto out; 2213 2214 pp->retprobe = tp->retprobe; 2215 pp->offset = addr - map->unmap_ip(map, sym->start); 2216 pp->function = strdup(sym->name); 2217 ret = pp->function ? 0 : -ENOMEM; 2218 2219out: 2220 if (map && !is_kprobe) { 2221 map__put(map); 2222 } 2223 2224 return ret; 2225} 2226 2227static int convert_to_perf_probe_point(struct probe_trace_point *tp, 2228 struct perf_probe_point *pp, 2229 bool is_kprobe) 2230{ 2231 char buf[128]; 2232 int ret; 2233 2234 ret = find_perf_probe_point_from_dwarf(tp, pp, is_kprobe); 2235 if (!ret) 2236 return 0; 2237 ret = find_perf_probe_point_from_map(tp, pp, is_kprobe); 2238 if (!ret) 2239 return 0; 2240 2241 pr_debug("Failed to find probe point from both of dwarf and map.\n"); 2242 2243 if (tp->symbol) { 2244 pp->function = strdup(tp->symbol); 2245 pp->offset = tp->offset; 2246 } else { 2247 ret = e_snprintf(buf, 128, "0x%" PRIx64, (u64)tp->address); 2248 if (ret < 0) 2249 return ret; 2250 pp->function = strdup(buf); 2251 pp->offset = 0; 2252 } 2253 if (pp->function == NULL) 2254 return -ENOMEM; 2255 2256 pp->retprobe = tp->retprobe; 2257 2258 return 0; 2259} 2260 2261static int convert_to_perf_probe_event(struct probe_trace_event *tev, 2262 struct perf_probe_event *pev, bool is_kprobe) 2263{ 2264 struct strbuf buf = STRBUF_INIT; 2265 int i, ret; 2266 2267 /* Convert event/group name */ 2268 pev->event = strdup(tev->event); 2269 pev->group = strdup(tev->group); 2270 if (pev->event == NULL || pev->group == NULL) 2271 return -ENOMEM; 2272 2273 /* Convert trace_point to probe_point */ 2274 ret = convert_to_perf_probe_point(&tev->point, &pev->point, is_kprobe); 2275 if (ret < 0) 2276 return ret; 2277 2278 /* Convert trace_arg to probe_arg */ 2279 pev->nargs = tev->nargs; 2280 pev->args = zalloc(sizeof(struct perf_probe_arg) * pev->nargs); 2281 if (pev->args == NULL) 2282 return -ENOMEM; 2283 for (i = 0; i < tev->nargs && ret >= 0; i++) { 2284 if (tev->args[i].name) 2285 pev->args[i].name = strdup(tev->args[i].name); 2286 else { 2287 if ((ret = strbuf_init(&buf, 32)) < 0) 2288 goto error; 2289 ret = synthesize_probe_trace_arg(&tev->args[i], &buf); 2290 pev->args[i].name = strbuf_detach(&buf, NULL); 2291 } 2292 if (pev->args[i].name == NULL && ret >= 0) 2293 ret = -ENOMEM; 2294 } 2295error: 2296 if (ret < 0) 2297 clear_perf_probe_event(pev); 2298 2299 return ret; 2300} 2301 2302void clear_perf_probe_event(struct perf_probe_event *pev) 2303{ 2304 struct perf_probe_arg_field *field, *next; 2305 int i; 2306 2307 zfree(&pev->event); 2308 zfree(&pev->group); 2309 zfree(&pev->target); 2310 clear_perf_probe_point(&pev->point); 2311 2312 for (i = 0; i < pev->nargs; i++) { 2313 zfree(&pev->args[i].name); 2314 zfree(&pev->args[i].var); 2315 zfree(&pev->args[i].type); 2316 field = pev->args[i].field; 2317 while (field) { 2318 next = field->next; 2319 zfree(&field->name); 2320 free(field); 2321 field = next; 2322 } 2323 } 2324 pev->nargs = 0; 2325 zfree(&pev->args); 2326} 2327 2328#define strdup_or_goto(str, label) \ 2329({ char *__p = NULL; if (str && !(__p = strdup(str))) goto label; __p; }) 2330 2331static int perf_probe_point__copy(struct perf_probe_point *dst, 2332 struct perf_probe_point *src) 2333{ 2334 dst->file = strdup_or_goto(src->file, out_err); 2335 dst->function = strdup_or_goto(src->function, out_err); 2336 dst->lazy_line = strdup_or_goto(src->lazy_line, out_err); 2337 dst->line = src->line; 2338 dst->retprobe = src->retprobe; 2339 dst->offset = src->offset; 2340 return 0; 2341 2342out_err: 2343 clear_perf_probe_point(dst); 2344 return -ENOMEM; 2345} 2346 2347static int perf_probe_arg__copy(struct perf_probe_arg *dst, 2348 struct perf_probe_arg *src) 2349{ 2350 struct perf_probe_arg_field *field, **ppfield; 2351 2352 dst->name = strdup_or_goto(src->name, out_err); 2353 dst->var = strdup_or_goto(src->var, out_err); 2354 dst->type = strdup_or_goto(src->type, out_err); 2355 2356 field = src->field; 2357 ppfield = &(dst->field); 2358 while (field) { 2359 *ppfield = zalloc(sizeof(*field)); 2360 if (!*ppfield) 2361 goto out_err; 2362 (*ppfield)->name = strdup_or_goto(field->name, out_err); 2363 (*ppfield)->index = field->index; 2364 (*ppfield)->ref = field->ref; 2365 field = field->next; 2366 ppfield = &((*ppfield)->next); 2367 } 2368 return 0; 2369out_err: 2370 return -ENOMEM; 2371} 2372 2373int perf_probe_event__copy(struct perf_probe_event *dst, 2374 struct perf_probe_event *src) 2375{ 2376 int i; 2377 2378 dst->event = strdup_or_goto(src->event, out_err); 2379 dst->group = strdup_or_goto(src->group, out_err); 2380 dst->target = strdup_or_goto(src->target, out_err); 2381 dst->uprobes = src->uprobes; 2382 2383 if (perf_probe_point__copy(&dst->point, &src->point) < 0) 2384 goto out_err; 2385 2386 dst->args = zalloc(sizeof(struct perf_probe_arg) * src->nargs); 2387 if (!dst->args) 2388 goto out_err; 2389 dst->nargs = src->nargs; 2390 2391 for (i = 0; i < src->nargs; i++) 2392 if (perf_probe_arg__copy(&dst->args[i], &src->args[i]) < 0) 2393 goto out_err; 2394 return 0; 2395 2396out_err: 2397 clear_perf_probe_event(dst); 2398 return -ENOMEM; 2399} 2400 2401void clear_probe_trace_event(struct probe_trace_event *tev) 2402{ 2403 struct probe_trace_arg_ref *ref, *next; 2404 int i; 2405 2406 zfree(&tev->event); 2407 zfree(&tev->group); 2408 zfree(&tev->point.symbol); 2409 zfree(&tev->point.realname); 2410 zfree(&tev->point.module); 2411 for (i = 0; i < tev->nargs; i++) { 2412 zfree(&tev->args[i].name); 2413 zfree(&tev->args[i].value); 2414 zfree(&tev->args[i].type); 2415 ref = tev->args[i].ref; 2416 while (ref) { 2417 next = ref->next; 2418 free(ref); 2419 ref = next; 2420 } 2421 } 2422 zfree(&tev->args); 2423 tev->nargs = 0; 2424} 2425 2426struct kprobe_blacklist_node { 2427 struct list_head list; 2428 unsigned long start; 2429 unsigned long end; 2430 char *symbol; 2431}; 2432 2433static void kprobe_blacklist__delete(struct list_head *blacklist) 2434{ 2435 struct kprobe_blacklist_node *node; 2436 2437 while (!list_empty(blacklist)) { 2438 node = list_first_entry(blacklist, 2439 struct kprobe_blacklist_node, list); 2440 list_del_init(&node->list); 2441 zfree(&node->symbol); 2442 free(node); 2443 } 2444} 2445 2446static int kprobe_blacklist__load(struct list_head *blacklist) 2447{ 2448 struct kprobe_blacklist_node *node; 2449 const char *__debugfs = debugfs__mountpoint(); 2450 char buf[PATH_MAX], *p; 2451 FILE *fp; 2452 int ret; 2453 2454 if (__debugfs == NULL) 2455 return -ENOTSUP; 2456 2457 ret = e_snprintf(buf, PATH_MAX, "%s/kprobes/blacklist", __debugfs); 2458 if (ret < 0) 2459 return ret; 2460 2461 fp = fopen(buf, "r"); 2462 if (!fp) 2463 return -errno; 2464 2465 ret = 0; 2466 while (fgets(buf, PATH_MAX, fp)) { 2467 node = zalloc(sizeof(*node)); 2468 if (!node) { 2469 ret = -ENOMEM; 2470 break; 2471 } 2472 INIT_LIST_HEAD(&node->list); 2473 list_add_tail(&node->list, blacklist); 2474 if (sscanf(buf, "0x%lx-0x%lx", &node->start, &node->end) != 2) { 2475 ret = -EINVAL; 2476 break; 2477 } 2478 p = strchr(buf, '\t'); 2479 if (p) { 2480 p++; 2481 if (p[strlen(p) - 1] == '\n') 2482 p[strlen(p) - 1] = '\0'; 2483 } else 2484 p = (char *)"unknown"; 2485 node->symbol = strdup(p); 2486 if (!node->symbol) { 2487 ret = -ENOMEM; 2488 break; 2489 } 2490 pr_debug2("Blacklist: 0x%lx-0x%lx, %s\n", 2491 node->start, node->end, node->symbol); 2492 ret++; 2493 } 2494 if (ret < 0) 2495 kprobe_blacklist__delete(blacklist); 2496 fclose(fp); 2497 2498 return ret; 2499} 2500 2501static struct kprobe_blacklist_node * 2502kprobe_blacklist__find_by_address(struct list_head *blacklist, 2503 unsigned long address) 2504{ 2505 struct kprobe_blacklist_node *node; 2506 2507 list_for_each_entry(node, blacklist, list) { 2508 if (node->start <= address && address < node->end) 2509 return node; 2510 } 2511 2512 return NULL; 2513} 2514 2515static LIST_HEAD(kprobe_blacklist); 2516 2517static void kprobe_blacklist__init(void) 2518{ 2519 if (!list_empty(&kprobe_blacklist)) 2520 return; 2521 2522 if (kprobe_blacklist__load(&kprobe_blacklist) < 0) 2523 pr_debug("No kprobe blacklist support, ignored\n"); 2524} 2525 2526static void kprobe_blacklist__release(void) 2527{ 2528 kprobe_blacklist__delete(&kprobe_blacklist); 2529} 2530 2531static bool kprobe_blacklist__listed(unsigned long address) 2532{ 2533 return !!kprobe_blacklist__find_by_address(&kprobe_blacklist, address); 2534} 2535 2536static int perf_probe_event__sprintf(const char *group, const char *event, 2537 struct perf_probe_event *pev, 2538 const char *module, 2539 struct strbuf *result) 2540{ 2541 int i, ret; 2542 char *buf; 2543 2544 if (asprintf(&buf, "%s:%s", group, event) < 0) 2545 return -errno; 2546 ret = strbuf_addf(result, " %-20s (on ", buf); 2547 free(buf); 2548 if (ret) 2549 return ret; 2550 2551 /* Synthesize only event probe point */ 2552 buf = synthesize_perf_probe_point(&pev->point); 2553 if (!buf) 2554 return -ENOMEM; 2555 ret = strbuf_addstr(result, buf); 2556 free(buf); 2557 2558 if (!ret && module) 2559 ret = strbuf_addf(result, " in %s", module); 2560 2561 if (!ret && pev->nargs > 0) { 2562 ret = strbuf_add(result, " with", 5); 2563 for (i = 0; !ret && i < pev->nargs; i++) { 2564 buf = synthesize_perf_probe_arg(&pev->args[i]); 2565 if (!buf) 2566 return -ENOMEM; 2567 ret = strbuf_addf(result, " %s", buf); 2568 free(buf); 2569 } 2570 } 2571 if (!ret) 2572 ret = strbuf_addch(result, ')'); 2573 2574 return ret; 2575} 2576 2577/* Show an event */ 2578int show_perf_probe_event(const char *group, const char *event, 2579 struct perf_probe_event *pev, 2580 const char *module, bool use_stdout) 2581{ 2582 struct strbuf buf = STRBUF_INIT; 2583 int ret; 2584 2585 ret = perf_probe_event__sprintf(group, event, pev, module, &buf); 2586 if (ret >= 0) { 2587 if (use_stdout) 2588 printf("%s\n", buf.buf); 2589 else 2590 pr_info("%s\n", buf.buf); 2591 } 2592 strbuf_release(&buf); 2593 2594 return ret; 2595} 2596 2597static bool filter_probe_trace_event(struct probe_trace_event *tev, 2598 struct strfilter *filter) 2599{ 2600 char tmp[128]; 2601 2602 /* At first, check the event name itself */ 2603 if (strfilter__compare(filter, tev->event)) 2604 return true; 2605 2606 /* Next, check the combination of name and group */ 2607 if (e_snprintf(tmp, 128, "%s:%s", tev->group, tev->event) < 0) 2608 return false; 2609 return strfilter__compare(filter, tmp); 2610} 2611 2612static int __show_perf_probe_events(int fd, bool is_kprobe, 2613 struct strfilter *filter) 2614{ 2615 int ret = 0; 2616 struct probe_trace_event tev; 2617 struct perf_probe_event pev; 2618 struct strlist *rawlist; 2619 struct str_node *ent; 2620 2621 memset(&tev, 0, sizeof(tev)); 2622 memset(&pev, 0, sizeof(pev)); 2623 2624 rawlist = probe_file__get_rawlist(fd); 2625 if (!rawlist) 2626 return -ENOMEM; 2627 2628 strlist__for_each_entry(ent, rawlist) { 2629 ret = parse_probe_trace_command(ent->s, &tev); 2630 if (ret >= 0) { 2631 if (!filter_probe_trace_event(&tev, filter)) 2632 goto next; 2633 ret = convert_to_perf_probe_event(&tev, &pev, 2634 is_kprobe); 2635 if (ret < 0) 2636 goto next; 2637 ret = show_perf_probe_event(pev.group, pev.event, 2638 &pev, tev.point.module, 2639 true); 2640 } 2641next: 2642 clear_perf_probe_event(&pev); 2643 clear_probe_trace_event(&tev); 2644 if (ret < 0) 2645 break; 2646 } 2647 strlist__delete(rawlist); 2648 /* Cleanup cached debuginfo if needed */ 2649 debuginfo_cache__exit(); 2650 2651 return ret; 2652} 2653 2654/* List up current perf-probe events */ 2655int show_perf_probe_events(struct strfilter *filter) 2656{ 2657 int kp_fd, up_fd, ret; 2658 2659 setup_pager(); 2660 2661 if (probe_conf.cache) 2662 return probe_cache__show_all_caches(filter); 2663 2664 ret = init_probe_symbol_maps(false); 2665 if (ret < 0) 2666 return ret; 2667 2668 ret = probe_file__open_both(&kp_fd, &up_fd, 0); 2669 if (ret < 0) 2670 return ret; 2671 2672 if (kp_fd >= 0) 2673 ret = __show_perf_probe_events(kp_fd, true, filter); 2674 if (up_fd >= 0 && ret >= 0) 2675 ret = __show_perf_probe_events(up_fd, false, filter); 2676 if (kp_fd > 0) 2677 close(kp_fd); 2678 if (up_fd > 0) 2679 close(up_fd); 2680 exit_probe_symbol_maps(); 2681 2682 return ret; 2683} 2684 2685static int get_new_event_name(char *buf, size_t len, const char *base, 2686 struct strlist *namelist, bool ret_event, 2687 bool allow_suffix) 2688{ 2689 int i, ret; 2690 char *p, *nbase; 2691 2692 if (*base == '.') 2693 base++; 2694 nbase = strdup(base); 2695 if (!nbase) 2696 return -ENOMEM; 2697 2698 /* Cut off the dot suffixes (e.g. .const, .isra) and version suffixes */ 2699 p = strpbrk(nbase, ".@"); 2700 if (p && p != nbase) 2701 *p = '\0'; 2702 2703 /* Try no suffix number */ 2704 ret = e_snprintf(buf, len, "%s%s", nbase, ret_event ? "__return" : ""); 2705 if (ret < 0) { 2706 pr_debug("snprintf() failed: %d\n", ret); 2707 goto out; 2708 } 2709 if (!strlist__has_entry(namelist, buf)) 2710 goto out; 2711 2712 if (!allow_suffix) { 2713 pr_warning("Error: event \"%s\" already exists.\n" 2714 " Hint: Remove existing event by 'perf probe -d'\n" 2715 " or force duplicates by 'perf probe -f'\n" 2716 " or set 'force=yes' in BPF source.\n", 2717 buf); 2718 ret = -EEXIST; 2719 goto out; 2720 } 2721 2722 /* Try to add suffix */ 2723 for (i = 1; i < MAX_EVENT_INDEX; i++) { 2724 ret = e_snprintf(buf, len, "%s_%d", nbase, i); 2725 if (ret < 0) { 2726 pr_debug("snprintf() failed: %d\n", ret); 2727 goto out; 2728 } 2729 if (!strlist__has_entry(namelist, buf)) 2730 break; 2731 } 2732 if (i == MAX_EVENT_INDEX) { 2733 pr_warning("Too many events are on the same function.\n"); 2734 ret = -ERANGE; 2735 } 2736 2737out: 2738 free(nbase); 2739 2740 /* Final validation */ 2741 if (ret >= 0 && !is_c_func_name(buf)) { 2742 pr_warning("Internal error: \"%s\" is an invalid event name.\n", 2743 buf); 2744 ret = -EINVAL; 2745 } 2746 2747 return ret; 2748} 2749 2750/* Warn if the current kernel's uprobe implementation is old */ 2751static void warn_uprobe_event_compat(struct probe_trace_event *tev) 2752{ 2753 int i; 2754 char *buf = synthesize_probe_trace_command(tev); 2755 struct probe_trace_point *tp = &tev->point; 2756 2757 if (tp->ref_ctr_offset && !uprobe_ref_ctr_is_supported()) { 2758 pr_warning("A semaphore is associated with %s:%s and " 2759 "seems your kernel doesn't support it.\n", 2760 tev->group, tev->event); 2761 } 2762 2763 /* Old uprobe event doesn't support memory dereference */ 2764 if (!tev->uprobes || tev->nargs == 0 || !buf) 2765 goto out; 2766 2767 for (i = 0; i < tev->nargs; i++) 2768 if (strglobmatch(tev->args[i].value, "[$@+-]*")) { 2769 pr_warning("Please upgrade your kernel to at least " 2770 "3.14 to have access to feature %s\n", 2771 tev->args[i].value); 2772 break; 2773 } 2774out: 2775 free(buf); 2776} 2777 2778/* Set new name from original perf_probe_event and namelist */ 2779static int probe_trace_event__set_name(struct probe_trace_event *tev, 2780 struct perf_probe_event *pev, 2781 struct strlist *namelist, 2782 bool allow_suffix) 2783{ 2784 const char *event, *group; 2785 char buf[64]; 2786 int ret; 2787 2788 /* If probe_event or trace_event already have the name, reuse it */ 2789 if (pev->event && !pev->sdt) 2790 event = pev->event; 2791 else if (tev->event) 2792 event = tev->event; 2793 else { 2794 /* Or generate new one from probe point */ 2795 if (pev->point.function && 2796 (strncmp(pev->point.function, "0x", 2) != 0) && 2797 !strisglob(pev->point.function)) 2798 event = pev->point.function; 2799 else 2800 event = tev->point.realname; 2801 } 2802 if (pev->group && !pev->sdt) 2803 group = pev->group; 2804 else if (tev->group) 2805 group = tev->group; 2806 else 2807 group = PERFPROBE_GROUP; 2808 2809 /* Get an unused new event name */ 2810 ret = get_new_event_name(buf, 64, event, namelist, 2811 tev->point.retprobe, allow_suffix); 2812 if (ret < 0) 2813 return ret; 2814 2815 event = buf; 2816 2817 tev->event = strdup(event); 2818 tev->group = strdup(group); 2819 if (tev->event == NULL || tev->group == NULL) 2820 return -ENOMEM; 2821 2822 /* 2823 * Add new event name to namelist if multiprobe event is NOT 2824 * supported, since we have to use new event name for following 2825 * probes in that case. 2826 */ 2827 if (!multiprobe_event_is_supported()) 2828 strlist__add(namelist, event); 2829 return 0; 2830} 2831 2832static int __open_probe_file_and_namelist(bool uprobe, 2833 struct strlist **namelist) 2834{ 2835 int fd; 2836 2837 fd = probe_file__open(PF_FL_RW | (uprobe ? PF_FL_UPROBE : 0)); 2838 if (fd < 0) 2839 return fd; 2840 2841 /* Get current event names */ 2842 *namelist = probe_file__get_namelist(fd); 2843 if (!(*namelist)) { 2844 pr_debug("Failed to get current event list.\n"); 2845 close(fd); 2846 return -ENOMEM; 2847 } 2848 return fd; 2849} 2850 2851static int __add_probe_trace_events(struct perf_probe_event *pev, 2852 struct probe_trace_event *tevs, 2853 int ntevs, bool allow_suffix) 2854{ 2855 int i, fd[2] = {-1, -1}, up, ret; 2856 struct probe_trace_event *tev = NULL; 2857 struct probe_cache *cache = NULL; 2858 struct strlist *namelist[2] = {NULL, NULL}; 2859 struct nscookie nsc; 2860 2861 up = pev->uprobes ? 1 : 0; 2862 fd[up] = __open_probe_file_and_namelist(up, &namelist[up]); 2863 if (fd[up] < 0) 2864 return fd[up]; 2865 2866 ret = 0; 2867 for (i = 0; i < ntevs; i++) { 2868 tev = &tevs[i]; 2869 up = tev->uprobes ? 1 : 0; 2870 if (fd[up] == -1) { /* Open the kprobe/uprobe_events */ 2871 fd[up] = __open_probe_file_and_namelist(up, 2872 &namelist[up]); 2873 if (fd[up] < 0) 2874 goto close_out; 2875 } 2876 /* Skip if the symbol is out of .text or blacklisted */ 2877 if (!tev->point.symbol && !pev->uprobes) 2878 continue; 2879 2880 /* Set new name for tev (and update namelist) */ 2881 ret = probe_trace_event__set_name(tev, pev, namelist[up], 2882 allow_suffix); 2883 if (ret < 0) 2884 break; 2885 2886 nsinfo__mountns_enter(pev->nsi, &nsc); 2887 ret = probe_file__add_event(fd[up], tev); 2888 nsinfo__mountns_exit(&nsc); 2889 if (ret < 0) 2890 break; 2891 2892 /* 2893 * Probes after the first probe which comes from same 2894 * user input are always allowed to add suffix, because 2895 * there might be several addresses corresponding to 2896 * one code line. 2897 */ 2898 allow_suffix = true; 2899 } 2900 if (ret == -EINVAL && pev->uprobes) 2901 warn_uprobe_event_compat(tev); 2902 if (ret == 0 && probe_conf.cache) { 2903 cache = probe_cache__new(pev->target, pev->nsi); 2904 if (!cache || 2905 probe_cache__add_entry(cache, pev, tevs, ntevs) < 0 || 2906 probe_cache__commit(cache) < 0) 2907 pr_warning("Failed to add event to probe cache\n"); 2908 probe_cache__delete(cache); 2909 } 2910 2911close_out: 2912 for (up = 0; up < 2; up++) { 2913 strlist__delete(namelist[up]); 2914 if (fd[up] >= 0) 2915 close(fd[up]); 2916 } 2917 return ret; 2918} 2919 2920static int find_probe_functions(struct map *map, char *name, 2921 struct symbol **syms) 2922{ 2923 int found = 0; 2924 struct symbol *sym; 2925 struct rb_node *tmp; 2926 const char *norm, *ver; 2927 char *buf = NULL; 2928 bool cut_version = true; 2929 2930 if (map__load(map) < 0) 2931 return 0; 2932 2933 /* If user gives a version, don't cut off the version from symbols */ 2934 if (strchr(name, '@')) 2935 cut_version = false; 2936 2937 map__for_each_symbol(map, sym, tmp) { 2938 norm = arch__normalize_symbol_name(sym->name); 2939 if (!norm) 2940 continue; 2941 2942 if (cut_version) { 2943 /* We don't care about default symbol or not */ 2944 ver = strchr(norm, '@'); 2945 if (ver) { 2946 buf = strndup(norm, ver - norm); 2947 if (!buf) 2948 return -ENOMEM; 2949 norm = buf; 2950 } 2951 } 2952 2953 if (strglobmatch(norm, name)) { 2954 found++; 2955 if (syms && found < probe_conf.max_probes) 2956 syms[found - 1] = sym; 2957 } 2958 if (buf) 2959 zfree(&buf); 2960 } 2961 2962 return found; 2963} 2964 2965void __weak arch__fix_tev_from_maps(struct perf_probe_event *pev __maybe_unused, 2966 struct probe_trace_event *tev __maybe_unused, 2967 struct map *map __maybe_unused, 2968 struct symbol *sym __maybe_unused) { } 2969 2970/* 2971 * Find probe function addresses from map. 2972 * Return an error or the number of found probe_trace_event 2973 */ 2974static int find_probe_trace_events_from_map(struct perf_probe_event *pev, 2975 struct probe_trace_event **tevs) 2976{ 2977 struct map *map = NULL; 2978 struct ref_reloc_sym *reloc_sym = NULL; 2979 struct symbol *sym; 2980 struct symbol **syms = NULL; 2981 struct probe_trace_event *tev; 2982 struct perf_probe_point *pp = &pev->point; 2983 struct probe_trace_point *tp; 2984 int num_matched_functions; 2985 int ret, i, j, skipped = 0; 2986 char *mod_name; 2987 2988 map = get_target_map(pev->target, pev->nsi, pev->uprobes); 2989 if (!map) { 2990 ret = -EINVAL; 2991 goto out; 2992 } 2993 2994 syms = malloc(sizeof(struct symbol *) * probe_conf.max_probes); 2995 if (!syms) { 2996 ret = -ENOMEM; 2997 goto out; 2998 } 2999 3000 /* 3001 * Load matched symbols: Since the different local symbols may have 3002 * same name but different addresses, this lists all the symbols. 3003 */ 3004 num_matched_functions = find_probe_functions(map, pp->function, syms); 3005 if (num_matched_functions <= 0) { 3006 pr_err("Failed to find symbol %s in %s\n", pp->function, 3007 pev->target ? : "kernel"); 3008 ret = -ENOENT; 3009 goto out; 3010 } else if (num_matched_functions > probe_conf.max_probes) { 3011 pr_err("Too many functions matched in %s\n", 3012 pev->target ? : "kernel"); 3013 ret = -E2BIG; 3014 goto out; 3015 } 3016 3017 /* Note that the symbols in the kmodule are not relocated */ 3018 if (!pev->uprobes && !pev->target && 3019 (!pp->retprobe || kretprobe_offset_is_supported())) { 3020 reloc_sym = kernel_get_ref_reloc_sym(NULL); 3021 if (!reloc_sym) { 3022 pr_warning("Relocated base symbol is not found!\n"); 3023 ret = -EINVAL; 3024 goto out; 3025 } 3026 } 3027 3028 /* Setup result trace-probe-events */ 3029 *tevs = zalloc(sizeof(*tev) * num_matched_functions); 3030 if (!*tevs) { 3031 ret = -ENOMEM; 3032 goto out; 3033 } 3034 3035 ret = 0; 3036 3037 for (j = 0; j < num_matched_functions; j++) { 3038 sym = syms[j]; 3039 3040 if (sym->type != STT_FUNC) 3041 continue; 3042 3043 /* There can be duplicated symbols in the map */ 3044 for (i = 0; i < j; i++) 3045 if (sym->start == syms[i]->start) { 3046 pr_debug("Found duplicated symbol %s @ %" PRIx64 "\n", 3047 sym->name, sym->start); 3048 break; 3049 } 3050 if (i != j) 3051 continue; 3052 3053 tev = (*tevs) + ret; 3054 tp = &tev->point; 3055 if (ret == num_matched_functions) { 3056 pr_warning("Too many symbols are listed. Skip it.\n"); 3057 break; 3058 } 3059 ret++; 3060 3061 if (pp->offset > sym->end - sym->start) { 3062 pr_warning("Offset %ld is bigger than the size of %s\n", 3063 pp->offset, sym->name); 3064 ret = -ENOENT; 3065 goto err_out; 3066 } 3067 /* Add one probe point */ 3068 tp->address = map->unmap_ip(map, sym->start) + pp->offset; 3069 3070 /* Check the kprobe (not in module) is within .text */ 3071 if (!pev->uprobes && !pev->target && 3072 kprobe_warn_out_range(sym->name, tp->address)) { 3073 tp->symbol = NULL; /* Skip it */ 3074 skipped++; 3075 } else if (reloc_sym) { 3076 tp->symbol = strdup_or_goto(reloc_sym->name, nomem_out); 3077 tp->offset = tp->address - reloc_sym->addr; 3078 } else { 3079 tp->symbol = strdup_or_goto(sym->name, nomem_out); 3080 tp->offset = pp->offset; 3081 } 3082 tp->realname = strdup_or_goto(sym->name, nomem_out); 3083 3084 tp->retprobe = pp->retprobe; 3085 if (pev->target) { 3086 if (pev->uprobes) { 3087 tev->point.module = strdup_or_goto(pev->target, 3088 nomem_out); 3089 } else { 3090 mod_name = find_module_name(pev->target); 3091 tev->point.module = 3092 strdup(mod_name ? mod_name : pev->target); 3093 free(mod_name); 3094 if (!tev->point.module) 3095 goto nomem_out; 3096 } 3097 } 3098 tev->uprobes = pev->uprobes; 3099 tev->nargs = pev->nargs; 3100 if (tev->nargs) { 3101 tev->args = zalloc(sizeof(struct probe_trace_arg) * 3102 tev->nargs); 3103 if (tev->args == NULL) 3104 goto nomem_out; 3105 } 3106 for (i = 0; i < tev->nargs; i++) { 3107 if (pev->args[i].name) 3108 tev->args[i].name = 3109 strdup_or_goto(pev->args[i].name, 3110 nomem_out); 3111 3112 tev->args[i].value = strdup_or_goto(pev->args[i].var, 3113 nomem_out); 3114 if (pev->args[i].type) 3115 tev->args[i].type = 3116 strdup_or_goto(pev->args[i].type, 3117 nomem_out); 3118 } 3119 arch__fix_tev_from_maps(pev, tev, map, sym); 3120 } 3121 if (ret == skipped) { 3122 ret = -ENOENT; 3123 goto err_out; 3124 } 3125 3126out: 3127 map__put(map); 3128 free(syms); 3129 return ret; 3130 3131nomem_out: 3132 ret = -ENOMEM; 3133err_out: 3134 clear_probe_trace_events(*tevs, num_matched_functions); 3135 zfree(tevs); 3136 goto out; 3137} 3138 3139static int try_to_find_absolute_address(struct perf_probe_event *pev, 3140 struct probe_trace_event **tevs) 3141{ 3142 struct perf_probe_point *pp = &pev->point; 3143 struct probe_trace_event *tev; 3144 struct probe_trace_point *tp; 3145 int i, err; 3146 3147 if (!(pev->point.function && !strncmp(pev->point.function, "0x", 2))) 3148 return -EINVAL; 3149 if (perf_probe_event_need_dwarf(pev)) 3150 return -EINVAL; 3151 3152 /* 3153 * This is 'perf probe /lib/libc.so 0xabcd'. Try to probe at 3154 * absolute address. 3155 * 3156 * Only one tev can be generated by this. 3157 */ 3158 *tevs = zalloc(sizeof(*tev)); 3159 if (!*tevs) 3160 return -ENOMEM; 3161 3162 tev = *tevs; 3163 tp = &tev->point; 3164 3165 /* 3166 * Don't use tp->offset, use address directly, because 3167 * in synthesize_probe_trace_command() address cannot be 3168 * zero. 3169 */ 3170 tp->address = pev->point.abs_address; 3171 tp->retprobe = pp->retprobe; 3172 tev->uprobes = pev->uprobes; 3173 3174 err = -ENOMEM; 3175 /* 3176 * Give it a '0x' leading symbol name. 3177 * In __add_probe_trace_events, a NULL symbol is interpreted as 3178 * invalid. 3179 */ 3180 if (asprintf(&tp->symbol, "0x%lx", tp->address) < 0) 3181 goto errout; 3182 3183 /* For kprobe, check range */ 3184 if ((!tev->uprobes) && 3185 (kprobe_warn_out_range(tev->point.symbol, 3186 tev->point.address))) { 3187 err = -EACCES; 3188 goto errout; 3189 } 3190 3191 if (asprintf(&tp->realname, "abs_%lx", tp->address) < 0) 3192 goto errout; 3193 3194 if (pev->target) { 3195 tp->module = strdup(pev->target); 3196 if (!tp->module) 3197 goto errout; 3198 } 3199 3200 if (tev->group) { 3201 tev->group = strdup(pev->group); 3202 if (!tev->group) 3203 goto errout; 3204 } 3205 3206 if (pev->event) { 3207 tev->event = strdup(pev->event); 3208 if (!tev->event) 3209 goto errout; 3210 } 3211 3212 tev->nargs = pev->nargs; 3213 tev->args = zalloc(sizeof(struct probe_trace_arg) * tev->nargs); 3214 if (!tev->args) 3215 goto errout; 3216 3217 for (i = 0; i < tev->nargs; i++) 3218 copy_to_probe_trace_arg(&tev->args[i], &pev->args[i]); 3219 3220 return 1; 3221 3222errout: 3223 clear_probe_trace_events(*tevs, 1); 3224 *tevs = NULL; 3225 return err; 3226} 3227 3228/* Concatinate two arrays */ 3229static void *memcat(void *a, size_t sz_a, void *b, size_t sz_b) 3230{ 3231 void *ret; 3232 3233 ret = malloc(sz_a + sz_b); 3234 if (ret) { 3235 memcpy(ret, a, sz_a); 3236 memcpy(ret + sz_a, b, sz_b); 3237 } 3238 return ret; 3239} 3240 3241static int 3242concat_probe_trace_events(struct probe_trace_event **tevs, int *ntevs, 3243 struct probe_trace_event **tevs2, int ntevs2) 3244{ 3245 struct probe_trace_event *new_tevs; 3246 int ret = 0; 3247 3248 if (*ntevs == 0) { 3249 *tevs = *tevs2; 3250 *ntevs = ntevs2; 3251 *tevs2 = NULL; 3252 return 0; 3253 } 3254 3255 if (*ntevs + ntevs2 > probe_conf.max_probes) 3256 ret = -E2BIG; 3257 else { 3258 /* Concatinate the array of probe_trace_event */ 3259 new_tevs = memcat(*tevs, (*ntevs) * sizeof(**tevs), 3260 *tevs2, ntevs2 * sizeof(**tevs2)); 3261 if (!new_tevs) 3262 ret = -ENOMEM; 3263 else { 3264 free(*tevs); 3265 *tevs = new_tevs; 3266 *ntevs += ntevs2; 3267 } 3268 } 3269 if (ret < 0) 3270 clear_probe_trace_events(*tevs2, ntevs2); 3271 zfree(tevs2); 3272 3273 return ret; 3274} 3275 3276/* 3277 * Try to find probe_trace_event from given probe caches. Return the number 3278 * of cached events found, if an error occurs return the error. 3279 */ 3280static int find_cached_events(struct perf_probe_event *pev, 3281 struct probe_trace_event **tevs, 3282 const char *target) 3283{ 3284 struct probe_cache *cache; 3285 struct probe_cache_entry *entry; 3286 struct probe_trace_event *tmp_tevs = NULL; 3287 int ntevs = 0; 3288 int ret = 0; 3289 3290 cache = probe_cache__new(target, pev->nsi); 3291 /* Return 0 ("not found") if the target has no probe cache. */ 3292 if (!cache) 3293 return 0; 3294 3295 for_each_probe_cache_entry(entry, cache) { 3296 /* Skip the cache entry which has no name */ 3297 if (!entry->pev.event || !entry->pev.group) 3298 continue; 3299 if ((!pev->group || strglobmatch(entry->pev.group, pev->group)) && 3300 strglobmatch(entry->pev.event, pev->event)) { 3301 ret = probe_cache_entry__get_event(entry, &tmp_tevs); 3302 if (ret > 0) 3303 ret = concat_probe_trace_events(tevs, &ntevs, 3304 &tmp_tevs, ret); 3305 if (ret < 0) 3306 break; 3307 } 3308 } 3309 probe_cache__delete(cache); 3310 if (ret < 0) { 3311 clear_probe_trace_events(*tevs, ntevs); 3312 zfree(tevs); 3313 } else { 3314 ret = ntevs; 3315 if (ntevs > 0 && target && target[0] == '/') 3316 pev->uprobes = true; 3317 } 3318 3319 return ret; 3320} 3321 3322/* Try to find probe_trace_event from all probe caches */ 3323static int find_cached_events_all(struct perf_probe_event *pev, 3324 struct probe_trace_event **tevs) 3325{ 3326 struct probe_trace_event *tmp_tevs = NULL; 3327 struct strlist *bidlist; 3328 struct str_node *nd; 3329 char *pathname; 3330 int ntevs = 0; 3331 int ret; 3332 3333 /* Get the buildid list of all valid caches */ 3334 bidlist = build_id_cache__list_all(true); 3335 if (!bidlist) { 3336 ret = -errno; 3337 pr_debug("Failed to get buildids: %d\n", ret); 3338 return ret; 3339 } 3340 3341 ret = 0; 3342 strlist__for_each_entry(nd, bidlist) { 3343 pathname = build_id_cache__origname(nd->s); 3344 ret = find_cached_events(pev, &tmp_tevs, pathname); 3345 /* In the case of cnt == 0, we just skip it */ 3346 if (ret > 0) 3347 ret = concat_probe_trace_events(tevs, &ntevs, 3348 &tmp_tevs, ret); 3349 free(pathname); 3350 if (ret < 0) 3351 break; 3352 } 3353 strlist__delete(bidlist); 3354 3355 if (ret < 0) { 3356 clear_probe_trace_events(*tevs, ntevs); 3357 zfree(tevs); 3358 } else 3359 ret = ntevs; 3360 3361 return ret; 3362} 3363 3364static int find_probe_trace_events_from_cache(struct perf_probe_event *pev, 3365 struct probe_trace_event **tevs) 3366{ 3367 struct probe_cache *cache; 3368 struct probe_cache_entry *entry; 3369 struct probe_trace_event *tev; 3370 struct str_node *node; 3371 int ret, i; 3372 3373 if (pev->sdt) { 3374 /* For SDT/cached events, we use special search functions */ 3375 if (!pev->target) 3376 return find_cached_events_all(pev, tevs); 3377 else 3378 return find_cached_events(pev, tevs, pev->target); 3379 } 3380 cache = probe_cache__new(pev->target, pev->nsi); 3381 if (!cache) 3382 return 0; 3383 3384 entry = probe_cache__find(cache, pev); 3385 if (!entry) { 3386 /* SDT must be in the cache */ 3387 ret = pev->sdt ? -ENOENT : 0; 3388 goto out; 3389 } 3390 3391 ret = strlist__nr_entries(entry->tevlist); 3392 if (ret > probe_conf.max_probes) { 3393 pr_debug("Too many entries matched in the cache of %s\n", 3394 pev->target ? : "kernel"); 3395 ret = -E2BIG; 3396 goto out; 3397 } 3398 3399 *tevs = zalloc(ret * sizeof(*tev)); 3400 if (!*tevs) { 3401 ret = -ENOMEM; 3402 goto out; 3403 } 3404 3405 i = 0; 3406 strlist__for_each_entry(node, entry->tevlist) { 3407 tev = &(*tevs)[i++]; 3408 ret = parse_probe_trace_command(node->s, tev); 3409 if (ret < 0) 3410 goto out; 3411 /* Set the uprobes attribute as same as original */ 3412 tev->uprobes = pev->uprobes; 3413 } 3414 ret = i; 3415 3416out: 3417 probe_cache__delete(cache); 3418 return ret; 3419} 3420 3421static int convert_to_probe_trace_events(struct perf_probe_event *pev, 3422 struct probe_trace_event **tevs) 3423{ 3424 int ret; 3425 3426 if (!pev->group && !pev->sdt) { 3427 /* Set group name if not given */ 3428 if (!pev->uprobes) { 3429 pev->group = strdup(PERFPROBE_GROUP); 3430 ret = pev->group ? 0 : -ENOMEM; 3431 } else 3432 ret = convert_exec_to_group(pev->target, &pev->group); 3433 if (ret != 0) { 3434 pr_warning("Failed to make a group name.\n"); 3435 return ret; 3436 } 3437 } 3438 3439 ret = try_to_find_absolute_address(pev, tevs); 3440 if (ret > 0) 3441 return ret; 3442 3443 /* At first, we need to lookup cache entry */ 3444 ret = find_probe_trace_events_from_cache(pev, tevs); 3445 if (ret > 0 || pev->sdt) /* SDT can be found only in the cache */ 3446 return ret == 0 ? -ENOENT : ret; /* Found in probe cache */ 3447 3448 /* Convert perf_probe_event with debuginfo */ 3449 ret = try_to_find_probe_trace_events(pev, tevs); 3450 if (ret != 0) 3451 return ret; /* Found in debuginfo or got an error */ 3452 3453 return find_probe_trace_events_from_map(pev, tevs); 3454} 3455 3456int convert_perf_probe_events(struct perf_probe_event *pevs, int npevs) 3457{ 3458 int i, ret; 3459 3460 /* Loop 1: convert all events */ 3461 for (i = 0; i < npevs; i++) { 3462 /* Init kprobe blacklist if needed */ 3463 if (!pevs[i].uprobes) 3464 kprobe_blacklist__init(); 3465 /* Convert with or without debuginfo */ 3466 ret = convert_to_probe_trace_events(&pevs[i], &pevs[i].tevs); 3467 if (ret < 0) 3468 return ret; 3469 pevs[i].ntevs = ret; 3470 } 3471 /* This just release blacklist only if allocated */ 3472 kprobe_blacklist__release(); 3473 3474 return 0; 3475} 3476 3477static int show_probe_trace_event(struct probe_trace_event *tev) 3478{ 3479 char *buf = synthesize_probe_trace_command(tev); 3480 3481 if (!buf) { 3482 pr_debug("Failed to synthesize probe trace event.\n"); 3483 return -EINVAL; 3484 } 3485 3486 /* Showing definition always go stdout */ 3487 printf("%s\n", buf); 3488 free(buf); 3489 3490 return 0; 3491} 3492 3493int show_probe_trace_events(struct perf_probe_event *pevs, int npevs) 3494{ 3495 struct strlist *namelist = strlist__new(NULL, NULL); 3496 struct probe_trace_event *tev; 3497 struct perf_probe_event *pev; 3498 int i, j, ret = 0; 3499 3500 if (!namelist) 3501 return -ENOMEM; 3502 3503 for (j = 0; j < npevs && !ret; j++) { 3504 pev = &pevs[j]; 3505 for (i = 0; i < pev->ntevs && !ret; i++) { 3506 tev = &pev->tevs[i]; 3507 /* Skip if the symbol is out of .text or blacklisted */ 3508 if (!tev->point.symbol && !pev->uprobes) 3509 continue; 3510 3511 /* Set new name for tev (and update namelist) */ 3512 ret = probe_trace_event__set_name(tev, pev, 3513 namelist, true); 3514 if (!ret) 3515 ret = show_probe_trace_event(tev); 3516 } 3517 } 3518 strlist__delete(namelist); 3519 3520 return ret; 3521} 3522 3523int apply_perf_probe_events(struct perf_probe_event *pevs, int npevs) 3524{ 3525 int i, ret = 0; 3526 3527 /* Loop 2: add all events */ 3528 for (i = 0; i < npevs; i++) { 3529 ret = __add_probe_trace_events(&pevs[i], pevs[i].tevs, 3530 pevs[i].ntevs, 3531 probe_conf.force_add); 3532 if (ret < 0) 3533 break; 3534 } 3535 return ret; 3536} 3537 3538void cleanup_perf_probe_events(struct perf_probe_event *pevs, int npevs) 3539{ 3540 int i, j; 3541 struct perf_probe_event *pev; 3542 3543 /* Loop 3: cleanup and free trace events */ 3544 for (i = 0; i < npevs; i++) { 3545 pev = &pevs[i]; 3546 for (j = 0; j < pevs[i].ntevs; j++) 3547 clear_probe_trace_event(&pevs[i].tevs[j]); 3548 zfree(&pevs[i].tevs); 3549 pevs[i].ntevs = 0; 3550 nsinfo__zput(pev->nsi); 3551 clear_perf_probe_event(&pevs[i]); 3552 } 3553} 3554 3555int add_perf_probe_events(struct perf_probe_event *pevs, int npevs) 3556{ 3557 int ret; 3558 3559 ret = init_probe_symbol_maps(pevs->uprobes); 3560 if (ret < 0) 3561 return ret; 3562 3563 ret = convert_perf_probe_events(pevs, npevs); 3564 if (ret == 0) 3565 ret = apply_perf_probe_events(pevs, npevs); 3566 3567 cleanup_perf_probe_events(pevs, npevs); 3568 3569 exit_probe_symbol_maps(); 3570 return ret; 3571} 3572 3573int del_perf_probe_events(struct strfilter *filter) 3574{ 3575 int ret, ret2, ufd = -1, kfd = -1; 3576 char *str = strfilter__string(filter); 3577 3578 if (!str) 3579 return -EINVAL; 3580 3581 /* Get current event names */ 3582 ret = probe_file__open_both(&kfd, &ufd, PF_FL_RW); 3583 if (ret < 0) 3584 goto out; 3585 3586 ret = probe_file__del_events(kfd, filter); 3587 if (ret < 0 && ret != -ENOENT) 3588 goto error; 3589 3590 ret2 = probe_file__del_events(ufd, filter); 3591 if (ret2 < 0 && ret2 != -ENOENT) { 3592 ret = ret2; 3593 goto error; 3594 } 3595 ret = 0; 3596 3597error: 3598 if (kfd >= 0) 3599 close(kfd); 3600 if (ufd >= 0) 3601 close(ufd); 3602out: 3603 free(str); 3604 3605 return ret; 3606} 3607 3608int show_available_funcs(const char *target, struct nsinfo *nsi, 3609 struct strfilter *_filter, bool user) 3610{ 3611 struct rb_node *nd; 3612 struct map *map; 3613 int ret; 3614 3615 ret = init_probe_symbol_maps(user); 3616 if (ret < 0) 3617 return ret; 3618 3619 /* Get a symbol map */ 3620 map = get_target_map(target, nsi, user); 3621 if (!map) { 3622 pr_err("Failed to get a map for %s\n", (target) ? : "kernel"); 3623 return -EINVAL; 3624 } 3625 3626 ret = map__load(map); 3627 if (ret) { 3628 if (ret == -2) { 3629 char *str = strfilter__string(_filter); 3630 pr_err("Failed to find symbols matched to \"%s\"\n", 3631 str); 3632 free(str); 3633 } else 3634 pr_err("Failed to load symbols in %s\n", 3635 (target) ? : "kernel"); 3636 goto end; 3637 } 3638 if (!dso__sorted_by_name(map->dso)) 3639 dso__sort_by_name(map->dso); 3640 3641 /* Show all (filtered) symbols */ 3642 setup_pager(); 3643 3644 for (nd = rb_first_cached(&map->dso->symbol_names); nd; 3645 nd = rb_next(nd)) { 3646 struct symbol_name_rb_node *pos = rb_entry(nd, struct symbol_name_rb_node, rb_node); 3647 3648 if (strfilter__compare(_filter, pos->sym.name)) 3649 printf("%s\n", pos->sym.name); 3650 } 3651end: 3652 map__put(map); 3653 exit_probe_symbol_maps(); 3654 3655 return ret; 3656} 3657 3658int copy_to_probe_trace_arg(struct probe_trace_arg *tvar, 3659 struct perf_probe_arg *pvar) 3660{ 3661 tvar->value = strdup(pvar->var); 3662 if (tvar->value == NULL) 3663 return -ENOMEM; 3664 if (pvar->type) { 3665 tvar->type = strdup(pvar->type); 3666 if (tvar->type == NULL) 3667 return -ENOMEM; 3668 } 3669 if (pvar->name) { 3670 tvar->name = strdup(pvar->name); 3671 if (tvar->name == NULL) 3672 return -ENOMEM; 3673 } else 3674 tvar->name = NULL; 3675 return 0; 3676} 3677