cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

probe-event.c (88874B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * probe-event.c : perf-probe definition to probe_events format converter
      4 *
      5 * Written by Masami Hiramatsu <mhiramat@redhat.com>
      6 */
      7
      8#include <inttypes.h>
      9#include <sys/utsname.h>
     10#include <sys/types.h>
     11#include <sys/stat.h>
     12#include <fcntl.h>
     13#include <errno.h>
     14#include <stdio.h>
     15#include <unistd.h>
     16#include <stdlib.h>
     17#include <string.h>
     18#include <stdarg.h>
     19#include <limits.h>
     20#include <elf.h>
     21
     22#include "build-id.h"
     23#include "event.h"
     24#include "namespaces.h"
     25#include "strlist.h"
     26#include "strfilter.h"
     27#include "debug.h"
     28#include "dso.h"
     29#include "color.h"
     30#include "map.h"
     31#include "maps.h"
     32#include "symbol.h"
     33#include <api/fs/fs.h>
     34#include "trace-event.h"	/* For __maybe_unused */
     35#include "probe-event.h"
     36#include "probe-finder.h"
     37#include "probe-file.h"
     38#include "session.h"
     39#include "string2.h"
     40#include "strbuf.h"
     41
     42#include <subcmd/pager.h>
     43#include <linux/ctype.h>
     44#include <linux/zalloc.h>
     45
     46#ifdef HAVE_DEBUGINFOD_SUPPORT
     47#include <elfutils/debuginfod.h>
     48#endif
     49
     50#define PERFPROBE_GROUP "probe"
     51
     52bool probe_event_dry_run;	/* Dry run flag */
     53struct probe_conf probe_conf = { .magic_num = DEFAULT_PROBE_MAGIC_NUM };
     54
     55#define semantic_error(msg ...) pr_err("Semantic error :" msg)
     56
     57int e_snprintf(char *str, size_t size, const char *format, ...)
     58{
     59	int ret;
     60	va_list ap;
     61	va_start(ap, format);
     62	ret = vsnprintf(str, size, format, ap);
     63	va_end(ap);
     64	if (ret >= (int)size)
     65		ret = -E2BIG;
     66	return ret;
     67}
     68
     69static struct machine *host_machine;
     70
     71/* Initialize symbol maps and path of vmlinux/modules */
     72int init_probe_symbol_maps(bool user_only)
     73{
     74	int ret;
     75
     76	symbol_conf.sort_by_name = true;
     77	symbol_conf.allow_aliases = true;
     78	ret = symbol__init(NULL);
     79	if (ret < 0) {
     80		pr_debug("Failed to init symbol map.\n");
     81		goto out;
     82	}
     83
     84	if (host_machine || user_only)	/* already initialized */
     85		return 0;
     86
     87	if (symbol_conf.vmlinux_name)
     88		pr_debug("Use vmlinux: %s\n", symbol_conf.vmlinux_name);
     89
     90	host_machine = machine__new_host();
     91	if (!host_machine) {
     92		pr_debug("machine__new_host() failed.\n");
     93		symbol__exit();
     94		ret = -1;
     95	}
     96out:
     97	if (ret < 0)
     98		pr_warning("Failed to init vmlinux path.\n");
     99	return ret;
    100}
    101
    102void exit_probe_symbol_maps(void)
    103{
    104	machine__delete(host_machine);
    105	host_machine = NULL;
    106	symbol__exit();
    107}
    108
    109static struct ref_reloc_sym *kernel_get_ref_reloc_sym(struct map **pmap)
    110{
    111	struct kmap *kmap;
    112	struct map *map = machine__kernel_map(host_machine);
    113
    114	if (map__load(map) < 0)
    115		return NULL;
    116
    117	kmap = map__kmap(map);
    118	if (!kmap)
    119		return NULL;
    120
    121	if (pmap)
    122		*pmap = map;
    123
    124	return kmap->ref_reloc_sym;
    125}
    126
    127static int kernel_get_symbol_address_by_name(const char *name, u64 *addr,
    128					     bool reloc, bool reladdr)
    129{
    130	struct ref_reloc_sym *reloc_sym;
    131	struct symbol *sym;
    132	struct map *map;
    133
    134	/* ref_reloc_sym is just a label. Need a special fix*/
    135	reloc_sym = kernel_get_ref_reloc_sym(&map);
    136	if (reloc_sym && strcmp(name, reloc_sym->name) == 0)
    137		*addr = (!map->reloc || reloc) ? reloc_sym->addr :
    138			reloc_sym->unrelocated_addr;
    139	else {
    140		sym = machine__find_kernel_symbol_by_name(host_machine, name, &map);
    141		if (!sym)
    142			return -ENOENT;
    143		*addr = map->unmap_ip(map, sym->start) -
    144			((reloc) ? 0 : map->reloc) -
    145			((reladdr) ? map->start : 0);
    146	}
    147	return 0;
    148}
    149
    150static struct map *kernel_get_module_map(const char *module)
    151{
    152	struct maps *maps = machine__kernel_maps(host_machine);
    153	struct map *pos;
    154
    155	/* A file path -- this is an offline module */
    156	if (module && strchr(module, '/'))
    157		return dso__new_map(module);
    158
    159	if (!module) {
    160		pos = machine__kernel_map(host_machine);
    161		return map__get(pos);
    162	}
    163
    164	maps__for_each_entry(maps, pos) {
    165		/* short_name is "[module]" */
    166		if (strncmp(pos->dso->short_name + 1, module,
    167			    pos->dso->short_name_len - 2) == 0 &&
    168		    module[pos->dso->short_name_len - 2] == '\0') {
    169			return map__get(pos);
    170		}
    171	}
    172	return NULL;
    173}
    174
    175struct map *get_target_map(const char *target, struct nsinfo *nsi, bool user)
    176{
    177	/* Init maps of given executable or kernel */
    178	if (user) {
    179		struct map *map;
    180
    181		map = dso__new_map(target);
    182		if (map && map->dso) {
    183			nsinfo__put(map->dso->nsinfo);
    184			map->dso->nsinfo = nsinfo__get(nsi);
    185		}
    186		return map;
    187	} else {
    188		return kernel_get_module_map(target);
    189	}
    190}
    191
    192static int convert_exec_to_group(const char *exec, char **result)
    193{
    194	char *ptr1, *ptr2, *exec_copy;
    195	char buf[64];
    196	int ret;
    197
    198	exec_copy = strdup(exec);
    199	if (!exec_copy)
    200		return -ENOMEM;
    201
    202	ptr1 = basename(exec_copy);
    203	if (!ptr1) {
    204		ret = -EINVAL;
    205		goto out;
    206	}
    207
    208	for (ptr2 = ptr1; *ptr2 != '\0'; ptr2++) {
    209		if (!isalnum(*ptr2) && *ptr2 != '_') {
    210			*ptr2 = '\0';
    211			break;
    212		}
    213	}
    214
    215	ret = e_snprintf(buf, 64, "%s_%s", PERFPROBE_GROUP, ptr1);
    216	if (ret < 0)
    217		goto out;
    218
    219	*result = strdup(buf);
    220	ret = *result ? 0 : -ENOMEM;
    221
    222out:
    223	free(exec_copy);
    224	return ret;
    225}
    226
    227static void clear_perf_probe_point(struct perf_probe_point *pp)
    228{
    229	zfree(&pp->file);
    230	zfree(&pp->function);
    231	zfree(&pp->lazy_line);
    232}
    233
    234static void clear_probe_trace_events(struct probe_trace_event *tevs, int ntevs)
    235{
    236	int i;
    237
    238	for (i = 0; i < ntevs; i++)
    239		clear_probe_trace_event(tevs + i);
    240}
    241
    242static bool kprobe_blacklist__listed(u64 address);
    243static bool kprobe_warn_out_range(const char *symbol, u64 address)
    244{
    245	struct map *map;
    246	bool ret = false;
    247
    248	map = kernel_get_module_map(NULL);
    249	if (map) {
    250		ret = address <= map->start || map->end < address;
    251		if (ret)
    252			pr_warning("%s is out of .text, skip it.\n", symbol);
    253		map__put(map);
    254	}
    255	if (!ret && kprobe_blacklist__listed(address)) {
    256		pr_warning("%s is blacklisted function, skip it.\n", symbol);
    257		ret = true;
    258	}
    259
    260	return ret;
    261}
    262
    263/*
    264 * @module can be module name of module file path. In case of path,
    265 * inspect elf and find out what is actual module name.
    266 * Caller has to free mod_name after using it.
    267 */
    268static char *find_module_name(const char *module)
    269{
    270	int fd;
    271	Elf *elf;
    272	GElf_Ehdr ehdr;
    273	GElf_Shdr shdr;
    274	Elf_Data *data;
    275	Elf_Scn *sec;
    276	char *mod_name = NULL;
    277	int name_offset;
    278
    279	fd = open(module, O_RDONLY);
    280	if (fd < 0)
    281		return NULL;
    282
    283	elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
    284	if (elf == NULL)
    285		goto elf_err;
    286
    287	if (gelf_getehdr(elf, &ehdr) == NULL)
    288		goto ret_err;
    289
    290	sec = elf_section_by_name(elf, &ehdr, &shdr,
    291			".gnu.linkonce.this_module", NULL);
    292	if (!sec)
    293		goto ret_err;
    294
    295	data = elf_getdata(sec, NULL);
    296	if (!data || !data->d_buf)
    297		goto ret_err;
    298
    299	/*
    300	 * NOTE:
    301	 * '.gnu.linkonce.this_module' section of kernel module elf directly
    302	 * maps to 'struct module' from linux/module.h. This section contains
    303	 * actual module name which will be used by kernel after loading it.
    304	 * But, we cannot use 'struct module' here since linux/module.h is not
    305	 * exposed to user-space. Offset of 'name' has remained same from long
    306	 * time, so hardcoding it here.
    307	 */
    308	if (ehdr.e_ident[EI_CLASS] == ELFCLASS32)
    309		name_offset = 12;
    310	else	/* expect ELFCLASS64 by default */
    311		name_offset = 24;
    312
    313	mod_name = strdup((char *)data->d_buf + name_offset);
    314
    315ret_err:
    316	elf_end(elf);
    317elf_err:
    318	close(fd);
    319	return mod_name;
    320}
    321
    322#ifdef HAVE_DWARF_SUPPORT
    323
    324static int kernel_get_module_dso(const char *module, struct dso **pdso)
    325{
    326	struct dso *dso;
    327	struct map *map;
    328	const char *vmlinux_name;
    329	int ret = 0;
    330
    331	if (module) {
    332		char module_name[128];
    333
    334		snprintf(module_name, sizeof(module_name), "[%s]", module);
    335		map = maps__find_by_name(machine__kernel_maps(host_machine), module_name);
    336		if (map) {
    337			dso = map->dso;
    338			goto found;
    339		}
    340		pr_debug("Failed to find module %s.\n", module);
    341		return -ENOENT;
    342	}
    343
    344	map = machine__kernel_map(host_machine);
    345	dso = map->dso;
    346	if (!dso->has_build_id)
    347		dso__read_running_kernel_build_id(dso, host_machine);
    348
    349	vmlinux_name = symbol_conf.vmlinux_name;
    350	dso->load_errno = 0;
    351	if (vmlinux_name)
    352		ret = dso__load_vmlinux(dso, map, vmlinux_name, false);
    353	else
    354		ret = dso__load_vmlinux_path(dso, map);
    355found:
    356	*pdso = dso;
    357	return ret;
    358}
    359
    360/*
    361 * Some binaries like glibc have special symbols which are on the symbol
    362 * table, but not in the debuginfo. If we can find the address of the
    363 * symbol from map, we can translate the address back to the probe point.
    364 */
    365static int find_alternative_probe_point(struct debuginfo *dinfo,
    366					struct perf_probe_point *pp,
    367					struct perf_probe_point *result,
    368					const char *target, struct nsinfo *nsi,
    369					bool uprobes)
    370{
    371	struct map *map = NULL;
    372	struct symbol *sym;
    373	u64 address = 0;
    374	int ret = -ENOENT;
    375
    376	/* This can work only for function-name based one */
    377	if (!pp->function || pp->file)
    378		return -ENOTSUP;
    379
    380	map = get_target_map(target, nsi, uprobes);
    381	if (!map)
    382		return -EINVAL;
    383
    384	/* Find the address of given function */
    385	map__for_each_symbol_by_name(map, pp->function, sym) {
    386		if (uprobes) {
    387			address = sym->start;
    388			if (sym->type == STT_GNU_IFUNC)
    389				pr_warning("Warning: The probe function (%s) is a GNU indirect function.\n"
    390					   "Consider identifying the final function used at run time and set the probe directly on that.\n",
    391					   pp->function);
    392		} else
    393			address = map->unmap_ip(map, sym->start) - map->reloc;
    394		break;
    395	}
    396	if (!address) {
    397		ret = -ENOENT;
    398		goto out;
    399	}
    400	pr_debug("Symbol %s address found : %" PRIx64 "\n",
    401			pp->function, address);
    402
    403	ret = debuginfo__find_probe_point(dinfo, address, result);
    404	if (ret <= 0)
    405		ret = (!ret) ? -ENOENT : ret;
    406	else {
    407		result->offset += pp->offset;
    408		result->line += pp->line;
    409		result->retprobe = pp->retprobe;
    410		ret = 0;
    411	}
    412
    413out:
    414	map__put(map);
    415	return ret;
    416
    417}
    418
    419static int get_alternative_probe_event(struct debuginfo *dinfo,
    420				       struct perf_probe_event *pev,
    421				       struct perf_probe_point *tmp)
    422{
    423	int ret;
    424
    425	memcpy(tmp, &pev->point, sizeof(*tmp));
    426	memset(&pev->point, 0, sizeof(pev->point));
    427	ret = find_alternative_probe_point(dinfo, tmp, &pev->point, pev->target,
    428					   pev->nsi, pev->uprobes);
    429	if (ret < 0)
    430		memcpy(&pev->point, tmp, sizeof(*tmp));
    431
    432	return ret;
    433}
    434
    435static int get_alternative_line_range(struct debuginfo *dinfo,
    436				      struct line_range *lr,
    437				      const char *target, bool user)
    438{
    439	struct perf_probe_point pp = { .function = lr->function,
    440				       .file = lr->file,
    441				       .line = lr->start };
    442	struct perf_probe_point result;
    443	int ret, len = 0;
    444
    445	memset(&result, 0, sizeof(result));
    446
    447	if (lr->end != INT_MAX)
    448		len = lr->end - lr->start;
    449	ret = find_alternative_probe_point(dinfo, &pp, &result,
    450					   target, NULL, user);
    451	if (!ret) {
    452		lr->function = result.function;
    453		lr->file = result.file;
    454		lr->start = result.line;
    455		if (lr->end != INT_MAX)
    456			lr->end = lr->start + len;
    457		clear_perf_probe_point(&pp);
    458	}
    459	return ret;
    460}
    461
    462#ifdef HAVE_DEBUGINFOD_SUPPORT
    463static struct debuginfo *open_from_debuginfod(struct dso *dso, struct nsinfo *nsi,
    464					      bool silent)
    465{
    466	debuginfod_client *c = debuginfod_begin();
    467	char sbuild_id[SBUILD_ID_SIZE + 1];
    468	struct debuginfo *ret = NULL;
    469	struct nscookie nsc;
    470	char *path;
    471	int fd;
    472
    473	if (!c)
    474		return NULL;
    475
    476	build_id__sprintf(&dso->bid, sbuild_id);
    477	fd = debuginfod_find_debuginfo(c, (const unsigned char *)sbuild_id,
    478					0, &path);
    479	if (fd >= 0)
    480		close(fd);
    481	debuginfod_end(c);
    482	if (fd < 0) {
    483		if (!silent)
    484			pr_debug("Failed to find debuginfo in debuginfod.\n");
    485		return NULL;
    486	}
    487	if (!silent)
    488		pr_debug("Load debuginfo from debuginfod (%s)\n", path);
    489
    490	nsinfo__mountns_enter(nsi, &nsc);
    491	ret = debuginfo__new((const char *)path);
    492	nsinfo__mountns_exit(&nsc);
    493	return ret;
    494}
    495#else
    496static inline
    497struct debuginfo *open_from_debuginfod(struct dso *dso __maybe_unused,
    498				       struct nsinfo *nsi __maybe_unused,
    499				       bool silent __maybe_unused)
    500{
    501	return NULL;
    502}
    503#endif
    504
    505/* Open new debuginfo of given module */
    506static struct debuginfo *open_debuginfo(const char *module, struct nsinfo *nsi,
    507					bool silent)
    508{
    509	const char *path = module;
    510	char reason[STRERR_BUFSIZE];
    511	struct debuginfo *ret = NULL;
    512	struct dso *dso = NULL;
    513	struct nscookie nsc;
    514	int err;
    515
    516	if (!module || !strchr(module, '/')) {
    517		err = kernel_get_module_dso(module, &dso);
    518		if (err < 0) {
    519			if (!dso || dso->load_errno == 0) {
    520				if (!str_error_r(-err, reason, STRERR_BUFSIZE))
    521					strcpy(reason, "(unknown)");
    522			} else
    523				dso__strerror_load(dso, reason, STRERR_BUFSIZE);
    524			if (dso)
    525				ret = open_from_debuginfod(dso, nsi, silent);
    526			if (ret)
    527				return ret;
    528			if (!silent) {
    529				if (module)
    530					pr_err("Module %s is not loaded, please specify its full path name.\n", module);
    531				else
    532					pr_err("Failed to find the path for the kernel: %s\n", reason);
    533			}
    534			return NULL;
    535		}
    536		path = dso->long_name;
    537	}
    538	nsinfo__mountns_enter(nsi, &nsc);
    539	ret = debuginfo__new(path);
    540	if (!ret && !silent) {
    541		pr_warning("The %s file has no debug information.\n", path);
    542		if (!module || !strtailcmp(path, ".ko"))
    543			pr_warning("Rebuild with CONFIG_DEBUG_INFO=y, ");
    544		else
    545			pr_warning("Rebuild with -g, ");
    546		pr_warning("or install an appropriate debuginfo package.\n");
    547	}
    548	nsinfo__mountns_exit(&nsc);
    549	return ret;
    550}
    551
    552/* For caching the last debuginfo */
    553static struct debuginfo *debuginfo_cache;
    554static char *debuginfo_cache_path;
    555
    556static struct debuginfo *debuginfo_cache__open(const char *module, bool silent)
    557{
    558	const char *path = module;
    559
    560	/* If the module is NULL, it should be the kernel. */
    561	if (!module)
    562		path = "kernel";
    563
    564	if (debuginfo_cache_path && !strcmp(debuginfo_cache_path, path))
    565		goto out;
    566
    567	/* Copy module path */
    568	free(debuginfo_cache_path);
    569	debuginfo_cache_path = strdup(path);
    570	if (!debuginfo_cache_path) {
    571		debuginfo__delete(debuginfo_cache);
    572		debuginfo_cache = NULL;
    573		goto out;
    574	}
    575
    576	debuginfo_cache = open_debuginfo(module, NULL, silent);
    577	if (!debuginfo_cache)
    578		zfree(&debuginfo_cache_path);
    579out:
    580	return debuginfo_cache;
    581}
    582
    583static void debuginfo_cache__exit(void)
    584{
    585	debuginfo__delete(debuginfo_cache);
    586	debuginfo_cache = NULL;
    587	zfree(&debuginfo_cache_path);
    588}
    589
    590
    591static int get_text_start_address(const char *exec, u64 *address,
    592				  struct nsinfo *nsi)
    593{
    594	Elf *elf;
    595	GElf_Ehdr ehdr;
    596	GElf_Shdr shdr;
    597	int fd, ret = -ENOENT;
    598	struct nscookie nsc;
    599
    600	nsinfo__mountns_enter(nsi, &nsc);
    601	fd = open(exec, O_RDONLY);
    602	nsinfo__mountns_exit(&nsc);
    603	if (fd < 0)
    604		return -errno;
    605
    606	elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
    607	if (elf == NULL) {
    608		ret = -EINVAL;
    609		goto out_close;
    610	}
    611
    612	if (gelf_getehdr(elf, &ehdr) == NULL)
    613		goto out;
    614
    615	if (!elf_section_by_name(elf, &ehdr, &shdr, ".text", NULL))
    616		goto out;
    617
    618	*address = shdr.sh_addr - shdr.sh_offset;
    619	ret = 0;
    620out:
    621	elf_end(elf);
    622out_close:
    623	close(fd);
    624
    625	return ret;
    626}
    627
    628/*
    629 * Convert trace point to probe point with debuginfo
    630 */
    631static int find_perf_probe_point_from_dwarf(struct probe_trace_point *tp,
    632					    struct perf_probe_point *pp,
    633					    bool is_kprobe)
    634{
    635	struct debuginfo *dinfo = NULL;
    636	u64 stext = 0;
    637	u64 addr = tp->address;
    638	int ret = -ENOENT;
    639
    640	/* convert the address to dwarf address */
    641	if (!is_kprobe) {
    642		if (!addr) {
    643			ret = -EINVAL;
    644			goto error;
    645		}
    646		ret = get_text_start_address(tp->module, &stext, NULL);
    647		if (ret < 0)
    648			goto error;
    649		addr += stext;
    650	} else if (tp->symbol) {
    651		/* If the module is given, this returns relative address */
    652		ret = kernel_get_symbol_address_by_name(tp->symbol, &addr,
    653							false, !!tp->module);
    654		if (ret != 0)
    655			goto error;
    656		addr += tp->offset;
    657	}
    658
    659	pr_debug("try to find information at %" PRIx64 " in %s\n", addr,
    660		 tp->module ? : "kernel");
    661
    662	dinfo = debuginfo_cache__open(tp->module, verbose <= 0);
    663	if (dinfo)
    664		ret = debuginfo__find_probe_point(dinfo, addr, pp);
    665	else
    666		ret = -ENOENT;
    667
    668	if (ret > 0) {
    669		pp->retprobe = tp->retprobe;
    670		return 0;
    671	}
    672error:
    673	pr_debug("Failed to find corresponding probes from debuginfo.\n");
    674	return ret ? : -ENOENT;
    675}
    676
    677/* Adjust symbol name and address */
    678static int post_process_probe_trace_point(struct probe_trace_point *tp,
    679					   struct map *map, u64 offs)
    680{
    681	struct symbol *sym;
    682	u64 addr = tp->address - offs;
    683
    684	sym = map__find_symbol(map, addr);
    685	if (!sym) {
    686		/*
    687		 * If the address is in the inittext section, map can not
    688		 * find it. Ignore it if we are probing offline kernel.
    689		 */
    690		return (symbol_conf.ignore_vmlinux_buildid) ? 0 : -ENOENT;
    691	}
    692
    693	if (strcmp(sym->name, tp->symbol)) {
    694		/* If we have no realname, use symbol for it */
    695		if (!tp->realname)
    696			tp->realname = tp->symbol;
    697		else
    698			free(tp->symbol);
    699		tp->symbol = strdup(sym->name);
    700		if (!tp->symbol)
    701			return -ENOMEM;
    702	}
    703	tp->offset = addr - sym->start;
    704	tp->address -= offs;
    705
    706	return 0;
    707}
    708
    709/*
    710 * Rename DWARF symbols to ELF symbols -- gcc sometimes optimizes functions
    711 * and generate new symbols with suffixes such as .constprop.N or .isra.N
    712 * etc. Since those symbols are not recorded in DWARF, we have to find
    713 * correct generated symbols from offline ELF binary.
    714 * For online kernel or uprobes we don't need this because those are
    715 * rebased on _text, or already a section relative address.
    716 */
    717static int
    718post_process_offline_probe_trace_events(struct probe_trace_event *tevs,
    719					int ntevs, const char *pathname)
    720{
    721	struct map *map;
    722	u64 stext = 0;
    723	int i, ret = 0;
    724
    725	/* Prepare a map for offline binary */
    726	map = dso__new_map(pathname);
    727	if (!map || get_text_start_address(pathname, &stext, NULL) < 0) {
    728		pr_warning("Failed to get ELF symbols for %s\n", pathname);
    729		return -EINVAL;
    730	}
    731
    732	for (i = 0; i < ntevs; i++) {
    733		ret = post_process_probe_trace_point(&tevs[i].point,
    734						     map, stext);
    735		if (ret < 0)
    736			break;
    737	}
    738	map__put(map);
    739
    740	return ret;
    741}
    742
    743static int add_exec_to_probe_trace_events(struct probe_trace_event *tevs,
    744					  int ntevs, const char *exec,
    745					  struct nsinfo *nsi)
    746{
    747	int i, ret = 0;
    748	u64 stext = 0;
    749
    750	if (!exec)
    751		return 0;
    752
    753	ret = get_text_start_address(exec, &stext, nsi);
    754	if (ret < 0)
    755		return ret;
    756
    757	for (i = 0; i < ntevs && ret >= 0; i++) {
    758		/* point.address is the address of point.symbol + point.offset */
    759		tevs[i].point.address -= stext;
    760		tevs[i].point.module = strdup(exec);
    761		if (!tevs[i].point.module) {
    762			ret = -ENOMEM;
    763			break;
    764		}
    765		tevs[i].uprobes = true;
    766	}
    767
    768	return ret;
    769}
    770
    771static int
    772post_process_module_probe_trace_events(struct probe_trace_event *tevs,
    773				       int ntevs, const char *module,
    774				       struct debuginfo *dinfo)
    775{
    776	Dwarf_Addr text_offs = 0;
    777	int i, ret = 0;
    778	char *mod_name = NULL;
    779	struct map *map;
    780
    781	if (!module)
    782		return 0;
    783
    784	map = get_target_map(module, NULL, false);
    785	if (!map || debuginfo__get_text_offset(dinfo, &text_offs, true) < 0) {
    786		pr_warning("Failed to get ELF symbols for %s\n", module);
    787		return -EINVAL;
    788	}
    789
    790	mod_name = find_module_name(module);
    791	for (i = 0; i < ntevs; i++) {
    792		ret = post_process_probe_trace_point(&tevs[i].point,
    793						map, text_offs);
    794		if (ret < 0)
    795			break;
    796		tevs[i].point.module =
    797			strdup(mod_name ? mod_name : module);
    798		if (!tevs[i].point.module) {
    799			ret = -ENOMEM;
    800			break;
    801		}
    802	}
    803
    804	free(mod_name);
    805	map__put(map);
    806
    807	return ret;
    808}
    809
    810static int
    811post_process_kernel_probe_trace_events(struct probe_trace_event *tevs,
    812				       int ntevs)
    813{
    814	struct ref_reloc_sym *reloc_sym;
    815	struct map *map;
    816	char *tmp;
    817	int i, skipped = 0;
    818
    819	/* Skip post process if the target is an offline kernel */
    820	if (symbol_conf.ignore_vmlinux_buildid)
    821		return post_process_offline_probe_trace_events(tevs, ntevs,
    822						symbol_conf.vmlinux_name);
    823
    824	reloc_sym = kernel_get_ref_reloc_sym(&map);
    825	if (!reloc_sym) {
    826		pr_warning("Relocated base symbol is not found! "
    827			   "Check /proc/sys/kernel/kptr_restrict\n"
    828			   "and /proc/sys/kernel/perf_event_paranoid. "
    829			   "Or run as privileged perf user.\n\n");
    830		return -EINVAL;
    831	}
    832
    833	for (i = 0; i < ntevs; i++) {
    834		if (!tevs[i].point.address)
    835			continue;
    836		if (tevs[i].point.retprobe && !kretprobe_offset_is_supported())
    837			continue;
    838		/*
    839		 * If we found a wrong one, mark it by NULL symbol.
    840		 * Since addresses in debuginfo is same as objdump, we need
    841		 * to convert it to addresses on memory.
    842		 */
    843		if (kprobe_warn_out_range(tevs[i].point.symbol,
    844			map__objdump_2mem(map, tevs[i].point.address))) {
    845			tmp = NULL;
    846			skipped++;
    847		} else {
    848			tmp = strdup(reloc_sym->name);
    849			if (!tmp)
    850				return -ENOMEM;
    851		}
    852		/* If we have no realname, use symbol for it */
    853		if (!tevs[i].point.realname)
    854			tevs[i].point.realname = tevs[i].point.symbol;
    855		else
    856			free(tevs[i].point.symbol);
    857		tevs[i].point.symbol = tmp;
    858		tevs[i].point.offset = tevs[i].point.address -
    859			(map->reloc ? reloc_sym->unrelocated_addr :
    860				      reloc_sym->addr);
    861	}
    862	return skipped;
    863}
    864
    865void __weak
    866arch__post_process_probe_trace_events(struct perf_probe_event *pev __maybe_unused,
    867				      int ntevs __maybe_unused)
    868{
    869}
    870
    871/* Post processing the probe events */
    872static int post_process_probe_trace_events(struct perf_probe_event *pev,
    873					   struct probe_trace_event *tevs,
    874					   int ntevs, const char *module,
    875					   bool uprobe, struct debuginfo *dinfo)
    876{
    877	int ret;
    878
    879	if (uprobe)
    880		ret = add_exec_to_probe_trace_events(tevs, ntevs, module,
    881						     pev->nsi);
    882	else if (module)
    883		/* Currently ref_reloc_sym based probe is not for drivers */
    884		ret = post_process_module_probe_trace_events(tevs, ntevs,
    885							     module, dinfo);
    886	else
    887		ret = post_process_kernel_probe_trace_events(tevs, ntevs);
    888
    889	if (ret >= 0)
    890		arch__post_process_probe_trace_events(pev, ntevs);
    891
    892	return ret;
    893}
    894
    895/* Try to find perf_probe_event with debuginfo */
    896static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
    897					  struct probe_trace_event **tevs)
    898{
    899	bool need_dwarf = perf_probe_event_need_dwarf(pev);
    900	struct perf_probe_point tmp;
    901	struct debuginfo *dinfo;
    902	int ntevs, ret = 0;
    903
    904	/* Workaround for gcc #98776 issue.
    905	 * Perf failed to add kretprobe event with debuginfo of vmlinux which is
    906	 * compiled by gcc with -fpatchable-function-entry option enabled. The
    907	 * same issue with kernel module. The retprobe doesn`t need debuginfo.
    908	 * This workaround solution use map to query the probe function address
    909	 * for retprobe event.
    910	 */
    911	if (pev->point.retprobe)
    912		return 0;
    913
    914	dinfo = open_debuginfo(pev->target, pev->nsi, !need_dwarf);
    915	if (!dinfo) {
    916		if (need_dwarf)
    917			return -ENOENT;
    918		pr_debug("Could not open debuginfo. Try to use symbols.\n");
    919		return 0;
    920	}
    921
    922	pr_debug("Try to find probe point from debuginfo.\n");
    923	/* Searching trace events corresponding to a probe event */
    924	ntevs = debuginfo__find_trace_events(dinfo, pev, tevs);
    925
    926	if (ntevs == 0)	{  /* Not found, retry with an alternative */
    927		ret = get_alternative_probe_event(dinfo, pev, &tmp);
    928		if (!ret) {
    929			ntevs = debuginfo__find_trace_events(dinfo, pev, tevs);
    930			/*
    931			 * Write back to the original probe_event for
    932			 * setting appropriate (user given) event name
    933			 */
    934			clear_perf_probe_point(&pev->point);
    935			memcpy(&pev->point, &tmp, sizeof(tmp));
    936		}
    937	}
    938
    939	if (ntevs > 0) {	/* Succeeded to find trace events */
    940		pr_debug("Found %d probe_trace_events.\n", ntevs);
    941		ret = post_process_probe_trace_events(pev, *tevs, ntevs,
    942					pev->target, pev->uprobes, dinfo);
    943		if (ret < 0 || ret == ntevs) {
    944			pr_debug("Post processing failed or all events are skipped. (%d)\n", ret);
    945			clear_probe_trace_events(*tevs, ntevs);
    946			zfree(tevs);
    947			ntevs = 0;
    948		}
    949	}
    950
    951	debuginfo__delete(dinfo);
    952
    953	if (ntevs == 0)	{	/* No error but failed to find probe point. */
    954		pr_warning("Probe point '%s' not found.\n",
    955			   synthesize_perf_probe_point(&pev->point));
    956		return -ENOENT;
    957	} else if (ntevs < 0) {
    958		/* Error path : ntevs < 0 */
    959		pr_debug("An error occurred in debuginfo analysis (%d).\n", ntevs);
    960		if (ntevs == -EBADF)
    961			pr_warning("Warning: No dwarf info found in the vmlinux - "
    962				"please rebuild kernel with CONFIG_DEBUG_INFO=y.\n");
    963		if (!need_dwarf) {
    964			pr_debug("Trying to use symbols.\n");
    965			return 0;
    966		}
    967	}
    968	return ntevs;
    969}
    970
    971#define LINEBUF_SIZE 256
    972#define NR_ADDITIONAL_LINES 2
    973
    974static int __show_one_line(FILE *fp, int l, bool skip, bool show_num)
    975{
    976	char buf[LINEBUF_SIZE], sbuf[STRERR_BUFSIZE];
    977	const char *color = show_num ? "" : PERF_COLOR_BLUE;
    978	const char *prefix = NULL;
    979
    980	do {
    981		if (fgets(buf, LINEBUF_SIZE, fp) == NULL)
    982			goto error;
    983		if (skip)
    984			continue;
    985		if (!prefix) {
    986			prefix = show_num ? "%7d  " : "         ";
    987			color_fprintf(stdout, color, prefix, l);
    988		}
    989		color_fprintf(stdout, color, "%s", buf);
    990
    991	} while (strchr(buf, '\n') == NULL);
    992
    993	return 1;
    994error:
    995	if (ferror(fp)) {
    996		pr_warning("File read error: %s\n",
    997			   str_error_r(errno, sbuf, sizeof(sbuf)));
    998		return -1;
    999	}
   1000	return 0;
   1001}
   1002
   1003static int _show_one_line(FILE *fp, int l, bool skip, bool show_num)
   1004{
   1005	int rv = __show_one_line(fp, l, skip, show_num);
   1006	if (rv == 0) {
   1007		pr_warning("Source file is shorter than expected.\n");
   1008		rv = -1;
   1009	}
   1010	return rv;
   1011}
   1012
   1013#define show_one_line_with_num(f,l)	_show_one_line(f,l,false,true)
   1014#define show_one_line(f,l)		_show_one_line(f,l,false,false)
   1015#define skip_one_line(f,l)		_show_one_line(f,l,true,false)
   1016#define show_one_line_or_eof(f,l)	__show_one_line(f,l,false,false)
   1017
   1018/*
   1019 * Show line-range always requires debuginfo to find source file and
   1020 * line number.
   1021 */
   1022static int __show_line_range(struct line_range *lr, const char *module,
   1023			     bool user)
   1024{
   1025	struct build_id bid;
   1026	int l = 1;
   1027	struct int_node *ln;
   1028	struct debuginfo *dinfo;
   1029	FILE *fp;
   1030	int ret;
   1031	char *tmp;
   1032	char sbuf[STRERR_BUFSIZE];
   1033	char sbuild_id[SBUILD_ID_SIZE] = "";
   1034
   1035	/* Search a line range */
   1036	dinfo = open_debuginfo(module, NULL, false);
   1037	if (!dinfo)
   1038		return -ENOENT;
   1039
   1040	ret = debuginfo__find_line_range(dinfo, lr);
   1041	if (!ret) {	/* Not found, retry with an alternative */
   1042		ret = get_alternative_line_range(dinfo, lr, module, user);
   1043		if (!ret)
   1044			ret = debuginfo__find_line_range(dinfo, lr);
   1045	}
   1046	if (dinfo->build_id) {
   1047		build_id__init(&bid, dinfo->build_id, BUILD_ID_SIZE);
   1048		build_id__sprintf(&bid, sbuild_id);
   1049	}
   1050	debuginfo__delete(dinfo);
   1051	if (ret == 0 || ret == -ENOENT) {
   1052		pr_warning("Specified source line is not found.\n");
   1053		return -ENOENT;
   1054	} else if (ret < 0) {
   1055		pr_warning("Debuginfo analysis failed.\n");
   1056		return ret;
   1057	}
   1058
   1059	/* Convert source file path */
   1060	tmp = lr->path;
   1061	ret = find_source_path(tmp, sbuild_id, lr->comp_dir, &lr->path);
   1062
   1063	/* Free old path when new path is assigned */
   1064	if (tmp != lr->path)
   1065		free(tmp);
   1066
   1067	if (ret < 0) {
   1068		pr_warning("Failed to find source file path.\n");
   1069		return ret;
   1070	}
   1071
   1072	setup_pager();
   1073
   1074	if (lr->function)
   1075		fprintf(stdout, "<%s@%s:%d>\n", lr->function, lr->path,
   1076			lr->start - lr->offset);
   1077	else
   1078		fprintf(stdout, "<%s:%d>\n", lr->path, lr->start);
   1079
   1080	fp = fopen(lr->path, "r");
   1081	if (fp == NULL) {
   1082		pr_warning("Failed to open %s: %s\n", lr->path,
   1083			   str_error_r(errno, sbuf, sizeof(sbuf)));
   1084		return -errno;
   1085	}
   1086	/* Skip to starting line number */
   1087	while (l < lr->start) {
   1088		ret = skip_one_line(fp, l++);
   1089		if (ret < 0)
   1090			goto end;
   1091	}
   1092
   1093	intlist__for_each_entry(ln, lr->line_list) {
   1094		for (; ln->i > (unsigned long)l; l++) {
   1095			ret = show_one_line(fp, l - lr->offset);
   1096			if (ret < 0)
   1097				goto end;
   1098		}
   1099		ret = show_one_line_with_num(fp, l++ - lr->offset);
   1100		if (ret < 0)
   1101			goto end;
   1102	}
   1103
   1104	if (lr->end == INT_MAX)
   1105		lr->end = l + NR_ADDITIONAL_LINES;
   1106	while (l <= lr->end) {
   1107		ret = show_one_line_or_eof(fp, l++ - lr->offset);
   1108		if (ret <= 0)
   1109			break;
   1110	}
   1111end:
   1112	fclose(fp);
   1113	return ret;
   1114}
   1115
   1116int show_line_range(struct line_range *lr, const char *module,
   1117		    struct nsinfo *nsi, bool user)
   1118{
   1119	int ret;
   1120	struct nscookie nsc;
   1121
   1122	ret = init_probe_symbol_maps(user);
   1123	if (ret < 0)
   1124		return ret;
   1125	nsinfo__mountns_enter(nsi, &nsc);
   1126	ret = __show_line_range(lr, module, user);
   1127	nsinfo__mountns_exit(&nsc);
   1128	exit_probe_symbol_maps();
   1129
   1130	return ret;
   1131}
   1132
   1133static int show_available_vars_at(struct debuginfo *dinfo,
   1134				  struct perf_probe_event *pev,
   1135				  struct strfilter *_filter)
   1136{
   1137	char *buf;
   1138	int ret, i, nvars;
   1139	struct str_node *node;
   1140	struct variable_list *vls = NULL, *vl;
   1141	struct perf_probe_point tmp;
   1142	const char *var;
   1143
   1144	buf = synthesize_perf_probe_point(&pev->point);
   1145	if (!buf)
   1146		return -EINVAL;
   1147	pr_debug("Searching variables at %s\n", buf);
   1148
   1149	ret = debuginfo__find_available_vars_at(dinfo, pev, &vls);
   1150	if (!ret) {  /* Not found, retry with an alternative */
   1151		ret = get_alternative_probe_event(dinfo, pev, &tmp);
   1152		if (!ret) {
   1153			ret = debuginfo__find_available_vars_at(dinfo, pev,
   1154								&vls);
   1155			/* Release the old probe_point */
   1156			clear_perf_probe_point(&tmp);
   1157		}
   1158	}
   1159	if (ret <= 0) {
   1160		if (ret == 0 || ret == -ENOENT) {
   1161			pr_err("Failed to find the address of %s\n", buf);
   1162			ret = -ENOENT;
   1163		} else
   1164			pr_warning("Debuginfo analysis failed.\n");
   1165		goto end;
   1166	}
   1167
   1168	/* Some variables are found */
   1169	fprintf(stdout, "Available variables at %s\n", buf);
   1170	for (i = 0; i < ret; i++) {
   1171		vl = &vls[i];
   1172		/*
   1173		 * A probe point might be converted to
   1174		 * several trace points.
   1175		 */
   1176		fprintf(stdout, "\t@<%s+%lu>\n", vl->point.symbol,
   1177			vl->point.offset);
   1178		zfree(&vl->point.symbol);
   1179		nvars = 0;
   1180		if (vl->vars) {
   1181			strlist__for_each_entry(node, vl->vars) {
   1182				var = strchr(node->s, '\t') + 1;
   1183				if (strfilter__compare(_filter, var)) {
   1184					fprintf(stdout, "\t\t%s\n", node->s);
   1185					nvars++;
   1186				}
   1187			}
   1188			strlist__delete(vl->vars);
   1189		}
   1190		if (nvars == 0)
   1191			fprintf(stdout, "\t\t(No matched variables)\n");
   1192	}
   1193	free(vls);
   1194end:
   1195	free(buf);
   1196	return ret;
   1197}
   1198
   1199/* Show available variables on given probe point */
   1200int show_available_vars(struct perf_probe_event *pevs, int npevs,
   1201			struct strfilter *_filter)
   1202{
   1203	int i, ret = 0;
   1204	struct debuginfo *dinfo;
   1205
   1206	ret = init_probe_symbol_maps(pevs->uprobes);
   1207	if (ret < 0)
   1208		return ret;
   1209
   1210	dinfo = open_debuginfo(pevs->target, pevs->nsi, false);
   1211	if (!dinfo) {
   1212		ret = -ENOENT;
   1213		goto out;
   1214	}
   1215
   1216	setup_pager();
   1217
   1218	for (i = 0; i < npevs && ret >= 0; i++)
   1219		ret = show_available_vars_at(dinfo, &pevs[i], _filter);
   1220
   1221	debuginfo__delete(dinfo);
   1222out:
   1223	exit_probe_symbol_maps();
   1224	return ret;
   1225}
   1226
   1227#else	/* !HAVE_DWARF_SUPPORT */
   1228
   1229static void debuginfo_cache__exit(void)
   1230{
   1231}
   1232
   1233static int
   1234find_perf_probe_point_from_dwarf(struct probe_trace_point *tp __maybe_unused,
   1235				 struct perf_probe_point *pp __maybe_unused,
   1236				 bool is_kprobe __maybe_unused)
   1237{
   1238	return -ENOSYS;
   1239}
   1240
   1241static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
   1242				struct probe_trace_event **tevs __maybe_unused)
   1243{
   1244	if (perf_probe_event_need_dwarf(pev)) {
   1245		pr_warning("Debuginfo-analysis is not supported.\n");
   1246		return -ENOSYS;
   1247	}
   1248
   1249	return 0;
   1250}
   1251
   1252int show_line_range(struct line_range *lr __maybe_unused,
   1253		    const char *module __maybe_unused,
   1254		    struct nsinfo *nsi __maybe_unused,
   1255		    bool user __maybe_unused)
   1256{
   1257	pr_warning("Debuginfo-analysis is not supported.\n");
   1258	return -ENOSYS;
   1259}
   1260
   1261int show_available_vars(struct perf_probe_event *pevs __maybe_unused,
   1262			int npevs __maybe_unused,
   1263			struct strfilter *filter __maybe_unused)
   1264{
   1265	pr_warning("Debuginfo-analysis is not supported.\n");
   1266	return -ENOSYS;
   1267}
   1268#endif
   1269
   1270void line_range__clear(struct line_range *lr)
   1271{
   1272	zfree(&lr->function);
   1273	zfree(&lr->file);
   1274	zfree(&lr->path);
   1275	zfree(&lr->comp_dir);
   1276	intlist__delete(lr->line_list);
   1277}
   1278
   1279int line_range__init(struct line_range *lr)
   1280{
   1281	memset(lr, 0, sizeof(*lr));
   1282	lr->line_list = intlist__new(NULL);
   1283	if (!lr->line_list)
   1284		return -ENOMEM;
   1285	else
   1286		return 0;
   1287}
   1288
   1289static int parse_line_num(char **ptr, int *val, const char *what)
   1290{
   1291	const char *start = *ptr;
   1292
   1293	errno = 0;
   1294	*val = strtol(*ptr, ptr, 0);
   1295	if (errno || *ptr == start) {
   1296		semantic_error("'%s' is not a valid number.\n", what);
   1297		return -EINVAL;
   1298	}
   1299	return 0;
   1300}
   1301
   1302/* Check the name is good for event, group or function */
   1303static bool is_c_func_name(const char *name)
   1304{
   1305	if (!isalpha(*name) && *name != '_')
   1306		return false;
   1307	while (*++name != '\0') {
   1308		if (!isalpha(*name) && !isdigit(*name) && *name != '_')
   1309			return false;
   1310	}
   1311	return true;
   1312}
   1313
   1314/*
   1315 * Stuff 'lr' according to the line range described by 'arg'.
   1316 * The line range syntax is described by:
   1317 *
   1318 *         SRC[:SLN[+NUM|-ELN]]
   1319 *         FNC[@SRC][:SLN[+NUM|-ELN]]
   1320 */
   1321int parse_line_range_desc(const char *arg, struct line_range *lr)
   1322{
   1323	char *range, *file, *name = strdup(arg);
   1324	int err;
   1325
   1326	if (!name)
   1327		return -ENOMEM;
   1328
   1329	lr->start = 0;
   1330	lr->end = INT_MAX;
   1331
   1332	range = strchr(name, ':');
   1333	if (range) {
   1334		*range++ = '\0';
   1335
   1336		err = parse_line_num(&range, &lr->start, "start line");
   1337		if (err)
   1338			goto err;
   1339
   1340		if (*range == '+' || *range == '-') {
   1341			const char c = *range++;
   1342
   1343			err = parse_line_num(&range, &lr->end, "end line");
   1344			if (err)
   1345				goto err;
   1346
   1347			if (c == '+') {
   1348				lr->end += lr->start;
   1349				/*
   1350				 * Adjust the number of lines here.
   1351				 * If the number of lines == 1, the
   1352				 * the end of line should be equal to
   1353				 * the start of line.
   1354				 */
   1355				lr->end--;
   1356			}
   1357		}
   1358
   1359		pr_debug("Line range is %d to %d\n", lr->start, lr->end);
   1360
   1361		err = -EINVAL;
   1362		if (lr->start > lr->end) {
   1363			semantic_error("Start line must be smaller"
   1364				       " than end line.\n");
   1365			goto err;
   1366		}
   1367		if (*range != '\0') {
   1368			semantic_error("Tailing with invalid str '%s'.\n", range);
   1369			goto err;
   1370		}
   1371	}
   1372
   1373	file = strchr(name, '@');
   1374	if (file) {
   1375		*file = '\0';
   1376		lr->file = strdup(++file);
   1377		if (lr->file == NULL) {
   1378			err = -ENOMEM;
   1379			goto err;
   1380		}
   1381		lr->function = name;
   1382	} else if (strchr(name, '/') || strchr(name, '.'))
   1383		lr->file = name;
   1384	else if (is_c_func_name(name))/* We reuse it for checking funcname */
   1385		lr->function = name;
   1386	else {	/* Invalid name */
   1387		semantic_error("'%s' is not a valid function name.\n", name);
   1388		err = -EINVAL;
   1389		goto err;
   1390	}
   1391
   1392	return 0;
   1393err:
   1394	free(name);
   1395	return err;
   1396}
   1397
   1398static int parse_perf_probe_event_name(char **arg, struct perf_probe_event *pev)
   1399{
   1400	char *ptr;
   1401
   1402	ptr = strpbrk_esc(*arg, ":");
   1403	if (ptr) {
   1404		*ptr = '\0';
   1405		if (!pev->sdt && !is_c_func_name(*arg))
   1406			goto ng_name;
   1407		pev->group = strdup_esc(*arg);
   1408		if (!pev->group)
   1409			return -ENOMEM;
   1410		*arg = ptr + 1;
   1411	} else
   1412		pev->group = NULL;
   1413
   1414	pev->event = strdup_esc(*arg);
   1415	if (pev->event == NULL)
   1416		return -ENOMEM;
   1417
   1418	if (!pev->sdt && !is_c_func_name(pev->event)) {
   1419		zfree(&pev->event);
   1420ng_name:
   1421		zfree(&pev->group);
   1422		semantic_error("%s is bad for event name -it must "
   1423			       "follow C symbol-naming rule.\n", *arg);
   1424		return -EINVAL;
   1425	}
   1426	return 0;
   1427}
   1428
   1429/* Parse probepoint definition. */
   1430static int parse_perf_probe_point(char *arg, struct perf_probe_event *pev)
   1431{
   1432	struct perf_probe_point *pp = &pev->point;
   1433	char *ptr, *tmp;
   1434	char c, nc = 0;
   1435	bool file_spec = false;
   1436	int ret;
   1437
   1438	/*
   1439	 * <Syntax>
   1440	 * perf probe [GRP:][EVENT=]SRC[:LN|;PTN]
   1441	 * perf probe [GRP:][EVENT=]FUNC[@SRC][+OFFS|%return|:LN|;PAT]
   1442	 * perf probe %[GRP:]SDT_EVENT
   1443	 */
   1444	if (!arg)
   1445		return -EINVAL;
   1446
   1447	if (is_sdt_event(arg)) {
   1448		pev->sdt = true;
   1449		if (arg[0] == '%')
   1450			arg++;
   1451	}
   1452
   1453	ptr = strpbrk_esc(arg, ";=@+%");
   1454	if (pev->sdt) {
   1455		if (ptr) {
   1456			if (*ptr != '@') {
   1457				semantic_error("%s must be an SDT name.\n",
   1458					       arg);
   1459				return -EINVAL;
   1460			}
   1461			/* This must be a target file name or build id */
   1462			tmp = build_id_cache__complement(ptr + 1);
   1463			if (tmp) {
   1464				pev->target = build_id_cache__origname(tmp);
   1465				free(tmp);
   1466			} else
   1467				pev->target = strdup_esc(ptr + 1);
   1468			if (!pev->target)
   1469				return -ENOMEM;
   1470			*ptr = '\0';
   1471		}
   1472		ret = parse_perf_probe_event_name(&arg, pev);
   1473		if (ret == 0) {
   1474			if (asprintf(&pev->point.function, "%%%s", pev->event) < 0)
   1475				ret = -errno;
   1476		}
   1477		return ret;
   1478	}
   1479
   1480	if (ptr && *ptr == '=') {	/* Event name */
   1481		*ptr = '\0';
   1482		tmp = ptr + 1;
   1483		ret = parse_perf_probe_event_name(&arg, pev);
   1484		if (ret < 0)
   1485			return ret;
   1486
   1487		arg = tmp;
   1488	}
   1489
   1490	/*
   1491	 * Check arg is function or file name and copy it.
   1492	 *
   1493	 * We consider arg to be a file spec if and only if it satisfies
   1494	 * all of the below criteria::
   1495	 * - it does not include any of "+@%",
   1496	 * - it includes one of ":;", and
   1497	 * - it has a period '.' in the name.
   1498	 *
   1499	 * Otherwise, we consider arg to be a function specification.
   1500	 */
   1501	if (!strpbrk_esc(arg, "+@%")) {
   1502		ptr = strpbrk_esc(arg, ";:");
   1503		/* This is a file spec if it includes a '.' before ; or : */
   1504		if (ptr && memchr(arg, '.', ptr - arg))
   1505			file_spec = true;
   1506	}
   1507
   1508	ptr = strpbrk_esc(arg, ";:+@%");
   1509	if (ptr) {
   1510		nc = *ptr;
   1511		*ptr++ = '\0';
   1512	}
   1513
   1514	if (arg[0] == '\0')
   1515		tmp = NULL;
   1516	else {
   1517		tmp = strdup_esc(arg);
   1518		if (tmp == NULL)
   1519			return -ENOMEM;
   1520	}
   1521
   1522	if (file_spec)
   1523		pp->file = tmp;
   1524	else {
   1525		pp->function = tmp;
   1526
   1527		/*
   1528		 * Keep pp->function even if this is absolute address,
   1529		 * so it can mark whether abs_address is valid.
   1530		 * Which make 'perf probe lib.bin 0x0' possible.
   1531		 *
   1532		 * Note that checking length of tmp is not needed
   1533		 * because when we access tmp[1] we know tmp[0] is '0',
   1534		 * so tmp[1] should always valid (but could be '\0').
   1535		 */
   1536		if (tmp && !strncmp(tmp, "0x", 2)) {
   1537			pp->abs_address = strtoull(pp->function, &tmp, 0);
   1538			if (*tmp != '\0') {
   1539				semantic_error("Invalid absolute address.\n");
   1540				return -EINVAL;
   1541			}
   1542		}
   1543	}
   1544
   1545	/* Parse other options */
   1546	while (ptr) {
   1547		arg = ptr;
   1548		c = nc;
   1549		if (c == ';') {	/* Lazy pattern must be the last part */
   1550			pp->lazy_line = strdup(arg); /* let leave escapes */
   1551			if (pp->lazy_line == NULL)
   1552				return -ENOMEM;
   1553			break;
   1554		}
   1555		ptr = strpbrk_esc(arg, ";:+@%");
   1556		if (ptr) {
   1557			nc = *ptr;
   1558			*ptr++ = '\0';
   1559		}
   1560		switch (c) {
   1561		case ':':	/* Line number */
   1562			pp->line = strtoul(arg, &tmp, 0);
   1563			if (*tmp != '\0') {
   1564				semantic_error("There is non-digit char"
   1565					       " in line number.\n");
   1566				return -EINVAL;
   1567			}
   1568			break;
   1569		case '+':	/* Byte offset from a symbol */
   1570			pp->offset = strtoul(arg, &tmp, 0);
   1571			if (*tmp != '\0') {
   1572				semantic_error("There is non-digit character"
   1573						" in offset.\n");
   1574				return -EINVAL;
   1575			}
   1576			break;
   1577		case '@':	/* File name */
   1578			if (pp->file) {
   1579				semantic_error("SRC@SRC is not allowed.\n");
   1580				return -EINVAL;
   1581			}
   1582			pp->file = strdup_esc(arg);
   1583			if (pp->file == NULL)
   1584				return -ENOMEM;
   1585			break;
   1586		case '%':	/* Probe places */
   1587			if (strcmp(arg, "return") == 0) {
   1588				pp->retprobe = 1;
   1589			} else {	/* Others not supported yet */
   1590				semantic_error("%%%s is not supported.\n", arg);
   1591				return -ENOTSUP;
   1592			}
   1593			break;
   1594		default:	/* Buggy case */
   1595			pr_err("This program has a bug at %s:%d.\n",
   1596				__FILE__, __LINE__);
   1597			return -ENOTSUP;
   1598			break;
   1599		}
   1600	}
   1601
   1602	/* Exclusion check */
   1603	if (pp->lazy_line && pp->line) {
   1604		semantic_error("Lazy pattern can't be used with"
   1605			       " line number.\n");
   1606		return -EINVAL;
   1607	}
   1608
   1609	if (pp->lazy_line && pp->offset) {
   1610		semantic_error("Lazy pattern can't be used with offset.\n");
   1611		return -EINVAL;
   1612	}
   1613
   1614	if (pp->line && pp->offset) {
   1615		semantic_error("Offset can't be used with line number.\n");
   1616		return -EINVAL;
   1617	}
   1618
   1619	if (!pp->line && !pp->lazy_line && pp->file && !pp->function) {
   1620		semantic_error("File always requires line number or "
   1621			       "lazy pattern.\n");
   1622		return -EINVAL;
   1623	}
   1624
   1625	if (pp->offset && !pp->function) {
   1626		semantic_error("Offset requires an entry function.\n");
   1627		return -EINVAL;
   1628	}
   1629
   1630	if ((pp->offset || pp->line || pp->lazy_line) && pp->retprobe) {
   1631		semantic_error("Offset/Line/Lazy pattern can't be used with "
   1632			       "return probe.\n");
   1633		return -EINVAL;
   1634	}
   1635
   1636	pr_debug("symbol:%s file:%s line:%d offset:%lu return:%d lazy:%s\n",
   1637		 pp->function, pp->file, pp->line, pp->offset, pp->retprobe,
   1638		 pp->lazy_line);
   1639	return 0;
   1640}
   1641
   1642/* Parse perf-probe event argument */
   1643static int parse_perf_probe_arg(char *str, struct perf_probe_arg *arg)
   1644{
   1645	char *tmp, *goodname;
   1646	struct perf_probe_arg_field **fieldp;
   1647
   1648	pr_debug("parsing arg: %s into ", str);
   1649
   1650	tmp = strchr(str, '=');
   1651	if (tmp) {
   1652		arg->name = strndup(str, tmp - str);
   1653		if (arg->name == NULL)
   1654			return -ENOMEM;
   1655		pr_debug("name:%s ", arg->name);
   1656		str = tmp + 1;
   1657	}
   1658
   1659	tmp = strchr(str, '@');
   1660	if (tmp && tmp != str && !strcmp(tmp + 1, "user")) { /* user attr */
   1661		if (!user_access_is_supported()) {
   1662			semantic_error("ftrace does not support user access\n");
   1663			return -EINVAL;
   1664		}
   1665		*tmp = '\0';
   1666		arg->user_access = true;
   1667		pr_debug("user_access ");
   1668	}
   1669
   1670	tmp = strchr(str, ':');
   1671	if (tmp) {	/* Type setting */
   1672		*tmp = '\0';
   1673		arg->type = strdup(tmp + 1);
   1674		if (arg->type == NULL)
   1675			return -ENOMEM;
   1676		pr_debug("type:%s ", arg->type);
   1677	}
   1678
   1679	tmp = strpbrk(str, "-.[");
   1680	if (!is_c_varname(str) || !tmp) {
   1681		/* A variable, register, symbol or special value */
   1682		arg->var = strdup(str);
   1683		if (arg->var == NULL)
   1684			return -ENOMEM;
   1685		pr_debug("%s\n", arg->var);
   1686		return 0;
   1687	}
   1688
   1689	/* Structure fields or array element */
   1690	arg->var = strndup(str, tmp - str);
   1691	if (arg->var == NULL)
   1692		return -ENOMEM;
   1693	goodname = arg->var;
   1694	pr_debug("%s, ", arg->var);
   1695	fieldp = &arg->field;
   1696
   1697	do {
   1698		*fieldp = zalloc(sizeof(struct perf_probe_arg_field));
   1699		if (*fieldp == NULL)
   1700			return -ENOMEM;
   1701		if (*tmp == '[') {	/* Array */
   1702			str = tmp;
   1703			(*fieldp)->index = strtol(str + 1, &tmp, 0);
   1704			(*fieldp)->ref = true;
   1705			if (*tmp != ']' || tmp == str + 1) {
   1706				semantic_error("Array index must be a"
   1707						" number.\n");
   1708				return -EINVAL;
   1709			}
   1710			tmp++;
   1711			if (*tmp == '\0')
   1712				tmp = NULL;
   1713		} else {		/* Structure */
   1714			if (*tmp == '.') {
   1715				str = tmp + 1;
   1716				(*fieldp)->ref = false;
   1717			} else if (tmp[1] == '>') {
   1718				str = tmp + 2;
   1719				(*fieldp)->ref = true;
   1720			} else {
   1721				semantic_error("Argument parse error: %s\n",
   1722					       str);
   1723				return -EINVAL;
   1724			}
   1725			tmp = strpbrk(str, "-.[");
   1726		}
   1727		if (tmp) {
   1728			(*fieldp)->name = strndup(str, tmp - str);
   1729			if ((*fieldp)->name == NULL)
   1730				return -ENOMEM;
   1731			if (*str != '[')
   1732				goodname = (*fieldp)->name;
   1733			pr_debug("%s(%d), ", (*fieldp)->name, (*fieldp)->ref);
   1734			fieldp = &(*fieldp)->next;
   1735		}
   1736	} while (tmp);
   1737	(*fieldp)->name = strdup(str);
   1738	if ((*fieldp)->name == NULL)
   1739		return -ENOMEM;
   1740	if (*str != '[')
   1741		goodname = (*fieldp)->name;
   1742	pr_debug("%s(%d)\n", (*fieldp)->name, (*fieldp)->ref);
   1743
   1744	/* If no name is specified, set the last field name (not array index)*/
   1745	if (!arg->name) {
   1746		arg->name = strdup(goodname);
   1747		if (arg->name == NULL)
   1748			return -ENOMEM;
   1749	}
   1750	return 0;
   1751}
   1752
   1753/* Parse perf-probe event command */
   1754int parse_perf_probe_command(const char *cmd, struct perf_probe_event *pev)
   1755{
   1756	char **argv;
   1757	int argc, i, ret = 0;
   1758
   1759	argv = argv_split(cmd, &argc);
   1760	if (!argv) {
   1761		pr_debug("Failed to split arguments.\n");
   1762		return -ENOMEM;
   1763	}
   1764	if (argc - 1 > MAX_PROBE_ARGS) {
   1765		semantic_error("Too many probe arguments (%d).\n", argc - 1);
   1766		ret = -ERANGE;
   1767		goto out;
   1768	}
   1769	/* Parse probe point */
   1770	ret = parse_perf_probe_point(argv[0], pev);
   1771	if (ret < 0)
   1772		goto out;
   1773
   1774	/* Generate event name if needed */
   1775	if (!pev->event && pev->point.function && pev->point.line
   1776			&& !pev->point.lazy_line && !pev->point.offset) {
   1777		if (asprintf(&pev->event, "%s_L%d", pev->point.function,
   1778			pev->point.line) < 0)
   1779			return -ENOMEM;
   1780	}
   1781
   1782	/* Copy arguments and ensure return probe has no C argument */
   1783	pev->nargs = argc - 1;
   1784	pev->args = zalloc(sizeof(struct perf_probe_arg) * pev->nargs);
   1785	if (pev->args == NULL) {
   1786		ret = -ENOMEM;
   1787		goto out;
   1788	}
   1789	for (i = 0; i < pev->nargs && ret >= 0; i++) {
   1790		ret = parse_perf_probe_arg(argv[i + 1], &pev->args[i]);
   1791		if (ret >= 0 &&
   1792		    is_c_varname(pev->args[i].var) && pev->point.retprobe) {
   1793			semantic_error("You can't specify local variable for"
   1794				       " kretprobe.\n");
   1795			ret = -EINVAL;
   1796		}
   1797	}
   1798out:
   1799	argv_free(argv);
   1800
   1801	return ret;
   1802}
   1803
   1804/* Returns true if *any* ARG is either C variable, $params or $vars. */
   1805bool perf_probe_with_var(struct perf_probe_event *pev)
   1806{
   1807	int i = 0;
   1808
   1809	for (i = 0; i < pev->nargs; i++)
   1810		if (is_c_varname(pev->args[i].var)              ||
   1811		    !strcmp(pev->args[i].var, PROBE_ARG_PARAMS) ||
   1812		    !strcmp(pev->args[i].var, PROBE_ARG_VARS))
   1813			return true;
   1814	return false;
   1815}
   1816
   1817/* Return true if this perf_probe_event requires debuginfo */
   1818bool perf_probe_event_need_dwarf(struct perf_probe_event *pev)
   1819{
   1820	if (pev->point.file || pev->point.line || pev->point.lazy_line)
   1821		return true;
   1822
   1823	if (perf_probe_with_var(pev))
   1824		return true;
   1825
   1826	return false;
   1827}
   1828
   1829/* Parse probe_events event into struct probe_point */
   1830int parse_probe_trace_command(const char *cmd, struct probe_trace_event *tev)
   1831{
   1832	struct probe_trace_point *tp = &tev->point;
   1833	char pr;
   1834	char *p;
   1835	char *argv0_str = NULL, *fmt, *fmt1_str, *fmt2_str, *fmt3_str;
   1836	int ret, i, argc;
   1837	char **argv;
   1838
   1839	pr_debug("Parsing probe_events: %s\n", cmd);
   1840	argv = argv_split(cmd, &argc);
   1841	if (!argv) {
   1842		pr_debug("Failed to split arguments.\n");
   1843		return -ENOMEM;
   1844	}
   1845	if (argc < 2) {
   1846		semantic_error("Too few probe arguments.\n");
   1847		ret = -ERANGE;
   1848		goto out;
   1849	}
   1850
   1851	/* Scan event and group name. */
   1852	argv0_str = strdup(argv[0]);
   1853	if (argv0_str == NULL) {
   1854		ret = -ENOMEM;
   1855		goto out;
   1856	}
   1857	fmt1_str = strtok_r(argv0_str, ":", &fmt);
   1858	fmt2_str = strtok_r(NULL, "/", &fmt);
   1859	fmt3_str = strtok_r(NULL, " \t", &fmt);
   1860	if (fmt1_str == NULL || fmt2_str == NULL || fmt3_str == NULL) {
   1861		semantic_error("Failed to parse event name: %s\n", argv[0]);
   1862		ret = -EINVAL;
   1863		goto out;
   1864	}
   1865	pr = fmt1_str[0];
   1866	tev->group = strdup(fmt2_str);
   1867	tev->event = strdup(fmt3_str);
   1868	if (tev->group == NULL || tev->event == NULL) {
   1869		ret = -ENOMEM;
   1870		goto out;
   1871	}
   1872	pr_debug("Group:%s Event:%s probe:%c\n", tev->group, tev->event, pr);
   1873
   1874	tp->retprobe = (pr == 'r');
   1875
   1876	/* Scan module name(if there), function name and offset */
   1877	p = strchr(argv[1], ':');
   1878	if (p) {
   1879		tp->module = strndup(argv[1], p - argv[1]);
   1880		if (!tp->module) {
   1881			ret = -ENOMEM;
   1882			goto out;
   1883		}
   1884		tev->uprobes = (tp->module[0] == '/');
   1885		p++;
   1886	} else
   1887		p = argv[1];
   1888	fmt1_str = strtok_r(p, "+", &fmt);
   1889	/* only the address started with 0x */
   1890	if (fmt1_str[0] == '0')	{
   1891		/*
   1892		 * Fix a special case:
   1893		 * if address == 0, kernel reports something like:
   1894		 * p:probe_libc/abs_0 /lib/libc-2.18.so:0x          (null) arg1=%ax
   1895		 * Newer kernel may fix that, but we want to
   1896		 * support old kernel also.
   1897		 */
   1898		if (strcmp(fmt1_str, "0x") == 0) {
   1899			if (!argv[2] || strcmp(argv[2], "(null)")) {
   1900				ret = -EINVAL;
   1901				goto out;
   1902			}
   1903			tp->address = 0;
   1904
   1905			free(argv[2]);
   1906			for (i = 2; argv[i + 1] != NULL; i++)
   1907				argv[i] = argv[i + 1];
   1908
   1909			argv[i] = NULL;
   1910			argc -= 1;
   1911		} else
   1912			tp->address = strtoull(fmt1_str, NULL, 0);
   1913	} else {
   1914		/* Only the symbol-based probe has offset */
   1915		tp->symbol = strdup(fmt1_str);
   1916		if (tp->symbol == NULL) {
   1917			ret = -ENOMEM;
   1918			goto out;
   1919		}
   1920		fmt2_str = strtok_r(NULL, "", &fmt);
   1921		if (fmt2_str == NULL)
   1922			tp->offset = 0;
   1923		else
   1924			tp->offset = strtoul(fmt2_str, NULL, 10);
   1925	}
   1926
   1927	if (tev->uprobes) {
   1928		fmt2_str = strchr(p, '(');
   1929		if (fmt2_str)
   1930			tp->ref_ctr_offset = strtoul(fmt2_str + 1, NULL, 0);
   1931	}
   1932
   1933	tev->nargs = argc - 2;
   1934	tev->args = zalloc(sizeof(struct probe_trace_arg) * tev->nargs);
   1935	if (tev->args == NULL) {
   1936		ret = -ENOMEM;
   1937		goto out;
   1938	}
   1939	for (i = 0; i < tev->nargs; i++) {
   1940		p = strchr(argv[i + 2], '=');
   1941		if (p)	/* We don't need which register is assigned. */
   1942			*p++ = '\0';
   1943		else
   1944			p = argv[i + 2];
   1945		tev->args[i].name = strdup(argv[i + 2]);
   1946		/* TODO: parse regs and offset */
   1947		tev->args[i].value = strdup(p);
   1948		if (tev->args[i].name == NULL || tev->args[i].value == NULL) {
   1949			ret = -ENOMEM;
   1950			goto out;
   1951		}
   1952	}
   1953	ret = 0;
   1954out:
   1955	free(argv0_str);
   1956	argv_free(argv);
   1957	return ret;
   1958}
   1959
   1960/* Compose only probe arg */
   1961char *synthesize_perf_probe_arg(struct perf_probe_arg *pa)
   1962{
   1963	struct perf_probe_arg_field *field = pa->field;
   1964	struct strbuf buf;
   1965	char *ret = NULL;
   1966	int err;
   1967
   1968	if (strbuf_init(&buf, 64) < 0)
   1969		return NULL;
   1970
   1971	if (pa->name && pa->var)
   1972		err = strbuf_addf(&buf, "%s=%s", pa->name, pa->var);
   1973	else
   1974		err = strbuf_addstr(&buf, pa->name ?: pa->var);
   1975	if (err)
   1976		goto out;
   1977
   1978	while (field) {
   1979		if (field->name[0] == '[')
   1980			err = strbuf_addstr(&buf, field->name);
   1981		else
   1982			err = strbuf_addf(&buf, "%s%s", field->ref ? "->" : ".",
   1983					  field->name);
   1984		field = field->next;
   1985		if (err)
   1986			goto out;
   1987	}
   1988
   1989	if (pa->type)
   1990		if (strbuf_addf(&buf, ":%s", pa->type) < 0)
   1991			goto out;
   1992
   1993	ret = strbuf_detach(&buf, NULL);
   1994out:
   1995	strbuf_release(&buf);
   1996	return ret;
   1997}
   1998
   1999/* Compose only probe point (not argument) */
   2000char *synthesize_perf_probe_point(struct perf_probe_point *pp)
   2001{
   2002	struct strbuf buf;
   2003	char *tmp, *ret = NULL;
   2004	int len, err = 0;
   2005
   2006	if (strbuf_init(&buf, 64) < 0)
   2007		return NULL;
   2008
   2009	if (pp->function) {
   2010		if (strbuf_addstr(&buf, pp->function) < 0)
   2011			goto out;
   2012		if (pp->offset)
   2013			err = strbuf_addf(&buf, "+%lu", pp->offset);
   2014		else if (pp->line)
   2015			err = strbuf_addf(&buf, ":%d", pp->line);
   2016		else if (pp->retprobe)
   2017			err = strbuf_addstr(&buf, "%return");
   2018		if (err)
   2019			goto out;
   2020	}
   2021	if (pp->file) {
   2022		tmp = pp->file;
   2023		len = strlen(tmp);
   2024		if (len > 30) {
   2025			tmp = strchr(pp->file + len - 30, '/');
   2026			tmp = tmp ? tmp + 1 : pp->file + len - 30;
   2027		}
   2028		err = strbuf_addf(&buf, "@%s", tmp);
   2029		if (!err && !pp->function && pp->line)
   2030			err = strbuf_addf(&buf, ":%d", pp->line);
   2031	}
   2032	if (!err)
   2033		ret = strbuf_detach(&buf, NULL);
   2034out:
   2035	strbuf_release(&buf);
   2036	return ret;
   2037}
   2038
   2039char *synthesize_perf_probe_command(struct perf_probe_event *pev)
   2040{
   2041	struct strbuf buf;
   2042	char *tmp, *ret = NULL;
   2043	int i;
   2044
   2045	if (strbuf_init(&buf, 64))
   2046		return NULL;
   2047	if (pev->event)
   2048		if (strbuf_addf(&buf, "%s:%s=", pev->group ?: PERFPROBE_GROUP,
   2049				pev->event) < 0)
   2050			goto out;
   2051
   2052	tmp = synthesize_perf_probe_point(&pev->point);
   2053	if (!tmp || strbuf_addstr(&buf, tmp) < 0)
   2054		goto out;
   2055	free(tmp);
   2056
   2057	for (i = 0; i < pev->nargs; i++) {
   2058		tmp = synthesize_perf_probe_arg(pev->args + i);
   2059		if (!tmp || strbuf_addf(&buf, " %s", tmp) < 0)
   2060			goto out;
   2061		free(tmp);
   2062	}
   2063
   2064	ret = strbuf_detach(&buf, NULL);
   2065out:
   2066	strbuf_release(&buf);
   2067	return ret;
   2068}
   2069
   2070static int __synthesize_probe_trace_arg_ref(struct probe_trace_arg_ref *ref,
   2071					    struct strbuf *buf, int depth)
   2072{
   2073	int err;
   2074	if (ref->next) {
   2075		depth = __synthesize_probe_trace_arg_ref(ref->next, buf,
   2076							 depth + 1);
   2077		if (depth < 0)
   2078			return depth;
   2079	}
   2080	if (ref->user_access)
   2081		err = strbuf_addf(buf, "%s%ld(", "+u", ref->offset);
   2082	else
   2083		err = strbuf_addf(buf, "%+ld(", ref->offset);
   2084	return (err < 0) ? err : depth;
   2085}
   2086
   2087static int synthesize_probe_trace_arg(struct probe_trace_arg *arg,
   2088				      struct strbuf *buf)
   2089{
   2090	struct probe_trace_arg_ref *ref = arg->ref;
   2091	int depth = 0, err;
   2092
   2093	/* Argument name or separator */
   2094	if (arg->name)
   2095		err = strbuf_addf(buf, " %s=", arg->name);
   2096	else
   2097		err = strbuf_addch(buf, ' ');
   2098	if (err)
   2099		return err;
   2100
   2101	/* Special case: @XXX */
   2102	if (arg->value[0] == '@' && arg->ref)
   2103			ref = ref->next;
   2104
   2105	/* Dereferencing arguments */
   2106	if (ref) {
   2107		depth = __synthesize_probe_trace_arg_ref(ref, buf, 1);
   2108		if (depth < 0)
   2109			return depth;
   2110	}
   2111
   2112	/* Print argument value */
   2113	if (arg->value[0] == '@' && arg->ref)
   2114		err = strbuf_addf(buf, "%s%+ld", arg->value, arg->ref->offset);
   2115	else
   2116		err = strbuf_addstr(buf, arg->value);
   2117
   2118	/* Closing */
   2119	while (!err && depth--)
   2120		err = strbuf_addch(buf, ')');
   2121
   2122	/* Print argument type */
   2123	if (!err && arg->type)
   2124		err = strbuf_addf(buf, ":%s", arg->type);
   2125
   2126	return err;
   2127}
   2128
   2129static int
   2130synthesize_probe_trace_args(struct probe_trace_event *tev, struct strbuf *buf)
   2131{
   2132	int i, ret = 0;
   2133
   2134	for (i = 0; i < tev->nargs && ret >= 0; i++)
   2135		ret = synthesize_probe_trace_arg(&tev->args[i], buf);
   2136
   2137	return ret;
   2138}
   2139
   2140static int
   2141synthesize_uprobe_trace_def(struct probe_trace_point *tp, struct strbuf *buf)
   2142{
   2143	int err;
   2144
   2145	/* Uprobes must have tp->module */
   2146	if (!tp->module)
   2147		return -EINVAL;
   2148	/*
   2149	 * If tp->address == 0, then this point must be a
   2150	 * absolute address uprobe.
   2151	 * try_to_find_absolute_address() should have made
   2152	 * tp->symbol to "0x0".
   2153	 */
   2154	if (!tp->address && (!tp->symbol || strcmp(tp->symbol, "0x0")))
   2155		return -EINVAL;
   2156
   2157	/* Use the tp->address for uprobes */
   2158	err = strbuf_addf(buf, "%s:0x%" PRIx64, tp->module, tp->address);
   2159
   2160	if (err >= 0 && tp->ref_ctr_offset) {
   2161		if (!uprobe_ref_ctr_is_supported())
   2162			return -EINVAL;
   2163		err = strbuf_addf(buf, "(0x%lx)", tp->ref_ctr_offset);
   2164	}
   2165	return err >= 0 ? 0 : err;
   2166}
   2167
   2168static int
   2169synthesize_kprobe_trace_def(struct probe_trace_point *tp, struct strbuf *buf)
   2170{
   2171	if (!strncmp(tp->symbol, "0x", 2)) {
   2172		/* Absolute address. See try_to_find_absolute_address() */
   2173		return strbuf_addf(buf, "%s%s0x%" PRIx64, tp->module ?: "",
   2174				  tp->module ? ":" : "", tp->address);
   2175	} else {
   2176		return strbuf_addf(buf, "%s%s%s+%lu", tp->module ?: "",
   2177				tp->module ? ":" : "", tp->symbol, tp->offset);
   2178	}
   2179}
   2180
   2181char *synthesize_probe_trace_command(struct probe_trace_event *tev)
   2182{
   2183	struct probe_trace_point *tp = &tev->point;
   2184	struct strbuf buf;
   2185	char *ret = NULL;
   2186	int err;
   2187
   2188	if (strbuf_init(&buf, 32) < 0)
   2189		return NULL;
   2190
   2191	if (strbuf_addf(&buf, "%c:%s/%s ", tp->retprobe ? 'r' : 'p',
   2192			tev->group, tev->event) < 0)
   2193		goto error;
   2194
   2195	if (tev->uprobes)
   2196		err = synthesize_uprobe_trace_def(tp, &buf);
   2197	else
   2198		err = synthesize_kprobe_trace_def(tp, &buf);
   2199
   2200	if (err >= 0)
   2201		err = synthesize_probe_trace_args(tev, &buf);
   2202
   2203	if (err >= 0)
   2204		ret = strbuf_detach(&buf, NULL);
   2205error:
   2206	strbuf_release(&buf);
   2207	return ret;
   2208}
   2209
   2210static int find_perf_probe_point_from_map(struct probe_trace_point *tp,
   2211					  struct perf_probe_point *pp,
   2212					  bool is_kprobe)
   2213{
   2214	struct symbol *sym = NULL;
   2215	struct map *map = NULL;
   2216	u64 addr = tp->address;
   2217	int ret = -ENOENT;
   2218
   2219	if (!is_kprobe) {
   2220		map = dso__new_map(tp->module);
   2221		if (!map)
   2222			goto out;
   2223		sym = map__find_symbol(map, addr);
   2224	} else {
   2225		if (tp->symbol && !addr) {
   2226			if (kernel_get_symbol_address_by_name(tp->symbol,
   2227						&addr, true, false) < 0)
   2228				goto out;
   2229		}
   2230		if (addr) {
   2231			addr += tp->offset;
   2232			sym = machine__find_kernel_symbol(host_machine, addr, &map);
   2233		}
   2234	}
   2235
   2236	if (!sym)
   2237		goto out;
   2238
   2239	pp->retprobe = tp->retprobe;
   2240	pp->offset = addr - map->unmap_ip(map, sym->start);
   2241	pp->function = strdup(sym->name);
   2242	ret = pp->function ? 0 : -ENOMEM;
   2243
   2244out:
   2245	if (map && !is_kprobe) {
   2246		map__put(map);
   2247	}
   2248
   2249	return ret;
   2250}
   2251
   2252static int convert_to_perf_probe_point(struct probe_trace_point *tp,
   2253				       struct perf_probe_point *pp,
   2254				       bool is_kprobe)
   2255{
   2256	char buf[128];
   2257	int ret;
   2258
   2259	ret = find_perf_probe_point_from_dwarf(tp, pp, is_kprobe);
   2260	if (!ret)
   2261		return 0;
   2262	ret = find_perf_probe_point_from_map(tp, pp, is_kprobe);
   2263	if (!ret)
   2264		return 0;
   2265
   2266	pr_debug("Failed to find probe point from both of dwarf and map.\n");
   2267
   2268	if (tp->symbol) {
   2269		pp->function = strdup(tp->symbol);
   2270		pp->offset = tp->offset;
   2271	} else {
   2272		ret = e_snprintf(buf, 128, "0x%" PRIx64, tp->address);
   2273		if (ret < 0)
   2274			return ret;
   2275		pp->function = strdup(buf);
   2276		pp->offset = 0;
   2277	}
   2278	if (pp->function == NULL)
   2279		return -ENOMEM;
   2280
   2281	pp->retprobe = tp->retprobe;
   2282
   2283	return 0;
   2284}
   2285
   2286static int convert_to_perf_probe_event(struct probe_trace_event *tev,
   2287			       struct perf_probe_event *pev, bool is_kprobe)
   2288{
   2289	struct strbuf buf = STRBUF_INIT;
   2290	int i, ret;
   2291
   2292	/* Convert event/group name */
   2293	pev->event = strdup(tev->event);
   2294	pev->group = strdup(tev->group);
   2295	if (pev->event == NULL || pev->group == NULL)
   2296		return -ENOMEM;
   2297
   2298	/* Convert trace_point to probe_point */
   2299	ret = convert_to_perf_probe_point(&tev->point, &pev->point, is_kprobe);
   2300	if (ret < 0)
   2301		return ret;
   2302
   2303	/* Convert trace_arg to probe_arg */
   2304	pev->nargs = tev->nargs;
   2305	pev->args = zalloc(sizeof(struct perf_probe_arg) * pev->nargs);
   2306	if (pev->args == NULL)
   2307		return -ENOMEM;
   2308	for (i = 0; i < tev->nargs && ret >= 0; i++) {
   2309		if (tev->args[i].name)
   2310			pev->args[i].name = strdup(tev->args[i].name);
   2311		else {
   2312			if ((ret = strbuf_init(&buf, 32)) < 0)
   2313				goto error;
   2314			ret = synthesize_probe_trace_arg(&tev->args[i], &buf);
   2315			pev->args[i].name = strbuf_detach(&buf, NULL);
   2316		}
   2317		if (pev->args[i].name == NULL && ret >= 0)
   2318			ret = -ENOMEM;
   2319	}
   2320error:
   2321	if (ret < 0)
   2322		clear_perf_probe_event(pev);
   2323
   2324	return ret;
   2325}
   2326
   2327void clear_perf_probe_event(struct perf_probe_event *pev)
   2328{
   2329	struct perf_probe_arg_field *field, *next;
   2330	int i;
   2331
   2332	zfree(&pev->event);
   2333	zfree(&pev->group);
   2334	zfree(&pev->target);
   2335	clear_perf_probe_point(&pev->point);
   2336
   2337	for (i = 0; i < pev->nargs; i++) {
   2338		zfree(&pev->args[i].name);
   2339		zfree(&pev->args[i].var);
   2340		zfree(&pev->args[i].type);
   2341		field = pev->args[i].field;
   2342		while (field) {
   2343			next = field->next;
   2344			zfree(&field->name);
   2345			free(field);
   2346			field = next;
   2347		}
   2348	}
   2349	pev->nargs = 0;
   2350	zfree(&pev->args);
   2351}
   2352
   2353#define strdup_or_goto(str, label)	\
   2354({ char *__p = NULL; if (str && !(__p = strdup(str))) goto label; __p; })
   2355
   2356static int perf_probe_point__copy(struct perf_probe_point *dst,
   2357				  struct perf_probe_point *src)
   2358{
   2359	dst->file = strdup_or_goto(src->file, out_err);
   2360	dst->function = strdup_or_goto(src->function, out_err);
   2361	dst->lazy_line = strdup_or_goto(src->lazy_line, out_err);
   2362	dst->line = src->line;
   2363	dst->retprobe = src->retprobe;
   2364	dst->offset = src->offset;
   2365	return 0;
   2366
   2367out_err:
   2368	clear_perf_probe_point(dst);
   2369	return -ENOMEM;
   2370}
   2371
   2372static int perf_probe_arg__copy(struct perf_probe_arg *dst,
   2373				struct perf_probe_arg *src)
   2374{
   2375	struct perf_probe_arg_field *field, **ppfield;
   2376
   2377	dst->name = strdup_or_goto(src->name, out_err);
   2378	dst->var = strdup_or_goto(src->var, out_err);
   2379	dst->type = strdup_or_goto(src->type, out_err);
   2380
   2381	field = src->field;
   2382	ppfield = &(dst->field);
   2383	while (field) {
   2384		*ppfield = zalloc(sizeof(*field));
   2385		if (!*ppfield)
   2386			goto out_err;
   2387		(*ppfield)->name = strdup_or_goto(field->name, out_err);
   2388		(*ppfield)->index = field->index;
   2389		(*ppfield)->ref = field->ref;
   2390		field = field->next;
   2391		ppfield = &((*ppfield)->next);
   2392	}
   2393	return 0;
   2394out_err:
   2395	return -ENOMEM;
   2396}
   2397
   2398int perf_probe_event__copy(struct perf_probe_event *dst,
   2399			   struct perf_probe_event *src)
   2400{
   2401	int i;
   2402
   2403	dst->event = strdup_or_goto(src->event, out_err);
   2404	dst->group = strdup_or_goto(src->group, out_err);
   2405	dst->target = strdup_or_goto(src->target, out_err);
   2406	dst->uprobes = src->uprobes;
   2407
   2408	if (perf_probe_point__copy(&dst->point, &src->point) < 0)
   2409		goto out_err;
   2410
   2411	dst->args = zalloc(sizeof(struct perf_probe_arg) * src->nargs);
   2412	if (!dst->args)
   2413		goto out_err;
   2414	dst->nargs = src->nargs;
   2415
   2416	for (i = 0; i < src->nargs; i++)
   2417		if (perf_probe_arg__copy(&dst->args[i], &src->args[i]) < 0)
   2418			goto out_err;
   2419	return 0;
   2420
   2421out_err:
   2422	clear_perf_probe_event(dst);
   2423	return -ENOMEM;
   2424}
   2425
   2426void clear_probe_trace_event(struct probe_trace_event *tev)
   2427{
   2428	struct probe_trace_arg_ref *ref, *next;
   2429	int i;
   2430
   2431	zfree(&tev->event);
   2432	zfree(&tev->group);
   2433	zfree(&tev->point.symbol);
   2434	zfree(&tev->point.realname);
   2435	zfree(&tev->point.module);
   2436	for (i = 0; i < tev->nargs; i++) {
   2437		zfree(&tev->args[i].name);
   2438		zfree(&tev->args[i].value);
   2439		zfree(&tev->args[i].type);
   2440		ref = tev->args[i].ref;
   2441		while (ref) {
   2442			next = ref->next;
   2443			free(ref);
   2444			ref = next;
   2445		}
   2446	}
   2447	zfree(&tev->args);
   2448	tev->nargs = 0;
   2449}
   2450
   2451struct kprobe_blacklist_node {
   2452	struct list_head list;
   2453	u64 start;
   2454	u64 end;
   2455	char *symbol;
   2456};
   2457
   2458static void kprobe_blacklist__delete(struct list_head *blacklist)
   2459{
   2460	struct kprobe_blacklist_node *node;
   2461
   2462	while (!list_empty(blacklist)) {
   2463		node = list_first_entry(blacklist,
   2464					struct kprobe_blacklist_node, list);
   2465		list_del_init(&node->list);
   2466		zfree(&node->symbol);
   2467		free(node);
   2468	}
   2469}
   2470
   2471static int kprobe_blacklist__load(struct list_head *blacklist)
   2472{
   2473	struct kprobe_blacklist_node *node;
   2474	const char *__debugfs = debugfs__mountpoint();
   2475	char buf[PATH_MAX], *p;
   2476	FILE *fp;
   2477	int ret;
   2478
   2479	if (__debugfs == NULL)
   2480		return -ENOTSUP;
   2481
   2482	ret = e_snprintf(buf, PATH_MAX, "%s/kprobes/blacklist", __debugfs);
   2483	if (ret < 0)
   2484		return ret;
   2485
   2486	fp = fopen(buf, "r");
   2487	if (!fp)
   2488		return -errno;
   2489
   2490	ret = 0;
   2491	while (fgets(buf, PATH_MAX, fp)) {
   2492		node = zalloc(sizeof(*node));
   2493		if (!node) {
   2494			ret = -ENOMEM;
   2495			break;
   2496		}
   2497		INIT_LIST_HEAD(&node->list);
   2498		list_add_tail(&node->list, blacklist);
   2499		if (sscanf(buf, "0x%" PRIx64 "-0x%" PRIx64, &node->start, &node->end) != 2) {
   2500			ret = -EINVAL;
   2501			break;
   2502		}
   2503		p = strchr(buf, '\t');
   2504		if (p) {
   2505			p++;
   2506			if (p[strlen(p) - 1] == '\n')
   2507				p[strlen(p) - 1] = '\0';
   2508		} else
   2509			p = (char *)"unknown";
   2510		node->symbol = strdup(p);
   2511		if (!node->symbol) {
   2512			ret = -ENOMEM;
   2513			break;
   2514		}
   2515		pr_debug2("Blacklist: 0x%" PRIx64 "-0x%" PRIx64 ", %s\n",
   2516			  node->start, node->end, node->symbol);
   2517		ret++;
   2518	}
   2519	if (ret < 0)
   2520		kprobe_blacklist__delete(blacklist);
   2521	fclose(fp);
   2522
   2523	return ret;
   2524}
   2525
   2526static struct kprobe_blacklist_node *
   2527kprobe_blacklist__find_by_address(struct list_head *blacklist, u64 address)
   2528{
   2529	struct kprobe_blacklist_node *node;
   2530
   2531	list_for_each_entry(node, blacklist, list) {
   2532		if (node->start <= address && address < node->end)
   2533			return node;
   2534	}
   2535
   2536	return NULL;
   2537}
   2538
   2539static LIST_HEAD(kprobe_blacklist);
   2540
   2541static void kprobe_blacklist__init(void)
   2542{
   2543	if (!list_empty(&kprobe_blacklist))
   2544		return;
   2545
   2546	if (kprobe_blacklist__load(&kprobe_blacklist) < 0)
   2547		pr_debug("No kprobe blacklist support, ignored\n");
   2548}
   2549
   2550static void kprobe_blacklist__release(void)
   2551{
   2552	kprobe_blacklist__delete(&kprobe_blacklist);
   2553}
   2554
   2555static bool kprobe_blacklist__listed(u64 address)
   2556{
   2557	return !!kprobe_blacklist__find_by_address(&kprobe_blacklist, address);
   2558}
   2559
   2560static int perf_probe_event__sprintf(const char *group, const char *event,
   2561				     struct perf_probe_event *pev,
   2562				     const char *module,
   2563				     struct strbuf *result)
   2564{
   2565	int i, ret;
   2566	char *buf;
   2567
   2568	if (asprintf(&buf, "%s:%s", group, event) < 0)
   2569		return -errno;
   2570	ret = strbuf_addf(result, "  %-20s (on ", buf);
   2571	free(buf);
   2572	if (ret)
   2573		return ret;
   2574
   2575	/* Synthesize only event probe point */
   2576	buf = synthesize_perf_probe_point(&pev->point);
   2577	if (!buf)
   2578		return -ENOMEM;
   2579	ret = strbuf_addstr(result, buf);
   2580	free(buf);
   2581
   2582	if (!ret && module)
   2583		ret = strbuf_addf(result, " in %s", module);
   2584
   2585	if (!ret && pev->nargs > 0) {
   2586		ret = strbuf_add(result, " with", 5);
   2587		for (i = 0; !ret && i < pev->nargs; i++) {
   2588			buf = synthesize_perf_probe_arg(&pev->args[i]);
   2589			if (!buf)
   2590				return -ENOMEM;
   2591			ret = strbuf_addf(result, " %s", buf);
   2592			free(buf);
   2593		}
   2594	}
   2595	if (!ret)
   2596		ret = strbuf_addch(result, ')');
   2597
   2598	return ret;
   2599}
   2600
   2601/* Show an event */
   2602int show_perf_probe_event(const char *group, const char *event,
   2603			  struct perf_probe_event *pev,
   2604			  const char *module, bool use_stdout)
   2605{
   2606	struct strbuf buf = STRBUF_INIT;
   2607	int ret;
   2608
   2609	ret = perf_probe_event__sprintf(group, event, pev, module, &buf);
   2610	if (ret >= 0) {
   2611		if (use_stdout)
   2612			printf("%s\n", buf.buf);
   2613		else
   2614			pr_info("%s\n", buf.buf);
   2615	}
   2616	strbuf_release(&buf);
   2617
   2618	return ret;
   2619}
   2620
   2621static bool filter_probe_trace_event(struct probe_trace_event *tev,
   2622				     struct strfilter *filter)
   2623{
   2624	char tmp[128];
   2625
   2626	/* At first, check the event name itself */
   2627	if (strfilter__compare(filter, tev->event))
   2628		return true;
   2629
   2630	/* Next, check the combination of name and group */
   2631	if (e_snprintf(tmp, 128, "%s:%s", tev->group, tev->event) < 0)
   2632		return false;
   2633	return strfilter__compare(filter, tmp);
   2634}
   2635
   2636static int __show_perf_probe_events(int fd, bool is_kprobe,
   2637				    struct strfilter *filter)
   2638{
   2639	int ret = 0;
   2640	struct probe_trace_event tev;
   2641	struct perf_probe_event pev;
   2642	struct strlist *rawlist;
   2643	struct str_node *ent;
   2644
   2645	memset(&tev, 0, sizeof(tev));
   2646	memset(&pev, 0, sizeof(pev));
   2647
   2648	rawlist = probe_file__get_rawlist(fd);
   2649	if (!rawlist)
   2650		return -ENOMEM;
   2651
   2652	strlist__for_each_entry(ent, rawlist) {
   2653		ret = parse_probe_trace_command(ent->s, &tev);
   2654		if (ret >= 0) {
   2655			if (!filter_probe_trace_event(&tev, filter))
   2656				goto next;
   2657			ret = convert_to_perf_probe_event(&tev, &pev,
   2658								is_kprobe);
   2659			if (ret < 0)
   2660				goto next;
   2661			ret = show_perf_probe_event(pev.group, pev.event,
   2662						    &pev, tev.point.module,
   2663						    true);
   2664		}
   2665next:
   2666		clear_perf_probe_event(&pev);
   2667		clear_probe_trace_event(&tev);
   2668		if (ret < 0)
   2669			break;
   2670	}
   2671	strlist__delete(rawlist);
   2672	/* Cleanup cached debuginfo if needed */
   2673	debuginfo_cache__exit();
   2674
   2675	return ret;
   2676}
   2677
   2678/* List up current perf-probe events */
   2679int show_perf_probe_events(struct strfilter *filter)
   2680{
   2681	int kp_fd, up_fd, ret;
   2682
   2683	setup_pager();
   2684
   2685	if (probe_conf.cache)
   2686		return probe_cache__show_all_caches(filter);
   2687
   2688	ret = init_probe_symbol_maps(false);
   2689	if (ret < 0)
   2690		return ret;
   2691
   2692	ret = probe_file__open_both(&kp_fd, &up_fd, 0);
   2693	if (ret < 0)
   2694		return ret;
   2695
   2696	if (kp_fd >= 0)
   2697		ret = __show_perf_probe_events(kp_fd, true, filter);
   2698	if (up_fd >= 0 && ret >= 0)
   2699		ret = __show_perf_probe_events(up_fd, false, filter);
   2700	if (kp_fd > 0)
   2701		close(kp_fd);
   2702	if (up_fd > 0)
   2703		close(up_fd);
   2704	exit_probe_symbol_maps();
   2705
   2706	return ret;
   2707}
   2708
   2709static int get_new_event_name(char *buf, size_t len, const char *base,
   2710			      struct strlist *namelist, bool ret_event,
   2711			      bool allow_suffix)
   2712{
   2713	int i, ret;
   2714	char *p, *nbase;
   2715
   2716	if (*base == '.')
   2717		base++;
   2718	nbase = strdup(base);
   2719	if (!nbase)
   2720		return -ENOMEM;
   2721
   2722	/* Cut off the dot suffixes (e.g. .const, .isra) and version suffixes */
   2723	p = strpbrk(nbase, ".@");
   2724	if (p && p != nbase)
   2725		*p = '\0';
   2726
   2727	/* Try no suffix number */
   2728	ret = e_snprintf(buf, len, "%s%s", nbase, ret_event ? "__return" : "");
   2729	if (ret < 0) {
   2730		pr_debug("snprintf() failed: %d\n", ret);
   2731		goto out;
   2732	}
   2733	if (!strlist__has_entry(namelist, buf))
   2734		goto out;
   2735
   2736	if (!allow_suffix) {
   2737		pr_warning("Error: event \"%s\" already exists.\n"
   2738			   " Hint: Remove existing event by 'perf probe -d'\n"
   2739			   "       or force duplicates by 'perf probe -f'\n"
   2740			   "       or set 'force=yes' in BPF source.\n",
   2741			   buf);
   2742		ret = -EEXIST;
   2743		goto out;
   2744	}
   2745
   2746	/* Try to add suffix */
   2747	for (i = 1; i < MAX_EVENT_INDEX; i++) {
   2748		ret = e_snprintf(buf, len, "%s_%d", nbase, i);
   2749		if (ret < 0) {
   2750			pr_debug("snprintf() failed: %d\n", ret);
   2751			goto out;
   2752		}
   2753		if (!strlist__has_entry(namelist, buf))
   2754			break;
   2755	}
   2756	if (i == MAX_EVENT_INDEX) {
   2757		pr_warning("Too many events are on the same function.\n");
   2758		ret = -ERANGE;
   2759	}
   2760
   2761out:
   2762	free(nbase);
   2763
   2764	/* Final validation */
   2765	if (ret >= 0 && !is_c_func_name(buf)) {
   2766		pr_warning("Internal error: \"%s\" is an invalid event name.\n",
   2767			   buf);
   2768		ret = -EINVAL;
   2769	}
   2770
   2771	return ret;
   2772}
   2773
   2774/* Warn if the current kernel's uprobe implementation is old */
   2775static void warn_uprobe_event_compat(struct probe_trace_event *tev)
   2776{
   2777	int i;
   2778	char *buf = synthesize_probe_trace_command(tev);
   2779	struct probe_trace_point *tp = &tev->point;
   2780
   2781	if (tp->ref_ctr_offset && !uprobe_ref_ctr_is_supported()) {
   2782		pr_warning("A semaphore is associated with %s:%s and "
   2783			   "seems your kernel doesn't support it.\n",
   2784			   tev->group, tev->event);
   2785	}
   2786
   2787	/* Old uprobe event doesn't support memory dereference */
   2788	if (!tev->uprobes || tev->nargs == 0 || !buf)
   2789		goto out;
   2790
   2791	for (i = 0; i < tev->nargs; i++)
   2792		if (strglobmatch(tev->args[i].value, "[$@+-]*")) {
   2793			pr_warning("Please upgrade your kernel to at least "
   2794				   "3.14 to have access to feature %s\n",
   2795				   tev->args[i].value);
   2796			break;
   2797		}
   2798out:
   2799	free(buf);
   2800}
   2801
   2802/* Set new name from original perf_probe_event and namelist */
   2803static int probe_trace_event__set_name(struct probe_trace_event *tev,
   2804				       struct perf_probe_event *pev,
   2805				       struct strlist *namelist,
   2806				       bool allow_suffix)
   2807{
   2808	const char *event, *group;
   2809	char buf[64];
   2810	int ret;
   2811
   2812	/* If probe_event or trace_event already have the name, reuse it */
   2813	if (pev->event && !pev->sdt)
   2814		event = pev->event;
   2815	else if (tev->event)
   2816		event = tev->event;
   2817	else {
   2818		/* Or generate new one from probe point */
   2819		if (pev->point.function &&
   2820			(strncmp(pev->point.function, "0x", 2) != 0) &&
   2821			!strisglob(pev->point.function))
   2822			event = pev->point.function;
   2823		else
   2824			event = tev->point.realname;
   2825	}
   2826	if (pev->group && !pev->sdt)
   2827		group = pev->group;
   2828	else if (tev->group)
   2829		group = tev->group;
   2830	else
   2831		group = PERFPROBE_GROUP;
   2832
   2833	/* Get an unused new event name */
   2834	ret = get_new_event_name(buf, 64, event, namelist,
   2835				 tev->point.retprobe, allow_suffix);
   2836	if (ret < 0)
   2837		return ret;
   2838
   2839	event = buf;
   2840
   2841	tev->event = strdup(event);
   2842	tev->group = strdup(group);
   2843	if (tev->event == NULL || tev->group == NULL)
   2844		return -ENOMEM;
   2845
   2846	/*
   2847	 * Add new event name to namelist if multiprobe event is NOT
   2848	 * supported, since we have to use new event name for following
   2849	 * probes in that case.
   2850	 */
   2851	if (!multiprobe_event_is_supported())
   2852		strlist__add(namelist, event);
   2853	return 0;
   2854}
   2855
   2856static int __open_probe_file_and_namelist(bool uprobe,
   2857					  struct strlist **namelist)
   2858{
   2859	int fd;
   2860
   2861	fd = probe_file__open(PF_FL_RW | (uprobe ? PF_FL_UPROBE : 0));
   2862	if (fd < 0)
   2863		return fd;
   2864
   2865	/* Get current event names */
   2866	*namelist = probe_file__get_namelist(fd);
   2867	if (!(*namelist)) {
   2868		pr_debug("Failed to get current event list.\n");
   2869		close(fd);
   2870		return -ENOMEM;
   2871	}
   2872	return fd;
   2873}
   2874
   2875static int __add_probe_trace_events(struct perf_probe_event *pev,
   2876				     struct probe_trace_event *tevs,
   2877				     int ntevs, bool allow_suffix)
   2878{
   2879	int i, fd[2] = {-1, -1}, up, ret;
   2880	struct probe_trace_event *tev = NULL;
   2881	struct probe_cache *cache = NULL;
   2882	struct strlist *namelist[2] = {NULL, NULL};
   2883	struct nscookie nsc;
   2884
   2885	up = pev->uprobes ? 1 : 0;
   2886	fd[up] = __open_probe_file_and_namelist(up, &namelist[up]);
   2887	if (fd[up] < 0)
   2888		return fd[up];
   2889
   2890	ret = 0;
   2891	for (i = 0; i < ntevs; i++) {
   2892		tev = &tevs[i];
   2893		up = tev->uprobes ? 1 : 0;
   2894		if (fd[up] == -1) {	/* Open the kprobe/uprobe_events */
   2895			fd[up] = __open_probe_file_and_namelist(up,
   2896								&namelist[up]);
   2897			if (fd[up] < 0)
   2898				goto close_out;
   2899		}
   2900		/* Skip if the symbol is out of .text or blacklisted */
   2901		if (!tev->point.symbol && !pev->uprobes)
   2902			continue;
   2903
   2904		/* Set new name for tev (and update namelist) */
   2905		ret = probe_trace_event__set_name(tev, pev, namelist[up],
   2906						  allow_suffix);
   2907		if (ret < 0)
   2908			break;
   2909
   2910		nsinfo__mountns_enter(pev->nsi, &nsc);
   2911		ret = probe_file__add_event(fd[up], tev);
   2912		nsinfo__mountns_exit(&nsc);
   2913		if (ret < 0)
   2914			break;
   2915
   2916		/*
   2917		 * Probes after the first probe which comes from same
   2918		 * user input are always allowed to add suffix, because
   2919		 * there might be several addresses corresponding to
   2920		 * one code line.
   2921		 */
   2922		allow_suffix = true;
   2923	}
   2924	if (ret == -EINVAL && pev->uprobes)
   2925		warn_uprobe_event_compat(tev);
   2926	if (ret == 0 && probe_conf.cache) {
   2927		cache = probe_cache__new(pev->target, pev->nsi);
   2928		if (!cache ||
   2929		    probe_cache__add_entry(cache, pev, tevs, ntevs) < 0 ||
   2930		    probe_cache__commit(cache) < 0)
   2931			pr_warning("Failed to add event to probe cache\n");
   2932		probe_cache__delete(cache);
   2933	}
   2934
   2935close_out:
   2936	for (up = 0; up < 2; up++) {
   2937		strlist__delete(namelist[up]);
   2938		if (fd[up] >= 0)
   2939			close(fd[up]);
   2940	}
   2941	return ret;
   2942}
   2943
   2944static int find_probe_functions(struct map *map, char *name,
   2945				struct symbol **syms)
   2946{
   2947	int found = 0;
   2948	struct symbol *sym;
   2949	struct rb_node *tmp;
   2950	const char *norm, *ver;
   2951	char *buf = NULL;
   2952	bool cut_version = true;
   2953
   2954	if (map__load(map) < 0)
   2955		return -EACCES;	/* Possible permission error to load symbols */
   2956
   2957	/* If user gives a version, don't cut off the version from symbols */
   2958	if (strchr(name, '@'))
   2959		cut_version = false;
   2960
   2961	map__for_each_symbol(map, sym, tmp) {
   2962		norm = arch__normalize_symbol_name(sym->name);
   2963		if (!norm)
   2964			continue;
   2965
   2966		if (cut_version) {
   2967			/* We don't care about default symbol or not */
   2968			ver = strchr(norm, '@');
   2969			if (ver) {
   2970				buf = strndup(norm, ver - norm);
   2971				if (!buf)
   2972					return -ENOMEM;
   2973				norm = buf;
   2974			}
   2975		}
   2976
   2977		if (strglobmatch(norm, name)) {
   2978			found++;
   2979			if (syms && found < probe_conf.max_probes)
   2980				syms[found - 1] = sym;
   2981		}
   2982		if (buf)
   2983			zfree(&buf);
   2984	}
   2985
   2986	return found;
   2987}
   2988
   2989void __weak arch__fix_tev_from_maps(struct perf_probe_event *pev __maybe_unused,
   2990				struct probe_trace_event *tev __maybe_unused,
   2991				struct map *map __maybe_unused,
   2992				struct symbol *sym __maybe_unused) { }
   2993
   2994
   2995static void pr_kallsyms_access_error(void)
   2996{
   2997	pr_err("Please ensure you can read the /proc/kallsyms symbol addresses.\n"
   2998	       "If /proc/sys/kernel/kptr_restrict is '2', you can not read\n"
   2999	       "kernel symbol addresses even if you are a superuser. Please change\n"
   3000	       "it to '1'. If kptr_restrict is '1', the superuser can read the\n"
   3001	       "symbol addresses.\n"
   3002	       "In that case, please run this command again with sudo.\n");
   3003}
   3004
   3005/*
   3006 * Find probe function addresses from map.
   3007 * Return an error or the number of found probe_trace_event
   3008 */
   3009static int find_probe_trace_events_from_map(struct perf_probe_event *pev,
   3010					    struct probe_trace_event **tevs)
   3011{
   3012	struct map *map = NULL;
   3013	struct ref_reloc_sym *reloc_sym = NULL;
   3014	struct symbol *sym;
   3015	struct symbol **syms = NULL;
   3016	struct probe_trace_event *tev;
   3017	struct perf_probe_point *pp = &pev->point;
   3018	struct probe_trace_point *tp;
   3019	int num_matched_functions;
   3020	int ret, i, j, skipped = 0;
   3021	char *mod_name;
   3022
   3023	map = get_target_map(pev->target, pev->nsi, pev->uprobes);
   3024	if (!map) {
   3025		ret = -EINVAL;
   3026		goto out;
   3027	}
   3028
   3029	syms = malloc(sizeof(struct symbol *) * probe_conf.max_probes);
   3030	if (!syms) {
   3031		ret = -ENOMEM;
   3032		goto out;
   3033	}
   3034
   3035	/*
   3036	 * Load matched symbols: Since the different local symbols may have
   3037	 * same name but different addresses, this lists all the symbols.
   3038	 */
   3039	num_matched_functions = find_probe_functions(map, pp->function, syms);
   3040	if (num_matched_functions <= 0) {
   3041		if (num_matched_functions == -EACCES) {
   3042			pr_err("Failed to load symbols from %s\n",
   3043			       pev->target ?: "/proc/kallsyms");
   3044			if (pev->target)
   3045				pr_err("Please ensure the file is not stripped.\n");
   3046			else
   3047				pr_kallsyms_access_error();
   3048		} else
   3049			pr_err("Failed to find symbol %s in %s\n", pp->function,
   3050				pev->target ? : "kernel");
   3051		ret = -ENOENT;
   3052		goto out;
   3053	} else if (num_matched_functions > probe_conf.max_probes) {
   3054		pr_err("Too many functions matched in %s\n",
   3055			pev->target ? : "kernel");
   3056		ret = -E2BIG;
   3057		goto out;
   3058	}
   3059
   3060	/* Note that the symbols in the kmodule are not relocated */
   3061	if (!pev->uprobes && !pev->target &&
   3062			(!pp->retprobe || kretprobe_offset_is_supported())) {
   3063		reloc_sym = kernel_get_ref_reloc_sym(NULL);
   3064		if (!reloc_sym) {
   3065			pr_warning("Relocated base symbol is not found! "
   3066				   "Check /proc/sys/kernel/kptr_restrict\n"
   3067				   "and /proc/sys/kernel/perf_event_paranoid. "
   3068				   "Or run as privileged perf user.\n\n");
   3069			ret = -EINVAL;
   3070			goto out;
   3071		}
   3072	}
   3073
   3074	/* Setup result trace-probe-events */
   3075	*tevs = zalloc(sizeof(*tev) * num_matched_functions);
   3076	if (!*tevs) {
   3077		ret = -ENOMEM;
   3078		goto out;
   3079	}
   3080
   3081	ret = 0;
   3082
   3083	for (j = 0; j < num_matched_functions; j++) {
   3084		sym = syms[j];
   3085
   3086		if (sym->type != STT_FUNC)
   3087			continue;
   3088
   3089		/* There can be duplicated symbols in the map */
   3090		for (i = 0; i < j; i++)
   3091			if (sym->start == syms[i]->start) {
   3092				pr_debug("Found duplicated symbol %s @ %" PRIx64 "\n",
   3093					 sym->name, sym->start);
   3094				break;
   3095			}
   3096		if (i != j)
   3097			continue;
   3098
   3099		tev = (*tevs) + ret;
   3100		tp = &tev->point;
   3101		if (ret == num_matched_functions) {
   3102			pr_warning("Too many symbols are listed. Skip it.\n");
   3103			break;
   3104		}
   3105		ret++;
   3106
   3107		if (pp->offset > sym->end - sym->start) {
   3108			pr_warning("Offset %ld is bigger than the size of %s\n",
   3109				   pp->offset, sym->name);
   3110			ret = -ENOENT;
   3111			goto err_out;
   3112		}
   3113		/* Add one probe point */
   3114		tp->address = map->unmap_ip(map, sym->start) + pp->offset;
   3115
   3116		/* Check the kprobe (not in module) is within .text  */
   3117		if (!pev->uprobes && !pev->target &&
   3118		    kprobe_warn_out_range(sym->name, tp->address)) {
   3119			tp->symbol = NULL;	/* Skip it */
   3120			skipped++;
   3121		} else if (reloc_sym) {
   3122			tp->symbol = strdup_or_goto(reloc_sym->name, nomem_out);
   3123			tp->offset = tp->address - reloc_sym->addr;
   3124		} else {
   3125			tp->symbol = strdup_or_goto(sym->name, nomem_out);
   3126			tp->offset = pp->offset;
   3127		}
   3128		tp->realname = strdup_or_goto(sym->name, nomem_out);
   3129
   3130		tp->retprobe = pp->retprobe;
   3131		if (pev->target) {
   3132			if (pev->uprobes) {
   3133				tev->point.module = strdup_or_goto(pev->target,
   3134								   nomem_out);
   3135			} else {
   3136				mod_name = find_module_name(pev->target);
   3137				tev->point.module =
   3138					strdup(mod_name ? mod_name : pev->target);
   3139				free(mod_name);
   3140				if (!tev->point.module)
   3141					goto nomem_out;
   3142			}
   3143		}
   3144		tev->uprobes = pev->uprobes;
   3145		tev->nargs = pev->nargs;
   3146		if (tev->nargs) {
   3147			tev->args = zalloc(sizeof(struct probe_trace_arg) *
   3148					   tev->nargs);
   3149			if (tev->args == NULL)
   3150				goto nomem_out;
   3151		}
   3152		for (i = 0; i < tev->nargs; i++) {
   3153			if (pev->args[i].name)
   3154				tev->args[i].name =
   3155					strdup_or_goto(pev->args[i].name,
   3156							nomem_out);
   3157
   3158			tev->args[i].value = strdup_or_goto(pev->args[i].var,
   3159							    nomem_out);
   3160			if (pev->args[i].type)
   3161				tev->args[i].type =
   3162					strdup_or_goto(pev->args[i].type,
   3163							nomem_out);
   3164		}
   3165		arch__fix_tev_from_maps(pev, tev, map, sym);
   3166	}
   3167	if (ret == skipped) {
   3168		ret = -ENOENT;
   3169		goto err_out;
   3170	}
   3171
   3172out:
   3173	map__put(map);
   3174	free(syms);
   3175	return ret;
   3176
   3177nomem_out:
   3178	ret = -ENOMEM;
   3179err_out:
   3180	clear_probe_trace_events(*tevs, num_matched_functions);
   3181	zfree(tevs);
   3182	goto out;
   3183}
   3184
   3185static int try_to_find_absolute_address(struct perf_probe_event *pev,
   3186					struct probe_trace_event **tevs)
   3187{
   3188	struct perf_probe_point *pp = &pev->point;
   3189	struct probe_trace_event *tev;
   3190	struct probe_trace_point *tp;
   3191	int i, err;
   3192
   3193	if (!(pev->point.function && !strncmp(pev->point.function, "0x", 2)))
   3194		return -EINVAL;
   3195	if (perf_probe_event_need_dwarf(pev))
   3196		return -EINVAL;
   3197
   3198	/*
   3199	 * This is 'perf probe /lib/libc.so 0xabcd'. Try to probe at
   3200	 * absolute address.
   3201	 *
   3202	 * Only one tev can be generated by this.
   3203	 */
   3204	*tevs = zalloc(sizeof(*tev));
   3205	if (!*tevs)
   3206		return -ENOMEM;
   3207
   3208	tev = *tevs;
   3209	tp = &tev->point;
   3210
   3211	/*
   3212	 * Don't use tp->offset, use address directly, because
   3213	 * in synthesize_probe_trace_command() address cannot be
   3214	 * zero.
   3215	 */
   3216	tp->address = pev->point.abs_address;
   3217	tp->retprobe = pp->retprobe;
   3218	tev->uprobes = pev->uprobes;
   3219
   3220	err = -ENOMEM;
   3221	/*
   3222	 * Give it a '0x' leading symbol name.
   3223	 * In __add_probe_trace_events, a NULL symbol is interpreted as
   3224	 * invalid.
   3225	 */
   3226	if (asprintf(&tp->symbol, "0x%" PRIx64, tp->address) < 0)
   3227		goto errout;
   3228
   3229	/* For kprobe, check range */
   3230	if ((!tev->uprobes) &&
   3231	    (kprobe_warn_out_range(tev->point.symbol,
   3232				   tev->point.address))) {
   3233		err = -EACCES;
   3234		goto errout;
   3235	}
   3236
   3237	if (asprintf(&tp->realname, "abs_%" PRIx64, tp->address) < 0)
   3238		goto errout;
   3239
   3240	if (pev->target) {
   3241		tp->module = strdup(pev->target);
   3242		if (!tp->module)
   3243			goto errout;
   3244	}
   3245
   3246	if (tev->group) {
   3247		tev->group = strdup(pev->group);
   3248		if (!tev->group)
   3249			goto errout;
   3250	}
   3251
   3252	if (pev->event) {
   3253		tev->event = strdup(pev->event);
   3254		if (!tev->event)
   3255			goto errout;
   3256	}
   3257
   3258	tev->nargs = pev->nargs;
   3259	tev->args = zalloc(sizeof(struct probe_trace_arg) * tev->nargs);
   3260	if (!tev->args)
   3261		goto errout;
   3262
   3263	for (i = 0; i < tev->nargs; i++)
   3264		copy_to_probe_trace_arg(&tev->args[i], &pev->args[i]);
   3265
   3266	return 1;
   3267
   3268errout:
   3269	clear_probe_trace_events(*tevs, 1);
   3270	*tevs = NULL;
   3271	return err;
   3272}
   3273
   3274/* Concatenate two arrays */
   3275static void *memcat(void *a, size_t sz_a, void *b, size_t sz_b)
   3276{
   3277	void *ret;
   3278
   3279	ret = malloc(sz_a + sz_b);
   3280	if (ret) {
   3281		memcpy(ret, a, sz_a);
   3282		memcpy(ret + sz_a, b, sz_b);
   3283	}
   3284	return ret;
   3285}
   3286
   3287static int
   3288concat_probe_trace_events(struct probe_trace_event **tevs, int *ntevs,
   3289			  struct probe_trace_event **tevs2, int ntevs2)
   3290{
   3291	struct probe_trace_event *new_tevs;
   3292	int ret = 0;
   3293
   3294	if (*ntevs == 0) {
   3295		*tevs = *tevs2;
   3296		*ntevs = ntevs2;
   3297		*tevs2 = NULL;
   3298		return 0;
   3299	}
   3300
   3301	if (*ntevs + ntevs2 > probe_conf.max_probes)
   3302		ret = -E2BIG;
   3303	else {
   3304		/* Concatenate the array of probe_trace_event */
   3305		new_tevs = memcat(*tevs, (*ntevs) * sizeof(**tevs),
   3306				  *tevs2, ntevs2 * sizeof(**tevs2));
   3307		if (!new_tevs)
   3308			ret = -ENOMEM;
   3309		else {
   3310			free(*tevs);
   3311			*tevs = new_tevs;
   3312			*ntevs += ntevs2;
   3313		}
   3314	}
   3315	if (ret < 0)
   3316		clear_probe_trace_events(*tevs2, ntevs2);
   3317	zfree(tevs2);
   3318
   3319	return ret;
   3320}
   3321
   3322/*
   3323 * Try to find probe_trace_event from given probe caches. Return the number
   3324 * of cached events found, if an error occurs return the error.
   3325 */
   3326static int find_cached_events(struct perf_probe_event *pev,
   3327			      struct probe_trace_event **tevs,
   3328			      const char *target)
   3329{
   3330	struct probe_cache *cache;
   3331	struct probe_cache_entry *entry;
   3332	struct probe_trace_event *tmp_tevs = NULL;
   3333	int ntevs = 0;
   3334	int ret = 0;
   3335
   3336	cache = probe_cache__new(target, pev->nsi);
   3337	/* Return 0 ("not found") if the target has no probe cache. */
   3338	if (!cache)
   3339		return 0;
   3340
   3341	for_each_probe_cache_entry(entry, cache) {
   3342		/* Skip the cache entry which has no name */
   3343		if (!entry->pev.event || !entry->pev.group)
   3344			continue;
   3345		if ((!pev->group || strglobmatch(entry->pev.group, pev->group)) &&
   3346		    strglobmatch(entry->pev.event, pev->event)) {
   3347			ret = probe_cache_entry__get_event(entry, &tmp_tevs);
   3348			if (ret > 0)
   3349				ret = concat_probe_trace_events(tevs, &ntevs,
   3350								&tmp_tevs, ret);
   3351			if (ret < 0)
   3352				break;
   3353		}
   3354	}
   3355	probe_cache__delete(cache);
   3356	if (ret < 0) {
   3357		clear_probe_trace_events(*tevs, ntevs);
   3358		zfree(tevs);
   3359	} else {
   3360		ret = ntevs;
   3361		if (ntevs > 0 && target && target[0] == '/')
   3362			pev->uprobes = true;
   3363	}
   3364
   3365	return ret;
   3366}
   3367
   3368/* Try to find probe_trace_event from all probe caches */
   3369static int find_cached_events_all(struct perf_probe_event *pev,
   3370				   struct probe_trace_event **tevs)
   3371{
   3372	struct probe_trace_event *tmp_tevs = NULL;
   3373	struct strlist *bidlist;
   3374	struct str_node *nd;
   3375	char *pathname;
   3376	int ntevs = 0;
   3377	int ret;
   3378
   3379	/* Get the buildid list of all valid caches */
   3380	bidlist = build_id_cache__list_all(true);
   3381	if (!bidlist) {
   3382		ret = -errno;
   3383		pr_debug("Failed to get buildids: %d\n", ret);
   3384		return ret;
   3385	}
   3386
   3387	ret = 0;
   3388	strlist__for_each_entry(nd, bidlist) {
   3389		pathname = build_id_cache__origname(nd->s);
   3390		ret = find_cached_events(pev, &tmp_tevs, pathname);
   3391		/* In the case of cnt == 0, we just skip it */
   3392		if (ret > 0)
   3393			ret = concat_probe_trace_events(tevs, &ntevs,
   3394							&tmp_tevs, ret);
   3395		free(pathname);
   3396		if (ret < 0)
   3397			break;
   3398	}
   3399	strlist__delete(bidlist);
   3400
   3401	if (ret < 0) {
   3402		clear_probe_trace_events(*tevs, ntevs);
   3403		zfree(tevs);
   3404	} else
   3405		ret = ntevs;
   3406
   3407	return ret;
   3408}
   3409
   3410static int find_probe_trace_events_from_cache(struct perf_probe_event *pev,
   3411					      struct probe_trace_event **tevs)
   3412{
   3413	struct probe_cache *cache;
   3414	struct probe_cache_entry *entry;
   3415	struct probe_trace_event *tev;
   3416	struct str_node *node;
   3417	int ret, i;
   3418
   3419	if (pev->sdt) {
   3420		/* For SDT/cached events, we use special search functions */
   3421		if (!pev->target)
   3422			return find_cached_events_all(pev, tevs);
   3423		else
   3424			return find_cached_events(pev, tevs, pev->target);
   3425	}
   3426	cache = probe_cache__new(pev->target, pev->nsi);
   3427	if (!cache)
   3428		return 0;
   3429
   3430	entry = probe_cache__find(cache, pev);
   3431	if (!entry) {
   3432		/* SDT must be in the cache */
   3433		ret = pev->sdt ? -ENOENT : 0;
   3434		goto out;
   3435	}
   3436
   3437	ret = strlist__nr_entries(entry->tevlist);
   3438	if (ret > probe_conf.max_probes) {
   3439		pr_debug("Too many entries matched in the cache of %s\n",
   3440			 pev->target ? : "kernel");
   3441		ret = -E2BIG;
   3442		goto out;
   3443	}
   3444
   3445	*tevs = zalloc(ret * sizeof(*tev));
   3446	if (!*tevs) {
   3447		ret = -ENOMEM;
   3448		goto out;
   3449	}
   3450
   3451	i = 0;
   3452	strlist__for_each_entry(node, entry->tevlist) {
   3453		tev = &(*tevs)[i++];
   3454		ret = parse_probe_trace_command(node->s, tev);
   3455		if (ret < 0)
   3456			goto out;
   3457		/* Set the uprobes attribute as same as original */
   3458		tev->uprobes = pev->uprobes;
   3459	}
   3460	ret = i;
   3461
   3462out:
   3463	probe_cache__delete(cache);
   3464	return ret;
   3465}
   3466
   3467static int convert_to_probe_trace_events(struct perf_probe_event *pev,
   3468					 struct probe_trace_event **tevs)
   3469{
   3470	int ret;
   3471
   3472	if (!pev->group && !pev->sdt) {
   3473		/* Set group name if not given */
   3474		if (!pev->uprobes) {
   3475			pev->group = strdup(PERFPROBE_GROUP);
   3476			ret = pev->group ? 0 : -ENOMEM;
   3477		} else
   3478			ret = convert_exec_to_group(pev->target, &pev->group);
   3479		if (ret != 0) {
   3480			pr_warning("Failed to make a group name.\n");
   3481			return ret;
   3482		}
   3483	}
   3484
   3485	ret = try_to_find_absolute_address(pev, tevs);
   3486	if (ret > 0)
   3487		return ret;
   3488
   3489	/* At first, we need to lookup cache entry */
   3490	ret = find_probe_trace_events_from_cache(pev, tevs);
   3491	if (ret > 0 || pev->sdt)	/* SDT can be found only in the cache */
   3492		return ret == 0 ? -ENOENT : ret; /* Found in probe cache */
   3493
   3494	/* Convert perf_probe_event with debuginfo */
   3495	ret = try_to_find_probe_trace_events(pev, tevs);
   3496	if (ret != 0)
   3497		return ret;	/* Found in debuginfo or got an error */
   3498
   3499	return find_probe_trace_events_from_map(pev, tevs);
   3500}
   3501
   3502int convert_perf_probe_events(struct perf_probe_event *pevs, int npevs)
   3503{
   3504	int i, ret;
   3505
   3506	/* Loop 1: convert all events */
   3507	for (i = 0; i < npevs; i++) {
   3508		/* Init kprobe blacklist if needed */
   3509		if (!pevs[i].uprobes)
   3510			kprobe_blacklist__init();
   3511		/* Convert with or without debuginfo */
   3512		ret  = convert_to_probe_trace_events(&pevs[i], &pevs[i].tevs);
   3513		if (ret < 0)
   3514			return ret;
   3515		pevs[i].ntevs = ret;
   3516	}
   3517	/* This just release blacklist only if allocated */
   3518	kprobe_blacklist__release();
   3519
   3520	return 0;
   3521}
   3522
   3523static int show_probe_trace_event(struct probe_trace_event *tev)
   3524{
   3525	char *buf = synthesize_probe_trace_command(tev);
   3526
   3527	if (!buf) {
   3528		pr_debug("Failed to synthesize probe trace event.\n");
   3529		return -EINVAL;
   3530	}
   3531
   3532	/* Showing definition always go stdout */
   3533	printf("%s\n", buf);
   3534	free(buf);
   3535
   3536	return 0;
   3537}
   3538
   3539int show_probe_trace_events(struct perf_probe_event *pevs, int npevs)
   3540{
   3541	struct strlist *namelist = strlist__new(NULL, NULL);
   3542	struct probe_trace_event *tev;
   3543	struct perf_probe_event *pev;
   3544	int i, j, ret = 0;
   3545
   3546	if (!namelist)
   3547		return -ENOMEM;
   3548
   3549	for (j = 0; j < npevs && !ret; j++) {
   3550		pev = &pevs[j];
   3551		for (i = 0; i < pev->ntevs && !ret; i++) {
   3552			tev = &pev->tevs[i];
   3553			/* Skip if the symbol is out of .text or blacklisted */
   3554			if (!tev->point.symbol && !pev->uprobes)
   3555				continue;
   3556
   3557			/* Set new name for tev (and update namelist) */
   3558			ret = probe_trace_event__set_name(tev, pev,
   3559							  namelist, true);
   3560			if (!ret)
   3561				ret = show_probe_trace_event(tev);
   3562		}
   3563	}
   3564	strlist__delete(namelist);
   3565
   3566	return ret;
   3567}
   3568
   3569static int show_bootconfig_event(struct probe_trace_event *tev)
   3570{
   3571	struct probe_trace_point *tp = &tev->point;
   3572	struct strbuf buf;
   3573	char *ret = NULL;
   3574	int err;
   3575
   3576	if (strbuf_init(&buf, 32) < 0)
   3577		return -ENOMEM;
   3578
   3579	err = synthesize_kprobe_trace_def(tp, &buf);
   3580	if (err >= 0)
   3581		err = synthesize_probe_trace_args(tev, &buf);
   3582	if (err >= 0)
   3583		ret = strbuf_detach(&buf, NULL);
   3584	strbuf_release(&buf);
   3585
   3586	if (ret) {
   3587		printf("'%s'", ret);
   3588		free(ret);
   3589	}
   3590
   3591	return err;
   3592}
   3593
   3594int show_bootconfig_events(struct perf_probe_event *pevs, int npevs)
   3595{
   3596	struct strlist *namelist = strlist__new(NULL, NULL);
   3597	struct probe_trace_event *tev;
   3598	struct perf_probe_event *pev;
   3599	char *cur_name = NULL;
   3600	int i, j, ret = 0;
   3601
   3602	if (!namelist)
   3603		return -ENOMEM;
   3604
   3605	for (j = 0; j < npevs && !ret; j++) {
   3606		pev = &pevs[j];
   3607		if (pev->group && strcmp(pev->group, "probe"))
   3608			pr_warning("WARN: Group name %s is ignored\n", pev->group);
   3609		if (pev->uprobes) {
   3610			pr_warning("ERROR: Bootconfig doesn't support uprobes\n");
   3611			ret = -EINVAL;
   3612			break;
   3613		}
   3614		for (i = 0; i < pev->ntevs && !ret; i++) {
   3615			tev = &pev->tevs[i];
   3616			/* Skip if the symbol is out of .text or blacklisted */
   3617			if (!tev->point.symbol && !pev->uprobes)
   3618				continue;
   3619
   3620			/* Set new name for tev (and update namelist) */
   3621			ret = probe_trace_event__set_name(tev, pev,
   3622							  namelist, true);
   3623			if (ret)
   3624				break;
   3625
   3626			if (!cur_name || strcmp(cur_name, tev->event)) {
   3627				printf("%sftrace.event.kprobes.%s.probe = ",
   3628					cur_name ? "\n" : "", tev->event);
   3629				cur_name = tev->event;
   3630			} else
   3631				printf(", ");
   3632			ret = show_bootconfig_event(tev);
   3633		}
   3634	}
   3635	printf("\n");
   3636	strlist__delete(namelist);
   3637
   3638	return ret;
   3639}
   3640
   3641int apply_perf_probe_events(struct perf_probe_event *pevs, int npevs)
   3642{
   3643	int i, ret = 0;
   3644
   3645	/* Loop 2: add all events */
   3646	for (i = 0; i < npevs; i++) {
   3647		ret = __add_probe_trace_events(&pevs[i], pevs[i].tevs,
   3648					       pevs[i].ntevs,
   3649					       probe_conf.force_add);
   3650		if (ret < 0)
   3651			break;
   3652	}
   3653	return ret;
   3654}
   3655
   3656void cleanup_perf_probe_events(struct perf_probe_event *pevs, int npevs)
   3657{
   3658	int i, j;
   3659	struct perf_probe_event *pev;
   3660
   3661	/* Loop 3: cleanup and free trace events  */
   3662	for (i = 0; i < npevs; i++) {
   3663		pev = &pevs[i];
   3664		for (j = 0; j < pevs[i].ntevs; j++)
   3665			clear_probe_trace_event(&pevs[i].tevs[j]);
   3666		zfree(&pevs[i].tevs);
   3667		pevs[i].ntevs = 0;
   3668		nsinfo__zput(pev->nsi);
   3669		clear_perf_probe_event(&pevs[i]);
   3670	}
   3671}
   3672
   3673int add_perf_probe_events(struct perf_probe_event *pevs, int npevs)
   3674{
   3675	int ret;
   3676
   3677	ret = init_probe_symbol_maps(pevs->uprobes);
   3678	if (ret < 0)
   3679		return ret;
   3680
   3681	ret = convert_perf_probe_events(pevs, npevs);
   3682	if (ret == 0)
   3683		ret = apply_perf_probe_events(pevs, npevs);
   3684
   3685	cleanup_perf_probe_events(pevs, npevs);
   3686
   3687	exit_probe_symbol_maps();
   3688	return ret;
   3689}
   3690
   3691int del_perf_probe_events(struct strfilter *filter)
   3692{
   3693	int ret, ret2, ufd = -1, kfd = -1;
   3694	char *str = strfilter__string(filter);
   3695
   3696	if (!str)
   3697		return -EINVAL;
   3698
   3699	/* Get current event names */
   3700	ret = probe_file__open_both(&kfd, &ufd, PF_FL_RW);
   3701	if (ret < 0)
   3702		goto out;
   3703
   3704	ret = probe_file__del_events(kfd, filter);
   3705	if (ret < 0 && ret != -ENOENT)
   3706		goto error;
   3707
   3708	ret2 = probe_file__del_events(ufd, filter);
   3709	if (ret2 < 0 && ret2 != -ENOENT) {
   3710		ret = ret2;
   3711		goto error;
   3712	}
   3713	ret = 0;
   3714
   3715error:
   3716	if (kfd >= 0)
   3717		close(kfd);
   3718	if (ufd >= 0)
   3719		close(ufd);
   3720out:
   3721	free(str);
   3722
   3723	return ret;
   3724}
   3725
   3726int show_available_funcs(const char *target, struct nsinfo *nsi,
   3727			 struct strfilter *_filter, bool user)
   3728{
   3729        struct rb_node *nd;
   3730	struct map *map;
   3731	int ret;
   3732
   3733	ret = init_probe_symbol_maps(user);
   3734	if (ret < 0)
   3735		return ret;
   3736
   3737	/* Get a symbol map */
   3738	map = get_target_map(target, nsi, user);
   3739	if (!map) {
   3740		pr_err("Failed to get a map for %s\n", (target) ? : "kernel");
   3741		return -EINVAL;
   3742	}
   3743
   3744	ret = map__load(map);
   3745	if (ret) {
   3746		if (ret == -2) {
   3747			char *str = strfilter__string(_filter);
   3748			pr_err("Failed to find symbols matched to \"%s\"\n",
   3749			       str);
   3750			free(str);
   3751		} else
   3752			pr_err("Failed to load symbols in %s\n",
   3753			       (target) ? : "kernel");
   3754		goto end;
   3755	}
   3756	if (!dso__sorted_by_name(map->dso))
   3757		dso__sort_by_name(map->dso);
   3758
   3759	/* Show all (filtered) symbols */
   3760	setup_pager();
   3761
   3762	for (nd = rb_first_cached(&map->dso->symbol_names); nd;
   3763	     nd = rb_next(nd)) {
   3764		struct symbol_name_rb_node *pos = rb_entry(nd, struct symbol_name_rb_node, rb_node);
   3765
   3766		if (strfilter__compare(_filter, pos->sym.name))
   3767			printf("%s\n", pos->sym.name);
   3768	}
   3769end:
   3770	map__put(map);
   3771	exit_probe_symbol_maps();
   3772
   3773	return ret;
   3774}
   3775
   3776int copy_to_probe_trace_arg(struct probe_trace_arg *tvar,
   3777			    struct perf_probe_arg *pvar)
   3778{
   3779	tvar->value = strdup(pvar->var);
   3780	if (tvar->value == NULL)
   3781		return -ENOMEM;
   3782	if (pvar->type) {
   3783		tvar->type = strdup(pvar->type);
   3784		if (tvar->type == NULL)
   3785			return -ENOMEM;
   3786	}
   3787	if (pvar->name) {
   3788		tvar->name = strdup(pvar->name);
   3789		if (tvar->name == NULL)
   3790			return -ENOMEM;
   3791	} else
   3792		tvar->name = NULL;
   3793	return 0;
   3794}