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

symbol.c (62559B)


      1// SPDX-License-Identifier: GPL-2.0
      2#include <dirent.h>
      3#include <errno.h>
      4#include <stdlib.h>
      5#include <stdio.h>
      6#include <string.h>
      7#include <linux/capability.h>
      8#include <linux/kernel.h>
      9#include <linux/mman.h>
     10#include <linux/string.h>
     11#include <linux/time64.h>
     12#include <sys/types.h>
     13#include <sys/stat.h>
     14#include <sys/param.h>
     15#include <fcntl.h>
     16#include <unistd.h>
     17#include <inttypes.h>
     18#include "annotate.h"
     19#include "build-id.h"
     20#include "cap.h"
     21#include "dso.h"
     22#include "util.h" // lsdir()
     23#include "debug.h"
     24#include "event.h"
     25#include "machine.h"
     26#include "map.h"
     27#include "symbol.h"
     28#include "map_symbol.h"
     29#include "mem-events.h"
     30#include "symsrc.h"
     31#include "strlist.h"
     32#include "intlist.h"
     33#include "namespaces.h"
     34#include "header.h"
     35#include "path.h"
     36#include <linux/ctype.h>
     37#include <linux/zalloc.h>
     38
     39#include <elf.h>
     40#include <limits.h>
     41#include <symbol/kallsyms.h>
     42#include <sys/utsname.h>
     43
     44static int dso__load_kernel_sym(struct dso *dso, struct map *map);
     45static int dso__load_guest_kernel_sym(struct dso *dso, struct map *map);
     46static bool symbol__is_idle(const char *name);
     47
     48int vmlinux_path__nr_entries;
     49char **vmlinux_path;
     50
     51struct symbol_conf symbol_conf = {
     52	.nanosecs		= false,
     53	.use_modules		= true,
     54	.try_vmlinux_path	= true,
     55	.demangle		= true,
     56	.demangle_kernel	= false,
     57	.cumulate_callchain	= true,
     58	.time_quantum		= 100 * NSEC_PER_MSEC, /* 100ms */
     59	.show_hist_headers	= true,
     60	.symfs			= "",
     61	.event_group		= true,
     62	.inline_name		= true,
     63	.res_sample		= 0,
     64};
     65
     66static enum dso_binary_type binary_type_symtab[] = {
     67	DSO_BINARY_TYPE__KALLSYMS,
     68	DSO_BINARY_TYPE__GUEST_KALLSYMS,
     69	DSO_BINARY_TYPE__JAVA_JIT,
     70	DSO_BINARY_TYPE__DEBUGLINK,
     71	DSO_BINARY_TYPE__BUILD_ID_CACHE,
     72	DSO_BINARY_TYPE__BUILD_ID_CACHE_DEBUGINFO,
     73	DSO_BINARY_TYPE__FEDORA_DEBUGINFO,
     74	DSO_BINARY_TYPE__UBUNTU_DEBUGINFO,
     75	DSO_BINARY_TYPE__BUILDID_DEBUGINFO,
     76	DSO_BINARY_TYPE__SYSTEM_PATH_DSO,
     77	DSO_BINARY_TYPE__GUEST_KMODULE,
     78	DSO_BINARY_TYPE__GUEST_KMODULE_COMP,
     79	DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE,
     80	DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP,
     81	DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO,
     82	DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO,
     83	DSO_BINARY_TYPE__NOT_FOUND,
     84};
     85
     86#define DSO_BINARY_TYPE__SYMTAB_CNT ARRAY_SIZE(binary_type_symtab)
     87
     88static bool symbol_type__filter(char symbol_type)
     89{
     90	symbol_type = toupper(symbol_type);
     91	return symbol_type == 'T' || symbol_type == 'W' || symbol_type == 'D' || symbol_type == 'B';
     92}
     93
     94static int prefix_underscores_count(const char *str)
     95{
     96	const char *tail = str;
     97
     98	while (*tail == '_')
     99		tail++;
    100
    101	return tail - str;
    102}
    103
    104const char * __weak arch__normalize_symbol_name(const char *name)
    105{
    106	return name;
    107}
    108
    109int __weak arch__compare_symbol_names(const char *namea, const char *nameb)
    110{
    111	return strcmp(namea, nameb);
    112}
    113
    114int __weak arch__compare_symbol_names_n(const char *namea, const char *nameb,
    115					unsigned int n)
    116{
    117	return strncmp(namea, nameb, n);
    118}
    119
    120int __weak arch__choose_best_symbol(struct symbol *syma,
    121				    struct symbol *symb __maybe_unused)
    122{
    123	/* Avoid "SyS" kernel syscall aliases */
    124	if (strlen(syma->name) >= 3 && !strncmp(syma->name, "SyS", 3))
    125		return SYMBOL_B;
    126	if (strlen(syma->name) >= 10 && !strncmp(syma->name, "compat_SyS", 10))
    127		return SYMBOL_B;
    128
    129	return SYMBOL_A;
    130}
    131
    132static int choose_best_symbol(struct symbol *syma, struct symbol *symb)
    133{
    134	s64 a;
    135	s64 b;
    136	size_t na, nb;
    137
    138	/* Prefer a symbol with non zero length */
    139	a = syma->end - syma->start;
    140	b = symb->end - symb->start;
    141	if ((b == 0) && (a > 0))
    142		return SYMBOL_A;
    143	else if ((a == 0) && (b > 0))
    144		return SYMBOL_B;
    145
    146	/* Prefer a non weak symbol over a weak one */
    147	a = syma->binding == STB_WEAK;
    148	b = symb->binding == STB_WEAK;
    149	if (b && !a)
    150		return SYMBOL_A;
    151	if (a && !b)
    152		return SYMBOL_B;
    153
    154	/* Prefer a global symbol over a non global one */
    155	a = syma->binding == STB_GLOBAL;
    156	b = symb->binding == STB_GLOBAL;
    157	if (a && !b)
    158		return SYMBOL_A;
    159	if (b && !a)
    160		return SYMBOL_B;
    161
    162	/* Prefer a symbol with less underscores */
    163	a = prefix_underscores_count(syma->name);
    164	b = prefix_underscores_count(symb->name);
    165	if (b > a)
    166		return SYMBOL_A;
    167	else if (a > b)
    168		return SYMBOL_B;
    169
    170	/* Choose the symbol with the longest name */
    171	na = strlen(syma->name);
    172	nb = strlen(symb->name);
    173	if (na > nb)
    174		return SYMBOL_A;
    175	else if (na < nb)
    176		return SYMBOL_B;
    177
    178	return arch__choose_best_symbol(syma, symb);
    179}
    180
    181void symbols__fixup_duplicate(struct rb_root_cached *symbols)
    182{
    183	struct rb_node *nd;
    184	struct symbol *curr, *next;
    185
    186	if (symbol_conf.allow_aliases)
    187		return;
    188
    189	nd = rb_first_cached(symbols);
    190
    191	while (nd) {
    192		curr = rb_entry(nd, struct symbol, rb_node);
    193again:
    194		nd = rb_next(&curr->rb_node);
    195		next = rb_entry(nd, struct symbol, rb_node);
    196
    197		if (!nd)
    198			break;
    199
    200		if (curr->start != next->start)
    201			continue;
    202
    203		if (choose_best_symbol(curr, next) == SYMBOL_A) {
    204			rb_erase_cached(&next->rb_node, symbols);
    205			symbol__delete(next);
    206			goto again;
    207		} else {
    208			nd = rb_next(&curr->rb_node);
    209			rb_erase_cached(&curr->rb_node, symbols);
    210			symbol__delete(curr);
    211		}
    212	}
    213}
    214
    215/* Update zero-sized symbols using the address of the next symbol */
    216void symbols__fixup_end(struct rb_root_cached *symbols, bool is_kallsyms)
    217{
    218	struct rb_node *nd, *prevnd = rb_first_cached(symbols);
    219	struct symbol *curr, *prev;
    220
    221	if (prevnd == NULL)
    222		return;
    223
    224	curr = rb_entry(prevnd, struct symbol, rb_node);
    225
    226	for (nd = rb_next(prevnd); nd; nd = rb_next(nd)) {
    227		prev = curr;
    228		curr = rb_entry(nd, struct symbol, rb_node);
    229
    230		/*
    231		 * On some architecture kernel text segment start is located at
    232		 * some low memory address, while modules are located at high
    233		 * memory addresses (or vice versa).  The gap between end of
    234		 * kernel text segment and beginning of first module's text
    235		 * segment is very big.  Therefore do not fill this gap and do
    236		 * not assign it to the kernel dso map (kallsyms).
    237		 *
    238		 * In kallsyms, it determines module symbols using '[' character
    239		 * like in:
    240		 *   ffffffffc1937000 T hdmi_driver_init  [snd_hda_codec_hdmi]
    241		 */
    242		if (prev->end == prev->start) {
    243			/* Last kernel/module symbol mapped to end of page */
    244			if (is_kallsyms && (!strchr(prev->name, '[') !=
    245					    !strchr(curr->name, '[')))
    246				prev->end = roundup(prev->end + 4096, 4096);
    247			else
    248				prev->end = curr->start;
    249
    250			pr_debug4("%s sym:%s end:%#" PRIx64 "\n",
    251				  __func__, prev->name, prev->end);
    252		}
    253	}
    254
    255	/* Last entry */
    256	if (curr->end == curr->start)
    257		curr->end = roundup(curr->start, 4096) + 4096;
    258}
    259
    260void maps__fixup_end(struct maps *maps)
    261{
    262	struct map *prev = NULL, *curr;
    263
    264	down_write(&maps->lock);
    265
    266	maps__for_each_entry(maps, curr) {
    267		if (prev != NULL && !prev->end)
    268			prev->end = curr->start;
    269
    270		prev = curr;
    271	}
    272
    273	/*
    274	 * We still haven't the actual symbols, so guess the
    275	 * last map final address.
    276	 */
    277	if (curr && !curr->end)
    278		curr->end = ~0ULL;
    279
    280	up_write(&maps->lock);
    281}
    282
    283struct symbol *symbol__new(u64 start, u64 len, u8 binding, u8 type, const char *name)
    284{
    285	size_t namelen = strlen(name) + 1;
    286	struct symbol *sym = calloc(1, (symbol_conf.priv_size +
    287					sizeof(*sym) + namelen));
    288	if (sym == NULL)
    289		return NULL;
    290
    291	if (symbol_conf.priv_size) {
    292		if (symbol_conf.init_annotation) {
    293			struct annotation *notes = (void *)sym;
    294			annotation__init(notes);
    295		}
    296		sym = ((void *)sym) + symbol_conf.priv_size;
    297	}
    298
    299	sym->start   = start;
    300	sym->end     = len ? start + len : start;
    301	sym->type    = type;
    302	sym->binding = binding;
    303	sym->namelen = namelen - 1;
    304
    305	pr_debug4("%s: %s %#" PRIx64 "-%#" PRIx64 "\n",
    306		  __func__, name, start, sym->end);
    307	memcpy(sym->name, name, namelen);
    308
    309	return sym;
    310}
    311
    312void symbol__delete(struct symbol *sym)
    313{
    314	if (symbol_conf.priv_size) {
    315		if (symbol_conf.init_annotation) {
    316			struct annotation *notes = symbol__annotation(sym);
    317
    318			annotation__exit(notes);
    319		}
    320	}
    321	free(((void *)sym) - symbol_conf.priv_size);
    322}
    323
    324void symbols__delete(struct rb_root_cached *symbols)
    325{
    326	struct symbol *pos;
    327	struct rb_node *next = rb_first_cached(symbols);
    328
    329	while (next) {
    330		pos = rb_entry(next, struct symbol, rb_node);
    331		next = rb_next(&pos->rb_node);
    332		rb_erase_cached(&pos->rb_node, symbols);
    333		symbol__delete(pos);
    334	}
    335}
    336
    337void __symbols__insert(struct rb_root_cached *symbols,
    338		       struct symbol *sym, bool kernel)
    339{
    340	struct rb_node **p = &symbols->rb_root.rb_node;
    341	struct rb_node *parent = NULL;
    342	const u64 ip = sym->start;
    343	struct symbol *s;
    344	bool leftmost = true;
    345
    346	if (kernel) {
    347		const char *name = sym->name;
    348		/*
    349		 * ppc64 uses function descriptors and appends a '.' to the
    350		 * start of every instruction address. Remove it.
    351		 */
    352		if (name[0] == '.')
    353			name++;
    354		sym->idle = symbol__is_idle(name);
    355	}
    356
    357	while (*p != NULL) {
    358		parent = *p;
    359		s = rb_entry(parent, struct symbol, rb_node);
    360		if (ip < s->start)
    361			p = &(*p)->rb_left;
    362		else {
    363			p = &(*p)->rb_right;
    364			leftmost = false;
    365		}
    366	}
    367	rb_link_node(&sym->rb_node, parent, p);
    368	rb_insert_color_cached(&sym->rb_node, symbols, leftmost);
    369}
    370
    371void symbols__insert(struct rb_root_cached *symbols, struct symbol *sym)
    372{
    373	__symbols__insert(symbols, sym, false);
    374}
    375
    376static struct symbol *symbols__find(struct rb_root_cached *symbols, u64 ip)
    377{
    378	struct rb_node *n;
    379
    380	if (symbols == NULL)
    381		return NULL;
    382
    383	n = symbols->rb_root.rb_node;
    384
    385	while (n) {
    386		struct symbol *s = rb_entry(n, struct symbol, rb_node);
    387
    388		if (ip < s->start)
    389			n = n->rb_left;
    390		else if (ip > s->end || (ip == s->end && ip != s->start))
    391			n = n->rb_right;
    392		else
    393			return s;
    394	}
    395
    396	return NULL;
    397}
    398
    399static struct symbol *symbols__first(struct rb_root_cached *symbols)
    400{
    401	struct rb_node *n = rb_first_cached(symbols);
    402
    403	if (n)
    404		return rb_entry(n, struct symbol, rb_node);
    405
    406	return NULL;
    407}
    408
    409static struct symbol *symbols__last(struct rb_root_cached *symbols)
    410{
    411	struct rb_node *n = rb_last(&symbols->rb_root);
    412
    413	if (n)
    414		return rb_entry(n, struct symbol, rb_node);
    415
    416	return NULL;
    417}
    418
    419static struct symbol *symbols__next(struct symbol *sym)
    420{
    421	struct rb_node *n = rb_next(&sym->rb_node);
    422
    423	if (n)
    424		return rb_entry(n, struct symbol, rb_node);
    425
    426	return NULL;
    427}
    428
    429static void symbols__insert_by_name(struct rb_root_cached *symbols, struct symbol *sym)
    430{
    431	struct rb_node **p = &symbols->rb_root.rb_node;
    432	struct rb_node *parent = NULL;
    433	struct symbol_name_rb_node *symn, *s;
    434	bool leftmost = true;
    435
    436	symn = container_of(sym, struct symbol_name_rb_node, sym);
    437
    438	while (*p != NULL) {
    439		parent = *p;
    440		s = rb_entry(parent, struct symbol_name_rb_node, rb_node);
    441		if (strcmp(sym->name, s->sym.name) < 0)
    442			p = &(*p)->rb_left;
    443		else {
    444			p = &(*p)->rb_right;
    445			leftmost = false;
    446		}
    447	}
    448	rb_link_node(&symn->rb_node, parent, p);
    449	rb_insert_color_cached(&symn->rb_node, symbols, leftmost);
    450}
    451
    452static void symbols__sort_by_name(struct rb_root_cached *symbols,
    453				  struct rb_root_cached *source)
    454{
    455	struct rb_node *nd;
    456
    457	for (nd = rb_first_cached(source); nd; nd = rb_next(nd)) {
    458		struct symbol *pos = rb_entry(nd, struct symbol, rb_node);
    459		symbols__insert_by_name(symbols, pos);
    460	}
    461}
    462
    463int symbol__match_symbol_name(const char *name, const char *str,
    464			      enum symbol_tag_include includes)
    465{
    466	const char *versioning;
    467
    468	if (includes == SYMBOL_TAG_INCLUDE__DEFAULT_ONLY &&
    469	    (versioning = strstr(name, "@@"))) {
    470		int len = strlen(str);
    471
    472		if (len < versioning - name)
    473			len = versioning - name;
    474
    475		return arch__compare_symbol_names_n(name, str, len);
    476	} else
    477		return arch__compare_symbol_names(name, str);
    478}
    479
    480static struct symbol *symbols__find_by_name(struct rb_root_cached *symbols,
    481					    const char *name,
    482					    enum symbol_tag_include includes)
    483{
    484	struct rb_node *n;
    485	struct symbol_name_rb_node *s = NULL;
    486
    487	if (symbols == NULL)
    488		return NULL;
    489
    490	n = symbols->rb_root.rb_node;
    491
    492	while (n) {
    493		int cmp;
    494
    495		s = rb_entry(n, struct symbol_name_rb_node, rb_node);
    496		cmp = symbol__match_symbol_name(s->sym.name, name, includes);
    497
    498		if (cmp > 0)
    499			n = n->rb_left;
    500		else if (cmp < 0)
    501			n = n->rb_right;
    502		else
    503			break;
    504	}
    505
    506	if (n == NULL)
    507		return NULL;
    508
    509	if (includes != SYMBOL_TAG_INCLUDE__DEFAULT_ONLY)
    510		/* return first symbol that has same name (if any) */
    511		for (n = rb_prev(n); n; n = rb_prev(n)) {
    512			struct symbol_name_rb_node *tmp;
    513
    514			tmp = rb_entry(n, struct symbol_name_rb_node, rb_node);
    515			if (arch__compare_symbol_names(tmp->sym.name, s->sym.name))
    516				break;
    517
    518			s = tmp;
    519		}
    520
    521	return &s->sym;
    522}
    523
    524void dso__reset_find_symbol_cache(struct dso *dso)
    525{
    526	dso->last_find_result.addr   = 0;
    527	dso->last_find_result.symbol = NULL;
    528}
    529
    530void dso__insert_symbol(struct dso *dso, struct symbol *sym)
    531{
    532	__symbols__insert(&dso->symbols, sym, dso->kernel);
    533
    534	/* update the symbol cache if necessary */
    535	if (dso->last_find_result.addr >= sym->start &&
    536	    (dso->last_find_result.addr < sym->end ||
    537	    sym->start == sym->end)) {
    538		dso->last_find_result.symbol = sym;
    539	}
    540}
    541
    542void dso__delete_symbol(struct dso *dso, struct symbol *sym)
    543{
    544	rb_erase_cached(&sym->rb_node, &dso->symbols);
    545	symbol__delete(sym);
    546	dso__reset_find_symbol_cache(dso);
    547}
    548
    549struct symbol *dso__find_symbol(struct dso *dso, u64 addr)
    550{
    551	if (dso->last_find_result.addr != addr || dso->last_find_result.symbol == NULL) {
    552		dso->last_find_result.addr   = addr;
    553		dso->last_find_result.symbol = symbols__find(&dso->symbols, addr);
    554	}
    555
    556	return dso->last_find_result.symbol;
    557}
    558
    559struct symbol *dso__first_symbol(struct dso *dso)
    560{
    561	return symbols__first(&dso->symbols);
    562}
    563
    564struct symbol *dso__last_symbol(struct dso *dso)
    565{
    566	return symbols__last(&dso->symbols);
    567}
    568
    569struct symbol *dso__next_symbol(struct symbol *sym)
    570{
    571	return symbols__next(sym);
    572}
    573
    574struct symbol *symbol__next_by_name(struct symbol *sym)
    575{
    576	struct symbol_name_rb_node *s = container_of(sym, struct symbol_name_rb_node, sym);
    577	struct rb_node *n = rb_next(&s->rb_node);
    578
    579	return n ? &rb_entry(n, struct symbol_name_rb_node, rb_node)->sym : NULL;
    580}
    581
    582 /*
    583  * Returns first symbol that matched with @name.
    584  */
    585struct symbol *dso__find_symbol_by_name(struct dso *dso, const char *name)
    586{
    587	struct symbol *s = symbols__find_by_name(&dso->symbol_names, name,
    588						 SYMBOL_TAG_INCLUDE__NONE);
    589	if (!s)
    590		s = symbols__find_by_name(&dso->symbol_names, name,
    591					  SYMBOL_TAG_INCLUDE__DEFAULT_ONLY);
    592	return s;
    593}
    594
    595void dso__sort_by_name(struct dso *dso)
    596{
    597	dso__set_sorted_by_name(dso);
    598	return symbols__sort_by_name(&dso->symbol_names, &dso->symbols);
    599}
    600
    601/*
    602 * While we find nice hex chars, build a long_val.
    603 * Return number of chars processed.
    604 */
    605static int hex2u64(const char *ptr, u64 *long_val)
    606{
    607	char *p;
    608
    609	*long_val = strtoull(ptr, &p, 16);
    610
    611	return p - ptr;
    612}
    613
    614
    615int modules__parse(const char *filename, void *arg,
    616		   int (*process_module)(void *arg, const char *name,
    617					 u64 start, u64 size))
    618{
    619	char *line = NULL;
    620	size_t n;
    621	FILE *file;
    622	int err = 0;
    623
    624	file = fopen(filename, "r");
    625	if (file == NULL)
    626		return -1;
    627
    628	while (1) {
    629		char name[PATH_MAX];
    630		u64 start, size;
    631		char *sep, *endptr;
    632		ssize_t line_len;
    633
    634		line_len = getline(&line, &n, file);
    635		if (line_len < 0) {
    636			if (feof(file))
    637				break;
    638			err = -1;
    639			goto out;
    640		}
    641
    642		if (!line) {
    643			err = -1;
    644			goto out;
    645		}
    646
    647		line[--line_len] = '\0'; /* \n */
    648
    649		sep = strrchr(line, 'x');
    650		if (sep == NULL)
    651			continue;
    652
    653		hex2u64(sep + 1, &start);
    654
    655		sep = strchr(line, ' ');
    656		if (sep == NULL)
    657			continue;
    658
    659		*sep = '\0';
    660
    661		scnprintf(name, sizeof(name), "[%s]", line);
    662
    663		size = strtoul(sep + 1, &endptr, 0);
    664		if (*endptr != ' ' && *endptr != '\t')
    665			continue;
    666
    667		err = process_module(arg, name, start, size);
    668		if (err)
    669			break;
    670	}
    671out:
    672	free(line);
    673	fclose(file);
    674	return err;
    675}
    676
    677/*
    678 * These are symbols in the kernel image, so make sure that
    679 * sym is from a kernel DSO.
    680 */
    681static bool symbol__is_idle(const char *name)
    682{
    683	const char * const idle_symbols[] = {
    684		"acpi_idle_do_entry",
    685		"acpi_processor_ffh_cstate_enter",
    686		"arch_cpu_idle",
    687		"cpu_idle",
    688		"cpu_startup_entry",
    689		"idle_cpu",
    690		"intel_idle",
    691		"default_idle",
    692		"native_safe_halt",
    693		"enter_idle",
    694		"exit_idle",
    695		"mwait_idle",
    696		"mwait_idle_with_hints",
    697		"mwait_idle_with_hints.constprop.0",
    698		"poll_idle",
    699		"ppc64_runlatch_off",
    700		"pseries_dedicated_idle_sleep",
    701		"psw_idle",
    702		"psw_idle_exit",
    703		NULL
    704	};
    705	int i;
    706	static struct strlist *idle_symbols_list;
    707
    708	if (idle_symbols_list)
    709		return strlist__has_entry(idle_symbols_list, name);
    710
    711	idle_symbols_list = strlist__new(NULL, NULL);
    712
    713	for (i = 0; idle_symbols[i]; i++)
    714		strlist__add(idle_symbols_list, idle_symbols[i]);
    715
    716	return strlist__has_entry(idle_symbols_list, name);
    717}
    718
    719static int map__process_kallsym_symbol(void *arg, const char *name,
    720				       char type, u64 start)
    721{
    722	struct symbol *sym;
    723	struct dso *dso = arg;
    724	struct rb_root_cached *root = &dso->symbols;
    725
    726	if (!symbol_type__filter(type))
    727		return 0;
    728
    729	/* Ignore local symbols for ARM modules */
    730	if (name[0] == '$')
    731		return 0;
    732
    733	/*
    734	 * module symbols are not sorted so we add all
    735	 * symbols, setting length to 0, and rely on
    736	 * symbols__fixup_end() to fix it up.
    737	 */
    738	sym = symbol__new(start, 0, kallsyms2elf_binding(type), kallsyms2elf_type(type), name);
    739	if (sym == NULL)
    740		return -ENOMEM;
    741	/*
    742	 * We will pass the symbols to the filter later, in
    743	 * map__split_kallsyms, when we have split the maps per module
    744	 */
    745	__symbols__insert(root, sym, !strchr(name, '['));
    746
    747	return 0;
    748}
    749
    750/*
    751 * Loads the function entries in /proc/kallsyms into kernel_map->dso,
    752 * so that we can in the next step set the symbol ->end address and then
    753 * call kernel_maps__split_kallsyms.
    754 */
    755static int dso__load_all_kallsyms(struct dso *dso, const char *filename)
    756{
    757	return kallsyms__parse(filename, dso, map__process_kallsym_symbol);
    758}
    759
    760static int maps__split_kallsyms_for_kcore(struct maps *kmaps, struct dso *dso)
    761{
    762	struct map *curr_map;
    763	struct symbol *pos;
    764	int count = 0;
    765	struct rb_root_cached old_root = dso->symbols;
    766	struct rb_root_cached *root = &dso->symbols;
    767	struct rb_node *next = rb_first_cached(root);
    768
    769	if (!kmaps)
    770		return -1;
    771
    772	*root = RB_ROOT_CACHED;
    773
    774	while (next) {
    775		char *module;
    776
    777		pos = rb_entry(next, struct symbol, rb_node);
    778		next = rb_next(&pos->rb_node);
    779
    780		rb_erase_cached(&pos->rb_node, &old_root);
    781		RB_CLEAR_NODE(&pos->rb_node);
    782		module = strchr(pos->name, '\t');
    783		if (module)
    784			*module = '\0';
    785
    786		curr_map = maps__find(kmaps, pos->start);
    787
    788		if (!curr_map) {
    789			symbol__delete(pos);
    790			continue;
    791		}
    792
    793		pos->start -= curr_map->start - curr_map->pgoff;
    794		if (pos->end > curr_map->end)
    795			pos->end = curr_map->end;
    796		if (pos->end)
    797			pos->end -= curr_map->start - curr_map->pgoff;
    798		symbols__insert(&curr_map->dso->symbols, pos);
    799		++count;
    800	}
    801
    802	/* Symbols have been adjusted */
    803	dso->adjust_symbols = 1;
    804
    805	return count;
    806}
    807
    808/*
    809 * Split the symbols into maps, making sure there are no overlaps, i.e. the
    810 * kernel range is broken in several maps, named [kernel].N, as we don't have
    811 * the original ELF section names vmlinux have.
    812 */
    813static int maps__split_kallsyms(struct maps *kmaps, struct dso *dso, u64 delta,
    814				struct map *initial_map)
    815{
    816	struct machine *machine;
    817	struct map *curr_map = initial_map;
    818	struct symbol *pos;
    819	int count = 0, moved = 0;
    820	struct rb_root_cached *root = &dso->symbols;
    821	struct rb_node *next = rb_first_cached(root);
    822	int kernel_range = 0;
    823	bool x86_64;
    824
    825	if (!kmaps)
    826		return -1;
    827
    828	machine = kmaps->machine;
    829
    830	x86_64 = machine__is(machine, "x86_64");
    831
    832	while (next) {
    833		char *module;
    834
    835		pos = rb_entry(next, struct symbol, rb_node);
    836		next = rb_next(&pos->rb_node);
    837
    838		module = strchr(pos->name, '\t');
    839		if (module) {
    840			if (!symbol_conf.use_modules)
    841				goto discard_symbol;
    842
    843			*module++ = '\0';
    844
    845			if (strcmp(curr_map->dso->short_name, module)) {
    846				if (curr_map != initial_map &&
    847				    dso->kernel == DSO_SPACE__KERNEL_GUEST &&
    848				    machine__is_default_guest(machine)) {
    849					/*
    850					 * We assume all symbols of a module are
    851					 * continuous in * kallsyms, so curr_map
    852					 * points to a module and all its
    853					 * symbols are in its kmap. Mark it as
    854					 * loaded.
    855					 */
    856					dso__set_loaded(curr_map->dso);
    857				}
    858
    859				curr_map = maps__find_by_name(kmaps, module);
    860				if (curr_map == NULL) {
    861					pr_debug("%s/proc/{kallsyms,modules} "
    862					         "inconsistency while looking "
    863						 "for \"%s\" module!\n",
    864						 machine->root_dir, module);
    865					curr_map = initial_map;
    866					goto discard_symbol;
    867				}
    868
    869				if (curr_map->dso->loaded &&
    870				    !machine__is_default_guest(machine))
    871					goto discard_symbol;
    872			}
    873			/*
    874			 * So that we look just like we get from .ko files,
    875			 * i.e. not prelinked, relative to initial_map->start.
    876			 */
    877			pos->start = curr_map->map_ip(curr_map, pos->start);
    878			pos->end   = curr_map->map_ip(curr_map, pos->end);
    879		} else if (x86_64 && is_entry_trampoline(pos->name)) {
    880			/*
    881			 * These symbols are not needed anymore since the
    882			 * trampoline maps refer to the text section and it's
    883			 * symbols instead. Avoid having to deal with
    884			 * relocations, and the assumption that the first symbol
    885			 * is the start of kernel text, by simply removing the
    886			 * symbols at this point.
    887			 */
    888			goto discard_symbol;
    889		} else if (curr_map != initial_map) {
    890			char dso_name[PATH_MAX];
    891			struct dso *ndso;
    892
    893			if (delta) {
    894				/* Kernel was relocated at boot time */
    895				pos->start -= delta;
    896				pos->end -= delta;
    897			}
    898
    899			if (count == 0) {
    900				curr_map = initial_map;
    901				goto add_symbol;
    902			}
    903
    904			if (dso->kernel == DSO_SPACE__KERNEL_GUEST)
    905				snprintf(dso_name, sizeof(dso_name),
    906					"[guest.kernel].%d",
    907					kernel_range++);
    908			else
    909				snprintf(dso_name, sizeof(dso_name),
    910					"[kernel].%d",
    911					kernel_range++);
    912
    913			ndso = dso__new(dso_name);
    914			if (ndso == NULL)
    915				return -1;
    916
    917			ndso->kernel = dso->kernel;
    918
    919			curr_map = map__new2(pos->start, ndso);
    920			if (curr_map == NULL) {
    921				dso__put(ndso);
    922				return -1;
    923			}
    924
    925			curr_map->map_ip = curr_map->unmap_ip = identity__map_ip;
    926			maps__insert(kmaps, curr_map);
    927			++kernel_range;
    928		} else if (delta) {
    929			/* Kernel was relocated at boot time */
    930			pos->start -= delta;
    931			pos->end -= delta;
    932		}
    933add_symbol:
    934		if (curr_map != initial_map) {
    935			rb_erase_cached(&pos->rb_node, root);
    936			symbols__insert(&curr_map->dso->symbols, pos);
    937			++moved;
    938		} else
    939			++count;
    940
    941		continue;
    942discard_symbol:
    943		rb_erase_cached(&pos->rb_node, root);
    944		symbol__delete(pos);
    945	}
    946
    947	if (curr_map != initial_map &&
    948	    dso->kernel == DSO_SPACE__KERNEL_GUEST &&
    949	    machine__is_default_guest(kmaps->machine)) {
    950		dso__set_loaded(curr_map->dso);
    951	}
    952
    953	return count + moved;
    954}
    955
    956bool symbol__restricted_filename(const char *filename,
    957				 const char *restricted_filename)
    958{
    959	bool restricted = false;
    960
    961	if (symbol_conf.kptr_restrict) {
    962		char *r = realpath(filename, NULL);
    963
    964		if (r != NULL) {
    965			restricted = strcmp(r, restricted_filename) == 0;
    966			free(r);
    967			return restricted;
    968		}
    969	}
    970
    971	return restricted;
    972}
    973
    974struct module_info {
    975	struct rb_node rb_node;
    976	char *name;
    977	u64 start;
    978};
    979
    980static void add_module(struct module_info *mi, struct rb_root *modules)
    981{
    982	struct rb_node **p = &modules->rb_node;
    983	struct rb_node *parent = NULL;
    984	struct module_info *m;
    985
    986	while (*p != NULL) {
    987		parent = *p;
    988		m = rb_entry(parent, struct module_info, rb_node);
    989		if (strcmp(mi->name, m->name) < 0)
    990			p = &(*p)->rb_left;
    991		else
    992			p = &(*p)->rb_right;
    993	}
    994	rb_link_node(&mi->rb_node, parent, p);
    995	rb_insert_color(&mi->rb_node, modules);
    996}
    997
    998static void delete_modules(struct rb_root *modules)
    999{
   1000	struct module_info *mi;
   1001	struct rb_node *next = rb_first(modules);
   1002
   1003	while (next) {
   1004		mi = rb_entry(next, struct module_info, rb_node);
   1005		next = rb_next(&mi->rb_node);
   1006		rb_erase(&mi->rb_node, modules);
   1007		zfree(&mi->name);
   1008		free(mi);
   1009	}
   1010}
   1011
   1012static struct module_info *find_module(const char *name,
   1013				       struct rb_root *modules)
   1014{
   1015	struct rb_node *n = modules->rb_node;
   1016
   1017	while (n) {
   1018		struct module_info *m;
   1019		int cmp;
   1020
   1021		m = rb_entry(n, struct module_info, rb_node);
   1022		cmp = strcmp(name, m->name);
   1023		if (cmp < 0)
   1024			n = n->rb_left;
   1025		else if (cmp > 0)
   1026			n = n->rb_right;
   1027		else
   1028			return m;
   1029	}
   1030
   1031	return NULL;
   1032}
   1033
   1034static int __read_proc_modules(void *arg, const char *name, u64 start,
   1035			       u64 size __maybe_unused)
   1036{
   1037	struct rb_root *modules = arg;
   1038	struct module_info *mi;
   1039
   1040	mi = zalloc(sizeof(struct module_info));
   1041	if (!mi)
   1042		return -ENOMEM;
   1043
   1044	mi->name = strdup(name);
   1045	mi->start = start;
   1046
   1047	if (!mi->name) {
   1048		free(mi);
   1049		return -ENOMEM;
   1050	}
   1051
   1052	add_module(mi, modules);
   1053
   1054	return 0;
   1055}
   1056
   1057static int read_proc_modules(const char *filename, struct rb_root *modules)
   1058{
   1059	if (symbol__restricted_filename(filename, "/proc/modules"))
   1060		return -1;
   1061
   1062	if (modules__parse(filename, modules, __read_proc_modules)) {
   1063		delete_modules(modules);
   1064		return -1;
   1065	}
   1066
   1067	return 0;
   1068}
   1069
   1070int compare_proc_modules(const char *from, const char *to)
   1071{
   1072	struct rb_root from_modules = RB_ROOT;
   1073	struct rb_root to_modules = RB_ROOT;
   1074	struct rb_node *from_node, *to_node;
   1075	struct module_info *from_m, *to_m;
   1076	int ret = -1;
   1077
   1078	if (read_proc_modules(from, &from_modules))
   1079		return -1;
   1080
   1081	if (read_proc_modules(to, &to_modules))
   1082		goto out_delete_from;
   1083
   1084	from_node = rb_first(&from_modules);
   1085	to_node = rb_first(&to_modules);
   1086	while (from_node) {
   1087		if (!to_node)
   1088			break;
   1089
   1090		from_m = rb_entry(from_node, struct module_info, rb_node);
   1091		to_m = rb_entry(to_node, struct module_info, rb_node);
   1092
   1093		if (from_m->start != to_m->start ||
   1094		    strcmp(from_m->name, to_m->name))
   1095			break;
   1096
   1097		from_node = rb_next(from_node);
   1098		to_node = rb_next(to_node);
   1099	}
   1100
   1101	if (!from_node && !to_node)
   1102		ret = 0;
   1103
   1104	delete_modules(&to_modules);
   1105out_delete_from:
   1106	delete_modules(&from_modules);
   1107
   1108	return ret;
   1109}
   1110
   1111static int do_validate_kcore_modules(const char *filename, struct maps *kmaps)
   1112{
   1113	struct rb_root modules = RB_ROOT;
   1114	struct map *old_map;
   1115	int err;
   1116
   1117	err = read_proc_modules(filename, &modules);
   1118	if (err)
   1119		return err;
   1120
   1121	maps__for_each_entry(kmaps, old_map) {
   1122		struct module_info *mi;
   1123
   1124		if (!__map__is_kmodule(old_map)) {
   1125			continue;
   1126		}
   1127
   1128		/* Module must be in memory at the same address */
   1129		mi = find_module(old_map->dso->short_name, &modules);
   1130		if (!mi || mi->start != old_map->start) {
   1131			err = -EINVAL;
   1132			goto out;
   1133		}
   1134	}
   1135out:
   1136	delete_modules(&modules);
   1137	return err;
   1138}
   1139
   1140/*
   1141 * If kallsyms is referenced by name then we look for filename in the same
   1142 * directory.
   1143 */
   1144static bool filename_from_kallsyms_filename(char *filename,
   1145					    const char *base_name,
   1146					    const char *kallsyms_filename)
   1147{
   1148	char *name;
   1149
   1150	strcpy(filename, kallsyms_filename);
   1151	name = strrchr(filename, '/');
   1152	if (!name)
   1153		return false;
   1154
   1155	name += 1;
   1156
   1157	if (!strcmp(name, "kallsyms")) {
   1158		strcpy(name, base_name);
   1159		return true;
   1160	}
   1161
   1162	return false;
   1163}
   1164
   1165static int validate_kcore_modules(const char *kallsyms_filename,
   1166				  struct map *map)
   1167{
   1168	struct maps *kmaps = map__kmaps(map);
   1169	char modules_filename[PATH_MAX];
   1170
   1171	if (!kmaps)
   1172		return -EINVAL;
   1173
   1174	if (!filename_from_kallsyms_filename(modules_filename, "modules",
   1175					     kallsyms_filename))
   1176		return -EINVAL;
   1177
   1178	if (do_validate_kcore_modules(modules_filename, kmaps))
   1179		return -EINVAL;
   1180
   1181	return 0;
   1182}
   1183
   1184static int validate_kcore_addresses(const char *kallsyms_filename,
   1185				    struct map *map)
   1186{
   1187	struct kmap *kmap = map__kmap(map);
   1188
   1189	if (!kmap)
   1190		return -EINVAL;
   1191
   1192	if (kmap->ref_reloc_sym && kmap->ref_reloc_sym->name) {
   1193		u64 start;
   1194
   1195		if (kallsyms__get_function_start(kallsyms_filename,
   1196						 kmap->ref_reloc_sym->name, &start))
   1197			return -ENOENT;
   1198		if (start != kmap->ref_reloc_sym->addr)
   1199			return -EINVAL;
   1200	}
   1201
   1202	return validate_kcore_modules(kallsyms_filename, map);
   1203}
   1204
   1205struct kcore_mapfn_data {
   1206	struct dso *dso;
   1207	struct list_head maps;
   1208};
   1209
   1210static int kcore_mapfn(u64 start, u64 len, u64 pgoff, void *data)
   1211{
   1212	struct kcore_mapfn_data *md = data;
   1213	struct map *map;
   1214
   1215	map = map__new2(start, md->dso);
   1216	if (map == NULL)
   1217		return -ENOMEM;
   1218
   1219	map->end = map->start + len;
   1220	map->pgoff = pgoff;
   1221
   1222	list_add(&map->node, &md->maps);
   1223
   1224	return 0;
   1225}
   1226
   1227/*
   1228 * Merges map into maps by splitting the new map within the existing map
   1229 * regions.
   1230 */
   1231int maps__merge_in(struct maps *kmaps, struct map *new_map)
   1232{
   1233	struct map *old_map;
   1234	LIST_HEAD(merged);
   1235
   1236	maps__for_each_entry(kmaps, old_map) {
   1237		/* no overload with this one */
   1238		if (new_map->end < old_map->start ||
   1239		    new_map->start >= old_map->end)
   1240			continue;
   1241
   1242		if (new_map->start < old_map->start) {
   1243			/*
   1244			 * |new......
   1245			 *       |old....
   1246			 */
   1247			if (new_map->end < old_map->end) {
   1248				/*
   1249				 * |new......|     -> |new..|
   1250				 *       |old....| ->       |old....|
   1251				 */
   1252				new_map->end = old_map->start;
   1253			} else {
   1254				/*
   1255				 * |new.............| -> |new..|       |new..|
   1256				 *       |old....|    ->       |old....|
   1257				 */
   1258				struct map *m = map__clone(new_map);
   1259
   1260				if (!m)
   1261					return -ENOMEM;
   1262
   1263				m->end = old_map->start;
   1264				list_add_tail(&m->node, &merged);
   1265				new_map->pgoff += old_map->end - new_map->start;
   1266				new_map->start = old_map->end;
   1267			}
   1268		} else {
   1269			/*
   1270			 *      |new......
   1271			 * |old....
   1272			 */
   1273			if (new_map->end < old_map->end) {
   1274				/*
   1275				 *      |new..|   -> x
   1276				 * |old.........| -> |old.........|
   1277				 */
   1278				map__put(new_map);
   1279				new_map = NULL;
   1280				break;
   1281			} else {
   1282				/*
   1283				 *      |new......| ->         |new...|
   1284				 * |old....|        -> |old....|
   1285				 */
   1286				new_map->pgoff += old_map->end - new_map->start;
   1287				new_map->start = old_map->end;
   1288			}
   1289		}
   1290	}
   1291
   1292	while (!list_empty(&merged)) {
   1293		old_map = list_entry(merged.next, struct map, node);
   1294		list_del_init(&old_map->node);
   1295		maps__insert(kmaps, old_map);
   1296		map__put(old_map);
   1297	}
   1298
   1299	if (new_map) {
   1300		maps__insert(kmaps, new_map);
   1301		map__put(new_map);
   1302	}
   1303	return 0;
   1304}
   1305
   1306static int dso__load_kcore(struct dso *dso, struct map *map,
   1307			   const char *kallsyms_filename)
   1308{
   1309	struct maps *kmaps = map__kmaps(map);
   1310	struct kcore_mapfn_data md;
   1311	struct map *old_map, *new_map, *replacement_map = NULL, *next;
   1312	struct machine *machine;
   1313	bool is_64_bit;
   1314	int err, fd;
   1315	char kcore_filename[PATH_MAX];
   1316	u64 stext;
   1317
   1318	if (!kmaps)
   1319		return -EINVAL;
   1320
   1321	machine = kmaps->machine;
   1322
   1323	/* This function requires that the map is the kernel map */
   1324	if (!__map__is_kernel(map))
   1325		return -EINVAL;
   1326
   1327	if (!filename_from_kallsyms_filename(kcore_filename, "kcore",
   1328					     kallsyms_filename))
   1329		return -EINVAL;
   1330
   1331	/* Modules and kernel must be present at their original addresses */
   1332	if (validate_kcore_addresses(kallsyms_filename, map))
   1333		return -EINVAL;
   1334
   1335	md.dso = dso;
   1336	INIT_LIST_HEAD(&md.maps);
   1337
   1338	fd = open(kcore_filename, O_RDONLY);
   1339	if (fd < 0) {
   1340		pr_debug("Failed to open %s. Note /proc/kcore requires CAP_SYS_RAWIO capability to access.\n",
   1341			 kcore_filename);
   1342		return -EINVAL;
   1343	}
   1344
   1345	/* Read new maps into temporary lists */
   1346	err = file__read_maps(fd, map->prot & PROT_EXEC, kcore_mapfn, &md,
   1347			      &is_64_bit);
   1348	if (err)
   1349		goto out_err;
   1350	dso->is_64_bit = is_64_bit;
   1351
   1352	if (list_empty(&md.maps)) {
   1353		err = -EINVAL;
   1354		goto out_err;
   1355	}
   1356
   1357	/* Remove old maps */
   1358	maps__for_each_entry_safe(kmaps, old_map, next) {
   1359		/*
   1360		 * We need to preserve eBPF maps even if they are
   1361		 * covered by kcore, because we need to access
   1362		 * eBPF dso for source data.
   1363		 */
   1364		if (old_map != map && !__map__is_bpf_prog(old_map))
   1365			maps__remove(kmaps, old_map);
   1366	}
   1367	machine->trampolines_mapped = false;
   1368
   1369	/* Find the kernel map using the '_stext' symbol */
   1370	if (!kallsyms__get_function_start(kallsyms_filename, "_stext", &stext)) {
   1371		list_for_each_entry(new_map, &md.maps, node) {
   1372			if (stext >= new_map->start && stext < new_map->end) {
   1373				replacement_map = new_map;
   1374				break;
   1375			}
   1376		}
   1377	}
   1378
   1379	if (!replacement_map)
   1380		replacement_map = list_entry(md.maps.next, struct map, node);
   1381
   1382	/* Add new maps */
   1383	while (!list_empty(&md.maps)) {
   1384		new_map = list_entry(md.maps.next, struct map, node);
   1385		list_del_init(&new_map->node);
   1386		if (new_map == replacement_map) {
   1387			map->start	= new_map->start;
   1388			map->end	= new_map->end;
   1389			map->pgoff	= new_map->pgoff;
   1390			map->map_ip	= new_map->map_ip;
   1391			map->unmap_ip	= new_map->unmap_ip;
   1392			/* Ensure maps are correctly ordered */
   1393			map__get(map);
   1394			maps__remove(kmaps, map);
   1395			maps__insert(kmaps, map);
   1396			map__put(map);
   1397			map__put(new_map);
   1398		} else {
   1399			/*
   1400			 * Merge kcore map into existing maps,
   1401			 * and ensure that current maps (eBPF)
   1402			 * stay intact.
   1403			 */
   1404			if (maps__merge_in(kmaps, new_map))
   1405				goto out_err;
   1406		}
   1407	}
   1408
   1409	if (machine__is(machine, "x86_64")) {
   1410		u64 addr;
   1411
   1412		/*
   1413		 * If one of the corresponding symbols is there, assume the
   1414		 * entry trampoline maps are too.
   1415		 */
   1416		if (!kallsyms__get_function_start(kallsyms_filename,
   1417						  ENTRY_TRAMPOLINE_NAME,
   1418						  &addr))
   1419			machine->trampolines_mapped = true;
   1420	}
   1421
   1422	/*
   1423	 * Set the data type and long name so that kcore can be read via
   1424	 * dso__data_read_addr().
   1425	 */
   1426	if (dso->kernel == DSO_SPACE__KERNEL_GUEST)
   1427		dso->binary_type = DSO_BINARY_TYPE__GUEST_KCORE;
   1428	else
   1429		dso->binary_type = DSO_BINARY_TYPE__KCORE;
   1430	dso__set_long_name(dso, strdup(kcore_filename), true);
   1431
   1432	close(fd);
   1433
   1434	if (map->prot & PROT_EXEC)
   1435		pr_debug("Using %s for kernel object code\n", kcore_filename);
   1436	else
   1437		pr_debug("Using %s for kernel data\n", kcore_filename);
   1438
   1439	return 0;
   1440
   1441out_err:
   1442	while (!list_empty(&md.maps)) {
   1443		map = list_entry(md.maps.next, struct map, node);
   1444		list_del_init(&map->node);
   1445		map__put(map);
   1446	}
   1447	close(fd);
   1448	return -EINVAL;
   1449}
   1450
   1451/*
   1452 * If the kernel is relocated at boot time, kallsyms won't match.  Compute the
   1453 * delta based on the relocation reference symbol.
   1454 */
   1455static int kallsyms__delta(struct kmap *kmap, const char *filename, u64 *delta)
   1456{
   1457	u64 addr;
   1458
   1459	if (!kmap->ref_reloc_sym || !kmap->ref_reloc_sym->name)
   1460		return 0;
   1461
   1462	if (kallsyms__get_function_start(filename, kmap->ref_reloc_sym->name, &addr))
   1463		return -1;
   1464
   1465	*delta = addr - kmap->ref_reloc_sym->addr;
   1466	return 0;
   1467}
   1468
   1469int __dso__load_kallsyms(struct dso *dso, const char *filename,
   1470			 struct map *map, bool no_kcore)
   1471{
   1472	struct kmap *kmap = map__kmap(map);
   1473	u64 delta = 0;
   1474
   1475	if (symbol__restricted_filename(filename, "/proc/kallsyms"))
   1476		return -1;
   1477
   1478	if (!kmap || !kmap->kmaps)
   1479		return -1;
   1480
   1481	if (dso__load_all_kallsyms(dso, filename) < 0)
   1482		return -1;
   1483
   1484	if (kallsyms__delta(kmap, filename, &delta))
   1485		return -1;
   1486
   1487	symbols__fixup_end(&dso->symbols, true);
   1488	symbols__fixup_duplicate(&dso->symbols);
   1489
   1490	if (dso->kernel == DSO_SPACE__KERNEL_GUEST)
   1491		dso->symtab_type = DSO_BINARY_TYPE__GUEST_KALLSYMS;
   1492	else
   1493		dso->symtab_type = DSO_BINARY_TYPE__KALLSYMS;
   1494
   1495	if (!no_kcore && !dso__load_kcore(dso, map, filename))
   1496		return maps__split_kallsyms_for_kcore(kmap->kmaps, dso);
   1497	else
   1498		return maps__split_kallsyms(kmap->kmaps, dso, delta, map);
   1499}
   1500
   1501int dso__load_kallsyms(struct dso *dso, const char *filename,
   1502		       struct map *map)
   1503{
   1504	return __dso__load_kallsyms(dso, filename, map, false);
   1505}
   1506
   1507static int dso__load_perf_map(const char *map_path, struct dso *dso)
   1508{
   1509	char *line = NULL;
   1510	size_t n;
   1511	FILE *file;
   1512	int nr_syms = 0;
   1513
   1514	file = fopen(map_path, "r");
   1515	if (file == NULL)
   1516		goto out_failure;
   1517
   1518	while (!feof(file)) {
   1519		u64 start, size;
   1520		struct symbol *sym;
   1521		int line_len, len;
   1522
   1523		line_len = getline(&line, &n, file);
   1524		if (line_len < 0)
   1525			break;
   1526
   1527		if (!line)
   1528			goto out_failure;
   1529
   1530		line[--line_len] = '\0'; /* \n */
   1531
   1532		len = hex2u64(line, &start);
   1533
   1534		len++;
   1535		if (len + 2 >= line_len)
   1536			continue;
   1537
   1538		len += hex2u64(line + len, &size);
   1539
   1540		len++;
   1541		if (len + 2 >= line_len)
   1542			continue;
   1543
   1544		sym = symbol__new(start, size, STB_GLOBAL, STT_FUNC, line + len);
   1545
   1546		if (sym == NULL)
   1547			goto out_delete_line;
   1548
   1549		symbols__insert(&dso->symbols, sym);
   1550		nr_syms++;
   1551	}
   1552
   1553	free(line);
   1554	fclose(file);
   1555
   1556	return nr_syms;
   1557
   1558out_delete_line:
   1559	free(line);
   1560out_failure:
   1561	return -1;
   1562}
   1563
   1564#ifdef HAVE_LIBBFD_SUPPORT
   1565#define PACKAGE 'perf'
   1566#include <bfd.h>
   1567
   1568static int bfd_symbols__cmpvalue(const void *a, const void *b)
   1569{
   1570	const asymbol *as = *(const asymbol **)a, *bs = *(const asymbol **)b;
   1571
   1572	if (bfd_asymbol_value(as) != bfd_asymbol_value(bs))
   1573		return bfd_asymbol_value(as) - bfd_asymbol_value(bs);
   1574
   1575	return bfd_asymbol_name(as)[0] - bfd_asymbol_name(bs)[0];
   1576}
   1577
   1578static int bfd2elf_binding(asymbol *symbol)
   1579{
   1580	if (symbol->flags & BSF_WEAK)
   1581		return STB_WEAK;
   1582	if (symbol->flags & BSF_GLOBAL)
   1583		return STB_GLOBAL;
   1584	if (symbol->flags & BSF_LOCAL)
   1585		return STB_LOCAL;
   1586	return -1;
   1587}
   1588
   1589int dso__load_bfd_symbols(struct dso *dso, const char *debugfile)
   1590{
   1591	int err = -1;
   1592	long symbols_size, symbols_count, i;
   1593	asection *section;
   1594	asymbol **symbols, *sym;
   1595	struct symbol *symbol;
   1596	bfd *abfd;
   1597	u64 start, len;
   1598
   1599	abfd = bfd_openr(debugfile, NULL);
   1600	if (!abfd)
   1601		return -1;
   1602
   1603	if (!bfd_check_format(abfd, bfd_object)) {
   1604		pr_debug2("%s: cannot read %s bfd file.\n", __func__,
   1605			  dso->long_name);
   1606		goto out_close;
   1607	}
   1608
   1609	if (bfd_get_flavour(abfd) == bfd_target_elf_flavour)
   1610		goto out_close;
   1611
   1612	symbols_size = bfd_get_symtab_upper_bound(abfd);
   1613	if (symbols_size == 0) {
   1614		bfd_close(abfd);
   1615		return 0;
   1616	}
   1617
   1618	if (symbols_size < 0)
   1619		goto out_close;
   1620
   1621	symbols = malloc(symbols_size);
   1622	if (!symbols)
   1623		goto out_close;
   1624
   1625	symbols_count = bfd_canonicalize_symtab(abfd, symbols);
   1626	if (symbols_count < 0)
   1627		goto out_free;
   1628
   1629	section = bfd_get_section_by_name(abfd, ".text");
   1630	if (section) {
   1631		for (i = 0; i < symbols_count; ++i) {
   1632			if (!strcmp(bfd_asymbol_name(symbols[i]), "__ImageBase") ||
   1633			    !strcmp(bfd_asymbol_name(symbols[i]), "__image_base__"))
   1634				break;
   1635		}
   1636		if (i < symbols_count) {
   1637			/* PE symbols can only have 4 bytes, so use .text high bits */
   1638			dso->text_offset = section->vma - (u32)section->vma;
   1639			dso->text_offset += (u32)bfd_asymbol_value(symbols[i]);
   1640		} else {
   1641			dso->text_offset = section->vma - section->filepos;
   1642		}
   1643	}
   1644
   1645	qsort(symbols, symbols_count, sizeof(asymbol *), bfd_symbols__cmpvalue);
   1646
   1647#ifdef bfd_get_section
   1648#define bfd_asymbol_section bfd_get_section
   1649#endif
   1650	for (i = 0; i < symbols_count; ++i) {
   1651		sym = symbols[i];
   1652		section = bfd_asymbol_section(sym);
   1653		if (bfd2elf_binding(sym) < 0)
   1654			continue;
   1655
   1656		while (i + 1 < symbols_count &&
   1657		       bfd_asymbol_section(symbols[i + 1]) == section &&
   1658		       bfd2elf_binding(symbols[i + 1]) < 0)
   1659			i++;
   1660
   1661		if (i + 1 < symbols_count &&
   1662		    bfd_asymbol_section(symbols[i + 1]) == section)
   1663			len = symbols[i + 1]->value - sym->value;
   1664		else
   1665			len = section->size - sym->value;
   1666
   1667		start = bfd_asymbol_value(sym) - dso->text_offset;
   1668		symbol = symbol__new(start, len, bfd2elf_binding(sym), STT_FUNC,
   1669				     bfd_asymbol_name(sym));
   1670		if (!symbol)
   1671			goto out_free;
   1672
   1673		symbols__insert(&dso->symbols, symbol);
   1674	}
   1675#ifdef bfd_get_section
   1676#undef bfd_asymbol_section
   1677#endif
   1678
   1679	symbols__fixup_end(&dso->symbols, false);
   1680	symbols__fixup_duplicate(&dso->symbols);
   1681	dso->adjust_symbols = 1;
   1682
   1683	err = 0;
   1684out_free:
   1685	free(symbols);
   1686out_close:
   1687	bfd_close(abfd);
   1688	return err;
   1689}
   1690#endif
   1691
   1692static bool dso__is_compatible_symtab_type(struct dso *dso, bool kmod,
   1693					   enum dso_binary_type type)
   1694{
   1695	switch (type) {
   1696	case DSO_BINARY_TYPE__JAVA_JIT:
   1697	case DSO_BINARY_TYPE__DEBUGLINK:
   1698	case DSO_BINARY_TYPE__SYSTEM_PATH_DSO:
   1699	case DSO_BINARY_TYPE__FEDORA_DEBUGINFO:
   1700	case DSO_BINARY_TYPE__UBUNTU_DEBUGINFO:
   1701	case DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO:
   1702	case DSO_BINARY_TYPE__BUILDID_DEBUGINFO:
   1703	case DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO:
   1704		return !kmod && dso->kernel == DSO_SPACE__USER;
   1705
   1706	case DSO_BINARY_TYPE__KALLSYMS:
   1707	case DSO_BINARY_TYPE__VMLINUX:
   1708	case DSO_BINARY_TYPE__KCORE:
   1709		return dso->kernel == DSO_SPACE__KERNEL;
   1710
   1711	case DSO_BINARY_TYPE__GUEST_KALLSYMS:
   1712	case DSO_BINARY_TYPE__GUEST_VMLINUX:
   1713	case DSO_BINARY_TYPE__GUEST_KCORE:
   1714		return dso->kernel == DSO_SPACE__KERNEL_GUEST;
   1715
   1716	case DSO_BINARY_TYPE__GUEST_KMODULE:
   1717	case DSO_BINARY_TYPE__GUEST_KMODULE_COMP:
   1718	case DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE:
   1719	case DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP:
   1720		/*
   1721		 * kernel modules know their symtab type - it's set when
   1722		 * creating a module dso in machine__addnew_module_map().
   1723		 */
   1724		return kmod && dso->symtab_type == type;
   1725
   1726	case DSO_BINARY_TYPE__BUILD_ID_CACHE:
   1727	case DSO_BINARY_TYPE__BUILD_ID_CACHE_DEBUGINFO:
   1728		return true;
   1729
   1730	case DSO_BINARY_TYPE__BPF_PROG_INFO:
   1731	case DSO_BINARY_TYPE__BPF_IMAGE:
   1732	case DSO_BINARY_TYPE__OOL:
   1733	case DSO_BINARY_TYPE__NOT_FOUND:
   1734	default:
   1735		return false;
   1736	}
   1737}
   1738
   1739/* Checks for the existence of the perf-<pid>.map file in two different
   1740 * locations.  First, if the process is a separate mount namespace, check in
   1741 * that namespace using the pid of the innermost pid namespace.  If's not in a
   1742 * namespace, or the file can't be found there, try in the mount namespace of
   1743 * the tracing process using our view of its pid.
   1744 */
   1745static int dso__find_perf_map(char *filebuf, size_t bufsz,
   1746			      struct nsinfo **nsip)
   1747{
   1748	struct nscookie nsc;
   1749	struct nsinfo *nsi;
   1750	struct nsinfo *nnsi;
   1751	int rc = -1;
   1752
   1753	nsi = *nsip;
   1754
   1755	if (nsinfo__need_setns(nsi)) {
   1756		snprintf(filebuf, bufsz, "/tmp/perf-%d.map", nsinfo__nstgid(nsi));
   1757		nsinfo__mountns_enter(nsi, &nsc);
   1758		rc = access(filebuf, R_OK);
   1759		nsinfo__mountns_exit(&nsc);
   1760		if (rc == 0)
   1761			return rc;
   1762	}
   1763
   1764	nnsi = nsinfo__copy(nsi);
   1765	if (nnsi) {
   1766		nsinfo__put(nsi);
   1767
   1768		nsinfo__clear_need_setns(nnsi);
   1769		snprintf(filebuf, bufsz, "/tmp/perf-%d.map", nsinfo__tgid(nnsi));
   1770		*nsip = nnsi;
   1771		rc = 0;
   1772	}
   1773
   1774	return rc;
   1775}
   1776
   1777int dso__load(struct dso *dso, struct map *map)
   1778{
   1779	char *name;
   1780	int ret = -1;
   1781	u_int i;
   1782	struct machine *machine = NULL;
   1783	char *root_dir = (char *) "";
   1784	int ss_pos = 0;
   1785	struct symsrc ss_[2];
   1786	struct symsrc *syms_ss = NULL, *runtime_ss = NULL;
   1787	bool kmod;
   1788	bool perfmap;
   1789	struct build_id bid;
   1790	struct nscookie nsc;
   1791	char newmapname[PATH_MAX];
   1792	const char *map_path = dso->long_name;
   1793
   1794	perfmap = strncmp(dso->name, "/tmp/perf-", 10) == 0;
   1795	if (perfmap) {
   1796		if (dso->nsinfo && (dso__find_perf_map(newmapname,
   1797		    sizeof(newmapname), &dso->nsinfo) == 0)) {
   1798			map_path = newmapname;
   1799		}
   1800	}
   1801
   1802	nsinfo__mountns_enter(dso->nsinfo, &nsc);
   1803	pthread_mutex_lock(&dso->lock);
   1804
   1805	/* check again under the dso->lock */
   1806	if (dso__loaded(dso)) {
   1807		ret = 1;
   1808		goto out;
   1809	}
   1810
   1811	kmod = dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE ||
   1812		dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP ||
   1813		dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE ||
   1814		dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE_COMP;
   1815
   1816	if (dso->kernel && !kmod) {
   1817		if (dso->kernel == DSO_SPACE__KERNEL)
   1818			ret = dso__load_kernel_sym(dso, map);
   1819		else if (dso->kernel == DSO_SPACE__KERNEL_GUEST)
   1820			ret = dso__load_guest_kernel_sym(dso, map);
   1821
   1822		machine = map__kmaps(map)->machine;
   1823		if (machine__is(machine, "x86_64"))
   1824			machine__map_x86_64_entry_trampolines(machine, dso);
   1825		goto out;
   1826	}
   1827
   1828	dso->adjust_symbols = 0;
   1829
   1830	if (perfmap) {
   1831		ret = dso__load_perf_map(map_path, dso);
   1832		dso->symtab_type = ret > 0 ? DSO_BINARY_TYPE__JAVA_JIT :
   1833					     DSO_BINARY_TYPE__NOT_FOUND;
   1834		goto out;
   1835	}
   1836
   1837	if (machine)
   1838		root_dir = machine->root_dir;
   1839
   1840	name = malloc(PATH_MAX);
   1841	if (!name)
   1842		goto out;
   1843
   1844	/*
   1845	 * Read the build id if possible. This is required for
   1846	 * DSO_BINARY_TYPE__BUILDID_DEBUGINFO to work
   1847	 */
   1848	if (!dso->has_build_id &&
   1849	    is_regular_file(dso->long_name)) {
   1850	    __symbol__join_symfs(name, PATH_MAX, dso->long_name);
   1851		if (filename__read_build_id(name, &bid) > 0)
   1852			dso__set_build_id(dso, &bid);
   1853	}
   1854
   1855	/*
   1856	 * Iterate over candidate debug images.
   1857	 * Keep track of "interesting" ones (those which have a symtab, dynsym,
   1858	 * and/or opd section) for processing.
   1859	 */
   1860	for (i = 0; i < DSO_BINARY_TYPE__SYMTAB_CNT; i++) {
   1861		struct symsrc *ss = &ss_[ss_pos];
   1862		bool next_slot = false;
   1863		bool is_reg;
   1864		bool nsexit;
   1865		int bfdrc = -1;
   1866		int sirc = -1;
   1867
   1868		enum dso_binary_type symtab_type = binary_type_symtab[i];
   1869
   1870		nsexit = (symtab_type == DSO_BINARY_TYPE__BUILD_ID_CACHE ||
   1871		    symtab_type == DSO_BINARY_TYPE__BUILD_ID_CACHE_DEBUGINFO);
   1872
   1873		if (!dso__is_compatible_symtab_type(dso, kmod, symtab_type))
   1874			continue;
   1875
   1876		if (dso__read_binary_type_filename(dso, symtab_type,
   1877						   root_dir, name, PATH_MAX))
   1878			continue;
   1879
   1880		if (nsexit)
   1881			nsinfo__mountns_exit(&nsc);
   1882
   1883		is_reg = is_regular_file(name);
   1884		if (!is_reg && errno == ENOENT && dso->nsinfo) {
   1885			char *new_name = filename_with_chroot(dso->nsinfo->pid,
   1886							      name);
   1887			if (new_name) {
   1888				is_reg = is_regular_file(new_name);
   1889				strlcpy(name, new_name, PATH_MAX);
   1890				free(new_name);
   1891			}
   1892		}
   1893
   1894#ifdef HAVE_LIBBFD_SUPPORT
   1895		if (is_reg)
   1896			bfdrc = dso__load_bfd_symbols(dso, name);
   1897#endif
   1898		if (is_reg && bfdrc < 0)
   1899			sirc = symsrc__init(ss, dso, name, symtab_type);
   1900
   1901		if (nsexit)
   1902			nsinfo__mountns_enter(dso->nsinfo, &nsc);
   1903
   1904		if (bfdrc == 0) {
   1905			ret = 0;
   1906			break;
   1907		}
   1908
   1909		if (!is_reg || sirc < 0)
   1910			continue;
   1911
   1912		if (!syms_ss && symsrc__has_symtab(ss)) {
   1913			syms_ss = ss;
   1914			next_slot = true;
   1915			if (!dso->symsrc_filename)
   1916				dso->symsrc_filename = strdup(name);
   1917		}
   1918
   1919		if (!runtime_ss && symsrc__possibly_runtime(ss)) {
   1920			runtime_ss = ss;
   1921			next_slot = true;
   1922		}
   1923
   1924		if (next_slot) {
   1925			ss_pos++;
   1926
   1927			if (syms_ss && runtime_ss)
   1928				break;
   1929		} else {
   1930			symsrc__destroy(ss);
   1931		}
   1932
   1933	}
   1934
   1935	if (!runtime_ss && !syms_ss)
   1936		goto out_free;
   1937
   1938	if (runtime_ss && !syms_ss) {
   1939		syms_ss = runtime_ss;
   1940	}
   1941
   1942	/* We'll have to hope for the best */
   1943	if (!runtime_ss && syms_ss)
   1944		runtime_ss = syms_ss;
   1945
   1946	if (syms_ss)
   1947		ret = dso__load_sym(dso, map, syms_ss, runtime_ss, kmod);
   1948	else
   1949		ret = -1;
   1950
   1951	if (ret > 0) {
   1952		int nr_plt;
   1953
   1954		nr_plt = dso__synthesize_plt_symbols(dso, runtime_ss);
   1955		if (nr_plt > 0)
   1956			ret += nr_plt;
   1957	}
   1958
   1959	for (; ss_pos > 0; ss_pos--)
   1960		symsrc__destroy(&ss_[ss_pos - 1]);
   1961out_free:
   1962	free(name);
   1963	if (ret < 0 && strstr(dso->name, " (deleted)") != NULL)
   1964		ret = 0;
   1965out:
   1966	dso__set_loaded(dso);
   1967	pthread_mutex_unlock(&dso->lock);
   1968	nsinfo__mountns_exit(&nsc);
   1969
   1970	return ret;
   1971}
   1972
   1973static int map__strcmp(const void *a, const void *b)
   1974{
   1975	const struct map *ma = *(const struct map **)a, *mb = *(const struct map **)b;
   1976	return strcmp(ma->dso->short_name, mb->dso->short_name);
   1977}
   1978
   1979static int map__strcmp_name(const void *name, const void *b)
   1980{
   1981	const struct map *map = *(const struct map **)b;
   1982	return strcmp(name, map->dso->short_name);
   1983}
   1984
   1985void __maps__sort_by_name(struct maps *maps)
   1986{
   1987	qsort(maps->maps_by_name, maps->nr_maps, sizeof(struct map *), map__strcmp);
   1988}
   1989
   1990static int map__groups__sort_by_name_from_rbtree(struct maps *maps)
   1991{
   1992	struct map *map;
   1993	struct map **maps_by_name = realloc(maps->maps_by_name, maps->nr_maps * sizeof(map));
   1994	int i = 0;
   1995
   1996	if (maps_by_name == NULL)
   1997		return -1;
   1998
   1999	maps->maps_by_name = maps_by_name;
   2000	maps->nr_maps_allocated = maps->nr_maps;
   2001
   2002	maps__for_each_entry(maps, map)
   2003		maps_by_name[i++] = map;
   2004
   2005	__maps__sort_by_name(maps);
   2006	return 0;
   2007}
   2008
   2009static struct map *__maps__find_by_name(struct maps *maps, const char *name)
   2010{
   2011	struct map **mapp;
   2012
   2013	if (maps->maps_by_name == NULL &&
   2014	    map__groups__sort_by_name_from_rbtree(maps))
   2015		return NULL;
   2016
   2017	mapp = bsearch(name, maps->maps_by_name, maps->nr_maps, sizeof(*mapp), map__strcmp_name);
   2018	if (mapp)
   2019		return *mapp;
   2020	return NULL;
   2021}
   2022
   2023struct map *maps__find_by_name(struct maps *maps, const char *name)
   2024{
   2025	struct map *map;
   2026
   2027	down_read(&maps->lock);
   2028
   2029	if (maps->last_search_by_name && strcmp(maps->last_search_by_name->dso->short_name, name) == 0) {
   2030		map = maps->last_search_by_name;
   2031		goto out_unlock;
   2032	}
   2033	/*
   2034	 * If we have maps->maps_by_name, then the name isn't in the rbtree,
   2035	 * as maps->maps_by_name mirrors the rbtree when lookups by name are
   2036	 * made.
   2037	 */
   2038	map = __maps__find_by_name(maps, name);
   2039	if (map || maps->maps_by_name != NULL)
   2040		goto out_unlock;
   2041
   2042	/* Fallback to traversing the rbtree... */
   2043	maps__for_each_entry(maps, map)
   2044		if (strcmp(map->dso->short_name, name) == 0) {
   2045			maps->last_search_by_name = map;
   2046			goto out_unlock;
   2047		}
   2048
   2049	map = NULL;
   2050
   2051out_unlock:
   2052	up_read(&maps->lock);
   2053	return map;
   2054}
   2055
   2056int dso__load_vmlinux(struct dso *dso, struct map *map,
   2057		      const char *vmlinux, bool vmlinux_allocated)
   2058{
   2059	int err = -1;
   2060	struct symsrc ss;
   2061	char symfs_vmlinux[PATH_MAX];
   2062	enum dso_binary_type symtab_type;
   2063
   2064	if (vmlinux[0] == '/')
   2065		snprintf(symfs_vmlinux, sizeof(symfs_vmlinux), "%s", vmlinux);
   2066	else
   2067		symbol__join_symfs(symfs_vmlinux, vmlinux);
   2068
   2069	if (dso->kernel == DSO_SPACE__KERNEL_GUEST)
   2070		symtab_type = DSO_BINARY_TYPE__GUEST_VMLINUX;
   2071	else
   2072		symtab_type = DSO_BINARY_TYPE__VMLINUX;
   2073
   2074	if (symsrc__init(&ss, dso, symfs_vmlinux, symtab_type))
   2075		return -1;
   2076
   2077	err = dso__load_sym(dso, map, &ss, &ss, 0);
   2078	symsrc__destroy(&ss);
   2079
   2080	if (err > 0) {
   2081		if (dso->kernel == DSO_SPACE__KERNEL_GUEST)
   2082			dso->binary_type = DSO_BINARY_TYPE__GUEST_VMLINUX;
   2083		else
   2084			dso->binary_type = DSO_BINARY_TYPE__VMLINUX;
   2085		dso__set_long_name(dso, vmlinux, vmlinux_allocated);
   2086		dso__set_loaded(dso);
   2087		pr_debug("Using %s for symbols\n", symfs_vmlinux);
   2088	}
   2089
   2090	return err;
   2091}
   2092
   2093int dso__load_vmlinux_path(struct dso *dso, struct map *map)
   2094{
   2095	int i, err = 0;
   2096	char *filename = NULL;
   2097
   2098	pr_debug("Looking at the vmlinux_path (%d entries long)\n",
   2099		 vmlinux_path__nr_entries + 1);
   2100
   2101	for (i = 0; i < vmlinux_path__nr_entries; ++i) {
   2102		err = dso__load_vmlinux(dso, map, vmlinux_path[i], false);
   2103		if (err > 0)
   2104			goto out;
   2105	}
   2106
   2107	if (!symbol_conf.ignore_vmlinux_buildid)
   2108		filename = dso__build_id_filename(dso, NULL, 0, false);
   2109	if (filename != NULL) {
   2110		err = dso__load_vmlinux(dso, map, filename, true);
   2111		if (err > 0)
   2112			goto out;
   2113		free(filename);
   2114	}
   2115out:
   2116	return err;
   2117}
   2118
   2119static bool visible_dir_filter(const char *name, struct dirent *d)
   2120{
   2121	if (d->d_type != DT_DIR)
   2122		return false;
   2123	return lsdir_no_dot_filter(name, d);
   2124}
   2125
   2126static int find_matching_kcore(struct map *map, char *dir, size_t dir_sz)
   2127{
   2128	char kallsyms_filename[PATH_MAX];
   2129	int ret = -1;
   2130	struct strlist *dirs;
   2131	struct str_node *nd;
   2132
   2133	dirs = lsdir(dir, visible_dir_filter);
   2134	if (!dirs)
   2135		return -1;
   2136
   2137	strlist__for_each_entry(nd, dirs) {
   2138		scnprintf(kallsyms_filename, sizeof(kallsyms_filename),
   2139			  "%s/%s/kallsyms", dir, nd->s);
   2140		if (!validate_kcore_addresses(kallsyms_filename, map)) {
   2141			strlcpy(dir, kallsyms_filename, dir_sz);
   2142			ret = 0;
   2143			break;
   2144		}
   2145	}
   2146
   2147	strlist__delete(dirs);
   2148
   2149	return ret;
   2150}
   2151
   2152/*
   2153 * Use open(O_RDONLY) to check readability directly instead of access(R_OK)
   2154 * since access(R_OK) only checks with real UID/GID but open() use effective
   2155 * UID/GID and actual capabilities (e.g. /proc/kcore requires CAP_SYS_RAWIO).
   2156 */
   2157static bool filename__readable(const char *file)
   2158{
   2159	int fd = open(file, O_RDONLY);
   2160	if (fd < 0)
   2161		return false;
   2162	close(fd);
   2163	return true;
   2164}
   2165
   2166static char *dso__find_kallsyms(struct dso *dso, struct map *map)
   2167{
   2168	struct build_id bid;
   2169	char sbuild_id[SBUILD_ID_SIZE];
   2170	bool is_host = false;
   2171	char path[PATH_MAX];
   2172
   2173	if (!dso->has_build_id) {
   2174		/*
   2175		 * Last resort, if we don't have a build-id and couldn't find
   2176		 * any vmlinux file, try the running kernel kallsyms table.
   2177		 */
   2178		goto proc_kallsyms;
   2179	}
   2180
   2181	if (sysfs__read_build_id("/sys/kernel/notes", &bid) == 0)
   2182		is_host = dso__build_id_equal(dso, &bid);
   2183
   2184	/* Try a fast path for /proc/kallsyms if possible */
   2185	if (is_host) {
   2186		/*
   2187		 * Do not check the build-id cache, unless we know we cannot use
   2188		 * /proc/kcore or module maps don't match to /proc/kallsyms.
   2189		 * To check readability of /proc/kcore, do not use access(R_OK)
   2190		 * since /proc/kcore requires CAP_SYS_RAWIO to read and access
   2191		 * can't check it.
   2192		 */
   2193		if (filename__readable("/proc/kcore") &&
   2194		    !validate_kcore_addresses("/proc/kallsyms", map))
   2195			goto proc_kallsyms;
   2196	}
   2197
   2198	build_id__sprintf(&dso->bid, sbuild_id);
   2199
   2200	/* Find kallsyms in build-id cache with kcore */
   2201	scnprintf(path, sizeof(path), "%s/%s/%s",
   2202		  buildid_dir, DSO__NAME_KCORE, sbuild_id);
   2203
   2204	if (!find_matching_kcore(map, path, sizeof(path)))
   2205		return strdup(path);
   2206
   2207	/* Use current /proc/kallsyms if possible */
   2208	if (is_host) {
   2209proc_kallsyms:
   2210		return strdup("/proc/kallsyms");
   2211	}
   2212
   2213	/* Finally, find a cache of kallsyms */
   2214	if (!build_id_cache__kallsyms_path(sbuild_id, path, sizeof(path))) {
   2215		pr_err("No kallsyms or vmlinux with build-id %s was found\n",
   2216		       sbuild_id);
   2217		return NULL;
   2218	}
   2219
   2220	return strdup(path);
   2221}
   2222
   2223static int dso__load_kernel_sym(struct dso *dso, struct map *map)
   2224{
   2225	int err;
   2226	const char *kallsyms_filename = NULL;
   2227	char *kallsyms_allocated_filename = NULL;
   2228	char *filename = NULL;
   2229
   2230	/*
   2231	 * Step 1: if the user specified a kallsyms or vmlinux filename, use
   2232	 * it and only it, reporting errors to the user if it cannot be used.
   2233	 *
   2234	 * For instance, try to analyse an ARM perf.data file _without_ a
   2235	 * build-id, or if the user specifies the wrong path to the right
   2236	 * vmlinux file, obviously we can't fallback to another vmlinux (a
   2237	 * x86_86 one, on the machine where analysis is being performed, say),
   2238	 * or worse, /proc/kallsyms.
   2239	 *
   2240	 * If the specified file _has_ a build-id and there is a build-id
   2241	 * section in the perf.data file, we will still do the expected
   2242	 * validation in dso__load_vmlinux and will bail out if they don't
   2243	 * match.
   2244	 */
   2245	if (symbol_conf.kallsyms_name != NULL) {
   2246		kallsyms_filename = symbol_conf.kallsyms_name;
   2247		goto do_kallsyms;
   2248	}
   2249
   2250	if (!symbol_conf.ignore_vmlinux && symbol_conf.vmlinux_name != NULL) {
   2251		return dso__load_vmlinux(dso, map, symbol_conf.vmlinux_name, false);
   2252	}
   2253
   2254	/*
   2255	 * Before checking on common vmlinux locations, check if it's
   2256	 * stored as standard build id binary (not kallsyms) under
   2257	 * .debug cache.
   2258	 */
   2259	if (!symbol_conf.ignore_vmlinux_buildid)
   2260		filename = __dso__build_id_filename(dso, NULL, 0, false, false);
   2261	if (filename != NULL) {
   2262		err = dso__load_vmlinux(dso, map, filename, true);
   2263		if (err > 0)
   2264			return err;
   2265		free(filename);
   2266	}
   2267
   2268	if (!symbol_conf.ignore_vmlinux && vmlinux_path != NULL) {
   2269		err = dso__load_vmlinux_path(dso, map);
   2270		if (err > 0)
   2271			return err;
   2272	}
   2273
   2274	/* do not try local files if a symfs was given */
   2275	if (symbol_conf.symfs[0] != 0)
   2276		return -1;
   2277
   2278	kallsyms_allocated_filename = dso__find_kallsyms(dso, map);
   2279	if (!kallsyms_allocated_filename)
   2280		return -1;
   2281
   2282	kallsyms_filename = kallsyms_allocated_filename;
   2283
   2284do_kallsyms:
   2285	err = dso__load_kallsyms(dso, kallsyms_filename, map);
   2286	if (err > 0)
   2287		pr_debug("Using %s for symbols\n", kallsyms_filename);
   2288	free(kallsyms_allocated_filename);
   2289
   2290	if (err > 0 && !dso__is_kcore(dso)) {
   2291		dso->binary_type = DSO_BINARY_TYPE__KALLSYMS;
   2292		dso__set_long_name(dso, DSO__NAME_KALLSYMS, false);
   2293		map__fixup_start(map);
   2294		map__fixup_end(map);
   2295	}
   2296
   2297	return err;
   2298}
   2299
   2300static int dso__load_guest_kernel_sym(struct dso *dso, struct map *map)
   2301{
   2302	int err;
   2303	const char *kallsyms_filename = NULL;
   2304	struct machine *machine = map__kmaps(map)->machine;
   2305	char path[PATH_MAX];
   2306
   2307	if (machine__is_default_guest(machine)) {
   2308		/*
   2309		 * if the user specified a vmlinux filename, use it and only
   2310		 * it, reporting errors to the user if it cannot be used.
   2311		 * Or use file guest_kallsyms inputted by user on commandline
   2312		 */
   2313		if (symbol_conf.default_guest_vmlinux_name != NULL) {
   2314			err = dso__load_vmlinux(dso, map,
   2315						symbol_conf.default_guest_vmlinux_name,
   2316						false);
   2317			return err;
   2318		}
   2319
   2320		kallsyms_filename = symbol_conf.default_guest_kallsyms;
   2321		if (!kallsyms_filename)
   2322			return -1;
   2323	} else {
   2324		sprintf(path, "%s/proc/kallsyms", machine->root_dir);
   2325		kallsyms_filename = path;
   2326	}
   2327
   2328	err = dso__load_kallsyms(dso, kallsyms_filename, map);
   2329	if (err > 0)
   2330		pr_debug("Using %s for symbols\n", kallsyms_filename);
   2331	if (err > 0 && !dso__is_kcore(dso)) {
   2332		dso->binary_type = DSO_BINARY_TYPE__GUEST_KALLSYMS;
   2333		dso__set_long_name(dso, machine->mmap_name, false);
   2334		map__fixup_start(map);
   2335		map__fixup_end(map);
   2336	}
   2337
   2338	return err;
   2339}
   2340
   2341static void vmlinux_path__exit(void)
   2342{
   2343	while (--vmlinux_path__nr_entries >= 0)
   2344		zfree(&vmlinux_path[vmlinux_path__nr_entries]);
   2345	vmlinux_path__nr_entries = 0;
   2346
   2347	zfree(&vmlinux_path);
   2348}
   2349
   2350static const char * const vmlinux_paths[] = {
   2351	"vmlinux",
   2352	"/boot/vmlinux"
   2353};
   2354
   2355static const char * const vmlinux_paths_upd[] = {
   2356	"/boot/vmlinux-%s",
   2357	"/usr/lib/debug/boot/vmlinux-%s",
   2358	"/lib/modules/%s/build/vmlinux",
   2359	"/usr/lib/debug/lib/modules/%s/vmlinux",
   2360	"/usr/lib/debug/boot/vmlinux-%s.debug"
   2361};
   2362
   2363static int vmlinux_path__add(const char *new_entry)
   2364{
   2365	vmlinux_path[vmlinux_path__nr_entries] = strdup(new_entry);
   2366	if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
   2367		return -1;
   2368	++vmlinux_path__nr_entries;
   2369
   2370	return 0;
   2371}
   2372
   2373static int vmlinux_path__init(struct perf_env *env)
   2374{
   2375	struct utsname uts;
   2376	char bf[PATH_MAX];
   2377	char *kernel_version;
   2378	unsigned int i;
   2379
   2380	vmlinux_path = malloc(sizeof(char *) * (ARRAY_SIZE(vmlinux_paths) +
   2381			      ARRAY_SIZE(vmlinux_paths_upd)));
   2382	if (vmlinux_path == NULL)
   2383		return -1;
   2384
   2385	for (i = 0; i < ARRAY_SIZE(vmlinux_paths); i++)
   2386		if (vmlinux_path__add(vmlinux_paths[i]) < 0)
   2387			goto out_fail;
   2388
   2389	/* only try kernel version if no symfs was given */
   2390	if (symbol_conf.symfs[0] != 0)
   2391		return 0;
   2392
   2393	if (env) {
   2394		kernel_version = env->os_release;
   2395	} else {
   2396		if (uname(&uts) < 0)
   2397			goto out_fail;
   2398
   2399		kernel_version = uts.release;
   2400	}
   2401
   2402	for (i = 0; i < ARRAY_SIZE(vmlinux_paths_upd); i++) {
   2403		snprintf(bf, sizeof(bf), vmlinux_paths_upd[i], kernel_version);
   2404		if (vmlinux_path__add(bf) < 0)
   2405			goto out_fail;
   2406	}
   2407
   2408	return 0;
   2409
   2410out_fail:
   2411	vmlinux_path__exit();
   2412	return -1;
   2413}
   2414
   2415int setup_list(struct strlist **list, const char *list_str,
   2416		      const char *list_name)
   2417{
   2418	if (list_str == NULL)
   2419		return 0;
   2420
   2421	*list = strlist__new(list_str, NULL);
   2422	if (!*list) {
   2423		pr_err("problems parsing %s list\n", list_name);
   2424		return -1;
   2425	}
   2426
   2427	symbol_conf.has_filter = true;
   2428	return 0;
   2429}
   2430
   2431int setup_intlist(struct intlist **list, const char *list_str,
   2432		  const char *list_name)
   2433{
   2434	if (list_str == NULL)
   2435		return 0;
   2436
   2437	*list = intlist__new(list_str);
   2438	if (!*list) {
   2439		pr_err("problems parsing %s list\n", list_name);
   2440		return -1;
   2441	}
   2442	return 0;
   2443}
   2444
   2445static int setup_addrlist(struct intlist **addr_list, struct strlist *sym_list)
   2446{
   2447	struct str_node *pos, *tmp;
   2448	unsigned long val;
   2449	char *sep;
   2450	const char *end;
   2451	int i = 0, err;
   2452
   2453	*addr_list = intlist__new(NULL);
   2454	if (!*addr_list)
   2455		return -1;
   2456
   2457	strlist__for_each_entry_safe(pos, tmp, sym_list) {
   2458		errno = 0;
   2459		val = strtoul(pos->s, &sep, 16);
   2460		if (errno || (sep == pos->s))
   2461			continue;
   2462
   2463		if (*sep != '\0') {
   2464			end = pos->s + strlen(pos->s) - 1;
   2465			while (end >= sep && isspace(*end))
   2466				end--;
   2467
   2468			if (end >= sep)
   2469				continue;
   2470		}
   2471
   2472		err = intlist__add(*addr_list, val);
   2473		if (err)
   2474			break;
   2475
   2476		strlist__remove(sym_list, pos);
   2477		i++;
   2478	}
   2479
   2480	if (i == 0) {
   2481		intlist__delete(*addr_list);
   2482		*addr_list = NULL;
   2483	}
   2484
   2485	return 0;
   2486}
   2487
   2488static bool symbol__read_kptr_restrict(void)
   2489{
   2490	bool value = false;
   2491	FILE *fp = fopen("/proc/sys/kernel/kptr_restrict", "r");
   2492
   2493	if (fp != NULL) {
   2494		char line[8];
   2495
   2496		if (fgets(line, sizeof(line), fp) != NULL)
   2497			value = perf_cap__capable(CAP_SYSLOG) ?
   2498					(atoi(line) >= 2) :
   2499					(atoi(line) != 0);
   2500
   2501		fclose(fp);
   2502	}
   2503
   2504	/* Per kernel/kallsyms.c:
   2505	 * we also restrict when perf_event_paranoid > 1 w/o CAP_SYSLOG
   2506	 */
   2507	if (perf_event_paranoid() > 1 && !perf_cap__capable(CAP_SYSLOG))
   2508		value = true;
   2509
   2510	return value;
   2511}
   2512
   2513int symbol__annotation_init(void)
   2514{
   2515	if (symbol_conf.init_annotation)
   2516		return 0;
   2517
   2518	if (symbol_conf.initialized) {
   2519		pr_err("Annotation needs to be init before symbol__init()\n");
   2520		return -1;
   2521	}
   2522
   2523	symbol_conf.priv_size += sizeof(struct annotation);
   2524	symbol_conf.init_annotation = true;
   2525	return 0;
   2526}
   2527
   2528int symbol__init(struct perf_env *env)
   2529{
   2530	const char *symfs;
   2531
   2532	if (symbol_conf.initialized)
   2533		return 0;
   2534
   2535	symbol_conf.priv_size = PERF_ALIGN(symbol_conf.priv_size, sizeof(u64));
   2536
   2537	symbol__elf_init();
   2538
   2539	if (symbol_conf.sort_by_name)
   2540		symbol_conf.priv_size += (sizeof(struct symbol_name_rb_node) -
   2541					  sizeof(struct symbol));
   2542
   2543	if (symbol_conf.try_vmlinux_path && vmlinux_path__init(env) < 0)
   2544		return -1;
   2545
   2546	if (symbol_conf.field_sep && *symbol_conf.field_sep == '.') {
   2547		pr_err("'.' is the only non valid --field-separator argument\n");
   2548		return -1;
   2549	}
   2550
   2551	if (setup_list(&symbol_conf.dso_list,
   2552		       symbol_conf.dso_list_str, "dso") < 0)
   2553		return -1;
   2554
   2555	if (setup_list(&symbol_conf.comm_list,
   2556		       symbol_conf.comm_list_str, "comm") < 0)
   2557		goto out_free_dso_list;
   2558
   2559	if (setup_intlist(&symbol_conf.pid_list,
   2560		       symbol_conf.pid_list_str, "pid") < 0)
   2561		goto out_free_comm_list;
   2562
   2563	if (setup_intlist(&symbol_conf.tid_list,
   2564		       symbol_conf.tid_list_str, "tid") < 0)
   2565		goto out_free_pid_list;
   2566
   2567	if (setup_list(&symbol_conf.sym_list,
   2568		       symbol_conf.sym_list_str, "symbol") < 0)
   2569		goto out_free_tid_list;
   2570
   2571	if (symbol_conf.sym_list &&
   2572	    setup_addrlist(&symbol_conf.addr_list, symbol_conf.sym_list) < 0)
   2573		goto out_free_sym_list;
   2574
   2575	if (setup_list(&symbol_conf.bt_stop_list,
   2576		       symbol_conf.bt_stop_list_str, "symbol") < 0)
   2577		goto out_free_sym_list;
   2578
   2579	/*
   2580	 * A path to symbols of "/" is identical to ""
   2581	 * reset here for simplicity.
   2582	 */
   2583	symfs = realpath(symbol_conf.symfs, NULL);
   2584	if (symfs == NULL)
   2585		symfs = symbol_conf.symfs;
   2586	if (strcmp(symfs, "/") == 0)
   2587		symbol_conf.symfs = "";
   2588	if (symfs != symbol_conf.symfs)
   2589		free((void *)symfs);
   2590
   2591	symbol_conf.kptr_restrict = symbol__read_kptr_restrict();
   2592
   2593	symbol_conf.initialized = true;
   2594	return 0;
   2595
   2596out_free_sym_list:
   2597	strlist__delete(symbol_conf.sym_list);
   2598	intlist__delete(symbol_conf.addr_list);
   2599out_free_tid_list:
   2600	intlist__delete(symbol_conf.tid_list);
   2601out_free_pid_list:
   2602	intlist__delete(symbol_conf.pid_list);
   2603out_free_comm_list:
   2604	strlist__delete(symbol_conf.comm_list);
   2605out_free_dso_list:
   2606	strlist__delete(symbol_conf.dso_list);
   2607	return -1;
   2608}
   2609
   2610void symbol__exit(void)
   2611{
   2612	if (!symbol_conf.initialized)
   2613		return;
   2614	strlist__delete(symbol_conf.bt_stop_list);
   2615	strlist__delete(symbol_conf.sym_list);
   2616	strlist__delete(symbol_conf.dso_list);
   2617	strlist__delete(symbol_conf.comm_list);
   2618	intlist__delete(symbol_conf.tid_list);
   2619	intlist__delete(symbol_conf.pid_list);
   2620	intlist__delete(symbol_conf.addr_list);
   2621	vmlinux_path__exit();
   2622	symbol_conf.sym_list = symbol_conf.dso_list = symbol_conf.comm_list = NULL;
   2623	symbol_conf.bt_stop_list = NULL;
   2624	symbol_conf.initialized = false;
   2625}
   2626
   2627int symbol__config_symfs(const struct option *opt __maybe_unused,
   2628			 const char *dir, int unset __maybe_unused)
   2629{
   2630	char *bf = NULL;
   2631	int ret;
   2632
   2633	symbol_conf.symfs = strdup(dir);
   2634	if (symbol_conf.symfs == NULL)
   2635		return -ENOMEM;
   2636
   2637	/* skip the locally configured cache if a symfs is given, and
   2638	 * config buildid dir to symfs/.debug
   2639	 */
   2640	ret = asprintf(&bf, "%s/%s", dir, ".debug");
   2641	if (ret < 0)
   2642		return -ENOMEM;
   2643
   2644	set_buildid_dir(bf);
   2645
   2646	free(bf);
   2647	return 0;
   2648}
   2649
   2650struct mem_info *mem_info__get(struct mem_info *mi)
   2651{
   2652	if (mi)
   2653		refcount_inc(&mi->refcnt);
   2654	return mi;
   2655}
   2656
   2657void mem_info__put(struct mem_info *mi)
   2658{
   2659	if (mi && refcount_dec_and_test(&mi->refcnt))
   2660		free(mi);
   2661}
   2662
   2663struct mem_info *mem_info__new(void)
   2664{
   2665	struct mem_info *mi = zalloc(sizeof(*mi));
   2666
   2667	if (mi)
   2668		refcount_set(&mi->refcnt, 1);
   2669	return mi;
   2670}
   2671
   2672/*
   2673 * Checks that user supplied symbol kernel files are accessible because
   2674 * the default mechanism for accessing elf files fails silently. i.e. if
   2675 * debug syms for a build ID aren't found perf carries on normally. When
   2676 * they are user supplied we should assume that the user doesn't want to
   2677 * silently fail.
   2678 */
   2679int symbol__validate_sym_arguments(void)
   2680{
   2681	if (symbol_conf.vmlinux_name &&
   2682	    access(symbol_conf.vmlinux_name, R_OK)) {
   2683		pr_err("Invalid file: %s\n", symbol_conf.vmlinux_name);
   2684		return -EINVAL;
   2685	}
   2686	if (symbol_conf.kallsyms_name &&
   2687	    access(symbol_conf.kallsyms_name, R_OK)) {
   2688		pr_err("Invalid file: %s\n", symbol_conf.kallsyms_name);
   2689		return -EINVAL;
   2690	}
   2691	return 0;
   2692}