xref: /openbmc/linux/tools/perf/util/maps.h (revision b181f7029bd71238ac2754ce7052dffd69432085)
1c54d241bSArnaldo Carvalho de Melo /* SPDX-License-Identifier: GPL-2.0 */
2c54d241bSArnaldo Carvalho de Melo #ifndef __PERF_MAPS_H
3c54d241bSArnaldo Carvalho de Melo #define __PERF_MAPS_H
4c54d241bSArnaldo Carvalho de Melo 
5c54d241bSArnaldo Carvalho de Melo #include <linux/refcount.h>
6c54d241bSArnaldo Carvalho de Melo #include <linux/rbtree.h>
7c54d241bSArnaldo Carvalho de Melo #include <stdio.h>
8c54d241bSArnaldo Carvalho de Melo #include <stdbool.h>
9c54d241bSArnaldo Carvalho de Melo #include <linux/types.h>
10c54d241bSArnaldo Carvalho de Melo #include "rwsem.h"
118f12692bSIan Rogers #include <internal/rc_check.h>
12c54d241bSArnaldo Carvalho de Melo 
13c54d241bSArnaldo Carvalho de Melo struct ref_reloc_sym;
14c54d241bSArnaldo Carvalho de Melo struct machine;
15c54d241bSArnaldo Carvalho de Melo struct map;
16c54d241bSArnaldo Carvalho de Melo struct maps;
17c54d241bSArnaldo Carvalho de Melo struct thread;
18c54d241bSArnaldo Carvalho de Melo 
19ff583dc4SIan Rogers struct map_rb_node {
20ff583dc4SIan Rogers 	struct rb_node rb_node;
21ff583dc4SIan Rogers 	struct map *map;
22ff583dc4SIan Rogers };
23ff583dc4SIan Rogers 
24*c3cc4656SIan Rogers struct map_list_node {
25*c3cc4656SIan Rogers 	struct list_head node;
26*c3cc4656SIan Rogers 	struct map *map;
27*c3cc4656SIan Rogers };
28*c3cc4656SIan Rogers 
map_list_node__new(void)29*c3cc4656SIan Rogers static inline struct map_list_node *map_list_node__new(void)
30*c3cc4656SIan Rogers {
31*c3cc4656SIan Rogers 	return malloc(sizeof(struct map_list_node));
32*c3cc4656SIan Rogers }
33*c3cc4656SIan Rogers 
34ff583dc4SIan Rogers struct map_rb_node *maps__first(struct maps *maps);
35ff583dc4SIan Rogers struct map_rb_node *map_rb_node__next(struct map_rb_node *node);
36ff583dc4SIan Rogers struct map_rb_node *maps__find_node(struct maps *maps, struct map *map);
37c54d241bSArnaldo Carvalho de Melo struct map *maps__find(struct maps *maps, u64 addr);
38c54d241bSArnaldo Carvalho de Melo 
39c54d241bSArnaldo Carvalho de Melo #define maps__for_each_entry(maps, map) \
40ff583dc4SIan Rogers 	for (map = maps__first(maps); map; map = map_rb_node__next(map))
41c54d241bSArnaldo Carvalho de Melo 
42c54d241bSArnaldo Carvalho de Melo #define maps__for_each_entry_safe(maps, map, next) \
43ff583dc4SIan Rogers 	for (map = maps__first(maps), next = map_rb_node__next(map); map; \
44ff583dc4SIan Rogers 	     map = next, next = map_rb_node__next(map))
45c54d241bSArnaldo Carvalho de Melo 
DECLARE_RC_STRUCT(maps)468f12692bSIan Rogers DECLARE_RC_STRUCT(maps) {
47c54d241bSArnaldo Carvalho de Melo 	struct rb_root      entries;
48c54d241bSArnaldo Carvalho de Melo 	struct rw_semaphore lock;
49c54d241bSArnaldo Carvalho de Melo 	struct machine	 *machine;
50c54d241bSArnaldo Carvalho de Melo 	struct map	 *last_search_by_name;
51c54d241bSArnaldo Carvalho de Melo 	struct map	 **maps_by_name;
52c54d241bSArnaldo Carvalho de Melo 	refcount_t	 refcnt;
53c54d241bSArnaldo Carvalho de Melo 	unsigned int	 nr_maps;
54c54d241bSArnaldo Carvalho de Melo 	unsigned int	 nr_maps_allocated;
55c54d241bSArnaldo Carvalho de Melo #ifdef HAVE_LIBUNWIND_SUPPORT
56c54d241bSArnaldo Carvalho de Melo 	void				*addr_space;
575ab6d715SIan Rogers 	const struct unwind_libunwind_ops *unwind_libunwind_ops;
58c54d241bSArnaldo Carvalho de Melo #endif
59c54d241bSArnaldo Carvalho de Melo };
60c54d241bSArnaldo Carvalho de Melo 
61c54d241bSArnaldo Carvalho de Melo #define KMAP_NAME_LEN 256
62c54d241bSArnaldo Carvalho de Melo 
63c54d241bSArnaldo Carvalho de Melo struct kmap {
64c54d241bSArnaldo Carvalho de Melo 	struct ref_reloc_sym *ref_reloc_sym;
65c54d241bSArnaldo Carvalho de Melo 	struct maps	     *kmaps;
66c54d241bSArnaldo Carvalho de Melo 	char		     name[KMAP_NAME_LEN];
67c54d241bSArnaldo Carvalho de Melo };
68c54d241bSArnaldo Carvalho de Melo 
69c54d241bSArnaldo Carvalho de Melo struct maps *maps__new(struct machine *machine);
70c54d241bSArnaldo Carvalho de Melo bool maps__empty(struct maps *maps);
715ab6d715SIan Rogers int maps__clone(struct thread *thread, struct maps *parent);
72c54d241bSArnaldo Carvalho de Melo 
735ab6d715SIan Rogers struct maps *maps__get(struct maps *maps);
745ab6d715SIan Rogers void maps__put(struct maps *maps);
755ab6d715SIan Rogers 
__maps__zput(struct maps ** map)7646125590SIan Rogers static inline void __maps__zput(struct maps **map)
7746125590SIan Rogers {
7846125590SIan Rogers 	maps__put(*map);
7946125590SIan Rogers 	*map = NULL;
8046125590SIan Rogers }
8146125590SIan Rogers 
8246125590SIan Rogers #define maps__zput(map) __maps__zput(&map)
8346125590SIan Rogers 
maps__entries(struct maps * maps)845ab6d715SIan Rogers static inline struct rb_root *maps__entries(struct maps *maps)
85c54d241bSArnaldo Carvalho de Melo {
868f12692bSIan Rogers 	return &RC_CHK_ACCESS(maps)->entries;
87c54d241bSArnaldo Carvalho de Melo }
88c54d241bSArnaldo Carvalho de Melo 
maps__machine(struct maps * maps)895ab6d715SIan Rogers static inline struct machine *maps__machine(struct maps *maps)
905ab6d715SIan Rogers {
918f12692bSIan Rogers 	return RC_CHK_ACCESS(maps)->machine;
925ab6d715SIan Rogers }
935ab6d715SIan Rogers 
maps__lock(struct maps * maps)945ab6d715SIan Rogers static inline struct rw_semaphore *maps__lock(struct maps *maps)
955ab6d715SIan Rogers {
968f12692bSIan Rogers 	return &RC_CHK_ACCESS(maps)->lock;
975ab6d715SIan Rogers }
985ab6d715SIan Rogers 
maps__maps_by_name(struct maps * maps)995ab6d715SIan Rogers static inline struct map **maps__maps_by_name(struct maps *maps)
1005ab6d715SIan Rogers {
1018f12692bSIan Rogers 	return RC_CHK_ACCESS(maps)->maps_by_name;
1025ab6d715SIan Rogers }
1035ab6d715SIan Rogers 
maps__nr_maps(const struct maps * maps)1045ab6d715SIan Rogers static inline unsigned int maps__nr_maps(const struct maps *maps)
1055ab6d715SIan Rogers {
1068f12692bSIan Rogers 	return RC_CHK_ACCESS(maps)->nr_maps;
1075ab6d715SIan Rogers }
1085ab6d715SIan Rogers 
maps__refcnt(struct maps * maps)109fe693d95SArnaldo Carvalho de Melo static inline refcount_t *maps__refcnt(struct maps *maps)
110fe693d95SArnaldo Carvalho de Melo {
1118f12692bSIan Rogers 	return &RC_CHK_ACCESS(maps)->refcnt;
112fe693d95SArnaldo Carvalho de Melo }
113fe693d95SArnaldo Carvalho de Melo 
1145ab6d715SIan Rogers #ifdef HAVE_LIBUNWIND_SUPPORT
maps__addr_space(struct maps * maps)1155ab6d715SIan Rogers static inline void *maps__addr_space(struct maps *maps)
1165ab6d715SIan Rogers {
1178f12692bSIan Rogers 	return RC_CHK_ACCESS(maps)->addr_space;
1185ab6d715SIan Rogers }
1195ab6d715SIan Rogers 
maps__unwind_libunwind_ops(const struct maps * maps)1205ab6d715SIan Rogers static inline const struct unwind_libunwind_ops *maps__unwind_libunwind_ops(const struct maps *maps)
1215ab6d715SIan Rogers {
1228f12692bSIan Rogers 	return RC_CHK_ACCESS(maps)->unwind_libunwind_ops;
1235ab6d715SIan Rogers }
1245ab6d715SIan Rogers #endif
1255ab6d715SIan Rogers 
126c54d241bSArnaldo Carvalho de Melo size_t maps__fprintf(struct maps *maps, FILE *fp);
127c54d241bSArnaldo Carvalho de Melo 
128ff583dc4SIan Rogers int maps__insert(struct maps *maps, struct map *map);
129c54d241bSArnaldo Carvalho de Melo void maps__remove(struct maps *maps, struct map *map);
130c54d241bSArnaldo Carvalho de Melo 
131c54d241bSArnaldo Carvalho de Melo struct symbol *maps__find_symbol(struct maps *maps, u64 addr, struct map **mapp);
132c54d241bSArnaldo Carvalho de Melo struct symbol *maps__find_symbol_by_name(struct maps *maps, const char *name, struct map **mapp);
133c54d241bSArnaldo Carvalho de Melo 
134c54d241bSArnaldo Carvalho de Melo struct addr_map_symbol;
135c54d241bSArnaldo Carvalho de Melo 
136c54d241bSArnaldo Carvalho de Melo int maps__find_ams(struct maps *maps, struct addr_map_symbol *ams);
137c54d241bSArnaldo Carvalho de Melo 
138c54d241bSArnaldo Carvalho de Melo int maps__fixup_overlappings(struct maps *maps, struct map *map, FILE *fp);
139c54d241bSArnaldo Carvalho de Melo 
140c54d241bSArnaldo Carvalho de Melo struct map *maps__find_by_name(struct maps *maps, const char *name);
141c54d241bSArnaldo Carvalho de Melo 
142c54d241bSArnaldo Carvalho de Melo int maps__merge_in(struct maps *kmaps, struct map *new_map);
143c54d241bSArnaldo Carvalho de Melo 
144c54d241bSArnaldo Carvalho de Melo void __maps__sort_by_name(struct maps *maps);
145c54d241bSArnaldo Carvalho de Melo 
146*c3cc4656SIan Rogers void maps__fixup_end(struct maps *maps);
147*c3cc4656SIan Rogers 
148c54d241bSArnaldo Carvalho de Melo #endif // __PERF_MAPS_H
149