Merge tag 'trace-v6.9-2' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux...
[sfrench/cifs-2.6.git] / tools / perf / util / maps.c
1 // SPDX-License-Identifier: GPL-2.0
2 #include <errno.h>
3 #include <stdlib.h>
4 #include <linux/zalloc.h>
5 #include "debug.h"
6 #include "dso.h"
7 #include "map.h"
8 #include "maps.h"
9 #include "rwsem.h"
10 #include "thread.h"
11 #include "ui/ui.h"
12 #include "unwind.h"
13 #include <internal/rc_check.h>
14
15 /*
16  * Locking/sorting note:
17  *
18  * Sorting is done with the write lock, iteration and binary searching happens
19  * under the read lock requiring being sorted. There is a race between sorting
20  * releasing the write lock and acquiring the read lock for iteration/searching
21  * where another thread could insert and break the sorting of the maps. In
22  * practice inserting maps should be rare meaning that the race shouldn't lead
23  * to live lock. Removal of maps doesn't break being sorted.
24  */
25
26 DECLARE_RC_STRUCT(maps) {
27         struct rw_semaphore lock;
28         /**
29          * @maps_by_address: array of maps sorted by their starting address if
30          * maps_by_address_sorted is true.
31          */
32         struct map       **maps_by_address;
33         /**
34          * @maps_by_name: optional array of maps sorted by their dso name if
35          * maps_by_name_sorted is true.
36          */
37         struct map       **maps_by_name;
38         struct machine   *machine;
39 #ifdef HAVE_LIBUNWIND_SUPPORT
40         void            *addr_space;
41         const struct unwind_libunwind_ops *unwind_libunwind_ops;
42 #endif
43         refcount_t       refcnt;
44         /**
45          * @nr_maps: number of maps_by_address, and possibly maps_by_name,
46          * entries that contain maps.
47          */
48         unsigned int     nr_maps;
49         /**
50          * @nr_maps_allocated: number of entries in maps_by_address and possibly
51          * maps_by_name.
52          */
53         unsigned int     nr_maps_allocated;
54         /**
55          * @last_search_by_name_idx: cache of last found by name entry's index
56          * as frequent searches for the same dso name are common.
57          */
58         unsigned int     last_search_by_name_idx;
59         /** @maps_by_address_sorted: is maps_by_address sorted. */
60         bool             maps_by_address_sorted;
61         /** @maps_by_name_sorted: is maps_by_name sorted. */
62         bool             maps_by_name_sorted;
63         /** @ends_broken: does the map contain a map where end values are unset/unsorted? */
64         bool             ends_broken;
65 };
66
67 static void check_invariants(const struct maps *maps __maybe_unused)
68 {
69 #ifndef NDEBUG
70         assert(RC_CHK_ACCESS(maps)->nr_maps <= RC_CHK_ACCESS(maps)->nr_maps_allocated);
71         for (unsigned int i = 0; i < RC_CHK_ACCESS(maps)->nr_maps; i++) {
72                 struct map *map = RC_CHK_ACCESS(maps)->maps_by_address[i];
73
74                 /* Check map is well-formed. */
75                 assert(map__end(map) == 0 || map__start(map) <= map__end(map));
76                 /* Expect at least 1 reference count. */
77                 assert(refcount_read(map__refcnt(map)) > 0);
78
79                 if (map__dso(map) && map__dso(map)->kernel)
80                         assert(RC_CHK_EQUAL(map__kmap(map)->kmaps, maps));
81
82                 if (i > 0) {
83                         struct map *prev = RC_CHK_ACCESS(maps)->maps_by_address[i - 1];
84
85                         /* If addresses are sorted... */
86                         if (RC_CHK_ACCESS(maps)->maps_by_address_sorted) {
87                                 /* Maps should be in start address order. */
88                                 assert(map__start(prev) <= map__start(map));
89                                 /*
90                                  * If the ends of maps aren't broken (during
91                                  * construction) then they should be ordered
92                                  * too.
93                                  */
94                                 if (!RC_CHK_ACCESS(maps)->ends_broken) {
95                                         assert(map__end(prev) <= map__end(map));
96                                         assert(map__end(prev) <= map__start(map) ||
97                                                map__start(prev) == map__start(map));
98                                 }
99                         }
100                 }
101         }
102         if (RC_CHK_ACCESS(maps)->maps_by_name) {
103                 for (unsigned int i = 0; i < RC_CHK_ACCESS(maps)->nr_maps; i++) {
104                         struct map *map = RC_CHK_ACCESS(maps)->maps_by_name[i];
105
106                         /*
107                          * Maps by name maps should be in maps_by_address, so
108                          * the reference count should be higher.
109                          */
110                         assert(refcount_read(map__refcnt(map)) > 1);
111                 }
112         }
113 #endif
114 }
115
116 static struct map **maps__maps_by_address(const struct maps *maps)
117 {
118         return RC_CHK_ACCESS(maps)->maps_by_address;
119 }
120
121 static void maps__set_maps_by_address(struct maps *maps, struct map **new)
122 {
123         RC_CHK_ACCESS(maps)->maps_by_address = new;
124
125 }
126
127 static struct map ***maps__maps_by_name_addr(struct maps *maps)
128 {
129         return &RC_CHK_ACCESS(maps)->maps_by_name;
130 }
131
132 static void maps__set_nr_maps_allocated(struct maps *maps, unsigned int nr_maps_allocated)
133 {
134         RC_CHK_ACCESS(maps)->nr_maps_allocated = nr_maps_allocated;
135 }
136
137 static void maps__set_nr_maps(struct maps *maps, unsigned int nr_maps)
138 {
139         RC_CHK_ACCESS(maps)->nr_maps = nr_maps;
140 }
141
142 /* Not in the header, to aid reference counting. */
143 static struct map **maps__maps_by_name(const struct maps *maps)
144 {
145         return RC_CHK_ACCESS(maps)->maps_by_name;
146
147 }
148
149 static void maps__set_maps_by_name(struct maps *maps, struct map **new)
150 {
151         RC_CHK_ACCESS(maps)->maps_by_name = new;
152
153 }
154
155 static bool maps__maps_by_address_sorted(const struct maps *maps)
156 {
157         return RC_CHK_ACCESS(maps)->maps_by_address_sorted;
158 }
159
160 static void maps__set_maps_by_address_sorted(struct maps *maps, bool value)
161 {
162         RC_CHK_ACCESS(maps)->maps_by_address_sorted = value;
163 }
164
165 static bool maps__maps_by_name_sorted(const struct maps *maps)
166 {
167         return RC_CHK_ACCESS(maps)->maps_by_name_sorted;
168 }
169
170 static void maps__set_maps_by_name_sorted(struct maps *maps, bool value)
171 {
172         RC_CHK_ACCESS(maps)->maps_by_name_sorted = value;
173 }
174
175 struct machine *maps__machine(const struct maps *maps)
176 {
177         return RC_CHK_ACCESS(maps)->machine;
178 }
179
180 unsigned int maps__nr_maps(const struct maps *maps)
181 {
182         return RC_CHK_ACCESS(maps)->nr_maps;
183 }
184
185 refcount_t *maps__refcnt(struct maps *maps)
186 {
187         return &RC_CHK_ACCESS(maps)->refcnt;
188 }
189
190 #ifdef HAVE_LIBUNWIND_SUPPORT
191 void *maps__addr_space(const struct maps *maps)
192 {
193         return RC_CHK_ACCESS(maps)->addr_space;
194 }
195
196 void maps__set_addr_space(struct maps *maps, void *addr_space)
197 {
198         RC_CHK_ACCESS(maps)->addr_space = addr_space;
199 }
200
201 const struct unwind_libunwind_ops *maps__unwind_libunwind_ops(const struct maps *maps)
202 {
203         return RC_CHK_ACCESS(maps)->unwind_libunwind_ops;
204 }
205
206 void maps__set_unwind_libunwind_ops(struct maps *maps, const struct unwind_libunwind_ops *ops)
207 {
208         RC_CHK_ACCESS(maps)->unwind_libunwind_ops = ops;
209 }
210 #endif
211
212 static struct rw_semaphore *maps__lock(struct maps *maps)
213 {
214         /*
215          * When the lock is acquired or released the maps invariants should
216          * hold.
217          */
218         check_invariants(maps);
219         return &RC_CHK_ACCESS(maps)->lock;
220 }
221
222 static void maps__init(struct maps *maps, struct machine *machine)
223 {
224         init_rwsem(maps__lock(maps));
225         RC_CHK_ACCESS(maps)->maps_by_address = NULL;
226         RC_CHK_ACCESS(maps)->maps_by_name = NULL;
227         RC_CHK_ACCESS(maps)->machine = machine;
228 #ifdef HAVE_LIBUNWIND_SUPPORT
229         RC_CHK_ACCESS(maps)->addr_space = NULL;
230         RC_CHK_ACCESS(maps)->unwind_libunwind_ops = NULL;
231 #endif
232         refcount_set(maps__refcnt(maps), 1);
233         RC_CHK_ACCESS(maps)->nr_maps = 0;
234         RC_CHK_ACCESS(maps)->nr_maps_allocated = 0;
235         RC_CHK_ACCESS(maps)->last_search_by_name_idx = 0;
236         RC_CHK_ACCESS(maps)->maps_by_address_sorted = true;
237         RC_CHK_ACCESS(maps)->maps_by_name_sorted = false;
238 }
239
240 static void maps__exit(struct maps *maps)
241 {
242         struct map **maps_by_address = maps__maps_by_address(maps);
243         struct map **maps_by_name = maps__maps_by_name(maps);
244
245         for (unsigned int i = 0; i < maps__nr_maps(maps); i++) {
246                 map__zput(maps_by_address[i]);
247                 if (maps_by_name)
248                         map__zput(maps_by_name[i]);
249         }
250         zfree(&maps_by_address);
251         zfree(&maps_by_name);
252         unwind__finish_access(maps);
253 }
254
255 struct maps *maps__new(struct machine *machine)
256 {
257         struct maps *result;
258         RC_STRUCT(maps) *maps = zalloc(sizeof(*maps));
259
260         if (ADD_RC_CHK(result, maps))
261                 maps__init(result, machine);
262
263         return result;
264 }
265
266 static void maps__delete(struct maps *maps)
267 {
268         maps__exit(maps);
269         RC_CHK_FREE(maps);
270 }
271
272 struct maps *maps__get(struct maps *maps)
273 {
274         struct maps *result;
275
276         if (RC_CHK_GET(result, maps))
277                 refcount_inc(maps__refcnt(maps));
278
279         return result;
280 }
281
282 void maps__put(struct maps *maps)
283 {
284         if (maps && refcount_dec_and_test(maps__refcnt(maps)))
285                 maps__delete(maps);
286         else
287                 RC_CHK_PUT(maps);
288 }
289
290 static void __maps__free_maps_by_name(struct maps *maps)
291 {
292         /*
293          * Free everything to try to do it from the rbtree in the next search
294          */
295         for (unsigned int i = 0; i < maps__nr_maps(maps); i++)
296                 map__put(maps__maps_by_name(maps)[i]);
297
298         zfree(&RC_CHK_ACCESS(maps)->maps_by_name);
299 }
300
301 static int map__start_cmp(const void *a, const void *b)
302 {
303         const struct map *map_a = *(const struct map * const *)a;
304         const struct map *map_b = *(const struct map * const *)b;
305         u64 map_a_start = map__start(map_a);
306         u64 map_b_start = map__start(map_b);
307
308         if (map_a_start == map_b_start) {
309                 u64 map_a_end = map__end(map_a);
310                 u64 map_b_end = map__end(map_b);
311
312                 if  (map_a_end == map_b_end) {
313                         /* Ensure maps with the same addresses have a fixed order. */
314                         if (RC_CHK_ACCESS(map_a) == RC_CHK_ACCESS(map_b))
315                                 return 0;
316                         return (intptr_t)RC_CHK_ACCESS(map_a) > (intptr_t)RC_CHK_ACCESS(map_b)
317                                 ? 1 : -1;
318                 }
319                 return map_a_end > map_b_end ? 1 : -1;
320         }
321         return map_a_start > map_b_start ? 1 : -1;
322 }
323
324 static void __maps__sort_by_address(struct maps *maps)
325 {
326         if (maps__maps_by_address_sorted(maps))
327                 return;
328
329         qsort(maps__maps_by_address(maps),
330                 maps__nr_maps(maps),
331                 sizeof(struct map *),
332                 map__start_cmp);
333         maps__set_maps_by_address_sorted(maps, true);
334 }
335
336 static void maps__sort_by_address(struct maps *maps)
337 {
338         down_write(maps__lock(maps));
339         __maps__sort_by_address(maps);
340         up_write(maps__lock(maps));
341 }
342
343 static int map__strcmp(const void *a, const void *b)
344 {
345         const struct map *map_a = *(const struct map * const *)a;
346         const struct map *map_b = *(const struct map * const *)b;
347         const struct dso *dso_a = map__dso(map_a);
348         const struct dso *dso_b = map__dso(map_b);
349         int ret = strcmp(dso_a->short_name, dso_b->short_name);
350
351         if (ret == 0 && RC_CHK_ACCESS(map_a) != RC_CHK_ACCESS(map_b)) {
352                 /* Ensure distinct but name equal maps have an order. */
353                 return map__start_cmp(a, b);
354         }
355         return ret;
356 }
357
358 static int maps__sort_by_name(struct maps *maps)
359 {
360         int err = 0;
361         down_write(maps__lock(maps));
362         if (!maps__maps_by_name_sorted(maps)) {
363                 struct map **maps_by_name = maps__maps_by_name(maps);
364
365                 if (!maps_by_name) {
366                         maps_by_name = malloc(RC_CHK_ACCESS(maps)->nr_maps_allocated *
367                                         sizeof(*maps_by_name));
368                         if (!maps_by_name)
369                                 err = -ENOMEM;
370                         else {
371                                 struct map **maps_by_address = maps__maps_by_address(maps);
372                                 unsigned int n = maps__nr_maps(maps);
373
374                                 maps__set_maps_by_name(maps, maps_by_name);
375                                 for (unsigned int i = 0; i < n; i++)
376                                         maps_by_name[i] = map__get(maps_by_address[i]);
377                         }
378                 }
379                 if (!err) {
380                         qsort(maps_by_name,
381                                 maps__nr_maps(maps),
382                                 sizeof(struct map *),
383                                 map__strcmp);
384                         maps__set_maps_by_name_sorted(maps, true);
385                 }
386         }
387         up_write(maps__lock(maps));
388         return err;
389 }
390
391 static unsigned int maps__by_address_index(const struct maps *maps, const struct map *map)
392 {
393         struct map **maps_by_address = maps__maps_by_address(maps);
394
395         if (maps__maps_by_address_sorted(maps)) {
396                 struct map **mapp =
397                         bsearch(&map, maps__maps_by_address(maps), maps__nr_maps(maps),
398                                 sizeof(*mapp), map__start_cmp);
399
400                 if (mapp)
401                         return mapp - maps_by_address;
402         } else {
403                 for (unsigned int i = 0; i < maps__nr_maps(maps); i++) {
404                         if (RC_CHK_ACCESS(maps_by_address[i]) == RC_CHK_ACCESS(map))
405                                 return i;
406                 }
407         }
408         pr_err("Map missing from maps");
409         return -1;
410 }
411
412 static unsigned int maps__by_name_index(const struct maps *maps, const struct map *map)
413 {
414         struct map **maps_by_name = maps__maps_by_name(maps);
415
416         if (maps__maps_by_name_sorted(maps)) {
417                 struct map **mapp =
418                         bsearch(&map, maps_by_name, maps__nr_maps(maps),
419                                 sizeof(*mapp), map__strcmp);
420
421                 if (mapp)
422                         return mapp - maps_by_name;
423         } else {
424                 for (unsigned int i = 0; i < maps__nr_maps(maps); i++) {
425                         if (RC_CHK_ACCESS(maps_by_name[i]) == RC_CHK_ACCESS(map))
426                                 return i;
427                 }
428         }
429         pr_err("Map missing from maps");
430         return -1;
431 }
432
433 static int __maps__insert(struct maps *maps, struct map *new)
434 {
435         struct map **maps_by_address = maps__maps_by_address(maps);
436         struct map **maps_by_name = maps__maps_by_name(maps);
437         const struct dso *dso = map__dso(new);
438         unsigned int nr_maps = maps__nr_maps(maps);
439         unsigned int nr_allocate = RC_CHK_ACCESS(maps)->nr_maps_allocated;
440
441         if (nr_maps + 1 > nr_allocate) {
442                 nr_allocate = !nr_allocate ? 32 : nr_allocate * 2;
443
444                 maps_by_address = realloc(maps_by_address, nr_allocate * sizeof(new));
445                 if (!maps_by_address)
446                         return -ENOMEM;
447
448                 maps__set_maps_by_address(maps, maps_by_address);
449                 if (maps_by_name) {
450                         maps_by_name = realloc(maps_by_name, nr_allocate * sizeof(new));
451                         if (!maps_by_name) {
452                                 /*
453                                  * If by name fails, just disable by name and it will
454                                  * recompute next time it is required.
455                                  */
456                                 __maps__free_maps_by_name(maps);
457                         }
458                         maps__set_maps_by_name(maps, maps_by_name);
459                 }
460                 RC_CHK_ACCESS(maps)->nr_maps_allocated = nr_allocate;
461         }
462         /* Insert the value at the end. */
463         maps_by_address[nr_maps] = map__get(new);
464         if (maps_by_name)
465                 maps_by_name[nr_maps] = map__get(new);
466
467         nr_maps++;
468         RC_CHK_ACCESS(maps)->nr_maps = nr_maps;
469
470         /*
471          * Recompute if things are sorted. If things are inserted in a sorted
472          * manner, for example by processing /proc/pid/maps, then no
473          * sorting/resorting will be necessary.
474          */
475         if (nr_maps == 1) {
476                 /* If there's just 1 entry then maps are sorted. */
477                 maps__set_maps_by_address_sorted(maps, true);
478                 maps__set_maps_by_name_sorted(maps, maps_by_name != NULL);
479         } else {
480                 /* Sorted if maps were already sorted and this map starts after the last one. */
481                 maps__set_maps_by_address_sorted(maps,
482                         maps__maps_by_address_sorted(maps) &&
483                         map__end(maps_by_address[nr_maps - 2]) <= map__start(new));
484                 maps__set_maps_by_name_sorted(maps, false);
485         }
486         if (map__end(new) < map__start(new))
487                 RC_CHK_ACCESS(maps)->ends_broken = true;
488         if (dso && dso->kernel) {
489                 struct kmap *kmap = map__kmap(new);
490
491                 if (kmap)
492                         kmap->kmaps = maps;
493                 else
494                         pr_err("Internal error: kernel dso with non kernel map\n");
495         }
496         return 0;
497 }
498
499 int maps__insert(struct maps *maps, struct map *map)
500 {
501         int ret;
502
503         down_write(maps__lock(maps));
504         ret = __maps__insert(maps, map);
505         up_write(maps__lock(maps));
506         return ret;
507 }
508
509 static void __maps__remove(struct maps *maps, struct map *map)
510 {
511         struct map **maps_by_address = maps__maps_by_address(maps);
512         struct map **maps_by_name = maps__maps_by_name(maps);
513         unsigned int nr_maps = maps__nr_maps(maps);
514         unsigned int address_idx;
515
516         /* Slide later mappings over the one to remove */
517         address_idx = maps__by_address_index(maps, map);
518         map__put(maps_by_address[address_idx]);
519         memmove(&maps_by_address[address_idx],
520                 &maps_by_address[address_idx + 1],
521                 (nr_maps - address_idx - 1) * sizeof(*maps_by_address));
522
523         if (maps_by_name) {
524                 unsigned int name_idx = maps__by_name_index(maps, map);
525
526                 map__put(maps_by_name[name_idx]);
527                 memmove(&maps_by_name[name_idx],
528                         &maps_by_name[name_idx + 1],
529                         (nr_maps - name_idx - 1) *  sizeof(*maps_by_name));
530         }
531
532         --RC_CHK_ACCESS(maps)->nr_maps;
533 }
534
535 void maps__remove(struct maps *maps, struct map *map)
536 {
537         down_write(maps__lock(maps));
538         __maps__remove(maps, map);
539         up_write(maps__lock(maps));
540 }
541
542 bool maps__empty(struct maps *maps)
543 {
544         bool res;
545
546         down_read(maps__lock(maps));
547         res = maps__nr_maps(maps) == 0;
548         up_read(maps__lock(maps));
549
550         return res;
551 }
552
553 bool maps__equal(struct maps *a, struct maps *b)
554 {
555         return RC_CHK_EQUAL(a, b);
556 }
557
558 int maps__for_each_map(struct maps *maps, int (*cb)(struct map *map, void *data), void *data)
559 {
560         bool done = false;
561         int ret = 0;
562
563         /* See locking/sorting note. */
564         while (!done) {
565                 down_read(maps__lock(maps));
566                 if (maps__maps_by_address_sorted(maps)) {
567                         /*
568                          * maps__for_each_map callbacks may buggily/unsafely
569                          * insert into maps_by_address. Deliberately reload
570                          * maps__nr_maps and maps_by_address on each iteration
571                          * to avoid using memory freed by maps__insert growing
572                          * the array - this may cause maps to be skipped or
573                          * repeated.
574                          */
575                         for (unsigned int i = 0; i < maps__nr_maps(maps); i++) {
576                                 struct map **maps_by_address = maps__maps_by_address(maps);
577                                 struct map *map = maps_by_address[i];
578
579                                 ret = cb(map, data);
580                                 if (ret)
581                                         break;
582                         }
583                         done = true;
584                 }
585                 up_read(maps__lock(maps));
586                 if (!done)
587                         maps__sort_by_address(maps);
588         }
589         return ret;
590 }
591
592 void maps__remove_maps(struct maps *maps, bool (*cb)(struct map *map, void *data), void *data)
593 {
594         struct map **maps_by_address;
595
596         down_write(maps__lock(maps));
597
598         maps_by_address = maps__maps_by_address(maps);
599         for (unsigned int i = 0; i < maps__nr_maps(maps);) {
600                 if (cb(maps_by_address[i], data))
601                         __maps__remove(maps, maps_by_address[i]);
602                 else
603                         i++;
604         }
605         up_write(maps__lock(maps));
606 }
607
608 struct symbol *maps__find_symbol(struct maps *maps, u64 addr, struct map **mapp)
609 {
610         struct map *map = maps__find(maps, addr);
611         struct symbol *result = NULL;
612
613         /* Ensure map is loaded before using map->map_ip */
614         if (map != NULL && map__load(map) >= 0)
615                 result = map__find_symbol(map, map__map_ip(map, addr));
616
617         if (mapp)
618                 *mapp = map;
619         else
620                 map__put(map);
621
622         return result;
623 }
624
625 struct maps__find_symbol_by_name_args {
626         struct map **mapp;
627         const char *name;
628         struct symbol *sym;
629 };
630
631 static int maps__find_symbol_by_name_cb(struct map *map, void *data)
632 {
633         struct maps__find_symbol_by_name_args *args = data;
634
635         args->sym = map__find_symbol_by_name(map, args->name);
636         if (!args->sym)
637                 return 0;
638
639         if (!map__contains_symbol(map, args->sym)) {
640                 args->sym = NULL;
641                 return 0;
642         }
643
644         if (args->mapp != NULL)
645                 *args->mapp = map__get(map);
646         return 1;
647 }
648
649 struct symbol *maps__find_symbol_by_name(struct maps *maps, const char *name, struct map **mapp)
650 {
651         struct maps__find_symbol_by_name_args args = {
652                 .mapp = mapp,
653                 .name = name,
654                 .sym = NULL,
655         };
656
657         maps__for_each_map(maps, maps__find_symbol_by_name_cb, &args);
658         return args.sym;
659 }
660
661 int maps__find_ams(struct maps *maps, struct addr_map_symbol *ams)
662 {
663         if (ams->addr < map__start(ams->ms.map) || ams->addr >= map__end(ams->ms.map)) {
664                 if (maps == NULL)
665                         return -1;
666                 ams->ms.map = maps__find(maps, ams->addr);
667                 if (ams->ms.map == NULL)
668                         return -1;
669         }
670
671         ams->al_addr = map__map_ip(ams->ms.map, ams->addr);
672         ams->ms.sym = map__find_symbol(ams->ms.map, ams->al_addr);
673
674         return ams->ms.sym ? 0 : -1;
675 }
676
677 struct maps__fprintf_args {
678         FILE *fp;
679         size_t printed;
680 };
681
682 static int maps__fprintf_cb(struct map *map, void *data)
683 {
684         struct maps__fprintf_args *args = data;
685
686         args->printed += fprintf(args->fp, "Map:");
687         args->printed += map__fprintf(map, args->fp);
688         if (verbose > 2) {
689                 args->printed += dso__fprintf(map__dso(map), args->fp);
690                 args->printed += fprintf(args->fp, "--\n");
691         }
692         return 0;
693 }
694
695 size_t maps__fprintf(struct maps *maps, FILE *fp)
696 {
697         struct maps__fprintf_args args = {
698                 .fp = fp,
699                 .printed = 0,
700         };
701
702         maps__for_each_map(maps, maps__fprintf_cb, &args);
703
704         return args.printed;
705 }
706
707 /*
708  * Find first map where end > map->start.
709  * Same as find_vma() in kernel.
710  */
711 static unsigned int first_ending_after(struct maps *maps, const struct map *map)
712 {
713         struct map **maps_by_address = maps__maps_by_address(maps);
714         int low = 0, high = (int)maps__nr_maps(maps) - 1, first = high + 1;
715
716         assert(maps__maps_by_address_sorted(maps));
717         if (low <= high && map__end(maps_by_address[0]) > map__start(map))
718                 return 0;
719
720         while (low <= high) {
721                 int mid = (low + high) / 2;
722                 struct map *pos = maps_by_address[mid];
723
724                 if (map__end(pos) > map__start(map)) {
725                         first = mid;
726                         if (map__start(pos) <= map__start(map)) {
727                                 /* Entry overlaps map. */
728                                 break;
729                         }
730                         high = mid - 1;
731                 } else
732                         low = mid + 1;
733         }
734         return first;
735 }
736
737 /*
738  * Adds new to maps, if new overlaps existing entries then the existing maps are
739  * adjusted or removed so that new fits without overlapping any entries.
740  */
741 static int __maps__fixup_overlap_and_insert(struct maps *maps, struct map *new)
742 {
743         struct map **maps_by_address;
744         int err = 0;
745         FILE *fp = debug_file();
746
747 sort_again:
748         if (!maps__maps_by_address_sorted(maps))
749                 __maps__sort_by_address(maps);
750
751         maps_by_address = maps__maps_by_address(maps);
752         /*
753          * Iterate through entries where the end of the existing entry is
754          * greater-than the new map's start.
755          */
756         for (unsigned int i = first_ending_after(maps, new); i < maps__nr_maps(maps); ) {
757                 struct map *pos = maps_by_address[i];
758                 struct map *before = NULL, *after = NULL;
759
760                 /*
761                  * Stop if current map starts after map->end.
762                  * Maps are ordered by start: next will not overlap for sure.
763                  */
764                 if (map__start(pos) >= map__end(new))
765                         break;
766
767                 if (use_browser) {
768                         pr_debug("overlapping maps in %s (disable tui for more info)\n",
769                                 map__dso(new)->name);
770                 } else if (verbose >= 2) {
771                         pr_debug("overlapping maps:\n");
772                         map__fprintf(new, fp);
773                         map__fprintf(pos, fp);
774                 }
775
776                 /*
777                  * Now check if we need to create new maps for areas not
778                  * overlapped by the new map:
779                  */
780                 if (map__start(new) > map__start(pos)) {
781                         /* Map starts within existing map. Need to shorten the existing map. */
782                         before = map__clone(pos);
783
784                         if (before == NULL) {
785                                 err = -ENOMEM;
786                                 goto out_err;
787                         }
788                         map__set_end(before, map__start(new));
789
790                         if (verbose >= 2 && !use_browser)
791                                 map__fprintf(before, fp);
792                 }
793                 if (map__end(new) < map__end(pos)) {
794                         /* The new map isn't as long as the existing map. */
795                         after = map__clone(pos);
796
797                         if (after == NULL) {
798                                 map__zput(before);
799                                 err = -ENOMEM;
800                                 goto out_err;
801                         }
802
803                         map__set_start(after, map__end(new));
804                         map__add_pgoff(after, map__end(new) - map__start(pos));
805                         assert(map__map_ip(pos, map__end(new)) ==
806                                map__map_ip(after, map__end(new)));
807
808                         if (verbose >= 2 && !use_browser)
809                                 map__fprintf(after, fp);
810                 }
811                 /*
812                  * If adding one entry, for `before` or `after`, we can replace
813                  * the existing entry. If both `before` and `after` are
814                  * necessary than an insert is needed. If the existing entry
815                  * entirely overlaps the existing entry it can just be removed.
816                  */
817                 if (before) {
818                         map__put(maps_by_address[i]);
819                         maps_by_address[i] = before;
820                         /* Maps are still ordered, go to next one. */
821                         i++;
822                         if (after) {
823                                 __maps__insert(maps, after);
824                                 map__put(after);
825                                 if (!maps__maps_by_address_sorted(maps)) {
826                                         /*
827                                          * Sorting broken so invariants don't
828                                          * hold, sort and go again.
829                                          */
830                                         goto sort_again;
831                                 }
832                                 /*
833                                  * Maps are still ordered, skip after and go to
834                                  * next one (terminate loop).
835                                  */
836                                 i++;
837                         }
838                 } else if (after) {
839                         map__put(maps_by_address[i]);
840                         maps_by_address[i] = after;
841                         /* Maps are ordered, go to next one. */
842                         i++;
843                 } else {
844                         __maps__remove(maps, pos);
845                         /*
846                          * Maps are ordered but no need to increase `i` as the
847                          * later maps were moved down.
848                          */
849                 }
850                 check_invariants(maps);
851         }
852         /* Add the map. */
853         __maps__insert(maps, new);
854 out_err:
855         return err;
856 }
857
858 int maps__fixup_overlap_and_insert(struct maps *maps, struct map *new)
859 {
860         int err;
861
862         down_write(maps__lock(maps));
863         err =  __maps__fixup_overlap_and_insert(maps, new);
864         up_write(maps__lock(maps));
865         return err;
866 }
867
868 int maps__copy_from(struct maps *dest, struct maps *parent)
869 {
870         /* Note, if struct map were immutable then cloning could use ref counts. */
871         struct map **parent_maps_by_address;
872         int err = 0;
873         unsigned int n;
874
875         down_write(maps__lock(dest));
876         down_read(maps__lock(parent));
877
878         parent_maps_by_address = maps__maps_by_address(parent);
879         n = maps__nr_maps(parent);
880         if (maps__nr_maps(dest) == 0) {
881                 /* No existing mappings so just copy from parent to avoid reallocs in insert. */
882                 unsigned int nr_maps_allocated = RC_CHK_ACCESS(parent)->nr_maps_allocated;
883                 struct map **dest_maps_by_address =
884                         malloc(nr_maps_allocated * sizeof(struct map *));
885                 struct map **dest_maps_by_name = NULL;
886
887                 if (!dest_maps_by_address)
888                         err = -ENOMEM;
889                 else {
890                         if (maps__maps_by_name(parent)) {
891                                 dest_maps_by_name =
892                                         malloc(nr_maps_allocated * sizeof(struct map *));
893                         }
894
895                         RC_CHK_ACCESS(dest)->maps_by_address = dest_maps_by_address;
896                         RC_CHK_ACCESS(dest)->maps_by_name = dest_maps_by_name;
897                         RC_CHK_ACCESS(dest)->nr_maps_allocated = nr_maps_allocated;
898                 }
899
900                 for (unsigned int i = 0; !err && i < n; i++) {
901                         struct map *pos = parent_maps_by_address[i];
902                         struct map *new = map__clone(pos);
903
904                         if (!new)
905                                 err = -ENOMEM;
906                         else {
907                                 err = unwind__prepare_access(dest, new, NULL);
908                                 if (!err) {
909                                         dest_maps_by_address[i] = new;
910                                         if (dest_maps_by_name)
911                                                 dest_maps_by_name[i] = map__get(new);
912                                         RC_CHK_ACCESS(dest)->nr_maps = i + 1;
913                                 }
914                         }
915                         if (err)
916                                 map__put(new);
917                 }
918                 maps__set_maps_by_address_sorted(dest, maps__maps_by_address_sorted(parent));
919                 if (!err) {
920                         RC_CHK_ACCESS(dest)->last_search_by_name_idx =
921                                 RC_CHK_ACCESS(parent)->last_search_by_name_idx;
922                         maps__set_maps_by_name_sorted(dest,
923                                                 dest_maps_by_name &&
924                                                 maps__maps_by_name_sorted(parent));
925                 } else {
926                         RC_CHK_ACCESS(dest)->last_search_by_name_idx = 0;
927                         maps__set_maps_by_name_sorted(dest, false);
928                 }
929         } else {
930                 /* Unexpected copying to a maps containing entries. */
931                 for (unsigned int i = 0; !err && i < n; i++) {
932                         struct map *pos = parent_maps_by_address[i];
933                         struct map *new = map__clone(pos);
934
935                         if (!new)
936                                 err = -ENOMEM;
937                         else {
938                                 err = unwind__prepare_access(dest, new, NULL);
939                                 if (!err)
940                                         err = __maps__insert(dest, new);
941                         }
942                         map__put(new);
943                 }
944         }
945         up_read(maps__lock(parent));
946         up_write(maps__lock(dest));
947         return err;
948 }
949
950 static int map__addr_cmp(const void *key, const void *entry)
951 {
952         const u64 ip = *(const u64 *)key;
953         const struct map *map = *(const struct map * const *)entry;
954
955         if (ip < map__start(map))
956                 return -1;
957         if (ip >= map__end(map))
958                 return 1;
959         return 0;
960 }
961
962 struct map *maps__find(struct maps *maps, u64 ip)
963 {
964         struct map *result = NULL;
965         bool done = false;
966
967         /* See locking/sorting note. */
968         while (!done) {
969                 down_read(maps__lock(maps));
970                 if (maps__maps_by_address_sorted(maps)) {
971                         struct map **mapp =
972                                 bsearch(&ip, maps__maps_by_address(maps), maps__nr_maps(maps),
973                                         sizeof(*mapp), map__addr_cmp);
974
975                         if (mapp)
976                                 result = map__get(*mapp);
977                         done = true;
978                 }
979                 up_read(maps__lock(maps));
980                 if (!done)
981                         maps__sort_by_address(maps);
982         }
983         return result;
984 }
985
986 static int map__strcmp_name(const void *name, const void *b)
987 {
988         const struct dso *dso = map__dso(*(const struct map **)b);
989
990         return strcmp(name, dso->short_name);
991 }
992
993 struct map *maps__find_by_name(struct maps *maps, const char *name)
994 {
995         struct map *result = NULL;
996         bool done = false;
997
998         /* See locking/sorting note. */
999         while (!done) {
1000                 unsigned int i;
1001
1002                 down_read(maps__lock(maps));
1003
1004                 /* First check last found entry. */
1005                 i = RC_CHK_ACCESS(maps)->last_search_by_name_idx;
1006                 if (i < maps__nr_maps(maps) && maps__maps_by_name(maps)) {
1007                         struct dso *dso = map__dso(maps__maps_by_name(maps)[i]);
1008
1009                         if (dso && strcmp(dso->short_name, name) == 0) {
1010                                 result = map__get(maps__maps_by_name(maps)[i]);
1011                                 done = true;
1012                         }
1013                 }
1014
1015                 /* Second search sorted array. */
1016                 if (!done && maps__maps_by_name_sorted(maps)) {
1017                         struct map **mapp =
1018                                 bsearch(name, maps__maps_by_name(maps), maps__nr_maps(maps),
1019                                         sizeof(*mapp), map__strcmp_name);
1020
1021                         if (mapp) {
1022                                 result = map__get(*mapp);
1023                                 i = mapp - maps__maps_by_name(maps);
1024                                 RC_CHK_ACCESS(maps)->last_search_by_name_idx = i;
1025                         }
1026                         done = true;
1027                 }
1028                 up_read(maps__lock(maps));
1029                 if (!done) {
1030                         /* Sort and retry binary search. */
1031                         if (maps__sort_by_name(maps)) {
1032                                 /*
1033                                  * Memory allocation failed do linear search
1034                                  * through address sorted maps.
1035                                  */
1036                                 struct map **maps_by_address;
1037                                 unsigned int n;
1038
1039                                 down_read(maps__lock(maps));
1040                                 maps_by_address =  maps__maps_by_address(maps);
1041                                 n = maps__nr_maps(maps);
1042                                 for (i = 0; i < n; i++) {
1043                                         struct map *pos = maps_by_address[i];
1044                                         struct dso *dso = map__dso(pos);
1045
1046                                         if (dso && strcmp(dso->short_name, name) == 0) {
1047                                                 result = map__get(pos);
1048                                                 break;
1049                                         }
1050                                 }
1051                                 up_read(maps__lock(maps));
1052                                 done = true;
1053                         }
1054                 }
1055         }
1056         return result;
1057 }
1058
1059 struct map *maps__find_next_entry(struct maps *maps, struct map *map)
1060 {
1061         unsigned int i;
1062         struct map *result = NULL;
1063
1064         down_read(maps__lock(maps));
1065         i = maps__by_address_index(maps, map);
1066         if (i < maps__nr_maps(maps))
1067                 result = map__get(maps__maps_by_address(maps)[i]);
1068
1069         up_read(maps__lock(maps));
1070         return result;
1071 }
1072
1073 void maps__fixup_end(struct maps *maps)
1074 {
1075         struct map **maps_by_address;
1076         unsigned int n;
1077
1078         down_write(maps__lock(maps));
1079         if (!maps__maps_by_address_sorted(maps))
1080                 __maps__sort_by_address(maps);
1081
1082         maps_by_address = maps__maps_by_address(maps);
1083         n = maps__nr_maps(maps);
1084         for (unsigned int i = 1; i < n; i++) {
1085                 struct map *prev = maps_by_address[i - 1];
1086                 struct map *curr = maps_by_address[i];
1087
1088                 if (!map__end(prev) || map__end(prev) > map__start(curr))
1089                         map__set_end(prev, map__start(curr));
1090         }
1091
1092         /*
1093          * We still haven't the actual symbols, so guess the
1094          * last map final address.
1095          */
1096         if (n > 0 && !map__end(maps_by_address[n - 1]))
1097                 map__set_end(maps_by_address[n - 1], ~0ULL);
1098
1099         RC_CHK_ACCESS(maps)->ends_broken = false;
1100
1101         up_write(maps__lock(maps));
1102 }
1103
1104 /*
1105  * Merges map into maps by splitting the new map within the existing map
1106  * regions.
1107  */
1108 int maps__merge_in(struct maps *kmaps, struct map *new_map)
1109 {
1110         unsigned int first_after_, kmaps__nr_maps;
1111         struct map **kmaps_maps_by_address;
1112         struct map **merged_maps_by_address;
1113         unsigned int merged_nr_maps_allocated;
1114
1115         /* First try under a read lock. */
1116         while (true) {
1117                 down_read(maps__lock(kmaps));
1118                 if (maps__maps_by_address_sorted(kmaps))
1119                         break;
1120
1121                 up_read(maps__lock(kmaps));
1122
1123                 /* First after binary search requires sorted maps. Sort and try again. */
1124                 maps__sort_by_address(kmaps);
1125         }
1126         first_after_ = first_ending_after(kmaps, new_map);
1127         kmaps_maps_by_address = maps__maps_by_address(kmaps);
1128
1129         if (first_after_ >= maps__nr_maps(kmaps) ||
1130             map__start(kmaps_maps_by_address[first_after_]) >= map__end(new_map)) {
1131                 /* No overlap so regular insert suffices. */
1132                 up_read(maps__lock(kmaps));
1133                 return maps__insert(kmaps, new_map);
1134         }
1135         up_read(maps__lock(kmaps));
1136
1137         /* Plain insert with a read-lock failed, try again now with the write lock. */
1138         down_write(maps__lock(kmaps));
1139         if (!maps__maps_by_address_sorted(kmaps))
1140                 __maps__sort_by_address(kmaps);
1141
1142         first_after_ = first_ending_after(kmaps, new_map);
1143         kmaps_maps_by_address = maps__maps_by_address(kmaps);
1144         kmaps__nr_maps = maps__nr_maps(kmaps);
1145
1146         if (first_after_ >= kmaps__nr_maps ||
1147             map__start(kmaps_maps_by_address[first_after_]) >= map__end(new_map)) {
1148                 /* No overlap so regular insert suffices. */
1149                 int ret = __maps__insert(kmaps, new_map);
1150                 up_write(maps__lock(kmaps));
1151                 return ret;
1152         }
1153         /* Array to merge into, possibly 1 more for the sake of new_map. */
1154         merged_nr_maps_allocated = RC_CHK_ACCESS(kmaps)->nr_maps_allocated;
1155         if (kmaps__nr_maps + 1 == merged_nr_maps_allocated)
1156                 merged_nr_maps_allocated++;
1157
1158         merged_maps_by_address = malloc(merged_nr_maps_allocated * sizeof(*merged_maps_by_address));
1159         if (!merged_maps_by_address) {
1160                 up_write(maps__lock(kmaps));
1161                 return -ENOMEM;
1162         }
1163         maps__set_maps_by_address(kmaps, merged_maps_by_address);
1164         maps__set_maps_by_address_sorted(kmaps, true);
1165         zfree(maps__maps_by_name_addr(kmaps));
1166         maps__set_maps_by_name_sorted(kmaps, true);
1167         maps__set_nr_maps_allocated(kmaps, merged_nr_maps_allocated);
1168
1169         /* Copy entries before the new_map that can't overlap. */
1170         for (unsigned int i = 0; i < first_after_; i++)
1171                 merged_maps_by_address[i] = map__get(kmaps_maps_by_address[i]);
1172
1173         maps__set_nr_maps(kmaps, first_after_);
1174
1175         /* Add the new map, it will be split when the later overlapping mappings are added. */
1176         __maps__insert(kmaps, new_map);
1177
1178         /* Insert mappings after new_map, splitting new_map in the process. */
1179         for (unsigned int i = first_after_; i < kmaps__nr_maps; i++)
1180                 __maps__fixup_overlap_and_insert(kmaps, kmaps_maps_by_address[i]);
1181
1182         /* Copy the maps from merged into kmaps. */
1183         for (unsigned int i = 0; i < kmaps__nr_maps; i++)
1184                 map__zput(kmaps_maps_by_address[i]);
1185
1186         free(kmaps_maps_by_address);
1187         up_write(maps__lock(kmaps));
1188         return 0;
1189 }
1190
1191 void maps__load_first(struct maps *maps)
1192 {
1193         down_read(maps__lock(maps));
1194
1195         if (maps__nr_maps(maps) > 0)
1196                 map__load(maps__maps_by_address(maps)[0]);
1197
1198         up_read(maps__lock(maps));
1199 }