]> Pileus Git - ~andy/linux/blob - tools/perf/util/symbol.c
perf symbols: Constify dso->long_name
[~andy/linux] / tools / perf / util / symbol.c
1 #include <dirent.h>
2 #include <errno.h>
3 #include <stdlib.h>
4 #include <stdio.h>
5 #include <string.h>
6 #include <sys/types.h>
7 #include <sys/stat.h>
8 #include <sys/param.h>
9 #include <fcntl.h>
10 #include <unistd.h>
11 #include <inttypes.h>
12 #include "build-id.h"
13 #include "util.h"
14 #include "debug.h"
15 #include "machine.h"
16 #include "symbol.h"
17 #include "strlist.h"
18
19 #include <elf.h>
20 #include <limits.h>
21 #include <sys/utsname.h>
22
23 #ifndef KSYM_NAME_LEN
24 #define KSYM_NAME_LEN 256
25 #endif
26
27 static int dso__load_kernel_sym(struct dso *dso, struct map *map,
28                                 symbol_filter_t filter);
29 static int dso__load_guest_kernel_sym(struct dso *dso, struct map *map,
30                         symbol_filter_t filter);
31 int vmlinux_path__nr_entries;
32 char **vmlinux_path;
33
34 struct symbol_conf symbol_conf = {
35         .use_modules      = true,
36         .try_vmlinux_path = true,
37         .annotate_src     = true,
38         .demangle         = true,
39         .symfs            = "",
40 };
41
42 static enum dso_binary_type binary_type_symtab[] = {
43         DSO_BINARY_TYPE__KALLSYMS,
44         DSO_BINARY_TYPE__GUEST_KALLSYMS,
45         DSO_BINARY_TYPE__JAVA_JIT,
46         DSO_BINARY_TYPE__DEBUGLINK,
47         DSO_BINARY_TYPE__BUILD_ID_CACHE,
48         DSO_BINARY_TYPE__FEDORA_DEBUGINFO,
49         DSO_BINARY_TYPE__UBUNTU_DEBUGINFO,
50         DSO_BINARY_TYPE__BUILDID_DEBUGINFO,
51         DSO_BINARY_TYPE__SYSTEM_PATH_DSO,
52         DSO_BINARY_TYPE__GUEST_KMODULE,
53         DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE,
54         DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO,
55         DSO_BINARY_TYPE__NOT_FOUND,
56 };
57
58 #define DSO_BINARY_TYPE__SYMTAB_CNT ARRAY_SIZE(binary_type_symtab)
59
60 bool symbol_type__is_a(char symbol_type, enum map_type map_type)
61 {
62         symbol_type = toupper(symbol_type);
63
64         switch (map_type) {
65         case MAP__FUNCTION:
66                 return symbol_type == 'T' || symbol_type == 'W';
67         case MAP__VARIABLE:
68                 return symbol_type == 'D';
69         default:
70                 return false;
71         }
72 }
73
74 static int prefix_underscores_count(const char *str)
75 {
76         const char *tail = str;
77
78         while (*tail == '_')
79                 tail++;
80
81         return tail - str;
82 }
83
84 #define SYMBOL_A 0
85 #define SYMBOL_B 1
86
87 static int choose_best_symbol(struct symbol *syma, struct symbol *symb)
88 {
89         s64 a;
90         s64 b;
91         size_t na, nb;
92
93         /* Prefer a symbol with non zero length */
94         a = syma->end - syma->start;
95         b = symb->end - symb->start;
96         if ((b == 0) && (a > 0))
97                 return SYMBOL_A;
98         else if ((a == 0) && (b > 0))
99                 return SYMBOL_B;
100
101         /* Prefer a non weak symbol over a weak one */
102         a = syma->binding == STB_WEAK;
103         b = symb->binding == STB_WEAK;
104         if (b && !a)
105                 return SYMBOL_A;
106         if (a && !b)
107                 return SYMBOL_B;
108
109         /* Prefer a global symbol over a non global one */
110         a = syma->binding == STB_GLOBAL;
111         b = symb->binding == STB_GLOBAL;
112         if (a && !b)
113                 return SYMBOL_A;
114         if (b && !a)
115                 return SYMBOL_B;
116
117         /* Prefer a symbol with less underscores */
118         a = prefix_underscores_count(syma->name);
119         b = prefix_underscores_count(symb->name);
120         if (b > a)
121                 return SYMBOL_A;
122         else if (a > b)
123                 return SYMBOL_B;
124
125         /* Choose the symbol with the longest name */
126         na = strlen(syma->name);
127         nb = strlen(symb->name);
128         if (na > nb)
129                 return SYMBOL_A;
130         else if (na < nb)
131                 return SYMBOL_B;
132
133         /* Avoid "SyS" kernel syscall aliases */
134         if (na >= 3 && !strncmp(syma->name, "SyS", 3))
135                 return SYMBOL_B;
136         if (na >= 10 && !strncmp(syma->name, "compat_SyS", 10))
137                 return SYMBOL_B;
138
139         return SYMBOL_A;
140 }
141
142 void symbols__fixup_duplicate(struct rb_root *symbols)
143 {
144         struct rb_node *nd;
145         struct symbol *curr, *next;
146
147         nd = rb_first(symbols);
148
149         while (nd) {
150                 curr = rb_entry(nd, struct symbol, rb_node);
151 again:
152                 nd = rb_next(&curr->rb_node);
153                 next = rb_entry(nd, struct symbol, rb_node);
154
155                 if (!nd)
156                         break;
157
158                 if (curr->start != next->start)
159                         continue;
160
161                 if (choose_best_symbol(curr, next) == SYMBOL_A) {
162                         rb_erase(&next->rb_node, symbols);
163                         symbol__delete(next);
164                         goto again;
165                 } else {
166                         nd = rb_next(&curr->rb_node);
167                         rb_erase(&curr->rb_node, symbols);
168                         symbol__delete(curr);
169                 }
170         }
171 }
172
173 void symbols__fixup_end(struct rb_root *symbols)
174 {
175         struct rb_node *nd, *prevnd = rb_first(symbols);
176         struct symbol *curr, *prev;
177
178         if (prevnd == NULL)
179                 return;
180
181         curr = rb_entry(prevnd, struct symbol, rb_node);
182
183         for (nd = rb_next(prevnd); nd; nd = rb_next(nd)) {
184                 prev = curr;
185                 curr = rb_entry(nd, struct symbol, rb_node);
186
187                 if (prev->end == prev->start && prev->end != curr->start)
188                         prev->end = curr->start - 1;
189         }
190
191         /* Last entry */
192         if (curr->end == curr->start)
193                 curr->end = roundup(curr->start, 4096);
194 }
195
196 void __map_groups__fixup_end(struct map_groups *mg, enum map_type type)
197 {
198         struct map *prev, *curr;
199         struct rb_node *nd, *prevnd = rb_first(&mg->maps[type]);
200
201         if (prevnd == NULL)
202                 return;
203
204         curr = rb_entry(prevnd, struct map, rb_node);
205
206         for (nd = rb_next(prevnd); nd; nd = rb_next(nd)) {
207                 prev = curr;
208                 curr = rb_entry(nd, struct map, rb_node);
209                 prev->end = curr->start - 1;
210         }
211
212         /*
213          * We still haven't the actual symbols, so guess the
214          * last map final address.
215          */
216         curr->end = ~0ULL;
217 }
218
219 struct symbol *symbol__new(u64 start, u64 len, u8 binding, const char *name)
220 {
221         size_t namelen = strlen(name) + 1;
222         struct symbol *sym = calloc(1, (symbol_conf.priv_size +
223                                         sizeof(*sym) + namelen));
224         if (sym == NULL)
225                 return NULL;
226
227         if (symbol_conf.priv_size)
228                 sym = ((void *)sym) + symbol_conf.priv_size;
229
230         sym->start   = start;
231         sym->end     = len ? start + len - 1 : start;
232         sym->binding = binding;
233         sym->namelen = namelen - 1;
234
235         pr_debug4("%s: %s %#" PRIx64 "-%#" PRIx64 "\n",
236                   __func__, name, start, sym->end);
237         memcpy(sym->name, name, namelen);
238
239         return sym;
240 }
241
242 void symbol__delete(struct symbol *sym)
243 {
244         free(((void *)sym) - symbol_conf.priv_size);
245 }
246
247 size_t symbol__fprintf(struct symbol *sym, FILE *fp)
248 {
249         return fprintf(fp, " %" PRIx64 "-%" PRIx64 " %c %s\n",
250                        sym->start, sym->end,
251                        sym->binding == STB_GLOBAL ? 'g' :
252                        sym->binding == STB_LOCAL  ? 'l' : 'w',
253                        sym->name);
254 }
255
256 size_t symbol__fprintf_symname_offs(const struct symbol *sym,
257                                     const struct addr_location *al, FILE *fp)
258 {
259         unsigned long offset;
260         size_t length;
261
262         if (sym && sym->name) {
263                 length = fprintf(fp, "%s", sym->name);
264                 if (al) {
265                         if (al->addr < sym->end)
266                                 offset = al->addr - sym->start;
267                         else
268                                 offset = al->addr - al->map->start - sym->start;
269                         length += fprintf(fp, "+0x%lx", offset);
270                 }
271                 return length;
272         } else
273                 return fprintf(fp, "[unknown]");
274 }
275
276 size_t symbol__fprintf_symname(const struct symbol *sym, FILE *fp)
277 {
278         return symbol__fprintf_symname_offs(sym, NULL, fp);
279 }
280
281 void symbols__delete(struct rb_root *symbols)
282 {
283         struct symbol *pos;
284         struct rb_node *next = rb_first(symbols);
285
286         while (next) {
287                 pos = rb_entry(next, struct symbol, rb_node);
288                 next = rb_next(&pos->rb_node);
289                 rb_erase(&pos->rb_node, symbols);
290                 symbol__delete(pos);
291         }
292 }
293
294 void symbols__insert(struct rb_root *symbols, struct symbol *sym)
295 {
296         struct rb_node **p = &symbols->rb_node;
297         struct rb_node *parent = NULL;
298         const u64 ip = sym->start;
299         struct symbol *s;
300
301         while (*p != NULL) {
302                 parent = *p;
303                 s = rb_entry(parent, struct symbol, rb_node);
304                 if (ip < s->start)
305                         p = &(*p)->rb_left;
306                 else
307                         p = &(*p)->rb_right;
308         }
309         rb_link_node(&sym->rb_node, parent, p);
310         rb_insert_color(&sym->rb_node, symbols);
311 }
312
313 static struct symbol *symbols__find(struct rb_root *symbols, u64 ip)
314 {
315         struct rb_node *n;
316
317         if (symbols == NULL)
318                 return NULL;
319
320         n = symbols->rb_node;
321
322         while (n) {
323                 struct symbol *s = rb_entry(n, struct symbol, rb_node);
324
325                 if (ip < s->start)
326                         n = n->rb_left;
327                 else if (ip > s->end)
328                         n = n->rb_right;
329                 else
330                         return s;
331         }
332
333         return NULL;
334 }
335
336 static struct symbol *symbols__first(struct rb_root *symbols)
337 {
338         struct rb_node *n = rb_first(symbols);
339
340         if (n)
341                 return rb_entry(n, struct symbol, rb_node);
342
343         return NULL;
344 }
345
346 struct symbol_name_rb_node {
347         struct rb_node  rb_node;
348         struct symbol   sym;
349 };
350
351 static void symbols__insert_by_name(struct rb_root *symbols, struct symbol *sym)
352 {
353         struct rb_node **p = &symbols->rb_node;
354         struct rb_node *parent = NULL;
355         struct symbol_name_rb_node *symn, *s;
356
357         symn = container_of(sym, struct symbol_name_rb_node, sym);
358
359         while (*p != NULL) {
360                 parent = *p;
361                 s = rb_entry(parent, struct symbol_name_rb_node, rb_node);
362                 if (strcmp(sym->name, s->sym.name) < 0)
363                         p = &(*p)->rb_left;
364                 else
365                         p = &(*p)->rb_right;
366         }
367         rb_link_node(&symn->rb_node, parent, p);
368         rb_insert_color(&symn->rb_node, symbols);
369 }
370
371 static void symbols__sort_by_name(struct rb_root *symbols,
372                                   struct rb_root *source)
373 {
374         struct rb_node *nd;
375
376         for (nd = rb_first(source); nd; nd = rb_next(nd)) {
377                 struct symbol *pos = rb_entry(nd, struct symbol, rb_node);
378                 symbols__insert_by_name(symbols, pos);
379         }
380 }
381
382 static struct symbol *symbols__find_by_name(struct rb_root *symbols,
383                                             const char *name)
384 {
385         struct rb_node *n;
386
387         if (symbols == NULL)
388                 return NULL;
389
390         n = symbols->rb_node;
391
392         while (n) {
393                 struct symbol_name_rb_node *s;
394                 int cmp;
395
396                 s = rb_entry(n, struct symbol_name_rb_node, rb_node);
397                 cmp = strcmp(name, s->sym.name);
398
399                 if (cmp < 0)
400                         n = n->rb_left;
401                 else if (cmp > 0)
402                         n = n->rb_right;
403                 else
404                         return &s->sym;
405         }
406
407         return NULL;
408 }
409
410 struct symbol *dso__find_symbol(struct dso *dso,
411                                 enum map_type type, u64 addr)
412 {
413         return symbols__find(&dso->symbols[type], addr);
414 }
415
416 struct symbol *dso__first_symbol(struct dso *dso, enum map_type type)
417 {
418         return symbols__first(&dso->symbols[type]);
419 }
420
421 struct symbol *dso__find_symbol_by_name(struct dso *dso, enum map_type type,
422                                         const char *name)
423 {
424         return symbols__find_by_name(&dso->symbol_names[type], name);
425 }
426
427 void dso__sort_by_name(struct dso *dso, enum map_type type)
428 {
429         dso__set_sorted_by_name(dso, type);
430         return symbols__sort_by_name(&dso->symbol_names[type],
431                                      &dso->symbols[type]);
432 }
433
434 size_t dso__fprintf_symbols_by_name(struct dso *dso,
435                                     enum map_type type, FILE *fp)
436 {
437         size_t ret = 0;
438         struct rb_node *nd;
439         struct symbol_name_rb_node *pos;
440
441         for (nd = rb_first(&dso->symbol_names[type]); nd; nd = rb_next(nd)) {
442                 pos = rb_entry(nd, struct symbol_name_rb_node, rb_node);
443                 fprintf(fp, "%s\n", pos->sym.name);
444         }
445
446         return ret;
447 }
448
449 int kallsyms__parse(const char *filename, void *arg,
450                     int (*process_symbol)(void *arg, const char *name,
451                                           char type, u64 start))
452 {
453         char *line = NULL;
454         size_t n;
455         int err = -1;
456         FILE *file = fopen(filename, "r");
457
458         if (file == NULL)
459                 goto out_failure;
460
461         err = 0;
462
463         while (!feof(file)) {
464                 u64 start;
465                 int line_len, len;
466                 char symbol_type;
467                 char *symbol_name;
468
469                 line_len = getline(&line, &n, file);
470                 if (line_len < 0 || !line)
471                         break;
472
473                 line[--line_len] = '\0'; /* \n */
474
475                 len = hex2u64(line, &start);
476
477                 len++;
478                 if (len + 2 >= line_len)
479                         continue;
480
481                 symbol_type = line[len];
482                 len += 2;
483                 symbol_name = line + len;
484                 len = line_len - len;
485
486                 if (len >= KSYM_NAME_LEN) {
487                         err = -1;
488                         break;
489                 }
490
491                 err = process_symbol(arg, symbol_name,
492                                      symbol_type, start);
493                 if (err)
494                         break;
495         }
496
497         free(line);
498         fclose(file);
499         return err;
500
501 out_failure:
502         return -1;
503 }
504
505 int modules__parse(const char *filename, void *arg,
506                    int (*process_module)(void *arg, const char *name,
507                                          u64 start))
508 {
509         char *line = NULL;
510         size_t n;
511         FILE *file;
512         int err = 0;
513
514         file = fopen(filename, "r");
515         if (file == NULL)
516                 return -1;
517
518         while (1) {
519                 char name[PATH_MAX];
520                 u64 start;
521                 char *sep;
522                 ssize_t line_len;
523
524                 line_len = getline(&line, &n, file);
525                 if (line_len < 0) {
526                         if (feof(file))
527                                 break;
528                         err = -1;
529                         goto out;
530                 }
531
532                 if (!line) {
533                         err = -1;
534                         goto out;
535                 }
536
537                 line[--line_len] = '\0'; /* \n */
538
539                 sep = strrchr(line, 'x');
540                 if (sep == NULL)
541                         continue;
542
543                 hex2u64(sep + 1, &start);
544
545                 sep = strchr(line, ' ');
546                 if (sep == NULL)
547                         continue;
548
549                 *sep = '\0';
550
551                 scnprintf(name, sizeof(name), "[%s]", line);
552
553                 err = process_module(arg, name, start);
554                 if (err)
555                         break;
556         }
557 out:
558         free(line);
559         fclose(file);
560         return err;
561 }
562
563 struct process_kallsyms_args {
564         struct map *map;
565         struct dso *dso;
566 };
567
568 static u8 kallsyms2elf_type(char type)
569 {
570         if (type == 'W')
571                 return STB_WEAK;
572
573         return isupper(type) ? STB_GLOBAL : STB_LOCAL;
574 }
575
576 bool symbol__is_idle(struct symbol *sym)
577 {
578         const char * const idle_symbols[] = {
579                 "cpu_idle",
580                 "intel_idle",
581                 "default_idle",
582                 "native_safe_halt",
583                 "enter_idle",
584                 "exit_idle",
585                 "mwait_idle",
586                 "mwait_idle_with_hints",
587                 "poll_idle",
588                 "ppc64_runlatch_off",
589                 "pseries_dedicated_idle_sleep",
590                 NULL
591         };
592
593         int i;
594
595         if (!sym)
596                 return false;
597
598         for (i = 0; idle_symbols[i]; i++) {
599                 if (!strcmp(idle_symbols[i], sym->name))
600                         return true;
601         }
602
603         return false;
604 }
605
606 static int map__process_kallsym_symbol(void *arg, const char *name,
607                                        char type, u64 start)
608 {
609         struct symbol *sym;
610         struct process_kallsyms_args *a = arg;
611         struct rb_root *root = &a->dso->symbols[a->map->type];
612
613         if (!symbol_type__is_a(type, a->map->type))
614                 return 0;
615
616         /*
617          * module symbols are not sorted so we add all
618          * symbols, setting length to 0, and rely on
619          * symbols__fixup_end() to fix it up.
620          */
621         sym = symbol__new(start, 0, kallsyms2elf_type(type), name);
622         if (sym == NULL)
623                 return -ENOMEM;
624         /*
625          * We will pass the symbols to the filter later, in
626          * map__split_kallsyms, when we have split the maps per module
627          */
628         symbols__insert(root, sym);
629
630         return 0;
631 }
632
633 /*
634  * Loads the function entries in /proc/kallsyms into kernel_map->dso,
635  * so that we can in the next step set the symbol ->end address and then
636  * call kernel_maps__split_kallsyms.
637  */
638 static int dso__load_all_kallsyms(struct dso *dso, const char *filename,
639                                   struct map *map)
640 {
641         struct process_kallsyms_args args = { .map = map, .dso = dso, };
642         return kallsyms__parse(filename, &args, map__process_kallsym_symbol);
643 }
644
645 static int dso__split_kallsyms_for_kcore(struct dso *dso, struct map *map,
646                                          symbol_filter_t filter)
647 {
648         struct map_groups *kmaps = map__kmap(map)->kmaps;
649         struct map *curr_map;
650         struct symbol *pos;
651         int count = 0, moved = 0;
652         struct rb_root *root = &dso->symbols[map->type];
653         struct rb_node *next = rb_first(root);
654
655         while (next) {
656                 char *module;
657
658                 pos = rb_entry(next, struct symbol, rb_node);
659                 next = rb_next(&pos->rb_node);
660
661                 module = strchr(pos->name, '\t');
662                 if (module)
663                         *module = '\0';
664
665                 curr_map = map_groups__find(kmaps, map->type, pos->start);
666
667                 if (!curr_map || (filter && filter(curr_map, pos))) {
668                         rb_erase(&pos->rb_node, root);
669                         symbol__delete(pos);
670                 } else {
671                         pos->start -= curr_map->start - curr_map->pgoff;
672                         if (pos->end)
673                                 pos->end -= curr_map->start - curr_map->pgoff;
674                         if (curr_map != map) {
675                                 rb_erase(&pos->rb_node, root);
676                                 symbols__insert(
677                                         &curr_map->dso->symbols[curr_map->type],
678                                         pos);
679                                 ++moved;
680                         } else {
681                                 ++count;
682                         }
683                 }
684         }
685
686         /* Symbols have been adjusted */
687         dso->adjust_symbols = 1;
688
689         return count + moved;
690 }
691
692 /*
693  * Split the symbols into maps, making sure there are no overlaps, i.e. the
694  * kernel range is broken in several maps, named [kernel].N, as we don't have
695  * the original ELF section names vmlinux have.
696  */
697 static int dso__split_kallsyms(struct dso *dso, struct map *map,
698                                symbol_filter_t filter)
699 {
700         struct map_groups *kmaps = map__kmap(map)->kmaps;
701         struct machine *machine = kmaps->machine;
702         struct map *curr_map = map;
703         struct symbol *pos;
704         int count = 0, moved = 0;       
705         struct rb_root *root = &dso->symbols[map->type];
706         struct rb_node *next = rb_first(root);
707         int kernel_range = 0;
708
709         while (next) {
710                 char *module;
711
712                 pos = rb_entry(next, struct symbol, rb_node);
713                 next = rb_next(&pos->rb_node);
714
715                 module = strchr(pos->name, '\t');
716                 if (module) {
717                         if (!symbol_conf.use_modules)
718                                 goto discard_symbol;
719
720                         *module++ = '\0';
721
722                         if (strcmp(curr_map->dso->short_name, module)) {
723                                 if (curr_map != map &&
724                                     dso->kernel == DSO_TYPE_GUEST_KERNEL &&
725                                     machine__is_default_guest(machine)) {
726                                         /*
727                                          * We assume all symbols of a module are
728                                          * continuous in * kallsyms, so curr_map
729                                          * points to a module and all its
730                                          * symbols are in its kmap. Mark it as
731                                          * loaded.
732                                          */
733                                         dso__set_loaded(curr_map->dso,
734                                                         curr_map->type);
735                                 }
736
737                                 curr_map = map_groups__find_by_name(kmaps,
738                                                         map->type, module);
739                                 if (curr_map == NULL) {
740                                         pr_debug("%s/proc/{kallsyms,modules} "
741                                                  "inconsistency while looking "
742                                                  "for \"%s\" module!\n",
743                                                  machine->root_dir, module);
744                                         curr_map = map;
745                                         goto discard_symbol;
746                                 }
747
748                                 if (curr_map->dso->loaded &&
749                                     !machine__is_default_guest(machine))
750                                         goto discard_symbol;
751                         }
752                         /*
753                          * So that we look just like we get from .ko files,
754                          * i.e. not prelinked, relative to map->start.
755                          */
756                         pos->start = curr_map->map_ip(curr_map, pos->start);
757                         pos->end   = curr_map->map_ip(curr_map, pos->end);
758                 } else if (curr_map != map) {
759                         char dso_name[PATH_MAX];
760                         struct dso *ndso;
761
762                         if (count == 0) {
763                                 curr_map = map;
764                                 goto filter_symbol;
765                         }
766
767                         if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
768                                 snprintf(dso_name, sizeof(dso_name),
769                                         "[guest.kernel].%d",
770                                         kernel_range++);
771                         else
772                                 snprintf(dso_name, sizeof(dso_name),
773                                         "[kernel].%d",
774                                         kernel_range++);
775
776                         ndso = dso__new(dso_name);
777                         if (ndso == NULL)
778                                 return -1;
779
780                         ndso->kernel = dso->kernel;
781
782                         curr_map = map__new2(pos->start, ndso, map->type);
783                         if (curr_map == NULL) {
784                                 dso__delete(ndso);
785                                 return -1;
786                         }
787
788                         curr_map->map_ip = curr_map->unmap_ip = identity__map_ip;
789                         map_groups__insert(kmaps, curr_map);
790                         ++kernel_range;
791                 }
792 filter_symbol:
793                 if (filter && filter(curr_map, pos)) {
794 discard_symbol:         rb_erase(&pos->rb_node, root);
795                         symbol__delete(pos);
796                 } else {
797                         if (curr_map != map) {
798                                 rb_erase(&pos->rb_node, root);
799                                 symbols__insert(&curr_map->dso->symbols[curr_map->type], pos);
800                                 ++moved;
801                         } else
802                                 ++count;
803                 }
804         }
805
806         if (curr_map != map &&
807             dso->kernel == DSO_TYPE_GUEST_KERNEL &&
808             machine__is_default_guest(kmaps->machine)) {
809                 dso__set_loaded(curr_map->dso, curr_map->type);
810         }
811
812         return count + moved;
813 }
814
815 bool symbol__restricted_filename(const char *filename,
816                                  const char *restricted_filename)
817 {
818         bool restricted = false;
819
820         if (symbol_conf.kptr_restrict) {
821                 char *r = realpath(filename, NULL);
822
823                 if (r != NULL) {
824                         restricted = strcmp(r, restricted_filename) == 0;
825                         free(r);
826                         return restricted;
827                 }
828         }
829
830         return restricted;
831 }
832
833 struct module_info {
834         struct rb_node rb_node;
835         char *name;
836         u64 start;
837 };
838
839 static void add_module(struct module_info *mi, struct rb_root *modules)
840 {
841         struct rb_node **p = &modules->rb_node;
842         struct rb_node *parent = NULL;
843         struct module_info *m;
844
845         while (*p != NULL) {
846                 parent = *p;
847                 m = rb_entry(parent, struct module_info, rb_node);
848                 if (strcmp(mi->name, m->name) < 0)
849                         p = &(*p)->rb_left;
850                 else
851                         p = &(*p)->rb_right;
852         }
853         rb_link_node(&mi->rb_node, parent, p);
854         rb_insert_color(&mi->rb_node, modules);
855 }
856
857 static void delete_modules(struct rb_root *modules)
858 {
859         struct module_info *mi;
860         struct rb_node *next = rb_first(modules);
861
862         while (next) {
863                 mi = rb_entry(next, struct module_info, rb_node);
864                 next = rb_next(&mi->rb_node);
865                 rb_erase(&mi->rb_node, modules);
866                 free(mi->name);
867                 free(mi);
868         }
869 }
870
871 static struct module_info *find_module(const char *name,
872                                        struct rb_root *modules)
873 {
874         struct rb_node *n = modules->rb_node;
875
876         while (n) {
877                 struct module_info *m;
878                 int cmp;
879
880                 m = rb_entry(n, struct module_info, rb_node);
881                 cmp = strcmp(name, m->name);
882                 if (cmp < 0)
883                         n = n->rb_left;
884                 else if (cmp > 0)
885                         n = n->rb_right;
886                 else
887                         return m;
888         }
889
890         return NULL;
891 }
892
893 static int __read_proc_modules(void *arg, const char *name, u64 start)
894 {
895         struct rb_root *modules = arg;
896         struct module_info *mi;
897
898         mi = zalloc(sizeof(struct module_info));
899         if (!mi)
900                 return -ENOMEM;
901
902         mi->name = strdup(name);
903         mi->start = start;
904
905         if (!mi->name) {
906                 free(mi);
907                 return -ENOMEM;
908         }
909
910         add_module(mi, modules);
911
912         return 0;
913 }
914
915 static int read_proc_modules(const char *filename, struct rb_root *modules)
916 {
917         if (symbol__restricted_filename(filename, "/proc/modules"))
918                 return -1;
919
920         if (modules__parse(filename, modules, __read_proc_modules)) {
921                 delete_modules(modules);
922                 return -1;
923         }
924
925         return 0;
926 }
927
928 int compare_proc_modules(const char *from, const char *to)
929 {
930         struct rb_root from_modules = RB_ROOT;
931         struct rb_root to_modules = RB_ROOT;
932         struct rb_node *from_node, *to_node;
933         struct module_info *from_m, *to_m;
934         int ret = -1;
935
936         if (read_proc_modules(from, &from_modules))
937                 return -1;
938
939         if (read_proc_modules(to, &to_modules))
940                 goto out_delete_from;
941
942         from_node = rb_first(&from_modules);
943         to_node = rb_first(&to_modules);
944         while (from_node) {
945                 if (!to_node)
946                         break;
947
948                 from_m = rb_entry(from_node, struct module_info, rb_node);
949                 to_m = rb_entry(to_node, struct module_info, rb_node);
950
951                 if (from_m->start != to_m->start ||
952                     strcmp(from_m->name, to_m->name))
953                         break;
954
955                 from_node = rb_next(from_node);
956                 to_node = rb_next(to_node);
957         }
958
959         if (!from_node && !to_node)
960                 ret = 0;
961
962         delete_modules(&to_modules);
963 out_delete_from:
964         delete_modules(&from_modules);
965
966         return ret;
967 }
968
969 static int do_validate_kcore_modules(const char *filename, struct map *map,
970                                   struct map_groups *kmaps)
971 {
972         struct rb_root modules = RB_ROOT;
973         struct map *old_map;
974         int err;
975
976         err = read_proc_modules(filename, &modules);
977         if (err)
978                 return err;
979
980         old_map = map_groups__first(kmaps, map->type);
981         while (old_map) {
982                 struct map *next = map_groups__next(old_map);
983                 struct module_info *mi;
984
985                 if (old_map == map || old_map->start == map->start) {
986                         /* The kernel map */
987                         old_map = next;
988                         continue;
989                 }
990
991                 /* Module must be in memory at the same address */
992                 mi = find_module(old_map->dso->short_name, &modules);
993                 if (!mi || mi->start != old_map->start) {
994                         err = -EINVAL;
995                         goto out;
996                 }
997
998                 old_map = next;
999         }
1000 out:
1001         delete_modules(&modules);
1002         return err;
1003 }
1004
1005 /*
1006  * If kallsyms is referenced by name then we look for filename in the same
1007  * directory.
1008  */
1009 static bool filename_from_kallsyms_filename(char *filename,
1010                                             const char *base_name,
1011                                             const char *kallsyms_filename)
1012 {
1013         char *name;
1014
1015         strcpy(filename, kallsyms_filename);
1016         name = strrchr(filename, '/');
1017         if (!name)
1018                 return false;
1019
1020         name += 1;
1021
1022         if (!strcmp(name, "kallsyms")) {
1023                 strcpy(name, base_name);
1024                 return true;
1025         }
1026
1027         return false;
1028 }
1029
1030 static int validate_kcore_modules(const char *kallsyms_filename,
1031                                   struct map *map)
1032 {
1033         struct map_groups *kmaps = map__kmap(map)->kmaps;
1034         char modules_filename[PATH_MAX];
1035
1036         if (!filename_from_kallsyms_filename(modules_filename, "modules",
1037                                              kallsyms_filename))
1038                 return -EINVAL;
1039
1040         if (do_validate_kcore_modules(modules_filename, map, kmaps))
1041                 return -EINVAL;
1042
1043         return 0;
1044 }
1045
1046 struct kcore_mapfn_data {
1047         struct dso *dso;
1048         enum map_type type;
1049         struct list_head maps;
1050 };
1051
1052 static int kcore_mapfn(u64 start, u64 len, u64 pgoff, void *data)
1053 {
1054         struct kcore_mapfn_data *md = data;
1055         struct map *map;
1056
1057         map = map__new2(start, md->dso, md->type);
1058         if (map == NULL)
1059                 return -ENOMEM;
1060
1061         map->end = map->start + len;
1062         map->pgoff = pgoff;
1063
1064         list_add(&map->node, &md->maps);
1065
1066         return 0;
1067 }
1068
1069 static int dso__load_kcore(struct dso *dso, struct map *map,
1070                            const char *kallsyms_filename)
1071 {
1072         struct map_groups *kmaps = map__kmap(map)->kmaps;
1073         struct machine *machine = kmaps->machine;
1074         struct kcore_mapfn_data md;
1075         struct map *old_map, *new_map, *replacement_map = NULL;
1076         bool is_64_bit;
1077         int err, fd;
1078         char kcore_filename[PATH_MAX];
1079         struct symbol *sym;
1080
1081         /* This function requires that the map is the kernel map */
1082         if (map != machine->vmlinux_maps[map->type])
1083                 return -EINVAL;
1084
1085         if (!filename_from_kallsyms_filename(kcore_filename, "kcore",
1086                                              kallsyms_filename))
1087                 return -EINVAL;
1088
1089         /* All modules must be present at their original addresses */
1090         if (validate_kcore_modules(kallsyms_filename, map))
1091                 return -EINVAL;
1092
1093         md.dso = dso;
1094         md.type = map->type;
1095         INIT_LIST_HEAD(&md.maps);
1096
1097         fd = open(kcore_filename, O_RDONLY);
1098         if (fd < 0)
1099                 return -EINVAL;
1100
1101         /* Read new maps into temporary lists */
1102         err = file__read_maps(fd, md.type == MAP__FUNCTION, kcore_mapfn, &md,
1103                               &is_64_bit);
1104         if (err)
1105                 goto out_err;
1106
1107         if (list_empty(&md.maps)) {
1108                 err = -EINVAL;
1109                 goto out_err;
1110         }
1111
1112         /* Remove old maps */
1113         old_map = map_groups__first(kmaps, map->type);
1114         while (old_map) {
1115                 struct map *next = map_groups__next(old_map);
1116
1117                 if (old_map != map)
1118                         map_groups__remove(kmaps, old_map);
1119                 old_map = next;
1120         }
1121
1122         /* Find the kernel map using the first symbol */
1123         sym = dso__first_symbol(dso, map->type);
1124         list_for_each_entry(new_map, &md.maps, node) {
1125                 if (sym && sym->start >= new_map->start &&
1126                     sym->start < new_map->end) {
1127                         replacement_map = new_map;
1128                         break;
1129                 }
1130         }
1131
1132         if (!replacement_map)
1133                 replacement_map = list_entry(md.maps.next, struct map, node);
1134
1135         /* Add new maps */
1136         while (!list_empty(&md.maps)) {
1137                 new_map = list_entry(md.maps.next, struct map, node);
1138                 list_del(&new_map->node);
1139                 if (new_map == replacement_map) {
1140                         map->start      = new_map->start;
1141                         map->end        = new_map->end;
1142                         map->pgoff      = new_map->pgoff;
1143                         map->map_ip     = new_map->map_ip;
1144                         map->unmap_ip   = new_map->unmap_ip;
1145                         map__delete(new_map);
1146                         /* Ensure maps are correctly ordered */
1147                         map_groups__remove(kmaps, map);
1148                         map_groups__insert(kmaps, map);
1149                 } else {
1150                         map_groups__insert(kmaps, new_map);
1151                 }
1152         }
1153
1154         /*
1155          * Set the data type and long name so that kcore can be read via
1156          * dso__data_read_addr().
1157          */
1158         if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
1159                 dso->data_type = DSO_BINARY_TYPE__GUEST_KCORE;
1160         else
1161                 dso->data_type = DSO_BINARY_TYPE__KCORE;
1162         dso__set_long_name(dso, strdup(kcore_filename), true);
1163
1164         close(fd);
1165
1166         if (map->type == MAP__FUNCTION)
1167                 pr_debug("Using %s for kernel object code\n", kcore_filename);
1168         else
1169                 pr_debug("Using %s for kernel data\n", kcore_filename);
1170
1171         return 0;
1172
1173 out_err:
1174         while (!list_empty(&md.maps)) {
1175                 map = list_entry(md.maps.next, struct map, node);
1176                 list_del(&map->node);
1177                 map__delete(map);
1178         }
1179         close(fd);
1180         return -EINVAL;
1181 }
1182
1183 int dso__load_kallsyms(struct dso *dso, const char *filename,
1184                        struct map *map, symbol_filter_t filter)
1185 {
1186         if (symbol__restricted_filename(filename, "/proc/kallsyms"))
1187                 return -1;
1188
1189         if (dso__load_all_kallsyms(dso, filename, map) < 0)
1190                 return -1;
1191
1192         symbols__fixup_duplicate(&dso->symbols[map->type]);
1193         symbols__fixup_end(&dso->symbols[map->type]);
1194
1195         if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
1196                 dso->symtab_type = DSO_BINARY_TYPE__GUEST_KALLSYMS;
1197         else
1198                 dso->symtab_type = DSO_BINARY_TYPE__KALLSYMS;
1199
1200         if (!dso__load_kcore(dso, map, filename))
1201                 return dso__split_kallsyms_for_kcore(dso, map, filter);
1202         else
1203                 return dso__split_kallsyms(dso, map, filter);
1204 }
1205
1206 static int dso__load_perf_map(struct dso *dso, struct map *map,
1207                               symbol_filter_t filter)
1208 {
1209         char *line = NULL;
1210         size_t n;
1211         FILE *file;
1212         int nr_syms = 0;
1213
1214         file = fopen(dso->long_name, "r");
1215         if (file == NULL)
1216                 goto out_failure;
1217
1218         while (!feof(file)) {
1219                 u64 start, size;
1220                 struct symbol *sym;
1221                 int line_len, len;
1222
1223                 line_len = getline(&line, &n, file);
1224                 if (line_len < 0)
1225                         break;
1226
1227                 if (!line)
1228                         goto out_failure;
1229
1230                 line[--line_len] = '\0'; /* \n */
1231
1232                 len = hex2u64(line, &start);
1233
1234                 len++;
1235                 if (len + 2 >= line_len)
1236                         continue;
1237
1238                 len += hex2u64(line + len, &size);
1239
1240                 len++;
1241                 if (len + 2 >= line_len)
1242                         continue;
1243
1244                 sym = symbol__new(start, size, STB_GLOBAL, line + len);
1245
1246                 if (sym == NULL)
1247                         goto out_delete_line;
1248
1249                 if (filter && filter(map, sym))
1250                         symbol__delete(sym);
1251                 else {
1252                         symbols__insert(&dso->symbols[map->type], sym);
1253                         nr_syms++;
1254                 }
1255         }
1256
1257         free(line);
1258         fclose(file);
1259
1260         return nr_syms;
1261
1262 out_delete_line:
1263         free(line);
1264 out_failure:
1265         return -1;
1266 }
1267
1268 int dso__load(struct dso *dso, struct map *map, symbol_filter_t filter)
1269 {
1270         char *name;
1271         int ret = -1;
1272         u_int i;
1273         struct machine *machine;
1274         char *root_dir = (char *) "";
1275         int ss_pos = 0;
1276         struct symsrc ss_[2];
1277         struct symsrc *syms_ss = NULL, *runtime_ss = NULL;
1278
1279         dso__set_loaded(dso, map->type);
1280
1281         if (dso->kernel == DSO_TYPE_KERNEL)
1282                 return dso__load_kernel_sym(dso, map, filter);
1283         else if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
1284                 return dso__load_guest_kernel_sym(dso, map, filter);
1285
1286         if (map->groups && map->groups->machine)
1287                 machine = map->groups->machine;
1288         else
1289                 machine = NULL;
1290
1291         dso->adjust_symbols = 0;
1292
1293         if (strncmp(dso->name, "/tmp/perf-", 10) == 0) {
1294                 struct stat st;
1295
1296                 if (lstat(dso->name, &st) < 0)
1297                         return -1;
1298
1299                 if (st.st_uid && (st.st_uid != geteuid())) {
1300                         pr_warning("File %s not owned by current user or root, "
1301                                 "ignoring it.\n", dso->name);
1302                         return -1;
1303                 }
1304
1305                 ret = dso__load_perf_map(dso, map, filter);
1306                 dso->symtab_type = ret > 0 ? DSO_BINARY_TYPE__JAVA_JIT :
1307                                              DSO_BINARY_TYPE__NOT_FOUND;
1308                 return ret;
1309         }
1310
1311         if (machine)
1312                 root_dir = machine->root_dir;
1313
1314         name = malloc(PATH_MAX);
1315         if (!name)
1316                 return -1;
1317
1318         /* Iterate over candidate debug images.
1319          * Keep track of "interesting" ones (those which have a symtab, dynsym,
1320          * and/or opd section) for processing.
1321          */
1322         for (i = 0; i < DSO_BINARY_TYPE__SYMTAB_CNT; i++) {
1323                 struct symsrc *ss = &ss_[ss_pos];
1324                 bool next_slot = false;
1325
1326                 enum dso_binary_type symtab_type = binary_type_symtab[i];
1327
1328                 if (dso__binary_type_file(dso, symtab_type,
1329                                           root_dir, name, PATH_MAX))
1330                         continue;
1331
1332                 /* Name is now the name of the next image to try */
1333                 if (symsrc__init(ss, dso, name, symtab_type) < 0)
1334                         continue;
1335
1336                 if (!syms_ss && symsrc__has_symtab(ss)) {
1337                         syms_ss = ss;
1338                         next_slot = true;
1339                         if (!dso->symsrc_filename)
1340                                 dso->symsrc_filename = strdup(name);
1341                 }
1342
1343                 if (!runtime_ss && symsrc__possibly_runtime(ss)) {
1344                         runtime_ss = ss;
1345                         next_slot = true;
1346                 }
1347
1348                 if (next_slot) {
1349                         ss_pos++;
1350
1351                         if (syms_ss && runtime_ss)
1352                                 break;
1353                 }
1354
1355         }
1356
1357         if (!runtime_ss && !syms_ss)
1358                 goto out_free;
1359
1360         if (runtime_ss && !syms_ss) {
1361                 syms_ss = runtime_ss;
1362         }
1363
1364         /* We'll have to hope for the best */
1365         if (!runtime_ss && syms_ss)
1366                 runtime_ss = syms_ss;
1367
1368         if (syms_ss) {
1369                 int km;
1370
1371                 km = dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE ||
1372                      dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE;
1373                 ret = dso__load_sym(dso, map, syms_ss, runtime_ss, filter, km);
1374         } else {
1375                 ret = -1;
1376         }
1377
1378         if (ret > 0) {
1379                 int nr_plt;
1380
1381                 nr_plt = dso__synthesize_plt_symbols(dso, runtime_ss, map, filter);
1382                 if (nr_plt > 0)
1383                         ret += nr_plt;
1384         }
1385
1386         for (; ss_pos > 0; ss_pos--)
1387                 symsrc__destroy(&ss_[ss_pos - 1]);
1388 out_free:
1389         free(name);
1390         if (ret < 0 && strstr(dso->name, " (deleted)") != NULL)
1391                 return 0;
1392         return ret;
1393 }
1394
1395 struct map *map_groups__find_by_name(struct map_groups *mg,
1396                                      enum map_type type, const char *name)
1397 {
1398         struct rb_node *nd;
1399
1400         for (nd = rb_first(&mg->maps[type]); nd; nd = rb_next(nd)) {
1401                 struct map *map = rb_entry(nd, struct map, rb_node);
1402
1403                 if (map->dso && strcmp(map->dso->short_name, name) == 0)
1404                         return map;
1405         }
1406
1407         return NULL;
1408 }
1409
1410 int dso__load_vmlinux(struct dso *dso, struct map *map,
1411                       const char *vmlinux, bool vmlinux_allocated,
1412                       symbol_filter_t filter)
1413 {
1414         int err = -1;
1415         struct symsrc ss;
1416         char symfs_vmlinux[PATH_MAX];
1417         enum dso_binary_type symtab_type;
1418
1419         if (vmlinux[0] == '/')
1420                 snprintf(symfs_vmlinux, sizeof(symfs_vmlinux), "%s", vmlinux);
1421         else
1422                 snprintf(symfs_vmlinux, sizeof(symfs_vmlinux), "%s%s",
1423                          symbol_conf.symfs, vmlinux);
1424
1425         if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
1426                 symtab_type = DSO_BINARY_TYPE__GUEST_VMLINUX;
1427         else
1428                 symtab_type = DSO_BINARY_TYPE__VMLINUX;
1429
1430         if (symsrc__init(&ss, dso, symfs_vmlinux, symtab_type))
1431                 return -1;
1432
1433         err = dso__load_sym(dso, map, &ss, &ss, filter, 0);
1434         symsrc__destroy(&ss);
1435
1436         if (err > 0) {
1437                 if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
1438                         dso->data_type = DSO_BINARY_TYPE__GUEST_VMLINUX;
1439                 else
1440                         dso->data_type = DSO_BINARY_TYPE__VMLINUX;
1441                 dso__set_long_name(dso, vmlinux, vmlinux_allocated);
1442                 dso__set_loaded(dso, map->type);
1443                 pr_debug("Using %s for symbols\n", symfs_vmlinux);
1444         }
1445
1446         return err;
1447 }
1448
1449 int dso__load_vmlinux_path(struct dso *dso, struct map *map,
1450                            symbol_filter_t filter)
1451 {
1452         int i, err = 0;
1453         char *filename;
1454
1455         pr_debug("Looking at the vmlinux_path (%d entries long)\n",
1456                  vmlinux_path__nr_entries + 1);
1457
1458         filename = dso__build_id_filename(dso, NULL, 0);
1459         if (filename != NULL) {
1460                 err = dso__load_vmlinux(dso, map, filename, true, filter);
1461                 if (err > 0)
1462                         goto out;
1463                 free(filename);
1464         }
1465
1466         for (i = 0; i < vmlinux_path__nr_entries; ++i) {
1467                 err = dso__load_vmlinux(dso, map, vmlinux_path[i], false, filter);
1468                 if (err > 0)
1469                         break;
1470         }
1471 out:
1472         return err;
1473 }
1474
1475 static int find_matching_kcore(struct map *map, char *dir, size_t dir_sz)
1476 {
1477         char kallsyms_filename[PATH_MAX];
1478         struct dirent *dent;
1479         int ret = -1;
1480         DIR *d;
1481
1482         d = opendir(dir);
1483         if (!d)
1484                 return -1;
1485
1486         while (1) {
1487                 dent = readdir(d);
1488                 if (!dent)
1489                         break;
1490                 if (dent->d_type != DT_DIR)
1491                         continue;
1492                 scnprintf(kallsyms_filename, sizeof(kallsyms_filename),
1493                           "%s/%s/kallsyms", dir, dent->d_name);
1494                 if (!validate_kcore_modules(kallsyms_filename, map)) {
1495                         strlcpy(dir, kallsyms_filename, dir_sz);
1496                         ret = 0;
1497                         break;
1498                 }
1499         }
1500
1501         closedir(d);
1502
1503         return ret;
1504 }
1505
1506 static char *dso__find_kallsyms(struct dso *dso, struct map *map)
1507 {
1508         u8 host_build_id[BUILD_ID_SIZE];
1509         char sbuild_id[BUILD_ID_SIZE * 2 + 1];
1510         bool is_host = false;
1511         char path[PATH_MAX];
1512
1513         if (!dso->has_build_id) {
1514                 /*
1515                  * Last resort, if we don't have a build-id and couldn't find
1516                  * any vmlinux file, try the running kernel kallsyms table.
1517                  */
1518                 goto proc_kallsyms;
1519         }
1520
1521         if (sysfs__read_build_id("/sys/kernel/notes", host_build_id,
1522                                  sizeof(host_build_id)) == 0)
1523                 is_host = dso__build_id_equal(dso, host_build_id);
1524
1525         build_id__sprintf(dso->build_id, sizeof(dso->build_id), sbuild_id);
1526
1527         scnprintf(path, sizeof(path), "%s/[kernel.kcore]/%s", buildid_dir,
1528                   sbuild_id);
1529
1530         /* Use /proc/kallsyms if possible */
1531         if (is_host) {
1532                 DIR *d;
1533                 int fd;
1534
1535                 /* If no cached kcore go with /proc/kallsyms */
1536                 d = opendir(path);
1537                 if (!d)
1538                         goto proc_kallsyms;
1539                 closedir(d);
1540
1541                 /*
1542                  * Do not check the build-id cache, until we know we cannot use
1543                  * /proc/kcore.
1544                  */
1545                 fd = open("/proc/kcore", O_RDONLY);
1546                 if (fd != -1) {
1547                         close(fd);
1548                         /* If module maps match go with /proc/kallsyms */
1549                         if (!validate_kcore_modules("/proc/kallsyms", map))
1550                                 goto proc_kallsyms;
1551                 }
1552
1553                 /* Find kallsyms in build-id cache with kcore */
1554                 if (!find_matching_kcore(map, path, sizeof(path)))
1555                         return strdup(path);
1556
1557                 goto proc_kallsyms;
1558         }
1559
1560         /* Find kallsyms in build-id cache with kcore */
1561         if (!find_matching_kcore(map, path, sizeof(path)))
1562                 return strdup(path);
1563
1564         scnprintf(path, sizeof(path), "%s/[kernel.kallsyms]/%s",
1565                   buildid_dir, sbuild_id);
1566
1567         if (access(path, F_OK)) {
1568                 pr_err("No kallsyms or vmlinux with build-id %s was found\n",
1569                        sbuild_id);
1570                 return NULL;
1571         }
1572
1573         return strdup(path);
1574
1575 proc_kallsyms:
1576         return strdup("/proc/kallsyms");
1577 }
1578
1579 static int dso__load_kernel_sym(struct dso *dso, struct map *map,
1580                                 symbol_filter_t filter)
1581 {
1582         int err;
1583         const char *kallsyms_filename = NULL;
1584         char *kallsyms_allocated_filename = NULL;
1585         /*
1586          * Step 1: if the user specified a kallsyms or vmlinux filename, use
1587          * it and only it, reporting errors to the user if it cannot be used.
1588          *
1589          * For instance, try to analyse an ARM perf.data file _without_ a
1590          * build-id, or if the user specifies the wrong path to the right
1591          * vmlinux file, obviously we can't fallback to another vmlinux (a
1592          * x86_86 one, on the machine where analysis is being performed, say),
1593          * or worse, /proc/kallsyms.
1594          *
1595          * If the specified file _has_ a build-id and there is a build-id
1596          * section in the perf.data file, we will still do the expected
1597          * validation in dso__load_vmlinux and will bail out if they don't
1598          * match.
1599          */
1600         if (symbol_conf.kallsyms_name != NULL) {
1601                 kallsyms_filename = symbol_conf.kallsyms_name;
1602                 goto do_kallsyms;
1603         }
1604
1605         if (!symbol_conf.ignore_vmlinux && symbol_conf.vmlinux_name != NULL) {
1606                 return dso__load_vmlinux(dso, map, symbol_conf.vmlinux_name,
1607                                          false, filter);
1608         }
1609
1610         if (!symbol_conf.ignore_vmlinux && vmlinux_path != NULL) {
1611                 err = dso__load_vmlinux_path(dso, map, filter);
1612                 if (err > 0)
1613                         return err;
1614         }
1615
1616         /* do not try local files if a symfs was given */
1617         if (symbol_conf.symfs[0] != 0)
1618                 return -1;
1619
1620         kallsyms_allocated_filename = dso__find_kallsyms(dso, map);
1621         if (!kallsyms_allocated_filename)
1622                 return -1;
1623
1624         kallsyms_filename = kallsyms_allocated_filename;
1625
1626 do_kallsyms:
1627         err = dso__load_kallsyms(dso, kallsyms_filename, map, filter);
1628         if (err > 0)
1629                 pr_debug("Using %s for symbols\n", kallsyms_filename);
1630         free(kallsyms_allocated_filename);
1631
1632         if (err > 0 && !dso__is_kcore(dso)) {
1633                 dso__set_long_name(dso, "[kernel.kallsyms]", false);
1634                 map__fixup_start(map);
1635                 map__fixup_end(map);
1636         }
1637
1638         return err;
1639 }
1640
1641 static int dso__load_guest_kernel_sym(struct dso *dso, struct map *map,
1642                                       symbol_filter_t filter)
1643 {
1644         int err;
1645         const char *kallsyms_filename = NULL;
1646         struct machine *machine;
1647         char path[PATH_MAX];
1648
1649         if (!map->groups) {
1650                 pr_debug("Guest kernel map hasn't the point to groups\n");
1651                 return -1;
1652         }
1653         machine = map->groups->machine;
1654
1655         if (machine__is_default_guest(machine)) {
1656                 /*
1657                  * if the user specified a vmlinux filename, use it and only
1658                  * it, reporting errors to the user if it cannot be used.
1659                  * Or use file guest_kallsyms inputted by user on commandline
1660                  */
1661                 if (symbol_conf.default_guest_vmlinux_name != NULL) {
1662                         err = dso__load_vmlinux(dso, map,
1663                                                 symbol_conf.default_guest_vmlinux_name,
1664                                                 false, filter);
1665                         return err;
1666                 }
1667
1668                 kallsyms_filename = symbol_conf.default_guest_kallsyms;
1669                 if (!kallsyms_filename)
1670                         return -1;
1671         } else {
1672                 sprintf(path, "%s/proc/kallsyms", machine->root_dir);
1673                 kallsyms_filename = path;
1674         }
1675
1676         err = dso__load_kallsyms(dso, kallsyms_filename, map, filter);
1677         if (err > 0)
1678                 pr_debug("Using %s for symbols\n", kallsyms_filename);
1679         if (err > 0 && !dso__is_kcore(dso)) {
1680                 machine__mmap_name(machine, path, sizeof(path));
1681                 dso__set_long_name(dso, strdup(path), true);
1682                 map__fixup_start(map);
1683                 map__fixup_end(map);
1684         }
1685
1686         return err;
1687 }
1688
1689 static void vmlinux_path__exit(void)
1690 {
1691         while (--vmlinux_path__nr_entries >= 0) {
1692                 free(vmlinux_path[vmlinux_path__nr_entries]);
1693                 vmlinux_path[vmlinux_path__nr_entries] = NULL;
1694         }
1695
1696         free(vmlinux_path);
1697         vmlinux_path = NULL;
1698 }
1699
1700 static int vmlinux_path__init(void)
1701 {
1702         struct utsname uts;
1703         char bf[PATH_MAX];
1704
1705         vmlinux_path = malloc(sizeof(char *) * 5);
1706         if (vmlinux_path == NULL)
1707                 return -1;
1708
1709         vmlinux_path[vmlinux_path__nr_entries] = strdup("vmlinux");
1710         if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
1711                 goto out_fail;
1712         ++vmlinux_path__nr_entries;
1713         vmlinux_path[vmlinux_path__nr_entries] = strdup("/boot/vmlinux");
1714         if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
1715                 goto out_fail;
1716         ++vmlinux_path__nr_entries;
1717
1718         /* only try running kernel version if no symfs was given */
1719         if (symbol_conf.symfs[0] != 0)
1720                 return 0;
1721
1722         if (uname(&uts) < 0)
1723                 return -1;
1724
1725         snprintf(bf, sizeof(bf), "/boot/vmlinux-%s", uts.release);
1726         vmlinux_path[vmlinux_path__nr_entries] = strdup(bf);
1727         if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
1728                 goto out_fail;
1729         ++vmlinux_path__nr_entries;
1730         snprintf(bf, sizeof(bf), "/lib/modules/%s/build/vmlinux", uts.release);
1731         vmlinux_path[vmlinux_path__nr_entries] = strdup(bf);
1732         if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
1733                 goto out_fail;
1734         ++vmlinux_path__nr_entries;
1735         snprintf(bf, sizeof(bf), "/usr/lib/debug/lib/modules/%s/vmlinux",
1736                  uts.release);
1737         vmlinux_path[vmlinux_path__nr_entries] = strdup(bf);
1738         if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
1739                 goto out_fail;
1740         ++vmlinux_path__nr_entries;
1741
1742         return 0;
1743
1744 out_fail:
1745         vmlinux_path__exit();
1746         return -1;
1747 }
1748
1749 int setup_list(struct strlist **list, const char *list_str,
1750                       const char *list_name)
1751 {
1752         if (list_str == NULL)
1753                 return 0;
1754
1755         *list = strlist__new(true, list_str);
1756         if (!*list) {
1757                 pr_err("problems parsing %s list\n", list_name);
1758                 return -1;
1759         }
1760         return 0;
1761 }
1762
1763 static bool symbol__read_kptr_restrict(void)
1764 {
1765         bool value = false;
1766
1767         if (geteuid() != 0) {
1768                 FILE *fp = fopen("/proc/sys/kernel/kptr_restrict", "r");
1769                 if (fp != NULL) {
1770                         char line[8];
1771
1772                         if (fgets(line, sizeof(line), fp) != NULL)
1773                                 value = atoi(line) != 0;
1774
1775                         fclose(fp);
1776                 }
1777         }
1778
1779         return value;
1780 }
1781
1782 int symbol__init(void)
1783 {
1784         const char *symfs;
1785
1786         if (symbol_conf.initialized)
1787                 return 0;
1788
1789         symbol_conf.priv_size = PERF_ALIGN(symbol_conf.priv_size, sizeof(u64));
1790
1791         symbol__elf_init();
1792
1793         if (symbol_conf.sort_by_name)
1794                 symbol_conf.priv_size += (sizeof(struct symbol_name_rb_node) -
1795                                           sizeof(struct symbol));
1796
1797         if (symbol_conf.try_vmlinux_path && vmlinux_path__init() < 0)
1798                 return -1;
1799
1800         if (symbol_conf.field_sep && *symbol_conf.field_sep == '.') {
1801                 pr_err("'.' is the only non valid --field-separator argument\n");
1802                 return -1;
1803         }
1804
1805         if (setup_list(&symbol_conf.dso_list,
1806                        symbol_conf.dso_list_str, "dso") < 0)
1807                 return -1;
1808
1809         if (setup_list(&symbol_conf.comm_list,
1810                        symbol_conf.comm_list_str, "comm") < 0)
1811                 goto out_free_dso_list;
1812
1813         if (setup_list(&symbol_conf.sym_list,
1814                        symbol_conf.sym_list_str, "symbol") < 0)
1815                 goto out_free_comm_list;
1816
1817         /*
1818          * A path to symbols of "/" is identical to ""
1819          * reset here for simplicity.
1820          */
1821         symfs = realpath(symbol_conf.symfs, NULL);
1822         if (symfs == NULL)
1823                 symfs = symbol_conf.symfs;
1824         if (strcmp(symfs, "/") == 0)
1825                 symbol_conf.symfs = "";
1826         if (symfs != symbol_conf.symfs)
1827                 free((void *)symfs);
1828
1829         symbol_conf.kptr_restrict = symbol__read_kptr_restrict();
1830
1831         symbol_conf.initialized = true;
1832         return 0;
1833
1834 out_free_comm_list:
1835         strlist__delete(symbol_conf.comm_list);
1836 out_free_dso_list:
1837         strlist__delete(symbol_conf.dso_list);
1838         return -1;
1839 }
1840
1841 void symbol__exit(void)
1842 {
1843         if (!symbol_conf.initialized)
1844                 return;
1845         strlist__delete(symbol_conf.sym_list);
1846         strlist__delete(symbol_conf.dso_list);
1847         strlist__delete(symbol_conf.comm_list);
1848         vmlinux_path__exit();
1849         symbol_conf.sym_list = symbol_conf.dso_list = symbol_conf.comm_list = NULL;
1850         symbol_conf.initialized = false;
1851 }