Merge branch 'x86-ras-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[sfrench/cifs-2.6.git] / tools / perf / util / map.c
1 #include "symbol.h"
2 #include <errno.h>
3 #include <inttypes.h>
4 #include <limits.h>
5 #include <stdlib.h>
6 #include <string.h>
7 #include <stdio.h>
8 #include <unistd.h>
9 #include "map.h"
10 #include "thread.h"
11 #include "strlist.h"
12 #include "vdso.h"
13 #include "build-id.h"
14 #include "util.h"
15 #include "debug.h"
16 #include "machine.h"
17 #include <linux/string.h>
18
19 const char *map_type__name[MAP__NR_TYPES] = {
20         [MAP__FUNCTION] = "Functions",
21         [MAP__VARIABLE] = "Variables",
22 };
23
24 static inline int is_anon_memory(const char *filename)
25 {
26         return !strcmp(filename, "//anon") ||
27                !strcmp(filename, "/dev/zero (deleted)") ||
28                !strcmp(filename, "/anon_hugepage (deleted)");
29 }
30
31 static inline int is_no_dso_memory(const char *filename)
32 {
33         return !strncmp(filename, "[stack", 6) ||
34                !strcmp(filename, "[heap]");
35 }
36
37 static inline int is_android_lib(const char *filename)
38 {
39         return !strncmp(filename, "/data/app-lib", 13) ||
40                !strncmp(filename, "/system/lib", 11);
41 }
42
43 static inline bool replace_android_lib(const char *filename, char *newfilename)
44 {
45         const char *libname;
46         char *app_abi;
47         size_t app_abi_length, new_length;
48         size_t lib_length = 0;
49
50         libname  = strrchr(filename, '/');
51         if (libname)
52                 lib_length = strlen(libname);
53
54         app_abi = getenv("APP_ABI");
55         if (!app_abi)
56                 return false;
57
58         app_abi_length = strlen(app_abi);
59
60         if (!strncmp(filename, "/data/app-lib", 13)) {
61                 char *apk_path;
62
63                 if (!app_abi_length)
64                         return false;
65
66                 new_length = 7 + app_abi_length + lib_length;
67
68                 apk_path = getenv("APK_PATH");
69                 if (apk_path) {
70                         new_length += strlen(apk_path) + 1;
71                         if (new_length > PATH_MAX)
72                                 return false;
73                         snprintf(newfilename, new_length,
74                                  "%s/libs/%s/%s", apk_path, app_abi, libname);
75                 } else {
76                         if (new_length > PATH_MAX)
77                                 return false;
78                         snprintf(newfilename, new_length,
79                                  "libs/%s/%s", app_abi, libname);
80                 }
81                 return true;
82         }
83
84         if (!strncmp(filename, "/system/lib/", 11)) {
85                 char *ndk, *app;
86                 const char *arch;
87                 size_t ndk_length;
88                 size_t app_length;
89
90                 ndk = getenv("NDK_ROOT");
91                 app = getenv("APP_PLATFORM");
92
93                 if (!(ndk && app))
94                         return false;
95
96                 ndk_length = strlen(ndk);
97                 app_length = strlen(app);
98
99                 if (!(ndk_length && app_length && app_abi_length))
100                         return false;
101
102                 arch = !strncmp(app_abi, "arm", 3) ? "arm" :
103                        !strncmp(app_abi, "mips", 4) ? "mips" :
104                        !strncmp(app_abi, "x86", 3) ? "x86" : NULL;
105
106                 if (!arch)
107                         return false;
108
109                 new_length = 27 + ndk_length +
110                              app_length + lib_length
111                            + strlen(arch);
112
113                 if (new_length > PATH_MAX)
114                         return false;
115                 snprintf(newfilename, new_length,
116                         "%s/platforms/%s/arch-%s/usr/lib/%s",
117                         ndk, app, arch, libname);
118
119                 return true;
120         }
121         return false;
122 }
123
124 void map__init(struct map *map, enum map_type type,
125                u64 start, u64 end, u64 pgoff, struct dso *dso)
126 {
127         map->type     = type;
128         map->start    = start;
129         map->end      = end;
130         map->pgoff    = pgoff;
131         map->reloc    = 0;
132         map->dso      = dso;
133         map->map_ip   = map__map_ip;
134         map->unmap_ip = map__unmap_ip;
135         RB_CLEAR_NODE(&map->rb_node);
136         map->groups   = NULL;
137         map->referenced = false;
138         map->erange_warned = false;
139 }
140
141 struct map *map__new(struct machine *machine, u64 start, u64 len,
142                      u64 pgoff, u32 pid, u32 d_maj, u32 d_min, u64 ino,
143                      u64 ino_gen, u32 prot, u32 flags, char *filename,
144                      enum map_type type, struct thread *thread)
145 {
146         struct map *map = malloc(sizeof(*map));
147
148         if (map != NULL) {
149                 char newfilename[PATH_MAX];
150                 struct dso *dso;
151                 int anon, no_dso, vdso, android;
152
153                 android = is_android_lib(filename);
154                 anon = is_anon_memory(filename);
155                 vdso = is_vdso_map(filename);
156                 no_dso = is_no_dso_memory(filename);
157
158                 map->maj = d_maj;
159                 map->min = d_min;
160                 map->ino = ino;
161                 map->ino_generation = ino_gen;
162                 map->prot = prot;
163                 map->flags = flags;
164
165                 if ((anon || no_dso) && type == MAP__FUNCTION) {
166                         snprintf(newfilename, sizeof(newfilename), "/tmp/perf-%d.map", pid);
167                         filename = newfilename;
168                 }
169
170                 if (android) {
171                         if (replace_android_lib(filename, newfilename))
172                                 filename = newfilename;
173                 }
174
175                 if (vdso) {
176                         pgoff = 0;
177                         dso = vdso__dso_findnew(machine, thread);
178                 } else
179                         dso = __dsos__findnew(&machine->user_dsos, filename);
180
181                 if (dso == NULL)
182                         goto out_delete;
183
184                 map__init(map, type, start, start + len, pgoff, dso);
185
186                 if (anon || no_dso) {
187                         map->map_ip = map->unmap_ip = identity__map_ip;
188
189                         /*
190                          * Set memory without DSO as loaded. All map__find_*
191                          * functions still return NULL, and we avoid the
192                          * unnecessary map__load warning.
193                          */
194                         if (type != MAP__FUNCTION)
195                                 dso__set_loaded(dso, map->type);
196                 }
197         }
198         return map;
199 out_delete:
200         free(map);
201         return NULL;
202 }
203
204 /*
205  * Constructor variant for modules (where we know from /proc/modules where
206  * they are loaded) and for vmlinux, where only after we load all the
207  * symbols we'll know where it starts and ends.
208  */
209 struct map *map__new2(u64 start, struct dso *dso, enum map_type type)
210 {
211         struct map *map = calloc(1, (sizeof(*map) +
212                                      (dso->kernel ? sizeof(struct kmap) : 0)));
213         if (map != NULL) {
214                 /*
215                  * ->end will be filled after we load all the symbols
216                  */
217                 map__init(map, type, start, 0, 0, dso);
218         }
219
220         return map;
221 }
222
223 void map__delete(struct map *map)
224 {
225         free(map);
226 }
227
228 void map__fixup_start(struct map *map)
229 {
230         struct rb_root *symbols = &map->dso->symbols[map->type];
231         struct rb_node *nd = rb_first(symbols);
232         if (nd != NULL) {
233                 struct symbol *sym = rb_entry(nd, struct symbol, rb_node);
234                 map->start = sym->start;
235         }
236 }
237
238 void map__fixup_end(struct map *map)
239 {
240         struct rb_root *symbols = &map->dso->symbols[map->type];
241         struct rb_node *nd = rb_last(symbols);
242         if (nd != NULL) {
243                 struct symbol *sym = rb_entry(nd, struct symbol, rb_node);
244                 map->end = sym->end;
245         }
246 }
247
248 #define DSO__DELETED "(deleted)"
249
250 int map__load(struct map *map, symbol_filter_t filter)
251 {
252         const char *name = map->dso->long_name;
253         int nr;
254
255         if (dso__loaded(map->dso, map->type))
256                 return 0;
257
258         nr = dso__load(map->dso, map, filter);
259         if (nr < 0) {
260                 if (map->dso->has_build_id) {
261                         char sbuild_id[BUILD_ID_SIZE * 2 + 1];
262
263                         build_id__sprintf(map->dso->build_id,
264                                           sizeof(map->dso->build_id),
265                                           sbuild_id);
266                         pr_warning("%s with build id %s not found",
267                                    name, sbuild_id);
268                 } else
269                         pr_warning("Failed to open %s", name);
270
271                 pr_warning(", continuing without symbols\n");
272                 return -1;
273         } else if (nr == 0) {
274 #ifdef HAVE_LIBELF_SUPPORT
275                 const size_t len = strlen(name);
276                 const size_t real_len = len - sizeof(DSO__DELETED);
277
278                 if (len > sizeof(DSO__DELETED) &&
279                     strcmp(name + real_len + 1, DSO__DELETED) == 0) {
280                         pr_warning("%.*s was updated (is prelink enabled?). "
281                                 "Restart the long running apps that use it!\n",
282                                    (int)real_len, name);
283                 } else {
284                         pr_warning("no symbols found in %s, maybe install "
285                                    "a debug package?\n", name);
286                 }
287 #endif
288                 return -1;
289         }
290
291         return 0;
292 }
293
294 struct symbol *map__find_symbol(struct map *map, u64 addr,
295                                 symbol_filter_t filter)
296 {
297         if (map__load(map, filter) < 0)
298                 return NULL;
299
300         return dso__find_symbol(map->dso, map->type, addr);
301 }
302
303 struct symbol *map__find_symbol_by_name(struct map *map, const char *name,
304                                         symbol_filter_t filter)
305 {
306         if (map__load(map, filter) < 0)
307                 return NULL;
308
309         if (!dso__sorted_by_name(map->dso, map->type))
310                 dso__sort_by_name(map->dso, map->type);
311
312         return dso__find_symbol_by_name(map->dso, map->type, name);
313 }
314
315 struct map *map__clone(struct map *map)
316 {
317         return memdup(map, sizeof(*map));
318 }
319
320 int map__overlap(struct map *l, struct map *r)
321 {
322         if (l->start > r->start) {
323                 struct map *t = l;
324                 l = r;
325                 r = t;
326         }
327
328         if (l->end > r->start)
329                 return 1;
330
331         return 0;
332 }
333
334 size_t map__fprintf(struct map *map, FILE *fp)
335 {
336         return fprintf(fp, " %" PRIx64 "-%" PRIx64 " %" PRIx64 " %s\n",
337                        map->start, map->end, map->pgoff, map->dso->name);
338 }
339
340 size_t map__fprintf_dsoname(struct map *map, FILE *fp)
341 {
342         const char *dsoname = "[unknown]";
343
344         if (map && map->dso && (map->dso->name || map->dso->long_name)) {
345                 if (symbol_conf.show_kernel_path && map->dso->long_name)
346                         dsoname = map->dso->long_name;
347                 else if (map->dso->name)
348                         dsoname = map->dso->name;
349         }
350
351         return fprintf(fp, "%s", dsoname);
352 }
353
354 int map__fprintf_srcline(struct map *map, u64 addr, const char *prefix,
355                          FILE *fp)
356 {
357         char *srcline;
358         int ret = 0;
359
360         if (map && map->dso) {
361                 srcline = get_srcline(map->dso,
362                                       map__rip_2objdump(map, addr));
363                 if (srcline != SRCLINE_UNKNOWN)
364                         ret = fprintf(fp, "%s%s", prefix, srcline);
365                 free_srcline(srcline);
366         }
367         return ret;
368 }
369
370 /**
371  * map__rip_2objdump - convert symbol start address to objdump address.
372  * @map: memory map
373  * @rip: symbol start address
374  *
375  * objdump wants/reports absolute IPs for ET_EXEC, and RIPs for ET_DYN.
376  * map->dso->adjust_symbols==1 for ET_EXEC-like cases except ET_REL which is
377  * relative to section start.
378  *
379  * Return: Address suitable for passing to "objdump --start-address="
380  */
381 u64 map__rip_2objdump(struct map *map, u64 rip)
382 {
383         if (!map->dso->adjust_symbols)
384                 return rip;
385
386         if (map->dso->rel)
387                 return rip - map->pgoff;
388
389         return map->unmap_ip(map, rip) - map->reloc;
390 }
391
392 /**
393  * map__objdump_2mem - convert objdump address to a memory address.
394  * @map: memory map
395  * @ip: objdump address
396  *
397  * Closely related to map__rip_2objdump(), this function takes an address from
398  * objdump and converts it to a memory address.  Note this assumes that @map
399  * contains the address.  To be sure the result is valid, check it forwards
400  * e.g. map__rip_2objdump(map->map_ip(map, map__objdump_2mem(map, ip))) == ip
401  *
402  * Return: Memory address.
403  */
404 u64 map__objdump_2mem(struct map *map, u64 ip)
405 {
406         if (!map->dso->adjust_symbols)
407                 return map->unmap_ip(map, ip);
408
409         if (map->dso->rel)
410                 return map->unmap_ip(map, ip + map->pgoff);
411
412         return ip + map->reloc;
413 }
414
415 void map_groups__init(struct map_groups *mg)
416 {
417         int i;
418         for (i = 0; i < MAP__NR_TYPES; ++i) {
419                 mg->maps[i] = RB_ROOT;
420                 INIT_LIST_HEAD(&mg->removed_maps[i]);
421         }
422         mg->machine = NULL;
423         mg->refcnt = 1;
424 }
425
426 static void maps__delete(struct rb_root *maps)
427 {
428         struct rb_node *next = rb_first(maps);
429
430         while (next) {
431                 struct map *pos = rb_entry(next, struct map, rb_node);
432
433                 next = rb_next(&pos->rb_node);
434                 rb_erase(&pos->rb_node, maps);
435                 map__delete(pos);
436         }
437 }
438
439 static void maps__delete_removed(struct list_head *maps)
440 {
441         struct map *pos, *n;
442
443         list_for_each_entry_safe(pos, n, maps, node) {
444                 list_del(&pos->node);
445                 map__delete(pos);
446         }
447 }
448
449 void map_groups__exit(struct map_groups *mg)
450 {
451         int i;
452
453         for (i = 0; i < MAP__NR_TYPES; ++i) {
454                 maps__delete(&mg->maps[i]);
455                 maps__delete_removed(&mg->removed_maps[i]);
456         }
457 }
458
459 bool map_groups__empty(struct map_groups *mg)
460 {
461         int i;
462
463         for (i = 0; i < MAP__NR_TYPES; ++i) {
464                 if (maps__first(&mg->maps[i]))
465                         return false;
466                 if (!list_empty(&mg->removed_maps[i]))
467                         return false;
468         }
469
470         return true;
471 }
472
473 struct map_groups *map_groups__new(void)
474 {
475         struct map_groups *mg = malloc(sizeof(*mg));
476
477         if (mg != NULL)
478                 map_groups__init(mg);
479
480         return mg;
481 }
482
483 void map_groups__delete(struct map_groups *mg)
484 {
485         map_groups__exit(mg);
486         free(mg);
487 }
488
489 void map_groups__put(struct map_groups *mg)
490 {
491         if (--mg->refcnt == 0)
492                 map_groups__delete(mg);
493 }
494
495 void map_groups__flush(struct map_groups *mg)
496 {
497         int type;
498
499         for (type = 0; type < MAP__NR_TYPES; type++) {
500                 struct rb_root *root = &mg->maps[type];
501                 struct rb_node *next = rb_first(root);
502
503                 while (next) {
504                         struct map *pos = rb_entry(next, struct map, rb_node);
505                         next = rb_next(&pos->rb_node);
506                         rb_erase(&pos->rb_node, root);
507                         /*
508                          * We may have references to this map, for
509                          * instance in some hist_entry instances, so
510                          * just move them to a separate list.
511                          */
512                         list_add_tail(&pos->node, &mg->removed_maps[pos->type]);
513                 }
514         }
515 }
516
517 struct symbol *map_groups__find_symbol(struct map_groups *mg,
518                                        enum map_type type, u64 addr,
519                                        struct map **mapp,
520                                        symbol_filter_t filter)
521 {
522         struct map *map = map_groups__find(mg, type, addr);
523
524         /* Ensure map is loaded before using map->map_ip */
525         if (map != NULL && map__load(map, filter) >= 0) {
526                 if (mapp != NULL)
527                         *mapp = map;
528                 return map__find_symbol(map, map->map_ip(map, addr), filter);
529         }
530
531         return NULL;
532 }
533
534 struct symbol *map_groups__find_symbol_by_name(struct map_groups *mg,
535                                                enum map_type type,
536                                                const char *name,
537                                                struct map **mapp,
538                                                symbol_filter_t filter)
539 {
540         struct rb_node *nd;
541
542         for (nd = rb_first(&mg->maps[type]); nd; nd = rb_next(nd)) {
543                 struct map *pos = rb_entry(nd, struct map, rb_node);
544                 struct symbol *sym = map__find_symbol_by_name(pos, name, filter);
545
546                 if (sym == NULL)
547                         continue;
548                 if (mapp != NULL)
549                         *mapp = pos;
550                 return sym;
551         }
552
553         return NULL;
554 }
555
556 int map_groups__find_ams(struct addr_map_symbol *ams, symbol_filter_t filter)
557 {
558         if (ams->addr < ams->map->start || ams->addr > ams->map->end) {
559                 if (ams->map->groups == NULL)
560                         return -1;
561                 ams->map = map_groups__find(ams->map->groups, ams->map->type,
562                                             ams->addr);
563                 if (ams->map == NULL)
564                         return -1;
565         }
566
567         ams->al_addr = ams->map->map_ip(ams->map, ams->addr);
568         ams->sym = map__find_symbol(ams->map, ams->al_addr, filter);
569
570         return ams->sym ? 0 : -1;
571 }
572
573 size_t __map_groups__fprintf_maps(struct map_groups *mg, enum map_type type,
574                                   FILE *fp)
575 {
576         size_t printed = fprintf(fp, "%s:\n", map_type__name[type]);
577         struct rb_node *nd;
578
579         for (nd = rb_first(&mg->maps[type]); nd; nd = rb_next(nd)) {
580                 struct map *pos = rb_entry(nd, struct map, rb_node);
581                 printed += fprintf(fp, "Map:");
582                 printed += map__fprintf(pos, fp);
583                 if (verbose > 2) {
584                         printed += dso__fprintf(pos->dso, type, fp);
585                         printed += fprintf(fp, "--\n");
586                 }
587         }
588
589         return printed;
590 }
591
592 static size_t map_groups__fprintf_maps(struct map_groups *mg, FILE *fp)
593 {
594         size_t printed = 0, i;
595         for (i = 0; i < MAP__NR_TYPES; ++i)
596                 printed += __map_groups__fprintf_maps(mg, i, fp);
597         return printed;
598 }
599
600 static size_t __map_groups__fprintf_removed_maps(struct map_groups *mg,
601                                                  enum map_type type, FILE *fp)
602 {
603         struct map *pos;
604         size_t printed = 0;
605
606         list_for_each_entry(pos, &mg->removed_maps[type], node) {
607                 printed += fprintf(fp, "Map:");
608                 printed += map__fprintf(pos, fp);
609                 if (verbose > 1) {
610                         printed += dso__fprintf(pos->dso, type, fp);
611                         printed += fprintf(fp, "--\n");
612                 }
613         }
614         return printed;
615 }
616
617 static size_t map_groups__fprintf_removed_maps(struct map_groups *mg,
618                                                FILE *fp)
619 {
620         size_t printed = 0, i;
621         for (i = 0; i < MAP__NR_TYPES; ++i)
622                 printed += __map_groups__fprintf_removed_maps(mg, i, fp);
623         return printed;
624 }
625
626 size_t map_groups__fprintf(struct map_groups *mg, FILE *fp)
627 {
628         size_t printed = map_groups__fprintf_maps(mg, fp);
629         printed += fprintf(fp, "Removed maps:\n");
630         return printed + map_groups__fprintf_removed_maps(mg, fp);
631 }
632
633 int map_groups__fixup_overlappings(struct map_groups *mg, struct map *map,
634                                    FILE *fp)
635 {
636         struct rb_root *root = &mg->maps[map->type];
637         struct rb_node *next = rb_first(root);
638         int err = 0;
639
640         while (next) {
641                 struct map *pos = rb_entry(next, struct map, rb_node);
642                 next = rb_next(&pos->rb_node);
643
644                 if (!map__overlap(pos, map))
645                         continue;
646
647                 if (verbose >= 2) {
648                         fputs("overlapping maps:\n", fp);
649                         map__fprintf(map, fp);
650                         map__fprintf(pos, fp);
651                 }
652
653                 rb_erase(&pos->rb_node, root);
654                 /*
655                  * Now check if we need to create new maps for areas not
656                  * overlapped by the new map:
657                  */
658                 if (map->start > pos->start) {
659                         struct map *before = map__clone(pos);
660
661                         if (before == NULL) {
662                                 err = -ENOMEM;
663                                 goto move_map;
664                         }
665
666                         before->end = map->start - 1;
667                         map_groups__insert(mg, before);
668                         if (verbose >= 2)
669                                 map__fprintf(before, fp);
670                 }
671
672                 if (map->end < pos->end) {
673                         struct map *after = map__clone(pos);
674
675                         if (after == NULL) {
676                                 err = -ENOMEM;
677                                 goto move_map;
678                         }
679
680                         after->start = map->end + 1;
681                         map_groups__insert(mg, after);
682                         if (verbose >= 2)
683                                 map__fprintf(after, fp);
684                 }
685 move_map:
686                 /*
687                  * If we have references, just move them to a separate list.
688                  */
689                 if (pos->referenced)
690                         list_add_tail(&pos->node, &mg->removed_maps[map->type]);
691                 else
692                         map__delete(pos);
693
694                 if (err)
695                         return err;
696         }
697
698         return 0;
699 }
700
701 /*
702  * XXX This should not really _copy_ te maps, but refcount them.
703  */
704 int map_groups__clone(struct map_groups *mg,
705                       struct map_groups *parent, enum map_type type)
706 {
707         struct rb_node *nd;
708         for (nd = rb_first(&parent->maps[type]); nd; nd = rb_next(nd)) {
709                 struct map *map = rb_entry(nd, struct map, rb_node);
710                 struct map *new = map__clone(map);
711                 if (new == NULL)
712                         return -ENOMEM;
713                 map_groups__insert(mg, new);
714         }
715         return 0;
716 }
717
718 void maps__insert(struct rb_root *maps, struct map *map)
719 {
720         struct rb_node **p = &maps->rb_node;
721         struct rb_node *parent = NULL;
722         const u64 ip = map->start;
723         struct map *m;
724
725         while (*p != NULL) {
726                 parent = *p;
727                 m = rb_entry(parent, struct map, rb_node);
728                 if (ip < m->start)
729                         p = &(*p)->rb_left;
730                 else
731                         p = &(*p)->rb_right;
732         }
733
734         rb_link_node(&map->rb_node, parent, p);
735         rb_insert_color(&map->rb_node, maps);
736 }
737
738 void maps__remove(struct rb_root *maps, struct map *map)
739 {
740         rb_erase(&map->rb_node, maps);
741 }
742
743 struct map *maps__find(struct rb_root *maps, u64 ip)
744 {
745         struct rb_node **p = &maps->rb_node;
746         struct rb_node *parent = NULL;
747         struct map *m;
748
749         while (*p != NULL) {
750                 parent = *p;
751                 m = rb_entry(parent, struct map, rb_node);
752                 if (ip < m->start)
753                         p = &(*p)->rb_left;
754                 else if (ip > m->end)
755                         p = &(*p)->rb_right;
756                 else
757                         return m;
758         }
759
760         return NULL;
761 }
762
763 struct map *maps__first(struct rb_root *maps)
764 {
765         struct rb_node *first = rb_first(maps);
766
767         if (first)
768                 return rb_entry(first, struct map, rb_node);
769         return NULL;
770 }
771
772 struct map *maps__next(struct map *map)
773 {
774         struct rb_node *next = rb_next(&map->rb_node);
775
776         if (next)
777                 return rb_entry(next, struct map, rb_node);
778         return NULL;
779 }