4 #include <linux/compiler.h>
5 #include <linux/list.h>
6 #include <linux/rbtree.h>
16 #define MAP__NR_TYPES (MAP__VARIABLE + 1)
18 extern const char *map_type__name
[MAP__NR_TYPES
];
27 struct rb_node rb_node
;
28 struct list_head node
;
36 u64 (*map_ip
)(struct map
*, u64
);
38 u64 (*unmap_ip
)(struct map
*, u64
);
41 struct map_groups
*groups
;
45 struct ref_reloc_sym
*ref_reloc_sym
;
46 struct map_groups
*kmaps
;
50 struct rb_root maps
[MAP__NR_TYPES
];
51 struct list_head removed_maps
[MAP__NR_TYPES
];
52 struct machine
*machine
;
55 /* Native host kernel uses -1 as pid index in machine */
56 #define HOST_KERNEL_ID (-1)
57 #define DEFAULT_GUEST_KERNEL_ID (0)
60 struct rb_node rb_node
;
63 struct list_head user_dsos
;
64 struct list_head kernel_dsos
;
65 struct map_groups kmaps
;
66 struct map
*vmlinux_maps
[MAP__NR_TYPES
];
69 static inline struct kmap
*map__kmap(struct map
*self
)
71 return (struct kmap
*)(self
+ 1);
74 static inline u64
map__map_ip(struct map
*map
, u64 ip
)
76 return ip
- map
->start
+ map
->pgoff
;
79 static inline u64
map__unmap_ip(struct map
*map
, u64 ip
)
81 return ip
+ map
->start
- map
->pgoff
;
84 static inline u64
identity__map_ip(struct map
*map __used
, u64 ip
)
90 /* rip/ip <-> addr suitable for passing to `objdump --start-address=` */
91 u64
map__rip_2objdump(struct map
*map
, u64 rip
);
92 u64
map__objdump_2ip(struct map
*map
, u64 addr
);
96 typedef int (*symbol_filter_t
)(struct map
*map
, struct symbol
*sym
);
98 void map__init(struct map
*self
, enum map_type type
,
99 u64 start
, u64 end
, u64 pgoff
, struct dso
*dso
);
100 struct map
*map__new(struct list_head
*dsos__list
, u64 start
, u64 len
,
101 u64 pgoff
, u32 pid
, char *filename
,
102 enum map_type type
, char *cwd
, int cwdlen
);
103 void map__delete(struct map
*self
);
104 struct map
*map__clone(struct map
*self
);
105 int map__overlap(struct map
*l
, struct map
*r
);
106 size_t map__fprintf(struct map
*self
, FILE *fp
);
108 int map__load(struct map
*self
, symbol_filter_t filter
);
109 struct symbol
*map__find_symbol(struct map
*self
,
110 u64 addr
, symbol_filter_t filter
);
111 struct symbol
*map__find_symbol_by_name(struct map
*self
, const char *name
,
112 symbol_filter_t filter
);
113 void map__fixup_start(struct map
*self
);
114 void map__fixup_end(struct map
*self
);
116 void map__reloc_vmlinux(struct map
*self
);
118 size_t __map_groups__fprintf_maps(struct map_groups
*self
,
119 enum map_type type
, int verbose
, FILE *fp
);
120 void maps__insert(struct rb_root
*maps
, struct map
*map
);
121 struct map
*maps__find(struct rb_root
*maps
, u64 addr
);
122 void map_groups__init(struct map_groups
*self
);
123 int map_groups__clone(struct map_groups
*self
,
124 struct map_groups
*parent
, enum map_type type
);
125 size_t map_groups__fprintf(struct map_groups
*self
, int verbose
, FILE *fp
);
126 size_t map_groups__fprintf_maps(struct map_groups
*self
, int verbose
, FILE *fp
);
128 typedef void (*machine__process_t
)(struct machine
*self
, void *data
);
130 void machines__process(struct rb_root
*self
, machine__process_t process
, void *data
);
131 struct machine
*machines__add(struct rb_root
*self
, pid_t pid
,
132 const char *root_dir
);
133 struct machine
*machines__find_host(struct rb_root
*self
);
134 struct machine
*machines__find(struct rb_root
*self
, pid_t pid
);
135 struct machine
*machines__findnew(struct rb_root
*self
, pid_t pid
);
136 char *machine__mmap_name(struct machine
*self
, char *bf
, size_t size
);
137 int machine__init(struct machine
*self
, const char *root_dir
, pid_t pid
);
140 * Default guest kernel is defined by parameter --guestkallsyms
143 static inline bool machine__is_default_guest(struct machine
*self
)
145 return self
? self
->pid
== DEFAULT_GUEST_KERNEL_ID
: false;
148 static inline bool machine__is_host(struct machine
*self
)
150 return self
? self
->pid
== HOST_KERNEL_ID
: false;
153 static inline void map_groups__insert(struct map_groups
*self
, struct map
*map
)
155 maps__insert(&self
->maps
[map
->type
], map
);
159 static inline struct map
*map_groups__find(struct map_groups
*self
,
160 enum map_type type
, u64 addr
)
162 return maps__find(&self
->maps
[type
], addr
);
165 struct symbol
*map_groups__find_symbol(struct map_groups
*self
,
166 enum map_type type
, u64 addr
,
168 symbol_filter_t filter
);
170 struct symbol
*map_groups__find_symbol_by_name(struct map_groups
*self
,
174 symbol_filter_t filter
);
176 static inline struct symbol
*machine__find_function(struct machine
*self
,
177 u64 addr
, struct map
**mapp
,
178 symbol_filter_t filter
)
180 return map_groups__find_symbol(&self
->kmaps
, MAP__FUNCTION
, addr
, mapp
, filter
);
184 struct symbol
*map_groups__find_function_by_name(struct map_groups
*self
,
185 const char *name
, struct map
**mapp
,
186 symbol_filter_t filter
)
188 return map_groups__find_symbol_by_name(self
, MAP__FUNCTION
, name
, mapp
, filter
);
191 int map_groups__fixup_overlappings(struct map_groups
*self
, struct map
*map
,
192 int verbose
, FILE *fp
);
194 struct map
*map_groups__find_by_name(struct map_groups
*self
,
195 enum map_type type
, const char *name
);
196 struct map
*machine__new_module(struct machine
*self
, u64 start
, const char *filename
);
198 void map_groups__flush(struct map_groups
*self
);
200 #endif /* __PERF_MAP_H */