Lines Matching full:map

7 #include "map.h"
32 struct map **maps_by_address; in DECLARE_RC_STRUCT()
37 struct map **maps_by_name; in DECLARE_RC_STRUCT()
63 /** @ends_broken: does the map contain a map where end values are unset/unsorted? */ in DECLARE_RC_STRUCT()
72 struct map *map = RC_CHK_ACCESS(maps)->maps_by_address[i]; in check_invariants() local
74 /* Check map is well-formed. */ in check_invariants()
75 assert(map__end(map) == 0 || map__start(map) <= map__end(map)); in check_invariants()
77 assert(refcount_read(map__refcnt(map)) > 0); in check_invariants()
79 if (map__dso(map) && dso__kernel(map__dso(map))) in check_invariants()
80 assert(RC_CHK_EQUAL(map__kmap(map)->kmaps, maps)); in check_invariants()
83 struct map *prev = RC_CHK_ACCESS(maps)->maps_by_address[i - 1]; in check_invariants()
88 assert(map__start(prev) <= map__start(map)); in check_invariants()
95 assert(map__end(prev) <= map__end(map)); in check_invariants()
96 assert(map__end(prev) <= map__start(map) || in check_invariants()
97 map__start(prev) == map__start(map)); in check_invariants()
104 struct map *map = RC_CHK_ACCESS(maps)->maps_by_name[i]; in check_invariants() local
110 assert(refcount_read(map__refcnt(map)) > 1); in check_invariants()
116 static struct map **maps__maps_by_address(const struct maps *maps) in maps__maps_by_address()
121 static void maps__set_maps_by_address(struct maps *maps, struct map **new) in maps__set_maps_by_address()
138 static struct map **maps__maps_by_name(const struct maps *maps) in maps__maps_by_name()
144 static void maps__set_maps_by_name(struct maps *maps, struct map **new) in maps__set_maps_by_name()
232 struct map **maps_by_address = maps__maps_by_address(maps); in maps__exit()
233 struct map **maps_by_name = maps__maps_by_name(maps); in maps__exit()
299 const struct map *map_a = *(const struct map * const *)a; in map__start_cmp()
300 const struct map *map_b = *(const struct map * const *)b; in map__start_cmp()
327 sizeof(struct map *), in __maps__sort_by_address()
341 const struct map *map_a = *(const struct map * const *)a; in map__strcmp()
342 const struct map *map_b = *(const struct map * const *)b; in map__strcmp()
360 struct map **maps_by_name = maps__maps_by_name(maps); in maps__sort_by_name()
368 struct map **maps_by_address = maps__maps_by_address(maps); in maps__sort_by_name()
379 sizeof(struct map *), in maps__sort_by_name()
389 static unsigned int maps__by_address_index(const struct maps *maps, const struct map *map) in maps__by_address_index() argument
391 struct map **maps_by_address = maps__maps_by_address(maps); in maps__by_address_index()
394 struct map **mapp = in maps__by_address_index()
395 bsearch(&map, maps__maps_by_address(maps), maps__nr_maps(maps), in maps__by_address_index()
402 if (RC_CHK_ACCESS(maps_by_address[i]) == RC_CHK_ACCESS(map)) in maps__by_address_index()
406 pr_err("Map missing from maps"); in maps__by_address_index()
410 static unsigned int maps__by_name_index(const struct maps *maps, const struct map *map) in maps__by_name_index() argument
412 struct map **maps_by_name = maps__maps_by_name(maps); in maps__by_name_index()
415 struct map **mapp = in maps__by_name_index()
416 bsearch(&map, maps_by_name, maps__nr_maps(maps), in maps__by_name_index()
423 if (RC_CHK_ACCESS(maps_by_name[i]) == RC_CHK_ACCESS(map)) in maps__by_name_index()
427 pr_err("Map missing from maps"); in maps__by_name_index()
431 static void map__set_kmap_maps(struct map *map, struct maps *maps) in map__set_kmap_maps() argument
435 if (map == NULL) in map__set_kmap_maps()
438 dso = map__dso(map); in map__set_kmap_maps()
441 struct kmap *kmap = map__kmap(map); in map__set_kmap_maps()
446 pr_err("Internal error: kernel dso with non kernel map\n"); in map__set_kmap_maps()
450 static int __maps__insert(struct maps *maps, struct map *new) in __maps__insert()
452 struct map **maps_by_address = maps__maps_by_address(maps); in __maps__insert()
453 struct map **maps_by_name = maps__maps_by_name(maps); in __maps__insert()
497 /* Sorted if maps were already sorted and this map starts after the last one. */ in __maps__insert()
509 int maps__insert(struct maps *maps, struct map *map) in maps__insert() argument
514 ret = __maps__insert(maps, map); in maps__insert()
520 static void __maps__remove(struct maps *maps, struct map *map) in __maps__remove() argument
522 struct map **maps_by_address = maps__maps_by_address(maps); in __maps__remove()
523 struct map **maps_by_name = maps__maps_by_name(maps); in __maps__remove()
528 address_idx = maps__by_address_index(maps, map); in __maps__remove()
535 unsigned int name_idx = maps__by_name_index(maps, map); in __maps__remove()
546 void maps__remove(struct maps *maps, struct map *map) in maps__remove() argument
549 __maps__remove(maps, map); in maps__remove()
570 int maps__for_each_map(struct maps *maps, int (*cb)(struct map *map, void *data), void *data) in maps__for_each_map() argument
588 struct map **maps_by_address = maps__maps_by_address(maps); in maps__for_each_map()
589 struct map *map = maps_by_address[i]; in maps__for_each_map() local
591 ret = cb(map, data); in maps__for_each_map()
604 void maps__remove_maps(struct maps *maps, bool (*cb)(struct map *map, void *data), void *data) in maps__remove_maps() argument
606 struct map **maps_by_address; in maps__remove_maps()
621 struct symbol *maps__find_symbol(struct maps *maps, u64 addr, struct map **mapp) in maps__find_symbol()
623 struct map *map = maps__find(maps, addr); in maps__find_symbol() local
626 /* Ensure map is loaded before using map->map_ip */ in maps__find_symbol()
627 if (map != NULL && map__load(map) >= 0) in maps__find_symbol()
628 result = map__find_symbol(map, map__map_ip(map, addr)); in maps__find_symbol()
631 *mapp = map; in maps__find_symbol()
633 map__put(map); in maps__find_symbol()
639 struct map **mapp;
644 static int maps__find_symbol_by_name_cb(struct map *map, void *data) in maps__find_symbol_by_name_cb() argument
648 args->sym = map__find_symbol_by_name(map, args->name); in maps__find_symbol_by_name_cb()
652 if (!map__contains_symbol(map, args->sym)) { in maps__find_symbol_by_name_cb()
658 *args->mapp = map__get(map); in maps__find_symbol_by_name_cb()
662 struct symbol *maps__find_symbol_by_name(struct maps *maps, const char *name, struct map **mapp) in maps__find_symbol_by_name()
676 if (ams->addr < map__start(ams->ms.map) || ams->addr >= map__end(ams->ms.map)) { in maps__find_ams()
679 ams->ms.map = maps__find(maps, ams->addr); in maps__find_ams()
680 if (ams->ms.map == NULL) in maps__find_ams()
684 ams->al_addr = map__map_ip(ams->ms.map, ams->addr); in maps__find_ams()
685 ams->ms.sym = map__find_symbol(ams->ms.map, ams->al_addr); in maps__find_ams()
695 static int maps__fprintf_cb(struct map *map, void *data) in maps__fprintf_cb() argument
699 args->printed += fprintf(args->fp, "Map:"); in maps__fprintf_cb()
700 args->printed += map__fprintf(map, args->fp); in maps__fprintf_cb()
702 args->printed += dso__fprintf(map__dso(map), args->fp); in maps__fprintf_cb()
721 * Find first map where end > map->start.
724 static unsigned int first_ending_after(struct maps *maps, const struct map *map) in first_ending_after() argument
726 struct map **maps_by_address = maps__maps_by_address(maps); in first_ending_after()
730 if (low <= high && map__end(maps_by_address[0]) > map__start(map)) in first_ending_after()
735 struct map *pos = maps_by_address[mid]; in first_ending_after()
737 if (map__end(pos) > map__start(map)) { in first_ending_after()
739 if (map__start(pos) <= map__start(map)) { in first_ending_after()
740 /* Entry overlaps map. */ in first_ending_after()
751 struct map *new1, struct map *new2) in __maps__insert_sorted()
753 struct map **maps_by_address = maps__maps_by_address(maps); in __maps__insert_sorted()
754 struct map **maps_by_name = maps__maps_by_name(maps); in __maps__insert_sorted()
811 static int __maps__fixup_overlap_and_insert(struct maps *maps, struct map *new) in __maps__fixup_overlap_and_insert()
822 * greater-than the new map's start. in __maps__fixup_overlap_and_insert()
825 struct map **maps_by_address = maps__maps_by_address(maps); in __maps__fixup_overlap_and_insert()
826 struct map **maps_by_name = maps__maps_by_name(maps); in __maps__fixup_overlap_and_insert()
827 struct map *pos = maps_by_address[i]; in __maps__fixup_overlap_and_insert()
828 struct map *before = NULL, *after = NULL; in __maps__fixup_overlap_and_insert()
831 * Stop if current map starts after map->end. in __maps__fixup_overlap_and_insert()
851 * overlapped by the new map: in __maps__fixup_overlap_and_insert()
854 /* Map starts within existing map. Need to shorten the existing map. */ in __maps__fixup_overlap_and_insert()
867 /* The new map isn't as long as the existing map. */ in __maps__fixup_overlap_and_insert()
933 struct map *next = NULL; in __maps__fixup_overlap_and_insert()
982 /* Add the map. */ in __maps__fixup_overlap_and_insert()
988 int maps__fixup_overlap_and_insert(struct maps *maps, struct map *new) in maps__fixup_overlap_and_insert()
1000 /* Note, if struct map were immutable then cloning could use ref counts. */ in maps__copy_from()
1001 struct map **parent_maps_by_address; in maps__copy_from()
1013 struct map **dest_maps_by_address = in maps__copy_from()
1014 malloc(nr_maps_allocated * sizeof(struct map *)); in maps__copy_from()
1015 struct map **dest_maps_by_name = NULL; in maps__copy_from()
1022 malloc(nr_maps_allocated * sizeof(struct map *)); in maps__copy_from()
1031 struct map *pos = parent_maps_by_address[i]; in maps__copy_from()
1032 struct map *new = map__clone(pos); in maps__copy_from()
1063 struct map *pos = parent_maps_by_address[i]; in maps__copy_from()
1064 struct map *new = map__clone(pos); in maps__copy_from()
1086 const struct map *map = *(const struct map * const *)entry; in map__addr_cmp() local
1088 if (ip < map__start(map)) in map__addr_cmp()
1090 if (ip >= map__end(map)) in map__addr_cmp()
1095 struct map *maps__find(struct maps *maps, u64 ip) in maps__find()
1097 struct map *result = NULL; in maps__find()
1104 struct map **mapp = NULL; in maps__find()
1105 struct map **maps_by_address = maps__maps_by_address(maps); in maps__find()
1124 const struct dso *dso = map__dso(*(const struct map **)b); in map__strcmp_name()
1129 struct map *maps__find_by_name(struct maps *maps, const char *name) in maps__find_by_name()
1131 struct map *result = NULL; in maps__find_by_name()
1153 struct map **mapp = in maps__find_by_name()
1172 struct map **maps_by_address; in maps__find_by_name()
1179 struct map *pos = maps_by_address[i]; in maps__find_by_name()
1195 struct map *maps__find_next_entry(struct maps *maps, struct map *map) in maps__find_next_entry() argument
1198 struct map *result = NULL; in maps__find_next_entry()
1206 i = maps__by_address_index(maps, map); in maps__find_next_entry()
1216 struct map **maps_by_address; in maps__fixup_end()
1226 struct map *prev = maps_by_address[i - 1]; in maps__fixup_end()
1227 struct map *curr = maps_by_address[i]; in maps__fixup_end()
1235 * last map final address. in maps__fixup_end()
1247 * Merges map into maps by splitting the new map within the existing map
1250 int maps__merge_in(struct maps *kmaps, struct map *new_map) in maps__merge_in()
1253 struct map **kmaps_maps_by_address; in maps__merge_in()
1254 struct map **merged_maps_by_address; in maps__merge_in()
1318 /* Add the new map, it will be split when the later overlapping mappings are added. */ in maps__merge_in()