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