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