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