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