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