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
];
29 struct rb_node rb_node
;
30 struct list_head node
;
34 u8
/* enum map_type */ type
;
40 u64 (*map_ip
)(struct map
*, u64
);
42 u64 (*unmap_ip
)(struct map
*, u64
);
45 struct map_groups
*groups
;
49 struct ref_reloc_sym
*ref_reloc_sym
;
50 struct map_groups
*kmaps
;
54 struct rb_root maps
[MAP__NR_TYPES
];
55 struct list_head removed_maps
[MAP__NR_TYPES
];
56 struct machine
*machine
;
59 /* Native host kernel uses -1 as pid index in machine */
60 #define HOST_KERNEL_ID (-1)
61 #define DEFAULT_GUEST_KERNEL_ID (0)
64 struct rb_node rb_node
;
68 struct rb_root threads
;
69 struct list_head dead_threads
;
70 struct thread
*last_match
;
71 struct list_head user_dsos
;
72 struct list_head kernel_dsos
;
73 struct map_groups kmaps
;
74 struct map
*vmlinux_maps
[MAP__NR_TYPES
];
78 struct map
*machine__kernel_map(struct machine
*self
, enum map_type type
)
80 return self
->vmlinux_maps
[type
];
83 static inline struct kmap
*map__kmap(struct map
*self
)
85 return (struct kmap
*)(self
+ 1);
88 static inline u64
map__map_ip(struct map
*map
, u64 ip
)
90 return ip
- map
->start
+ map
->pgoff
;
93 static inline u64
map__unmap_ip(struct map
*map
, u64 ip
)
95 return ip
+ map
->start
- map
->pgoff
;
98 static inline u64
identity__map_ip(struct map
*map __used
, u64 ip
)
104 /* rip/ip <-> addr suitable for passing to `objdump --start-address=` */
105 u64
map__rip_2objdump(struct map
*map
, u64 rip
);
106 u64
map__objdump_2ip(struct map
*map
, u64 addr
);
110 typedef int (*symbol_filter_t
)(struct map
*map
, struct symbol
*sym
);
112 void map__init(struct map
*self
, enum map_type type
,
113 u64 start
, u64 end
, u64 pgoff
, struct dso
*dso
);
114 struct map
*map__new(struct list_head
*dsos__list
, u64 start
, u64 len
,
115 u64 pgoff
, u32 pid
, char *filename
,
117 void map__delete(struct map
*self
);
118 struct map
*map__clone(struct map
*self
);
119 int map__overlap(struct map
*l
, struct map
*r
);
120 size_t map__fprintf(struct map
*self
, FILE *fp
);
122 int map__load(struct map
*self
, symbol_filter_t filter
);
123 struct symbol
*map__find_symbol(struct map
*self
,
124 u64 addr
, symbol_filter_t filter
);
125 struct symbol
*map__find_symbol_by_name(struct map
*self
, const char *name
,
126 symbol_filter_t filter
);
127 void map__fixup_start(struct map
*self
);
128 void map__fixup_end(struct map
*self
);
130 void map__reloc_vmlinux(struct map
*self
);
132 size_t __map_groups__fprintf_maps(struct map_groups
*mg
,
133 enum map_type type
, int verbose
, FILE *fp
);
134 void maps__insert(struct rb_root
*maps
, struct map
*map
);
135 void maps__remove(struct rb_root
*maps
, struct map
*map
);
136 struct map
*maps__find(struct rb_root
*maps
, u64 addr
);
137 void map_groups__init(struct map_groups
*mg
);
138 void map_groups__exit(struct map_groups
*mg
);
139 int map_groups__clone(struct map_groups
*mg
,
140 struct map_groups
*parent
, enum map_type type
);
141 size_t map_groups__fprintf(struct map_groups
*mg
, int verbose
, FILE *fp
);
142 size_t map_groups__fprintf_maps(struct map_groups
*mg
, int verbose
, FILE *fp
);
144 typedef void (*machine__process_t
)(struct machine
*self
, void *data
);
146 void machines__process(struct rb_root
*self
, machine__process_t process
, void *data
);
147 struct machine
*machines__add(struct rb_root
*self
, pid_t pid
,
148 const char *root_dir
);
149 struct machine
*machines__find_host(struct rb_root
*self
);
150 struct machine
*machines__find(struct rb_root
*self
, pid_t pid
);
151 struct machine
*machines__findnew(struct rb_root
*self
, pid_t pid
);
152 char *machine__mmap_name(struct machine
*self
, char *bf
, size_t size
);
153 int machine__init(struct machine
*self
, const char *root_dir
, pid_t pid
);
154 void machine__exit(struct machine
*self
);
155 void machine__delete(struct machine
*self
);
157 int machine__resolve_callchain(struct machine
*machine
,
158 struct perf_evsel
*evsel
, struct thread
*thread
,
159 struct ip_callchain
*chain
,
160 struct symbol
**parent
);
161 int maps__set_kallsyms_ref_reloc_sym(struct map
**maps
, const char *symbol_name
,
165 * Default guest kernel is defined by parameter --guestkallsyms
168 static inline bool machine__is_default_guest(struct machine
*self
)
170 return self
? self
->pid
== DEFAULT_GUEST_KERNEL_ID
: false;
173 static inline bool machine__is_host(struct machine
*self
)
175 return self
? self
->pid
== HOST_KERNEL_ID
: false;
178 static inline void map_groups__insert(struct map_groups
*mg
, struct map
*map
)
180 maps__insert(&mg
->maps
[map
->type
], map
);
184 static inline void map_groups__remove(struct map_groups
*mg
, struct map
*map
)
186 maps__remove(&mg
->maps
[map
->type
], map
);
189 static inline struct map
*map_groups__find(struct map_groups
*mg
,
190 enum map_type type
, u64 addr
)
192 return maps__find(&mg
->maps
[type
], addr
);
195 struct symbol
*map_groups__find_symbol(struct map_groups
*mg
,
196 enum map_type type
, u64 addr
,
198 symbol_filter_t filter
);
200 struct symbol
*map_groups__find_symbol_by_name(struct map_groups
*mg
,
204 symbol_filter_t filter
);
207 struct thread
*machine__findnew_thread(struct machine
*machine
, pid_t pid
);
208 void machine__remove_thread(struct machine
*machine
, struct thread
*th
);
210 size_t machine__fprintf(struct machine
*machine
, FILE *fp
);
213 struct symbol
*machine__find_kernel_symbol(struct machine
*self
,
214 enum map_type type
, u64 addr
,
216 symbol_filter_t filter
)
218 return map_groups__find_symbol(&self
->kmaps
, type
, addr
, mapp
, filter
);
222 struct symbol
*machine__find_kernel_function(struct machine
*self
, u64 addr
,
224 symbol_filter_t filter
)
226 return machine__find_kernel_symbol(self
, MAP__FUNCTION
, addr
, mapp
, filter
);
230 struct symbol
*map_groups__find_function_by_name(struct map_groups
*mg
,
231 const char *name
, struct map
**mapp
,
232 symbol_filter_t filter
)
234 return map_groups__find_symbol_by_name(mg
, MAP__FUNCTION
, name
, mapp
, filter
);
238 struct symbol
*machine__find_kernel_function_by_name(struct machine
*self
,
241 symbol_filter_t filter
)
243 return map_groups__find_function_by_name(&self
->kmaps
, name
, mapp
,
247 int map_groups__fixup_overlappings(struct map_groups
*mg
, struct map
*map
,
248 int verbose
, FILE *fp
);
250 struct map
*map_groups__find_by_name(struct map_groups
*mg
,
251 enum map_type type
, const char *name
);
252 struct map
*machine__new_module(struct machine
*self
, u64 start
, const char *filename
);
254 void map_groups__flush(struct map_groups
*mg
);
256 #endif /* __PERF_MAP_H */