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