Lines Matching +full:end +full:- +full:point
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * probe-event.c : perf-probe definition to probe_events format converter
22 #include "build-id.h"
34 #include "trace-event.h" /* For __maybe_unused */
35 #include "probe-event.h"
36 #include "probe-finder.h"
37 #include "probe-file.h"
65 ret = -E2BIG; in e_snprintf()
94 ret = -1; in init_probe_symbol_maps()
111 /* kmap->ref_reloc_sym should be set if host_machine is initialized */ in kernel_get_ref_reloc_sym()
125 return kmap->ref_reloc_sym; in kernel_get_ref_reloc_sym()
137 if (reloc_sym && strcmp(name, reloc_sym->name) == 0) in kernel_get_symbol_address_by_name()
138 *addr = (!map->reloc || reloc) ? reloc_sym->addr : in kernel_get_symbol_address_by_name()
139 reloc_sym->unrelocated_addr; in kernel_get_symbol_address_by_name()
143 return -ENOENT; in kernel_get_symbol_address_by_name()
144 *addr = map->unmap_ip(map, sym->start) - in kernel_get_symbol_address_by_name()
145 ((reloc) ? 0 : map->reloc) - in kernel_get_symbol_address_by_name()
146 ((reladdr) ? map->start : 0); in kernel_get_symbol_address_by_name()
156 /* A file path -- this is an offline module */ in kernel_get_module_map()
167 if (strncmp(pos->dso->short_name + 1, module, in kernel_get_module_map()
168 pos->dso->short_name_len - 2) == 0 && in kernel_get_module_map()
169 module[pos->dso->short_name_len - 2] == '\0') { in kernel_get_module_map()
183 if (map && map->dso) { in get_target_map()
184 nsinfo__put(map->dso->nsinfo); in get_target_map()
185 map->dso->nsinfo = nsinfo__get(nsi); in get_target_map()
201 return -ENOMEM; in convert_exec_to_group()
205 ret = -EINVAL; in convert_exec_to_group()
221 ret = *result ? 0 : -ENOMEM; in convert_exec_to_group()
230 zfree(&pp->file); in clear_perf_probe_point()
231 zfree(&pp->function); in clear_perf_probe_point()
232 zfree(&pp->lazy_line); in clear_perf_probe_point()
251 ret = address <= map->start || map->end < address; in kprobe_warn_out_range()
297 if (!data || !data->d_buf) in find_module_name()
306 * exposed to user-space. Offset of 'name' has remained same from long in find_module_name()
314 mod_name = strdup((char *)data->d_buf + name_offset); in find_module_name()
336 map = maps__find_by_name(&host_machine->kmaps, module_name); in kernel_get_module_dso()
338 dso = map->dso; in kernel_get_module_dso()
342 return -ENOENT; in kernel_get_module_dso()
346 dso = map->dso; in kernel_get_module_dso()
347 if (!dso->has_build_id) in kernel_get_module_dso()
351 dso->load_errno = 0; in kernel_get_module_dso()
364 * symbol from map, we can translate the address back to the probe point.
375 int ret = -ENOENT; in find_alternative_probe_point()
377 /* This can work only for function-name based one */ in find_alternative_probe_point()
378 if (!pp->function || pp->file) in find_alternative_probe_point()
379 return -ENOTSUP; in find_alternative_probe_point()
383 return -EINVAL; in find_alternative_probe_point()
386 map__for_each_symbol_by_name(map, pp->function, sym) { in find_alternative_probe_point()
388 address = sym->start; in find_alternative_probe_point()
389 if (sym->type == STT_GNU_IFUNC) in find_alternative_probe_point()
392 pp->function); in find_alternative_probe_point()
394 address = map->unmap_ip(map, sym->start) - map->reloc; in find_alternative_probe_point()
398 ret = -ENOENT; in find_alternative_probe_point()
402 pp->function, address); in find_alternative_probe_point()
407 ret = (!ret) ? -ENOENT : ret; in find_alternative_probe_point()
409 result->offset += pp->offset; in find_alternative_probe_point()
410 result->line += pp->line; in find_alternative_probe_point()
411 result->retprobe = pp->retprobe; in find_alternative_probe_point()
427 memcpy(tmp, &pev->point, sizeof(*tmp)); in get_alternative_probe_event()
428 memset(&pev->point, 0, sizeof(pev->point)); in get_alternative_probe_event()
429 ret = find_alternative_probe_point(dinfo, tmp, &pev->point, pev->target, in get_alternative_probe_event()
430 pev->nsi, pev->uprobes); in get_alternative_probe_event()
432 memcpy(&pev->point, tmp, sizeof(*tmp)); in get_alternative_probe_event()
441 struct perf_probe_point pp = { .function = lr->function, in get_alternative_line_range()
442 .file = lr->file, in get_alternative_line_range()
443 .line = lr->start }; in get_alternative_line_range()
449 if (lr->end != INT_MAX) in get_alternative_line_range()
450 len = lr->end - lr->start; in get_alternative_line_range()
454 lr->function = result.function; in get_alternative_line_range()
455 lr->file = result.file; in get_alternative_line_range()
456 lr->start = result.line; in get_alternative_line_range()
457 if (lr->end != INT_MAX) in get_alternative_line_range()
458 lr->end = lr->start + len; in get_alternative_line_range()
478 build_id__sprintf(&dso->bid, sbuild_id); in open_from_debuginfod()
521 if (!dso || dso->load_errno == 0) { in open_debuginfo()
522 if (!str_error_r(-err, reason, STRERR_BUFSIZE)) in open_debuginfo()
538 path = dso->long_name; in open_debuginfo()
547 pr_warning("Rebuild with -g, "); in open_debuginfo()
599 int fd, ret = -ENOENT; in get_text_start_address()
606 return -errno; in get_text_start_address()
610 ret = -EINVAL; in get_text_start_address()
620 *address = shdr.sh_addr - shdr.sh_offset; in get_text_start_address()
631 * Convert trace point to probe point with debuginfo
639 u64 addr = tp->address; in find_perf_probe_point_from_dwarf()
640 int ret = -ENOENT; in find_perf_probe_point_from_dwarf()
645 ret = -EINVAL; in find_perf_probe_point_from_dwarf()
648 ret = get_text_start_address(tp->module, &stext, NULL); in find_perf_probe_point_from_dwarf()
652 } else if (tp->symbol) { in find_perf_probe_point_from_dwarf()
654 ret = kernel_get_symbol_address_by_name(tp->symbol, &addr, in find_perf_probe_point_from_dwarf()
655 false, !!tp->module); in find_perf_probe_point_from_dwarf()
658 addr += tp->offset; in find_perf_probe_point_from_dwarf()
662 tp->module ? : "kernel"); in find_perf_probe_point_from_dwarf()
664 dinfo = debuginfo_cache__open(tp->module, verbose <= 0); in find_perf_probe_point_from_dwarf()
669 ret = -ENOENT; in find_perf_probe_point_from_dwarf()
672 pp->retprobe = tp->retprobe; in find_perf_probe_point_from_dwarf()
677 return ret ? : -ENOENT; in find_perf_probe_point_from_dwarf()
685 u64 addr = tp->address - offs; in post_process_probe_trace_point()
689 return -ENOENT; in post_process_probe_trace_point()
691 if (strcmp(sym->name, tp->symbol)) { in post_process_probe_trace_point()
693 if (!tp->realname) in post_process_probe_trace_point()
694 tp->realname = tp->symbol; in post_process_probe_trace_point()
696 free(tp->symbol); in post_process_probe_trace_point()
697 tp->symbol = strdup(sym->name); in post_process_probe_trace_point()
698 if (!tp->symbol) in post_process_probe_trace_point()
699 return -ENOMEM; in post_process_probe_trace_point()
701 tp->offset = addr - sym->start; in post_process_probe_trace_point()
702 tp->address -= offs; in post_process_probe_trace_point()
708 * Rename DWARF symbols to ELF symbols -- gcc sometimes optimizes functions
727 return -EINVAL; in post_process_offline_probe_trace_events()
731 ret = post_process_probe_trace_point(&tevs[i].point, in post_process_offline_probe_trace_events()
756 /* point.address is the address of point.symbol + point.offset */ in add_exec_to_probe_trace_events()
757 tevs[i].point.address -= stext; in add_exec_to_probe_trace_events()
758 tevs[i].point.module = strdup(exec); in add_exec_to_probe_trace_events()
759 if (!tevs[i].point.module) { in add_exec_to_probe_trace_events()
760 ret = -ENOMEM; in add_exec_to_probe_trace_events()
785 return -EINVAL; in post_process_module_probe_trace_events()
790 ret = post_process_probe_trace_point(&tevs[i].point, in post_process_module_probe_trace_events()
794 tevs[i].point.module = in post_process_module_probe_trace_events()
796 if (!tevs[i].point.module) { in post_process_module_probe_trace_events()
797 ret = -ENOMEM; in post_process_module_probe_trace_events()
825 return -EINVAL; in post_process_kernel_probe_trace_events()
829 if (!tevs[i].point.address) in post_process_kernel_probe_trace_events()
831 if (tevs[i].point.retprobe && !kretprobe_offset_is_supported()) in post_process_kernel_probe_trace_events()
838 if (kprobe_warn_out_range(tevs[i].point.symbol, in post_process_kernel_probe_trace_events()
839 map__objdump_2mem(map, tevs[i].point.address))) { in post_process_kernel_probe_trace_events()
843 tmp = strdup(reloc_sym->name); in post_process_kernel_probe_trace_events()
845 return -ENOMEM; in post_process_kernel_probe_trace_events()
848 if (!tevs[i].point.realname) in post_process_kernel_probe_trace_events()
849 tevs[i].point.realname = tevs[i].point.symbol; in post_process_kernel_probe_trace_events()
851 free(tevs[i].point.symbol); in post_process_kernel_probe_trace_events()
852 tevs[i].point.symbol = tmp; in post_process_kernel_probe_trace_events()
853 tevs[i].point.offset = tevs[i].point.address - in post_process_kernel_probe_trace_events()
854 (map->reloc ? reloc_sym->unrelocated_addr : in post_process_kernel_probe_trace_events()
855 reloc_sym->addr); in post_process_kernel_probe_trace_events()
876 pev->nsi); in post_process_probe_trace_events()
899 dinfo = open_debuginfo(pev->target, pev->nsi, !need_dwarf); in try_to_find_probe_trace_events()
902 return -ENOENT; in try_to_find_probe_trace_events()
907 pr_debug("Try to find probe point from debuginfo.\n"); in try_to_find_probe_trace_events()
919 clear_perf_probe_point(&pev->point); in try_to_find_probe_trace_events()
920 memcpy(&pev->point, &tmp, sizeof(tmp)); in try_to_find_probe_trace_events()
927 pev->target, pev->uprobes, dinfo); in try_to_find_probe_trace_events()
938 if (ntevs == 0) { /* No error but failed to find probe point. */ in try_to_find_probe_trace_events()
939 pr_warning("Probe point '%s' not found.\n", in try_to_find_probe_trace_events()
940 synthesize_perf_probe_point(&pev->point)); in try_to_find_probe_trace_events()
941 return -ENOENT; in try_to_find_probe_trace_events()
945 if (ntevs == -EBADF) in try_to_find_probe_trace_events()
946 pr_warning("Warning: No dwarf info found in the vmlinux - " in try_to_find_probe_trace_events()
983 return -1; in __show_one_line()
993 rv = -1; in _show_one_line()
1004 * Show line-range always requires debuginfo to find source file and
1023 return -ENOENT; in __show_line_range()
1031 if (dinfo->build_id) { in __show_line_range()
1032 build_id__init(&bid, dinfo->build_id, BUILD_ID_SIZE); in __show_line_range()
1036 if (ret == 0 || ret == -ENOENT) { in __show_line_range()
1038 return -ENOENT; in __show_line_range()
1045 tmp = lr->path; in __show_line_range()
1046 ret = find_source_path(tmp, sbuild_id, lr->comp_dir, &lr->path); in __show_line_range()
1049 if (tmp != lr->path) in __show_line_range()
1059 if (lr->function) in __show_line_range()
1060 fprintf(stdout, "<%s@%s:%d>\n", lr->function, lr->path, in __show_line_range()
1061 lr->start - lr->offset); in __show_line_range()
1063 fprintf(stdout, "<%s:%d>\n", lr->path, lr->start); in __show_line_range()
1065 fp = fopen(lr->path, "r"); in __show_line_range()
1067 pr_warning("Failed to open %s: %s\n", lr->path, in __show_line_range()
1069 return -errno; in __show_line_range()
1072 while (l < lr->start) { in __show_line_range()
1075 goto end; in __show_line_range()
1078 intlist__for_each_entry(ln, lr->line_list) { in __show_line_range()
1079 for (; ln->i > l; l++) { in __show_line_range()
1080 ret = show_one_line(fp, l - lr->offset); in __show_line_range()
1082 goto end; in __show_line_range()
1084 ret = show_one_line_with_num(fp, l++ - lr->offset); in __show_line_range()
1086 goto end; in __show_line_range()
1089 if (lr->end == INT_MAX) in __show_line_range()
1090 lr->end = l + NR_ADDITIONAL_LINES; in __show_line_range()
1091 while (l <= lr->end) { in __show_line_range()
1092 ret = show_one_line_or_eof(fp, l++ - lr->offset); in __show_line_range()
1096 end: in __show_line_range()
1129 buf = synthesize_perf_probe_point(&pev->point); in show_available_vars_at()
1131 return -EINVAL; in show_available_vars_at()
1145 if (ret == 0 || ret == -ENOENT) { in show_available_vars_at()
1147 ret = -ENOENT; in show_available_vars_at()
1150 goto end; in show_available_vars_at()
1158 * A probe point might be converted to in show_available_vars_at()
1161 fprintf(stdout, "\t@<%s+%lu>\n", vl->point.symbol, in show_available_vars_at()
1162 vl->point.offset); in show_available_vars_at()
1163 zfree(&vl->point.symbol); in show_available_vars_at()
1165 if (vl->vars) { in show_available_vars_at()
1166 strlist__for_each_entry(node, vl->vars) { in show_available_vars_at()
1167 var = strchr(node->s, '\t') + 1; in show_available_vars_at()
1169 fprintf(stdout, "\t\t%s\n", node->s); in show_available_vars_at()
1173 strlist__delete(vl->vars); in show_available_vars_at()
1179 end: in show_available_vars_at()
1184 /* Show available variables on given probe point */
1191 ret = init_probe_symbol_maps(pevs->uprobes); in show_available_vars()
1195 dinfo = open_debuginfo(pevs->target, pevs->nsi, false); in show_available_vars()
1197 ret = -ENOENT; in show_available_vars()
1223 return -ENOSYS; in find_perf_probe_point_from_dwarf()
1230 pr_warning("Debuginfo-analysis is not supported.\n"); in try_to_find_probe_trace_events()
1231 return -ENOSYS; in try_to_find_probe_trace_events()
1242 pr_warning("Debuginfo-analysis is not supported.\n"); in show_line_range()
1243 return -ENOSYS; in show_line_range()
1250 pr_warning("Debuginfo-analysis is not supported.\n"); in show_available_vars()
1251 return -ENOSYS; in show_available_vars()
1257 zfree(&lr->function); in line_range__clear()
1258 zfree(&lr->file); in line_range__clear()
1259 zfree(&lr->path); in line_range__clear()
1260 zfree(&lr->comp_dir); in line_range__clear()
1261 intlist__delete(lr->line_list); in line_range__clear()
1267 lr->line_list = intlist__new(NULL); in line_range__init()
1268 if (!lr->line_list) in line_range__init()
1269 return -ENOMEM; in line_range__init()
1282 return -EINVAL; in parse_line_num()
1303 * SRC[:SLN[+NUM|-ELN]]
1304 * FNC[@SRC][:SLN[+NUM|-ELN]]
1312 return -ENOMEM; in parse_line_range_desc()
1314 lr->start = 0; in parse_line_range_desc()
1315 lr->end = INT_MAX; in parse_line_range_desc()
1321 err = parse_line_num(&range, &lr->start, "start line"); in parse_line_range_desc()
1325 if (*range == '+' || *range == '-') { in parse_line_range_desc()
1328 err = parse_line_num(&range, &lr->end, "end line"); in parse_line_range_desc()
1333 lr->end += lr->start; in parse_line_range_desc()
1337 * the end of line should be equal to in parse_line_range_desc()
1340 lr->end--; in parse_line_range_desc()
1344 pr_debug("Line range is %d to %d\n", lr->start, lr->end); in parse_line_range_desc()
1346 err = -EINVAL; in parse_line_range_desc()
1347 if (lr->start > lr->end) { in parse_line_range_desc()
1349 " than end line.\n"); in parse_line_range_desc()
1361 lr->file = strdup(++file); in parse_line_range_desc()
1362 if (lr->file == NULL) { in parse_line_range_desc()
1363 err = -ENOMEM; in parse_line_range_desc()
1366 lr->function = name; in parse_line_range_desc()
1368 lr->file = name; in parse_line_range_desc()
1370 lr->function = name; in parse_line_range_desc()
1373 err = -EINVAL; in parse_line_range_desc()
1390 if (!pev->sdt && !is_c_func_name(*arg)) in parse_perf_probe_event_name()
1392 pev->group = strdup_esc(*arg); in parse_perf_probe_event_name()
1393 if (!pev->group) in parse_perf_probe_event_name()
1394 return -ENOMEM; in parse_perf_probe_event_name()
1397 pev->group = NULL; in parse_perf_probe_event_name()
1399 pev->event = strdup_esc(*arg); in parse_perf_probe_event_name()
1400 if (pev->event == NULL) in parse_perf_probe_event_name()
1401 return -ENOMEM; in parse_perf_probe_event_name()
1403 if (!pev->sdt && !is_c_func_name(pev->event)) { in parse_perf_probe_event_name()
1404 zfree(&pev->event); in parse_perf_probe_event_name()
1406 zfree(&pev->group); in parse_perf_probe_event_name()
1407 semantic_error("%s is bad for event name -it must " in parse_perf_probe_event_name()
1408 "follow C symbol-naming rule.\n", *arg); in parse_perf_probe_event_name()
1409 return -EINVAL; in parse_perf_probe_event_name()
1417 struct perf_probe_point *pp = &pev->point; in parse_perf_probe_point()
1430 return -EINVAL; in parse_perf_probe_point()
1433 pev->sdt = true; in parse_perf_probe_point()
1439 if (pev->sdt) { in parse_perf_probe_point()
1444 return -EINVAL; in parse_perf_probe_point()
1449 pev->target = build_id_cache__origname(tmp); in parse_perf_probe_point()
1452 pev->target = strdup_esc(ptr + 1); in parse_perf_probe_point()
1453 if (!pev->target) in parse_perf_probe_point()
1454 return -ENOMEM; in parse_perf_probe_point()
1459 if (asprintf(&pev->point.function, "%%%s", pev->event) < 0) in parse_perf_probe_point()
1460 ret = -errno; in parse_perf_probe_point()
1480 * - it does not include any of "+@%", in parse_perf_probe_point()
1481 * - it includes one of ":;", and in parse_perf_probe_point()
1482 * - it has a period '.' in the name. in parse_perf_probe_point()
1489 if (ptr && memchr(arg, '.', ptr - arg)) in parse_perf_probe_point()
1504 return -ENOMEM; in parse_perf_probe_point()
1508 pp->file = tmp; in parse_perf_probe_point()
1510 pp->function = tmp; in parse_perf_probe_point()
1513 * Keep pp->function even if this is absolute address, in parse_perf_probe_point()
1522 pp->abs_address = strtoul(pp->function, &tmp, 0); in parse_perf_probe_point()
1525 return -EINVAL; in parse_perf_probe_point()
1535 pp->lazy_line = strdup(arg); /* let leave escapes */ in parse_perf_probe_point()
1536 if (pp->lazy_line == NULL) in parse_perf_probe_point()
1537 return -ENOMEM; in parse_perf_probe_point()
1547 pp->line = strtoul(arg, &tmp, 0); in parse_perf_probe_point()
1549 semantic_error("There is non-digit char" in parse_perf_probe_point()
1551 return -EINVAL; in parse_perf_probe_point()
1555 pp->offset = strtoul(arg, &tmp, 0); in parse_perf_probe_point()
1557 semantic_error("There is non-digit character" in parse_perf_probe_point()
1559 return -EINVAL; in parse_perf_probe_point()
1563 if (pp->file) { in parse_perf_probe_point()
1565 return -EINVAL; in parse_perf_probe_point()
1567 pp->file = strdup_esc(arg); in parse_perf_probe_point()
1568 if (pp->file == NULL) in parse_perf_probe_point()
1569 return -ENOMEM; in parse_perf_probe_point()
1573 pp->retprobe = 1; in parse_perf_probe_point()
1576 return -ENOTSUP; in parse_perf_probe_point()
1582 return -ENOTSUP; in parse_perf_probe_point()
1588 if (pp->lazy_line && pp->line) { in parse_perf_probe_point()
1591 return -EINVAL; in parse_perf_probe_point()
1594 if (pp->lazy_line && pp->offset) { in parse_perf_probe_point()
1596 return -EINVAL; in parse_perf_probe_point()
1599 if (pp->line && pp->offset) { in parse_perf_probe_point()
1601 return -EINVAL; in parse_perf_probe_point()
1604 if (!pp->line && !pp->lazy_line && pp->file && !pp->function) { in parse_perf_probe_point()
1607 return -EINVAL; in parse_perf_probe_point()
1610 if (pp->offset && !pp->function) { in parse_perf_probe_point()
1612 return -EINVAL; in parse_perf_probe_point()
1615 if ((pp->offset || pp->line || pp->lazy_line) && pp->retprobe) { in parse_perf_probe_point()
1618 return -EINVAL; in parse_perf_probe_point()
1622 pp->function, pp->file, pp->line, pp->offset, pp->retprobe, in parse_perf_probe_point()
1623 pp->lazy_line); in parse_perf_probe_point()
1627 /* Parse perf-probe event argument */
1637 arg->name = strndup(str, tmp - str); in parse_perf_probe_arg()
1638 if (arg->name == NULL) in parse_perf_probe_arg()
1639 return -ENOMEM; in parse_perf_probe_arg()
1640 pr_debug("name:%s ", arg->name); in parse_perf_probe_arg()
1648 return -EINVAL; in parse_perf_probe_arg()
1651 arg->user_access = true; in parse_perf_probe_arg()
1658 arg->type = strdup(tmp + 1); in parse_perf_probe_arg()
1659 if (arg->type == NULL) in parse_perf_probe_arg()
1660 return -ENOMEM; in parse_perf_probe_arg()
1661 pr_debug("type:%s ", arg->type); in parse_perf_probe_arg()
1664 tmp = strpbrk(str, "-.["); in parse_perf_probe_arg()
1667 arg->var = strdup(str); in parse_perf_probe_arg()
1668 if (arg->var == NULL) in parse_perf_probe_arg()
1669 return -ENOMEM; in parse_perf_probe_arg()
1670 pr_debug("%s\n", arg->var); in parse_perf_probe_arg()
1675 arg->var = strndup(str, tmp - str); in parse_perf_probe_arg()
1676 if (arg->var == NULL) in parse_perf_probe_arg()
1677 return -ENOMEM; in parse_perf_probe_arg()
1678 goodname = arg->var; in parse_perf_probe_arg()
1679 pr_debug("%s, ", arg->var); in parse_perf_probe_arg()
1680 fieldp = &arg->field; in parse_perf_probe_arg()
1685 return -ENOMEM; in parse_perf_probe_arg()
1688 (*fieldp)->index = strtol(str + 1, &tmp, 0); in parse_perf_probe_arg()
1689 (*fieldp)->ref = true; in parse_perf_probe_arg()
1693 return -EINVAL; in parse_perf_probe_arg()
1701 (*fieldp)->ref = false; in parse_perf_probe_arg()
1704 (*fieldp)->ref = true; in parse_perf_probe_arg()
1708 return -EINVAL; in parse_perf_probe_arg()
1710 tmp = strpbrk(str, "-.["); in parse_perf_probe_arg()
1713 (*fieldp)->name = strndup(str, tmp - str); in parse_perf_probe_arg()
1714 if ((*fieldp)->name == NULL) in parse_perf_probe_arg()
1715 return -ENOMEM; in parse_perf_probe_arg()
1717 goodname = (*fieldp)->name; in parse_perf_probe_arg()
1718 pr_debug("%s(%d), ", (*fieldp)->name, (*fieldp)->ref); in parse_perf_probe_arg()
1719 fieldp = &(*fieldp)->next; in parse_perf_probe_arg()
1722 (*fieldp)->name = strdup(str); in parse_perf_probe_arg()
1723 if ((*fieldp)->name == NULL) in parse_perf_probe_arg()
1724 return -ENOMEM; in parse_perf_probe_arg()
1726 goodname = (*fieldp)->name; in parse_perf_probe_arg()
1727 pr_debug("%s(%d)\n", (*fieldp)->name, (*fieldp)->ref); in parse_perf_probe_arg()
1730 if (!arg->name) { in parse_perf_probe_arg()
1731 arg->name = strdup(goodname); in parse_perf_probe_arg()
1732 if (arg->name == NULL) in parse_perf_probe_arg()
1733 return -ENOMEM; in parse_perf_probe_arg()
1738 /* Parse perf-probe event command */
1747 return -ENOMEM; in parse_perf_probe_command()
1749 if (argc - 1 > MAX_PROBE_ARGS) { in parse_perf_probe_command()
1750 semantic_error("Too many probe arguments (%d).\n", argc - 1); in parse_perf_probe_command()
1751 ret = -ERANGE; in parse_perf_probe_command()
1754 /* Parse probe point */ in parse_perf_probe_command()
1760 if (!pev->event && pev->point.function && pev->point.line in parse_perf_probe_command()
1761 && !pev->point.lazy_line && !pev->point.offset) { in parse_perf_probe_command()
1762 if (asprintf(&pev->event, "%s_L%d", pev->point.function, in parse_perf_probe_command()
1763 pev->point.line) < 0) { in parse_perf_probe_command()
1764 ret = -ENOMEM; in parse_perf_probe_command()
1770 pev->nargs = argc - 1; in parse_perf_probe_command()
1771 pev->args = zalloc(sizeof(struct perf_probe_arg) * pev->nargs); in parse_perf_probe_command()
1772 if (pev->args == NULL) { in parse_perf_probe_command()
1773 ret = -ENOMEM; in parse_perf_probe_command()
1776 for (i = 0; i < pev->nargs && ret >= 0; i++) { in parse_perf_probe_command()
1777 ret = parse_perf_probe_arg(argv[i + 1], &pev->args[i]); in parse_perf_probe_command()
1779 is_c_varname(pev->args[i].var) && pev->point.retprobe) { in parse_perf_probe_command()
1782 ret = -EINVAL; in parse_perf_probe_command()
1796 for (i = 0; i < pev->nargs; i++) in perf_probe_with_var()
1797 if (is_c_varname(pev->args[i].var) || in perf_probe_with_var()
1798 !strcmp(pev->args[i].var, PROBE_ARG_PARAMS) || in perf_probe_with_var()
1799 !strcmp(pev->args[i].var, PROBE_ARG_VARS)) in perf_probe_with_var()
1807 if (pev->point.file || pev->point.line || pev->point.lazy_line) in perf_probe_event_need_dwarf()
1819 struct probe_trace_point *tp = &tev->point; in parse_probe_trace_command()
1830 return -ENOMEM; in parse_probe_trace_command()
1834 ret = -ERANGE; in parse_probe_trace_command()
1841 ret = -ENOMEM; in parse_probe_trace_command()
1849 ret = -EINVAL; in parse_probe_trace_command()
1853 tev->group = strdup(fmt2_str); in parse_probe_trace_command()
1854 tev->event = strdup(fmt3_str); in parse_probe_trace_command()
1855 if (tev->group == NULL || tev->event == NULL) { in parse_probe_trace_command()
1856 ret = -ENOMEM; in parse_probe_trace_command()
1859 pr_debug("Group:%s Event:%s probe:%c\n", tev->group, tev->event, pr); in parse_probe_trace_command()
1861 tp->retprobe = (pr == 'r'); in parse_probe_trace_command()
1866 tp->module = strndup(argv[1], p - argv[1]); in parse_probe_trace_command()
1867 if (!tp->module) { in parse_probe_trace_command()
1868 ret = -ENOMEM; in parse_probe_trace_command()
1871 tev->uprobes = (tp->module[0] == '/'); in parse_probe_trace_command()
1881 * p:probe_libc/abs_0 /lib/libc-2.18.so:0x (null) arg1=%ax in parse_probe_trace_command()
1887 ret = -EINVAL; in parse_probe_trace_command()
1890 tp->address = 0; in parse_probe_trace_command()
1897 argc -= 1; in parse_probe_trace_command()
1899 tp->address = strtoul(fmt1_str, NULL, 0); in parse_probe_trace_command()
1901 /* Only the symbol-based probe has offset */ in parse_probe_trace_command()
1902 tp->symbol = strdup(fmt1_str); in parse_probe_trace_command()
1903 if (tp->symbol == NULL) { in parse_probe_trace_command()
1904 ret = -ENOMEM; in parse_probe_trace_command()
1909 tp->offset = 0; in parse_probe_trace_command()
1911 tp->offset = strtoul(fmt2_str, NULL, 10); in parse_probe_trace_command()
1914 if (tev->uprobes) { in parse_probe_trace_command()
1917 tp->ref_ctr_offset = strtoul(fmt2_str + 1, NULL, 0); in parse_probe_trace_command()
1920 tev->nargs = argc - 2; in parse_probe_trace_command()
1921 tev->args = zalloc(sizeof(struct probe_trace_arg) * tev->nargs); in parse_probe_trace_command()
1922 if (tev->args == NULL) { in parse_probe_trace_command()
1923 ret = -ENOMEM; in parse_probe_trace_command()
1926 for (i = 0; i < tev->nargs; i++) { in parse_probe_trace_command()
1932 tev->args[i].name = strdup(argv[i + 2]); in parse_probe_trace_command()
1934 tev->args[i].value = strdup(p); in parse_probe_trace_command()
1935 if (tev->args[i].name == NULL || tev->args[i].value == NULL) { in parse_probe_trace_command()
1936 ret = -ENOMEM; in parse_probe_trace_command()
1950 struct perf_probe_arg_field *field = pa->field; in synthesize_perf_probe_arg()
1958 if (pa->name && pa->var) in synthesize_perf_probe_arg()
1959 err = strbuf_addf(&buf, "%s=%s", pa->name, pa->var); in synthesize_perf_probe_arg()
1961 err = strbuf_addstr(&buf, pa->name ?: pa->var); in synthesize_perf_probe_arg()
1966 if (field->name[0] == '[') in synthesize_perf_probe_arg()
1967 err = strbuf_addstr(&buf, field->name); in synthesize_perf_probe_arg()
1969 err = strbuf_addf(&buf, "%s%s", field->ref ? "->" : ".", in synthesize_perf_probe_arg()
1970 field->name); in synthesize_perf_probe_arg()
1971 field = field->next; in synthesize_perf_probe_arg()
1976 if (pa->type) in synthesize_perf_probe_arg()
1977 if (strbuf_addf(&buf, ":%s", pa->type) < 0) in synthesize_perf_probe_arg()
1986 /* Compose only probe point (not argument) */
1996 if (pp->function) { in synthesize_perf_probe_point()
1997 if (strbuf_addstr(&buf, pp->function) < 0) in synthesize_perf_probe_point()
1999 if (pp->offset) in synthesize_perf_probe_point()
2000 err = strbuf_addf(&buf, "+%lu", pp->offset); in synthesize_perf_probe_point()
2001 else if (pp->line) in synthesize_perf_probe_point()
2002 err = strbuf_addf(&buf, ":%d", pp->line); in synthesize_perf_probe_point()
2003 else if (pp->retprobe) in synthesize_perf_probe_point()
2008 if (pp->file) { in synthesize_perf_probe_point()
2009 tmp = pp->file; in synthesize_perf_probe_point()
2012 tmp = strchr(pp->file + len - 30, '/'); in synthesize_perf_probe_point()
2013 tmp = tmp ? tmp + 1 : pp->file + len - 30; in synthesize_perf_probe_point()
2016 if (!err && !pp->function && pp->line) in synthesize_perf_probe_point()
2017 err = strbuf_addf(&buf, ":%d", pp->line); in synthesize_perf_probe_point()
2034 if (pev->event) in synthesize_perf_probe_command()
2035 if (strbuf_addf(&buf, "%s:%s=", pev->group ?: PERFPROBE_GROUP, in synthesize_perf_probe_command()
2036 pev->event) < 0) in synthesize_perf_probe_command()
2039 tmp = synthesize_perf_probe_point(&pev->point); in synthesize_perf_probe_command()
2044 for (i = 0; i < pev->nargs; i++) { in synthesize_perf_probe_command()
2045 tmp = synthesize_perf_probe_arg(pev->args + i); in synthesize_perf_probe_command()
2061 if (ref->next) { in __synthesize_probe_trace_arg_ref()
2062 depth = __synthesize_probe_trace_arg_ref(ref->next, buf, in __synthesize_probe_trace_arg_ref()
2067 if (ref->user_access) in __synthesize_probe_trace_arg_ref()
2068 err = strbuf_addf(buf, "%s%ld(", "+u", ref->offset); in __synthesize_probe_trace_arg_ref()
2070 err = strbuf_addf(buf, "%+ld(", ref->offset); in __synthesize_probe_trace_arg_ref()
2077 struct probe_trace_arg_ref *ref = arg->ref; in synthesize_probe_trace_arg()
2081 if (arg->name) in synthesize_probe_trace_arg()
2082 err = strbuf_addf(buf, " %s=", arg->name); in synthesize_probe_trace_arg()
2089 if (arg->value[0] == '@' && arg->ref) in synthesize_probe_trace_arg()
2090 ref = ref->next; in synthesize_probe_trace_arg()
2100 if (arg->value[0] == '@' && arg->ref) in synthesize_probe_trace_arg()
2101 err = strbuf_addf(buf, "%s%+ld", arg->value, arg->ref->offset); in synthesize_probe_trace_arg()
2103 err = strbuf_addstr(buf, arg->value); in synthesize_probe_trace_arg()
2106 while (!err && depth--) in synthesize_probe_trace_arg()
2110 if (!err && arg->type) in synthesize_probe_trace_arg()
2111 err = strbuf_addf(buf, ":%s", arg->type); in synthesize_probe_trace_arg()
2119 struct probe_trace_point *tp = &tev->point; in synthesize_uprobe_trace_def()
2122 err = strbuf_addf(buf, "%s:0x%lx", tp->module, tp->address); in synthesize_uprobe_trace_def()
2124 if (err >= 0 && tp->ref_ctr_offset) { in synthesize_uprobe_trace_def()
2126 return -1; in synthesize_uprobe_trace_def()
2127 err = strbuf_addf(buf, "(0x%lx)", tp->ref_ctr_offset); in synthesize_uprobe_trace_def()
2129 return err >= 0 ? 0 : -1; in synthesize_uprobe_trace_def()
2134 struct probe_trace_point *tp = &tev->point; in synthesize_probe_trace_command()
2139 /* Uprobes must have tp->module */ in synthesize_probe_trace_command()
2140 if (tev->uprobes && !tp->module) in synthesize_probe_trace_command()
2146 if (strbuf_addf(&buf, "%c:%s/%s ", tp->retprobe ? 'r' : 'p', in synthesize_probe_trace_command()
2147 tev->group, tev->event) < 0) in synthesize_probe_trace_command()
2150 * If tp->address == 0, then this point must be a in synthesize_probe_trace_command()
2153 * tp->symbol to "0x0". in synthesize_probe_trace_command()
2155 if (tev->uprobes && !tp->address) { in synthesize_probe_trace_command()
2156 if (!tp->symbol || strcmp(tp->symbol, "0x0")) in synthesize_probe_trace_command()
2160 /* Use the tp->address for uprobes */ in synthesize_probe_trace_command()
2161 if (tev->uprobes) { in synthesize_probe_trace_command()
2163 } else if (!strncmp(tp->symbol, "0x", 2)) { in synthesize_probe_trace_command()
2165 err = strbuf_addf(&buf, "%s%s0x%lx", tp->module ?: "", in synthesize_probe_trace_command()
2166 tp->module ? ":" : "", tp->address); in synthesize_probe_trace_command()
2168 err = strbuf_addf(&buf, "%s%s%s+%lu", tp->module ?: "", in synthesize_probe_trace_command()
2169 tp->module ? ":" : "", tp->symbol, tp->offset); in synthesize_probe_trace_command()
2175 for (i = 0; i < tev->nargs; i++) in synthesize_probe_trace_command()
2176 if (synthesize_probe_trace_arg(&tev->args[i], &buf) < 0) in synthesize_probe_trace_command()
2191 u64 addr = tp->address; in find_perf_probe_point_from_map()
2192 int ret = -ENOENT; in find_perf_probe_point_from_map()
2195 map = dso__new_map(tp->module); in find_perf_probe_point_from_map()
2200 if (tp->symbol && !addr) { in find_perf_probe_point_from_map()
2201 if (kernel_get_symbol_address_by_name(tp->symbol, in find_perf_probe_point_from_map()
2206 addr += tp->offset; in find_perf_probe_point_from_map()
2214 pp->retprobe = tp->retprobe; in find_perf_probe_point_from_map()
2215 pp->offset = addr - map->unmap_ip(map, sym->start); in find_perf_probe_point_from_map()
2216 pp->function = strdup(sym->name); in find_perf_probe_point_from_map()
2217 ret = pp->function ? 0 : -ENOMEM; in find_perf_probe_point_from_map()
2241 pr_debug("Failed to find probe point from both of dwarf and map.\n"); in convert_to_perf_probe_point()
2243 if (tp->symbol) { in convert_to_perf_probe_point()
2244 pp->function = strdup(tp->symbol); in convert_to_perf_probe_point()
2245 pp->offset = tp->offset; in convert_to_perf_probe_point()
2247 ret = e_snprintf(buf, 128, "0x%" PRIx64, (u64)tp->address); in convert_to_perf_probe_point()
2250 pp->function = strdup(buf); in convert_to_perf_probe_point()
2251 pp->offset = 0; in convert_to_perf_probe_point()
2253 if (pp->function == NULL) in convert_to_perf_probe_point()
2254 return -ENOMEM; in convert_to_perf_probe_point()
2256 pp->retprobe = tp->retprobe; in convert_to_perf_probe_point()
2268 pev->event = strdup(tev->event); in convert_to_perf_probe_event()
2269 pev->group = strdup(tev->group); in convert_to_perf_probe_event()
2270 if (pev->event == NULL || pev->group == NULL) in convert_to_perf_probe_event()
2271 return -ENOMEM; in convert_to_perf_probe_event()
2274 ret = convert_to_perf_probe_point(&tev->point, &pev->point, is_kprobe); in convert_to_perf_probe_event()
2279 pev->nargs = tev->nargs; in convert_to_perf_probe_event()
2280 pev->args = zalloc(sizeof(struct perf_probe_arg) * pev->nargs); in convert_to_perf_probe_event()
2281 if (pev->args == NULL) in convert_to_perf_probe_event()
2282 return -ENOMEM; in convert_to_perf_probe_event()
2283 for (i = 0; i < tev->nargs && ret >= 0; i++) { in convert_to_perf_probe_event()
2284 if (tev->args[i].name) in convert_to_perf_probe_event()
2285 pev->args[i].name = strdup(tev->args[i].name); in convert_to_perf_probe_event()
2289 ret = synthesize_probe_trace_arg(&tev->args[i], &buf); in convert_to_perf_probe_event()
2290 pev->args[i].name = strbuf_detach(&buf, NULL); in convert_to_perf_probe_event()
2292 if (pev->args[i].name == NULL && ret >= 0) in convert_to_perf_probe_event()
2293 ret = -ENOMEM; in convert_to_perf_probe_event()
2307 zfree(&pev->event); in clear_perf_probe_event()
2308 zfree(&pev->group); in clear_perf_probe_event()
2309 zfree(&pev->target); in clear_perf_probe_event()
2310 clear_perf_probe_point(&pev->point); in clear_perf_probe_event()
2312 for (i = 0; i < pev->nargs; i++) { in clear_perf_probe_event()
2313 zfree(&pev->args[i].name); in clear_perf_probe_event()
2314 zfree(&pev->args[i].var); in clear_perf_probe_event()
2315 zfree(&pev->args[i].type); in clear_perf_probe_event()
2316 field = pev->args[i].field; in clear_perf_probe_event()
2318 next = field->next; in clear_perf_probe_event()
2319 zfree(&field->name); in clear_perf_probe_event()
2324 pev->nargs = 0; in clear_perf_probe_event()
2325 zfree(&pev->args); in clear_perf_probe_event()
2334 dst->file = strdup_or_goto(src->file, out_err); in perf_probe_point__copy()
2335 dst->function = strdup_or_goto(src->function, out_err); in perf_probe_point__copy()
2336 dst->lazy_line = strdup_or_goto(src->lazy_line, out_err); in perf_probe_point__copy()
2337 dst->line = src->line; in perf_probe_point__copy()
2338 dst->retprobe = src->retprobe; in perf_probe_point__copy()
2339 dst->offset = src->offset; in perf_probe_point__copy()
2344 return -ENOMEM; in perf_probe_point__copy()
2352 dst->name = strdup_or_goto(src->name, out_err); in perf_probe_arg__copy()
2353 dst->var = strdup_or_goto(src->var, out_err); in perf_probe_arg__copy()
2354 dst->type = strdup_or_goto(src->type, out_err); in perf_probe_arg__copy()
2356 field = src->field; in perf_probe_arg__copy()
2357 ppfield = &(dst->field); in perf_probe_arg__copy()
2362 (*ppfield)->name = strdup_or_goto(field->name, out_err); in perf_probe_arg__copy()
2363 (*ppfield)->index = field->index; in perf_probe_arg__copy()
2364 (*ppfield)->ref = field->ref; in perf_probe_arg__copy()
2365 field = field->next; in perf_probe_arg__copy()
2366 ppfield = &((*ppfield)->next); in perf_probe_arg__copy()
2370 return -ENOMEM; in perf_probe_arg__copy()
2378 dst->event = strdup_or_goto(src->event, out_err); in perf_probe_event__copy()
2379 dst->group = strdup_or_goto(src->group, out_err); in perf_probe_event__copy()
2380 dst->target = strdup_or_goto(src->target, out_err); in perf_probe_event__copy()
2381 dst->uprobes = src->uprobes; in perf_probe_event__copy()
2383 if (perf_probe_point__copy(&dst->point, &src->point) < 0) in perf_probe_event__copy()
2386 dst->args = zalloc(sizeof(struct perf_probe_arg) * src->nargs); in perf_probe_event__copy()
2387 if (!dst->args) in perf_probe_event__copy()
2389 dst->nargs = src->nargs; in perf_probe_event__copy()
2391 for (i = 0; i < src->nargs; i++) in perf_probe_event__copy()
2392 if (perf_probe_arg__copy(&dst->args[i], &src->args[i]) < 0) in perf_probe_event__copy()
2398 return -ENOMEM; in perf_probe_event__copy()
2406 zfree(&tev->event); in clear_probe_trace_event()
2407 zfree(&tev->group); in clear_probe_trace_event()
2408 zfree(&tev->point.symbol); in clear_probe_trace_event()
2409 zfree(&tev->point.realname); in clear_probe_trace_event()
2410 zfree(&tev->point.module); in clear_probe_trace_event()
2411 for (i = 0; i < tev->nargs; i++) { in clear_probe_trace_event()
2412 zfree(&tev->args[i].name); in clear_probe_trace_event()
2413 zfree(&tev->args[i].value); in clear_probe_trace_event()
2414 zfree(&tev->args[i].type); in clear_probe_trace_event()
2415 ref = tev->args[i].ref; in clear_probe_trace_event()
2417 next = ref->next; in clear_probe_trace_event()
2422 zfree(&tev->args); in clear_probe_trace_event()
2423 tev->nargs = 0; in clear_probe_trace_event()
2429 unsigned long end; member
2440 list_del_init(&node->list); in kprobe_blacklist__delete()
2441 zfree(&node->symbol); in kprobe_blacklist__delete()
2455 return -ENOTSUP; in kprobe_blacklist__load()
2463 return -errno; in kprobe_blacklist__load()
2469 ret = -ENOMEM; in kprobe_blacklist__load()
2472 INIT_LIST_HEAD(&node->list); in kprobe_blacklist__load()
2473 list_add_tail(&node->list, blacklist); in kprobe_blacklist__load()
2474 if (sscanf(buf, "0x%lx-0x%lx", &node->start, &node->end) != 2) { in kprobe_blacklist__load()
2475 ret = -EINVAL; in kprobe_blacklist__load()
2481 if (p[strlen(p) - 1] == '\n') in kprobe_blacklist__load()
2482 p[strlen(p) - 1] = '\0'; in kprobe_blacklist__load()
2485 node->symbol = strdup(p); in kprobe_blacklist__load()
2486 if (!node->symbol) { in kprobe_blacklist__load()
2487 ret = -ENOMEM; in kprobe_blacklist__load()
2490 pr_debug2("Blacklist: 0x%lx-0x%lx, %s\n", in kprobe_blacklist__load()
2491 node->start, node->end, node->symbol); in kprobe_blacklist__load()
2508 if (node->start <= address && address < node->end) in kprobe_blacklist__find_by_address()
2545 return -errno; in perf_probe_event__sprintf()
2546 ret = strbuf_addf(result, " %-20s (on ", buf); in perf_probe_event__sprintf()
2551 /* Synthesize only event probe point */ in perf_probe_event__sprintf()
2552 buf = synthesize_perf_probe_point(&pev->point); in perf_probe_event__sprintf()
2554 return -ENOMEM; in perf_probe_event__sprintf()
2561 if (!ret && pev->nargs > 0) { in perf_probe_event__sprintf()
2563 for (i = 0; !ret && i < pev->nargs; i++) { in perf_probe_event__sprintf()
2564 buf = synthesize_perf_probe_arg(&pev->args[i]); in perf_probe_event__sprintf()
2566 return -ENOMEM; in perf_probe_event__sprintf()
2603 if (strfilter__compare(filter, tev->event)) in filter_probe_trace_event()
2607 if (e_snprintf(tmp, 128, "%s:%s", tev->group, tev->event) < 0) in filter_probe_trace_event()
2626 return -ENOMEM; in __show_perf_probe_events()
2629 ret = parse_probe_trace_command(ent->s, &tev); in __show_perf_probe_events()
2638 &pev, tev.point.module, in __show_perf_probe_events()
2654 /* List up current perf-probe events */
2696 return -ENOMEM; in get_new_event_name()
2714 " Hint: Remove existing event by 'perf probe -d'\n" in get_new_event_name()
2715 " or force duplicates by 'perf probe -f'\n" in get_new_event_name()
2718 ret = -EEXIST; in get_new_event_name()
2734 ret = -ERANGE; in get_new_event_name()
2744 ret = -EINVAL; in get_new_event_name()
2755 struct probe_trace_point *tp = &tev->point; in warn_uprobe_event_compat()
2757 if (tp->ref_ctr_offset && !uprobe_ref_ctr_is_supported()) { in warn_uprobe_event_compat()
2760 tev->group, tev->event); in warn_uprobe_event_compat()
2764 if (!tev->uprobes || tev->nargs == 0 || !buf) in warn_uprobe_event_compat()
2767 for (i = 0; i < tev->nargs; i++) in warn_uprobe_event_compat()
2768 if (strglobmatch(tev->args[i].value, "[$@+-]*")) { in warn_uprobe_event_compat()
2771 tev->args[i].value); in warn_uprobe_event_compat()
2789 if (pev->event && !pev->sdt) in probe_trace_event__set_name()
2790 event = pev->event; in probe_trace_event__set_name()
2791 else if (tev->event) in probe_trace_event__set_name()
2792 event = tev->event; in probe_trace_event__set_name()
2794 /* Or generate new one from probe point */ in probe_trace_event__set_name()
2795 if (pev->point.function && in probe_trace_event__set_name()
2796 (strncmp(pev->point.function, "0x", 2) != 0) && in probe_trace_event__set_name()
2797 !strisglob(pev->point.function)) in probe_trace_event__set_name()
2798 event = pev->point.function; in probe_trace_event__set_name()
2800 event = tev->point.realname; in probe_trace_event__set_name()
2802 if (pev->group && !pev->sdt) in probe_trace_event__set_name()
2803 group = pev->group; in probe_trace_event__set_name()
2804 else if (tev->group) in probe_trace_event__set_name()
2805 group = tev->group; in probe_trace_event__set_name()
2811 tev->point.retprobe, allow_suffix); in probe_trace_event__set_name()
2817 tev->event = strdup(event); in probe_trace_event__set_name()
2818 tev->group = strdup(group); in probe_trace_event__set_name()
2819 if (tev->event == NULL || tev->group == NULL) in probe_trace_event__set_name()
2820 return -ENOMEM; in probe_trace_event__set_name()
2846 return -ENOMEM; in __open_probe_file_and_namelist()
2855 int i, fd[2] = {-1, -1}, up, ret; in __add_probe_trace_events()
2861 up = pev->uprobes ? 1 : 0; in __add_probe_trace_events()
2869 up = tev->uprobes ? 1 : 0; in __add_probe_trace_events()
2870 if (fd[up] == -1) { /* Open the kprobe/uprobe_events */ in __add_probe_trace_events()
2877 if (!tev->point.symbol && !pev->uprobes) in __add_probe_trace_events()
2886 nsinfo__mountns_enter(pev->nsi, &nsc); in __add_probe_trace_events()
2900 if (ret == -EINVAL && pev->uprobes) in __add_probe_trace_events()
2903 cache = probe_cache__new(pev->target, pev->nsi); in __add_probe_trace_events()
2938 norm = arch__normalize_symbol_name(sym->name); in find_probe_functions()
2946 buf = strndup(norm, ver - norm); in find_probe_functions()
2948 return -ENOMEM; in find_probe_functions()
2956 syms[found - 1] = sym; in find_probe_functions()
2982 struct perf_probe_point *pp = &pev->point; in find_probe_trace_events_from_map()
2988 map = get_target_map(pev->target, pev->nsi, pev->uprobes); in find_probe_trace_events_from_map()
2990 ret = -EINVAL; in find_probe_trace_events_from_map()
2996 ret = -ENOMEM; in find_probe_trace_events_from_map()
3004 num_matched_functions = find_probe_functions(map, pp->function, syms); in find_probe_trace_events_from_map()
3006 pr_err("Failed to find symbol %s in %s\n", pp->function, in find_probe_trace_events_from_map()
3007 pev->target ? : "kernel"); in find_probe_trace_events_from_map()
3008 ret = -ENOENT; in find_probe_trace_events_from_map()
3012 pev->target ? : "kernel"); in find_probe_trace_events_from_map()
3013 ret = -E2BIG; in find_probe_trace_events_from_map()
3018 if (!pev->uprobes && !pev->target && in find_probe_trace_events_from_map()
3019 (!pp->retprobe || kretprobe_offset_is_supported())) { in find_probe_trace_events_from_map()
3023 ret = -EINVAL; in find_probe_trace_events_from_map()
3028 /* Setup result trace-probe-events */ in find_probe_trace_events_from_map()
3031 ret = -ENOMEM; in find_probe_trace_events_from_map()
3040 if (sym->type != STT_FUNC) in find_probe_trace_events_from_map()
3045 if (sym->start == syms[i]->start) { in find_probe_trace_events_from_map()
3047 sym->name, sym->start); in find_probe_trace_events_from_map()
3054 tp = &tev->point; in find_probe_trace_events_from_map()
3061 if (pp->offset > sym->end - sym->start) { in find_probe_trace_events_from_map()
3063 pp->offset, sym->name); in find_probe_trace_events_from_map()
3064 ret = -ENOENT; in find_probe_trace_events_from_map()
3067 /* Add one probe point */ in find_probe_trace_events_from_map()
3068 tp->address = map->unmap_ip(map, sym->start) + pp->offset; in find_probe_trace_events_from_map()
3071 if (!pev->uprobes && !pev->target && in find_probe_trace_events_from_map()
3072 kprobe_warn_out_range(sym->name, tp->address)) { in find_probe_trace_events_from_map()
3073 tp->symbol = NULL; /* Skip it */ in find_probe_trace_events_from_map()
3076 tp->symbol = strdup_or_goto(reloc_sym->name, nomem_out); in find_probe_trace_events_from_map()
3077 tp->offset = tp->address - reloc_sym->addr; in find_probe_trace_events_from_map()
3079 tp->symbol = strdup_or_goto(sym->name, nomem_out); in find_probe_trace_events_from_map()
3080 tp->offset = pp->offset; in find_probe_trace_events_from_map()
3082 tp->realname = strdup_or_goto(sym->name, nomem_out); in find_probe_trace_events_from_map()
3084 tp->retprobe = pp->retprobe; in find_probe_trace_events_from_map()
3085 if (pev->target) { in find_probe_trace_events_from_map()
3086 if (pev->uprobes) { in find_probe_trace_events_from_map()
3087 tev->point.module = strdup_or_goto(pev->target, in find_probe_trace_events_from_map()
3090 mod_name = find_module_name(pev->target); in find_probe_trace_events_from_map()
3091 tev->point.module = in find_probe_trace_events_from_map()
3092 strdup(mod_name ? mod_name : pev->target); in find_probe_trace_events_from_map()
3094 if (!tev->point.module) in find_probe_trace_events_from_map()
3098 tev->uprobes = pev->uprobes; in find_probe_trace_events_from_map()
3099 tev->nargs = pev->nargs; in find_probe_trace_events_from_map()
3100 if (tev->nargs) { in find_probe_trace_events_from_map()
3101 tev->args = zalloc(sizeof(struct probe_trace_arg) * in find_probe_trace_events_from_map()
3102 tev->nargs); in find_probe_trace_events_from_map()
3103 if (tev->args == NULL) in find_probe_trace_events_from_map()
3106 for (i = 0; i < tev->nargs; i++) { in find_probe_trace_events_from_map()
3107 if (pev->args[i].name) in find_probe_trace_events_from_map()
3108 tev->args[i].name = in find_probe_trace_events_from_map()
3109 strdup_or_goto(pev->args[i].name, in find_probe_trace_events_from_map()
3112 tev->args[i].value = strdup_or_goto(pev->args[i].var, in find_probe_trace_events_from_map()
3114 if (pev->args[i].type) in find_probe_trace_events_from_map()
3115 tev->args[i].type = in find_probe_trace_events_from_map()
3116 strdup_or_goto(pev->args[i].type, in find_probe_trace_events_from_map()
3122 ret = -ENOENT; in find_probe_trace_events_from_map()
3132 ret = -ENOMEM; in find_probe_trace_events_from_map()
3142 struct perf_probe_point *pp = &pev->point; in try_to_find_absolute_address()
3147 if (!(pev->point.function && !strncmp(pev->point.function, "0x", 2))) in try_to_find_absolute_address()
3148 return -EINVAL; in try_to_find_absolute_address()
3150 return -EINVAL; in try_to_find_absolute_address()
3160 return -ENOMEM; in try_to_find_absolute_address()
3163 tp = &tev->point; in try_to_find_absolute_address()
3166 * Don't use tp->offset, use address directly, because in try_to_find_absolute_address()
3170 tp->address = pev->point.abs_address; in try_to_find_absolute_address()
3171 tp->retprobe = pp->retprobe; in try_to_find_absolute_address()
3172 tev->uprobes = pev->uprobes; in try_to_find_absolute_address()
3174 err = -ENOMEM; in try_to_find_absolute_address()
3180 if (asprintf(&tp->symbol, "0x%lx", tp->address) < 0) in try_to_find_absolute_address()
3184 if ((!tev->uprobes) && in try_to_find_absolute_address()
3185 (kprobe_warn_out_range(tev->point.symbol, in try_to_find_absolute_address()
3186 tev->point.address))) { in try_to_find_absolute_address()
3187 err = -EACCES; in try_to_find_absolute_address()
3191 if (asprintf(&tp->realname, "abs_%lx", tp->address) < 0) in try_to_find_absolute_address()
3194 if (pev->target) { in try_to_find_absolute_address()
3195 tp->module = strdup(pev->target); in try_to_find_absolute_address()
3196 if (!tp->module) in try_to_find_absolute_address()
3200 if (tev->group) { in try_to_find_absolute_address()
3201 tev->group = strdup(pev->group); in try_to_find_absolute_address()
3202 if (!tev->group) in try_to_find_absolute_address()
3206 if (pev->event) { in try_to_find_absolute_address()
3207 tev->event = strdup(pev->event); in try_to_find_absolute_address()
3208 if (!tev->event) in try_to_find_absolute_address()
3212 tev->nargs = pev->nargs; in try_to_find_absolute_address()
3213 tev->args = zalloc(sizeof(struct probe_trace_arg) * tev->nargs); in try_to_find_absolute_address()
3214 if (!tev->args) in try_to_find_absolute_address()
3217 for (i = 0; i < tev->nargs; i++) in try_to_find_absolute_address()
3218 copy_to_probe_trace_arg(&tev->args[i], &pev->args[i]); in try_to_find_absolute_address()
3256 ret = -E2BIG; in concat_probe_trace_events()
3262 ret = -ENOMEM; in concat_probe_trace_events()
3290 cache = probe_cache__new(target, pev->nsi); in find_cached_events()
3297 if (!entry->pev.event || !entry->pev.group) in find_cached_events()
3299 if ((!pev->group || strglobmatch(entry->pev.group, pev->group)) && in find_cached_events()
3300 strglobmatch(entry->pev.event, pev->event)) { in find_cached_events()
3316 pev->uprobes = true; in find_cached_events()
3336 ret = -errno; in find_cached_events_all()
3343 pathname = build_id_cache__origname(nd->s); in find_cached_events_all()
3373 if (pev->sdt) { in find_probe_trace_events_from_cache()
3375 if (!pev->target) in find_probe_trace_events_from_cache()
3378 return find_cached_events(pev, tevs, pev->target); in find_probe_trace_events_from_cache()
3380 cache = probe_cache__new(pev->target, pev->nsi); in find_probe_trace_events_from_cache()
3387 ret = pev->sdt ? -ENOENT : 0; in find_probe_trace_events_from_cache()
3391 ret = strlist__nr_entries(entry->tevlist); in find_probe_trace_events_from_cache()
3394 pev->target ? : "kernel"); in find_probe_trace_events_from_cache()
3395 ret = -E2BIG; in find_probe_trace_events_from_cache()
3401 ret = -ENOMEM; in find_probe_trace_events_from_cache()
3406 strlist__for_each_entry(node, entry->tevlist) { in find_probe_trace_events_from_cache()
3408 ret = parse_probe_trace_command(node->s, tev); in find_probe_trace_events_from_cache()
3412 tev->uprobes = pev->uprobes; in find_probe_trace_events_from_cache()
3426 if (!pev->group && !pev->sdt) { in convert_to_probe_trace_events()
3428 if (!pev->uprobes) { in convert_to_probe_trace_events()
3429 pev->group = strdup(PERFPROBE_GROUP); in convert_to_probe_trace_events()
3430 ret = pev->group ? 0 : -ENOMEM; in convert_to_probe_trace_events()
3432 ret = convert_exec_to_group(pev->target, &pev->group); in convert_to_probe_trace_events()
3445 if (ret > 0 || pev->sdt) /* SDT can be found only in the cache */ in convert_to_probe_trace_events()
3446 return ret == 0 ? -ENOENT : ret; /* Found in probe cache */ in convert_to_probe_trace_events()
3483 return -EINVAL; in show_probe_trace_event()
3501 return -ENOMEM; in show_probe_trace_events()
3505 for (i = 0; i < pev->ntevs && !ret; i++) { in show_probe_trace_events()
3506 tev = &pev->tevs[i]; in show_probe_trace_events()
3508 if (!tev->point.symbol && !pev->uprobes) in show_probe_trace_events()
3550 nsinfo__zput(pev->nsi); in cleanup_perf_probe_events()
3559 ret = init_probe_symbol_maps(pevs->uprobes); in add_perf_probe_events()
3575 int ret, ret2, ufd = -1, kfd = -1; in del_perf_probe_events()
3579 return -EINVAL; in del_perf_probe_events()
3587 if (ret < 0 && ret != -ENOENT) in del_perf_probe_events()
3591 if (ret2 < 0 && ret2 != -ENOENT) { in del_perf_probe_events()
3623 return -EINVAL; in show_available_funcs()
3628 if (ret == -2) { in show_available_funcs()
3636 goto end; in show_available_funcs()
3638 if (!dso__sorted_by_name(map->dso)) in show_available_funcs()
3639 dso__sort_by_name(map->dso); in show_available_funcs()
3644 for (nd = rb_first_cached(&map->dso->symbol_names); nd; in show_available_funcs()
3648 if (strfilter__compare(_filter, pos->sym.name)) in show_available_funcs()
3649 printf("%s\n", pos->sym.name); in show_available_funcs()
3651 end: in show_available_funcs()
3661 tvar->value = strdup(pvar->var); in copy_to_probe_trace_arg()
3662 if (tvar->value == NULL) in copy_to_probe_trace_arg()
3663 return -ENOMEM; in copy_to_probe_trace_arg()
3664 if (pvar->type) { in copy_to_probe_trace_arg()
3665 tvar->type = strdup(pvar->type); in copy_to_probe_trace_arg()
3666 if (tvar->type == NULL) in copy_to_probe_trace_arg()
3667 return -ENOMEM; in copy_to_probe_trace_arg()
3669 if (pvar->name) { in copy_to_probe_trace_arg()
3670 tvar->name = strdup(pvar->name); in copy_to_probe_trace_arg()
3671 if (tvar->name == NULL) in copy_to_probe_trace_arg()
3672 return -ENOMEM; in copy_to_probe_trace_arg()
3674 tvar->name = NULL; in copy_to_probe_trace_arg()