linux/tools/perf/util/map.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2#include "symbol.h"
   3#include <assert.h>
   4#include <errno.h>
   5#include <inttypes.h>
   6#include <limits.h>
   7#include <stdlib.h>
   8#include <string.h>
   9#include <stdio.h>
  10#include <unistd.h>
  11#include <uapi/linux/mman.h> /* To get things like MAP_HUGETLB even on older libc headers */
  12#include "dso.h"
  13#include "map.h"
  14#include "map_symbol.h"
  15#include "thread.h"
  16#include "vdso.h"
  17#include "build-id.h"
  18#include "debug.h"
  19#include "machine.h"
  20#include <linux/string.h>
  21#include <linux/zalloc.h>
  22#include "srcline.h"
  23#include "namespaces.h"
  24#include "unwind.h"
  25#include "srccode.h"
  26#include "ui/ui.h"
  27
  28static void __maps__insert(struct maps *maps, struct map *map);
  29
  30static inline int is_android_lib(const char *filename)
  31{
  32        return strstarts(filename, "/data/app-lib/") ||
  33               strstarts(filename, "/system/lib/");
  34}
  35
  36static inline bool replace_android_lib(const char *filename, char *newfilename)
  37{
  38        const char *libname;
  39        char *app_abi;
  40        size_t app_abi_length, new_length;
  41        size_t lib_length = 0;
  42
  43        libname  = strrchr(filename, '/');
  44        if (libname)
  45                lib_length = strlen(libname);
  46
  47        app_abi = getenv("APP_ABI");
  48        if (!app_abi)
  49                return false;
  50
  51        app_abi_length = strlen(app_abi);
  52
  53        if (strstarts(filename, "/data/app-lib/")) {
  54                char *apk_path;
  55
  56                if (!app_abi_length)
  57                        return false;
  58
  59                new_length = 7 + app_abi_length + lib_length;
  60
  61                apk_path = getenv("APK_PATH");
  62                if (apk_path) {
  63                        new_length += strlen(apk_path) + 1;
  64                        if (new_length > PATH_MAX)
  65                                return false;
  66                        snprintf(newfilename, new_length,
  67                                 "%s/libs/%s/%s", apk_path, app_abi, libname);
  68                } else {
  69                        if (new_length > PATH_MAX)
  70                                return false;
  71                        snprintf(newfilename, new_length,
  72                                 "libs/%s/%s", app_abi, libname);
  73                }
  74                return true;
  75        }
  76
  77        if (strstarts(filename, "/system/lib/")) {
  78                char *ndk, *app;
  79                const char *arch;
  80                size_t ndk_length;
  81                size_t app_length;
  82
  83                ndk = getenv("NDK_ROOT");
  84                app = getenv("APP_PLATFORM");
  85
  86                if (!(ndk && app))
  87                        return false;
  88
  89                ndk_length = strlen(ndk);
  90                app_length = strlen(app);
  91
  92                if (!(ndk_length && app_length && app_abi_length))
  93                        return false;
  94
  95                arch = !strncmp(app_abi, "arm", 3) ? "arm" :
  96                       !strncmp(app_abi, "mips", 4) ? "mips" :
  97                       !strncmp(app_abi, "x86", 3) ? "x86" : NULL;
  98
  99                if (!arch)
 100                        return false;
 101
 102                new_length = 27 + ndk_length +
 103                             app_length + lib_length
 104                           + strlen(arch);
 105
 106                if (new_length > PATH_MAX)
 107                        return false;
 108                snprintf(newfilename, new_length,
 109                        "%s/platforms/%s/arch-%s/usr/lib/%s",
 110                        ndk, app, arch, libname);
 111
 112                return true;
 113        }
 114        return false;
 115}
 116
 117void map__init(struct map *map, u64 start, u64 end, u64 pgoff, struct dso *dso)
 118{
 119        map->start    = start;
 120        map->end      = end;
 121        map->pgoff    = pgoff;
 122        map->reloc    = 0;
 123        map->dso      = dso__get(dso);
 124        map->map_ip   = map__map_ip;
 125        map->unmap_ip = map__unmap_ip;
 126        RB_CLEAR_NODE(&map->rb_node);
 127        map->erange_warned = false;
 128        refcount_set(&map->refcnt, 1);
 129}
 130
 131struct map *map__new(struct machine *machine, u64 start, u64 len,
 132                     u64 pgoff, struct dso_id *id,
 133                     u32 prot, u32 flags, char *filename,
 134                     struct thread *thread)
 135{
 136        struct map *map = malloc(sizeof(*map));
 137        struct nsinfo *nsi = NULL;
 138        struct nsinfo *nnsi;
 139
 140        if (map != NULL) {
 141                char newfilename[PATH_MAX];
 142                struct dso *dso;
 143                int anon, no_dso, vdso, android;
 144
 145                android = is_android_lib(filename);
 146                anon = is_anon_memory(filename) || flags & MAP_HUGETLB;
 147                vdso = is_vdso_map(filename);
 148                no_dso = is_no_dso_memory(filename);
 149                map->prot = prot;
 150                map->flags = flags;
 151                nsi = nsinfo__get(thread->nsinfo);
 152
 153                if ((anon || no_dso) && nsi && (prot & PROT_EXEC)) {
 154                        snprintf(newfilename, sizeof(newfilename),
 155                                 "/tmp/perf-%d.map", nsi->pid);
 156                        filename = newfilename;
 157                }
 158
 159                if (android) {
 160                        if (replace_android_lib(filename, newfilename))
 161                                filename = newfilename;
 162                }
 163
 164                if (vdso) {
 165                        /* The vdso maps are always on the host and not the
 166                         * container.  Ensure that we don't use setns to look
 167                         * them up.
 168                         */
 169                        nnsi = nsinfo__copy(nsi);
 170                        if (nnsi) {
 171                                nsinfo__put(nsi);
 172                                nnsi->need_setns = false;
 173                                nsi = nnsi;
 174                        }
 175                        pgoff = 0;
 176                        dso = machine__findnew_vdso(machine, thread);
 177                } else
 178                        dso = machine__findnew_dso_id(machine, filename, id);
 179
 180                if (dso == NULL)
 181                        goto out_delete;
 182
 183                map__init(map, start, start + len, pgoff, dso);
 184
 185                if (anon || no_dso) {
 186                        map->map_ip = map->unmap_ip = identity__map_ip;
 187
 188                        /*
 189                         * Set memory without DSO as loaded. All map__find_*
 190                         * functions still return NULL, and we avoid the
 191                         * unnecessary map__load warning.
 192                         */
 193                        if (!(prot & PROT_EXEC))
 194                                dso__set_loaded(dso);
 195                }
 196                dso->nsinfo = nsi;
 197                dso__put(dso);
 198        }
 199        return map;
 200out_delete:
 201        nsinfo__put(nsi);
 202        free(map);
 203        return NULL;
 204}
 205
 206/*
 207 * Constructor variant for modules (where we know from /proc/modules where
 208 * they are loaded) and for vmlinux, where only after we load all the
 209 * symbols we'll know where it starts and ends.
 210 */
 211struct map *map__new2(u64 start, struct dso *dso)
 212{
 213        struct map *map = calloc(1, (sizeof(*map) +
 214                                     (dso->kernel ? sizeof(struct kmap) : 0)));
 215        if (map != NULL) {
 216                /*
 217                 * ->end will be filled after we load all the symbols
 218                 */
 219                map__init(map, start, 0, 0, dso);
 220        }
 221
 222        return map;
 223}
 224
 225bool __map__is_kernel(const struct map *map)
 226{
 227        if (!map->dso->kernel)
 228                return false;
 229        return machine__kernel_map(map__kmaps((struct map *)map)->machine) == map;
 230}
 231
 232bool __map__is_extra_kernel_map(const struct map *map)
 233{
 234        struct kmap *kmap = __map__kmap((struct map *)map);
 235
 236        return kmap && kmap->name[0];
 237}
 238
 239bool __map__is_bpf_prog(const struct map *map)
 240{
 241        const char *name;
 242
 243        if (map->dso->binary_type == DSO_BINARY_TYPE__BPF_PROG_INFO)
 244                return true;
 245
 246        /*
 247         * If PERF_RECORD_BPF_EVENT is not included, the dso will not have
 248         * type of DSO_BINARY_TYPE__BPF_PROG_INFO. In such cases, we can
 249         * guess the type based on name.
 250         */
 251        name = map->dso->short_name;
 252        return name && (strstr(name, "bpf_prog_") == name);
 253}
 254
 255bool __map__is_bpf_image(const struct map *map)
 256{
 257        const char *name;
 258
 259        if (map->dso->binary_type == DSO_BINARY_TYPE__BPF_IMAGE)
 260                return true;
 261
 262        /*
 263         * If PERF_RECORD_KSYMBOL is not included, the dso will not have
 264         * type of DSO_BINARY_TYPE__BPF_IMAGE. In such cases, we can
 265         * guess the type based on name.
 266         */
 267        name = map->dso->short_name;
 268        return name && is_bpf_image(name);
 269}
 270
 271bool __map__is_ool(const struct map *map)
 272{
 273        return map->dso && map->dso->binary_type == DSO_BINARY_TYPE__OOL;
 274}
 275
 276bool map__has_symbols(const struct map *map)
 277{
 278        return dso__has_symbols(map->dso);
 279}
 280
 281static void map__exit(struct map *map)
 282{
 283        BUG_ON(refcount_read(&map->refcnt) != 0);
 284        dso__zput(map->dso);
 285}
 286
 287void map__delete(struct map *map)
 288{
 289        map__exit(map);
 290        free(map);
 291}
 292
 293void map__put(struct map *map)
 294{
 295        if (map && refcount_dec_and_test(&map->refcnt))
 296                map__delete(map);
 297}
 298
 299void map__fixup_start(struct map *map)
 300{
 301        struct rb_root_cached *symbols = &map->dso->symbols;
 302        struct rb_node *nd = rb_first_cached(symbols);
 303        if (nd != NULL) {
 304                struct symbol *sym = rb_entry(nd, struct symbol, rb_node);
 305                map->start = sym->start;
 306        }
 307}
 308
 309void map__fixup_end(struct map *map)
 310{
 311        struct rb_root_cached *symbols = &map->dso->symbols;
 312        struct rb_node *nd = rb_last(&symbols->rb_root);
 313        if (nd != NULL) {
 314                struct symbol *sym = rb_entry(nd, struct symbol, rb_node);
 315                map->end = sym->end;
 316        }
 317}
 318
 319#define DSO__DELETED "(deleted)"
 320
 321int map__load(struct map *map)
 322{
 323        const char *name = map->dso->long_name;
 324        int nr;
 325
 326        if (dso__loaded(map->dso))
 327                return 0;
 328
 329        nr = dso__load(map->dso, map);
 330        if (nr < 0) {
 331                if (map->dso->has_build_id) {
 332                        char sbuild_id[SBUILD_ID_SIZE];
 333
 334                        build_id__sprintf(&map->dso->bid, sbuild_id);
 335                        pr_debug("%s with build id %s not found", name, sbuild_id);
 336                } else
 337                        pr_debug("Failed to open %s", name);
 338
 339                pr_debug(", continuing without symbols\n");
 340                return -1;
 341        } else if (nr == 0) {
 342#ifdef HAVE_LIBELF_SUPPORT
 343                const size_t len = strlen(name);
 344                const size_t real_len = len - sizeof(DSO__DELETED);
 345
 346                if (len > sizeof(DSO__DELETED) &&
 347                    strcmp(name + real_len + 1, DSO__DELETED) == 0) {
 348                        pr_debug("%.*s was updated (is prelink enabled?). "
 349                                "Restart the long running apps that use it!\n",
 350                                   (int)real_len, name);
 351                } else {
 352                        pr_debug("no symbols found in %s, maybe install a debug package?\n", name);
 353                }
 354#endif
 355                return -1;
 356        }
 357
 358        return 0;
 359}
 360
 361struct symbol *map__find_symbol(struct map *map, u64 addr)
 362{
 363        if (map__load(map) < 0)
 364                return NULL;
 365
 366        return dso__find_symbol(map->dso, addr);
 367}
 368
 369struct symbol *map__find_symbol_by_name(struct map *map, const char *name)
 370{
 371        if (map__load(map) < 0)
 372                return NULL;
 373
 374        if (!dso__sorted_by_name(map->dso))
 375                dso__sort_by_name(map->dso);
 376
 377        return dso__find_symbol_by_name(map->dso, name);
 378}
 379
 380struct map *map__clone(struct map *from)
 381{
 382        size_t size = sizeof(struct map);
 383        struct map *map;
 384
 385        if (from->dso && from->dso->kernel)
 386                size += sizeof(struct kmap);
 387
 388        map = memdup(from, size);
 389        if (map != NULL) {
 390                refcount_set(&map->refcnt, 1);
 391                RB_CLEAR_NODE(&map->rb_node);
 392                dso__get(map->dso);
 393        }
 394
 395        return map;
 396}
 397
 398size_t map__fprintf(struct map *map, FILE *fp)
 399{
 400        return fprintf(fp, " %" PRIx64 "-%" PRIx64 " %" PRIx64 " %s\n",
 401                       map->start, map->end, map->pgoff, map->dso->name);
 402}
 403
 404size_t map__fprintf_dsoname(struct map *map, FILE *fp)
 405{
 406        char buf[symbol_conf.pad_output_len_dso + 1];
 407        const char *dsoname = "[unknown]";
 408
 409        if (map && map->dso) {
 410                if (symbol_conf.show_kernel_path && map->dso->long_name)
 411                        dsoname = map->dso->long_name;
 412                else
 413                        dsoname = map->dso->name;
 414        }
 415
 416        if (symbol_conf.pad_output_len_dso) {
 417                scnprintf_pad(buf, symbol_conf.pad_output_len_dso, "%s", dsoname);
 418                dsoname = buf;
 419        }
 420
 421        return fprintf(fp, "%s", dsoname);
 422}
 423
 424char *map__srcline(struct map *map, u64 addr, struct symbol *sym)
 425{
 426        if (map == NULL)
 427                return SRCLINE_UNKNOWN;
 428        return get_srcline(map->dso, map__rip_2objdump(map, addr), sym, true, true, addr);
 429}
 430
 431int map__fprintf_srcline(struct map *map, u64 addr, const char *prefix,
 432                         FILE *fp)
 433{
 434        int ret = 0;
 435
 436        if (map && map->dso) {
 437                char *srcline = map__srcline(map, addr, NULL);
 438                if (strncmp(srcline, SRCLINE_UNKNOWN, strlen(SRCLINE_UNKNOWN)) != 0)
 439                        ret = fprintf(fp, "%s%s", prefix, srcline);
 440                free_srcline(srcline);
 441        }
 442        return ret;
 443}
 444
 445void srccode_state_free(struct srccode_state *state)
 446{
 447        zfree(&state->srcfile);
 448        state->line = 0;
 449}
 450
 451/**
 452 * map__rip_2objdump - convert symbol start address to objdump address.
 453 * @map: memory map
 454 * @rip: symbol start address
 455 *
 456 * objdump wants/reports absolute IPs for ET_EXEC, and RIPs for ET_DYN.
 457 * map->dso->adjust_symbols==1 for ET_EXEC-like cases except ET_REL which is
 458 * relative to section start.
 459 *
 460 * Return: Address suitable for passing to "objdump --start-address="
 461 */
 462u64 map__rip_2objdump(struct map *map, u64 rip)
 463{
 464        struct kmap *kmap = __map__kmap(map);
 465
 466        /*
 467         * vmlinux does not have program headers for PTI entry trampolines and
 468         * kcore may not either. However the trampoline object code is on the
 469         * main kernel map, so just use that instead.
 470         */
 471        if (kmap && is_entry_trampoline(kmap->name) && kmap->kmaps && kmap->kmaps->machine) {
 472                struct map *kernel_map = machine__kernel_map(kmap->kmaps->machine);
 473
 474                if (kernel_map)
 475                        map = kernel_map;
 476        }
 477
 478        if (!map->dso->adjust_symbols)
 479                return rip;
 480
 481        if (map->dso->rel)
 482                return rip - map->pgoff;
 483
 484        /*
 485         * kernel modules also have DSO_TYPE_USER in dso->kernel,
 486         * but all kernel modules are ET_REL, so won't get here.
 487         */
 488        if (map->dso->kernel == DSO_SPACE__USER)
 489                return rip + map->dso->text_offset;
 490
 491        return map->unmap_ip(map, rip) - map->reloc;
 492}
 493
 494/**
 495 * map__objdump_2mem - convert objdump address to a memory address.
 496 * @map: memory map
 497 * @ip: objdump address
 498 *
 499 * Closely related to map__rip_2objdump(), this function takes an address from
 500 * objdump and converts it to a memory address.  Note this assumes that @map
 501 * contains the address.  To be sure the result is valid, check it forwards
 502 * e.g. map__rip_2objdump(map->map_ip(map, map__objdump_2mem(map, ip))) == ip
 503 *
 504 * Return: Memory address.
 505 */
 506u64 map__objdump_2mem(struct map *map, u64 ip)
 507{
 508        if (!map->dso->adjust_symbols)
 509                return map->unmap_ip(map, ip);
 510
 511        if (map->dso->rel)
 512                return map->unmap_ip(map, ip + map->pgoff);
 513
 514        /*
 515         * kernel modules also have DSO_TYPE_USER in dso->kernel,
 516         * but all kernel modules are ET_REL, so won't get here.
 517         */
 518        if (map->dso->kernel == DSO_SPACE__USER)
 519                return map->unmap_ip(map, ip - map->dso->text_offset);
 520
 521        return ip + map->reloc;
 522}
 523
 524void maps__init(struct maps *maps, struct machine *machine)
 525{
 526        maps->entries = RB_ROOT;
 527        init_rwsem(&maps->lock);
 528        maps->machine = machine;
 529        maps->last_search_by_name = NULL;
 530        maps->nr_maps = 0;
 531        maps->maps_by_name = NULL;
 532        refcount_set(&maps->refcnt, 1);
 533}
 534
 535static void __maps__free_maps_by_name(struct maps *maps)
 536{
 537        /*
 538         * Free everything to try to do it from the rbtree in the next search
 539         */
 540        zfree(&maps->maps_by_name);
 541        maps->nr_maps_allocated = 0;
 542}
 543
 544void maps__insert(struct maps *maps, struct map *map)
 545{
 546        down_write(&maps->lock);
 547        __maps__insert(maps, map);
 548        ++maps->nr_maps;
 549
 550        if (map->dso && map->dso->kernel) {
 551                struct kmap *kmap = map__kmap(map);
 552
 553                if (kmap)
 554                        kmap->kmaps = maps;
 555                else
 556                        pr_err("Internal error: kernel dso with non kernel map\n");
 557        }
 558
 559
 560        /*
 561         * If we already performed some search by name, then we need to add the just
 562         * inserted map and resort.
 563         */
 564        if (maps->maps_by_name) {
 565                if (maps->nr_maps > maps->nr_maps_allocated) {
 566                        int nr_allocate = maps->nr_maps * 2;
 567                        struct map **maps_by_name = realloc(maps->maps_by_name, nr_allocate * sizeof(map));
 568
 569                        if (maps_by_name == NULL) {
 570                                __maps__free_maps_by_name(maps);
 571                                up_write(&maps->lock);
 572                                return;
 573                        }
 574
 575                        maps->maps_by_name = maps_by_name;
 576                        maps->nr_maps_allocated = nr_allocate;
 577                }
 578                maps->maps_by_name[maps->nr_maps - 1] = map;
 579                __maps__sort_by_name(maps);
 580        }
 581        up_write(&maps->lock);
 582}
 583
 584static void __maps__remove(struct maps *maps, struct map *map)
 585{
 586        rb_erase_init(&map->rb_node, &maps->entries);
 587        map__put(map);
 588}
 589
 590void maps__remove(struct maps *maps, struct map *map)
 591{
 592        down_write(&maps->lock);
 593        if (maps->last_search_by_name == map)
 594                maps->last_search_by_name = NULL;
 595
 596        __maps__remove(maps, map);
 597        --maps->nr_maps;
 598        if (maps->maps_by_name)
 599                __maps__free_maps_by_name(maps);
 600        up_write(&maps->lock);
 601}
 602
 603static void __maps__purge(struct maps *maps)
 604{
 605        struct map *pos, *next;
 606
 607        maps__for_each_entry_safe(maps, pos, next) {
 608                rb_erase_init(&pos->rb_node,  &maps->entries);
 609                map__put(pos);
 610        }
 611}
 612
 613void maps__exit(struct maps *maps)
 614{
 615        down_write(&maps->lock);
 616        __maps__purge(maps);
 617        up_write(&maps->lock);
 618}
 619
 620bool maps__empty(struct maps *maps)
 621{
 622        return !maps__first(maps);
 623}
 624
 625struct maps *maps__new(struct machine *machine)
 626{
 627        struct maps *maps = zalloc(sizeof(*maps));
 628
 629        if (maps != NULL)
 630                maps__init(maps, machine);
 631
 632        return maps;
 633}
 634
 635void maps__delete(struct maps *maps)
 636{
 637        maps__exit(maps);
 638        unwind__finish_access(maps);
 639        free(maps);
 640}
 641
 642void maps__put(struct maps *maps)
 643{
 644        if (maps && refcount_dec_and_test(&maps->refcnt))
 645                maps__delete(maps);
 646}
 647
 648struct symbol *maps__find_symbol(struct maps *maps, u64 addr, struct map **mapp)
 649{
 650        struct map *map = maps__find(maps, addr);
 651
 652        /* Ensure map is loaded before using map->map_ip */
 653        if (map != NULL && map__load(map) >= 0) {
 654                if (mapp != NULL)
 655                        *mapp = map;
 656                return map__find_symbol(map, map->map_ip(map, addr));
 657        }
 658
 659        return NULL;
 660}
 661
 662static bool map__contains_symbol(struct map *map, struct symbol *sym)
 663{
 664        u64 ip = map->unmap_ip(map, sym->start);
 665
 666        return ip >= map->start && ip < map->end;
 667}
 668
 669struct symbol *maps__find_symbol_by_name(struct maps *maps, const char *name, struct map **mapp)
 670{
 671        struct symbol *sym;
 672        struct map *pos;
 673
 674        down_read(&maps->lock);
 675
 676        maps__for_each_entry(maps, pos) {
 677                sym = map__find_symbol_by_name(pos, name);
 678
 679                if (sym == NULL)
 680                        continue;
 681                if (!map__contains_symbol(pos, sym)) {
 682                        sym = NULL;
 683                        continue;
 684                }
 685                if (mapp != NULL)
 686                        *mapp = pos;
 687                goto out;
 688        }
 689
 690        sym = NULL;
 691out:
 692        up_read(&maps->lock);
 693        return sym;
 694}
 695
 696int maps__find_ams(struct maps *maps, struct addr_map_symbol *ams)
 697{
 698        if (ams->addr < ams->ms.map->start || ams->addr >= ams->ms.map->end) {
 699                if (maps == NULL)
 700                        return -1;
 701                ams->ms.map = maps__find(maps, ams->addr);
 702                if (ams->ms.map == NULL)
 703                        return -1;
 704        }
 705
 706        ams->al_addr = ams->ms.map->map_ip(ams->ms.map, ams->addr);
 707        ams->ms.sym = map__find_symbol(ams->ms.map, ams->al_addr);
 708
 709        return ams->ms.sym ? 0 : -1;
 710}
 711
 712size_t maps__fprintf(struct maps *maps, FILE *fp)
 713{
 714        size_t printed = 0;
 715        struct map *pos;
 716
 717        down_read(&maps->lock);
 718
 719        maps__for_each_entry(maps, pos) {
 720                printed += fprintf(fp, "Map:");
 721                printed += map__fprintf(pos, fp);
 722                if (verbose > 2) {
 723                        printed += dso__fprintf(pos->dso, fp);
 724                        printed += fprintf(fp, "--\n");
 725                }
 726        }
 727
 728        up_read(&maps->lock);
 729
 730        return printed;
 731}
 732
 733int maps__fixup_overlappings(struct maps *maps, struct map *map, FILE *fp)
 734{
 735        struct rb_root *root;
 736        struct rb_node *next, *first;
 737        int err = 0;
 738
 739        down_write(&maps->lock);
 740
 741        root = &maps->entries;
 742
 743        /*
 744         * Find first map where end > map->start.
 745         * Same as find_vma() in kernel.
 746         */
 747        next = root->rb_node;
 748        first = NULL;
 749        while (next) {
 750                struct map *pos = rb_entry(next, struct map, rb_node);
 751
 752                if (pos->end > map->start) {
 753                        first = next;
 754                        if (pos->start <= map->start)
 755                                break;
 756                        next = next->rb_left;
 757                } else
 758                        next = next->rb_right;
 759        }
 760
 761        next = first;
 762        while (next) {
 763                struct map *pos = rb_entry(next, struct map, rb_node);
 764                next = rb_next(&pos->rb_node);
 765
 766                /*
 767                 * Stop if current map starts after map->end.
 768                 * Maps are ordered by start: next will not overlap for sure.
 769                 */
 770                if (pos->start >= map->end)
 771                        break;
 772
 773                if (verbose >= 2) {
 774
 775                        if (use_browser) {
 776                                pr_debug("overlapping maps in %s (disable tui for more info)\n",
 777                                           map->dso->name);
 778                        } else {
 779                                fputs("overlapping maps:\n", fp);
 780                                map__fprintf(map, fp);
 781                                map__fprintf(pos, fp);
 782                        }
 783                }
 784
 785                rb_erase_init(&pos->rb_node, root);
 786                /*
 787                 * Now check if we need to create new maps for areas not
 788                 * overlapped by the new map:
 789                 */
 790                if (map->start > pos->start) {
 791                        struct map *before = map__clone(pos);
 792
 793                        if (before == NULL) {
 794                                err = -ENOMEM;
 795                                goto put_map;
 796                        }
 797
 798                        before->end = map->start;
 799                        __maps__insert(maps, before);
 800                        if (verbose >= 2 && !use_browser)
 801                                map__fprintf(before, fp);
 802                        map__put(before);
 803                }
 804
 805                if (map->end < pos->end) {
 806                        struct map *after = map__clone(pos);
 807
 808                        if (after == NULL) {
 809                                err = -ENOMEM;
 810                                goto put_map;
 811                        }
 812
 813                        after->start = map->end;
 814                        after->pgoff += map->end - pos->start;
 815                        assert(pos->map_ip(pos, map->end) == after->map_ip(after, map->end));
 816                        __maps__insert(maps, after);
 817                        if (verbose >= 2 && !use_browser)
 818                                map__fprintf(after, fp);
 819                        map__put(after);
 820                }
 821put_map:
 822                map__put(pos);
 823
 824                if (err)
 825                        goto out;
 826        }
 827
 828        err = 0;
 829out:
 830        up_write(&maps->lock);
 831        return err;
 832}
 833
 834/*
 835 * XXX This should not really _copy_ te maps, but refcount them.
 836 */
 837int maps__clone(struct thread *thread, struct maps *parent)
 838{
 839        struct maps *maps = thread->maps;
 840        int err = -ENOMEM;
 841        struct map *map;
 842
 843        down_read(&parent->lock);
 844
 845        maps__for_each_entry(parent, map) {
 846                struct map *new = map__clone(map);
 847                if (new == NULL)
 848                        goto out_unlock;
 849
 850                err = unwind__prepare_access(maps, new, NULL);
 851                if (err)
 852                        goto out_unlock;
 853
 854                maps__insert(maps, new);
 855                map__put(new);
 856        }
 857
 858        err = 0;
 859out_unlock:
 860        up_read(&parent->lock);
 861        return err;
 862}
 863
 864static void __maps__insert(struct maps *maps, struct map *map)
 865{
 866        struct rb_node **p = &maps->entries.rb_node;
 867        struct rb_node *parent = NULL;
 868        const u64 ip = map->start;
 869        struct map *m;
 870
 871        while (*p != NULL) {
 872                parent = *p;
 873                m = rb_entry(parent, struct map, rb_node);
 874                if (ip < m->start)
 875                        p = &(*p)->rb_left;
 876                else
 877                        p = &(*p)->rb_right;
 878        }
 879
 880        rb_link_node(&map->rb_node, parent, p);
 881        rb_insert_color(&map->rb_node, &maps->entries);
 882        map__get(map);
 883}
 884
 885struct map *maps__find(struct maps *maps, u64 ip)
 886{
 887        struct rb_node *p;
 888        struct map *m;
 889
 890        down_read(&maps->lock);
 891
 892        p = maps->entries.rb_node;
 893        while (p != NULL) {
 894                m = rb_entry(p, struct map, rb_node);
 895                if (ip < m->start)
 896                        p = p->rb_left;
 897                else if (ip >= m->end)
 898                        p = p->rb_right;
 899                else
 900                        goto out;
 901        }
 902
 903        m = NULL;
 904out:
 905        up_read(&maps->lock);
 906        return m;
 907}
 908
 909struct map *maps__first(struct maps *maps)
 910{
 911        struct rb_node *first = rb_first(&maps->entries);
 912
 913        if (first)
 914                return rb_entry(first, struct map, rb_node);
 915        return NULL;
 916}
 917
 918static struct map *__map__next(struct map *map)
 919{
 920        struct rb_node *next = rb_next(&map->rb_node);
 921
 922        if (next)
 923                return rb_entry(next, struct map, rb_node);
 924        return NULL;
 925}
 926
 927struct map *map__next(struct map *map)
 928{
 929        return map ? __map__next(map) : NULL;
 930}
 931
 932struct kmap *__map__kmap(struct map *map)
 933{
 934        if (!map->dso || !map->dso->kernel)
 935                return NULL;
 936        return (struct kmap *)(map + 1);
 937}
 938
 939struct kmap *map__kmap(struct map *map)
 940{
 941        struct kmap *kmap = __map__kmap(map);
 942
 943        if (!kmap)
 944                pr_err("Internal error: map__kmap with a non-kernel map\n");
 945        return kmap;
 946}
 947
 948struct maps *map__kmaps(struct map *map)
 949{
 950        struct kmap *kmap = map__kmap(map);
 951
 952        if (!kmap || !kmap->kmaps) {
 953                pr_err("Internal error: map__kmaps with a non-kernel map\n");
 954                return NULL;
 955        }
 956        return kmap->kmaps;
 957}
 958