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
;
41 u64 (*map_ip
)(struct map
*, u64
);
43 u64 (*unmap_ip
)(struct map
*, u64
);
46 struct map_groups
*groups
;
50 struct ref_reloc_sym
*ref_reloc_sym
;
51 struct map_groups
*kmaps
;
55 struct rb_root maps
[MAP__NR_TYPES
];
56 struct list_head removed_maps
[MAP__NR_TYPES
];
57 struct machine
*machine
;
60 /* Native host kernel uses -1 as pid index in machine */
61 #define HOST_KERNEL_ID (-1)
62 #define DEFAULT_GUEST_KERNEL_ID (0)
65 struct rb_node rb_node
;
69 struct rb_root threads
;
70 struct list_head dead_threads
;
71 struct thread
*last_match
;
72 struct list_head user_dsos
;
73 struct list_head kernel_dsos
;
74 struct map_groups kmaps
;
75 struct map
*vmlinux_maps
[MAP__NR_TYPES
];
79 struct map
*machine__kernel_map(struct machine
*self
, enum map_type type
)
81 return self
->vmlinux_maps
[type
];
84 static inline struct kmap
*map__kmap(struct map
*self
)
86 return (struct kmap
*)(self
+ 1);
89 static inline u64
map__map_ip(struct map
*map
, u64 ip
)
91 return ip
- map
->start
+ map
->pgoff
;
94 static inline u64
map__unmap_ip(struct map
*map
, u64 ip
)
96 return ip
+ map
->start
- map
->pgoff
;
99 static inline u64
identity__map_ip(struct map
*map __used
, u64 ip
)
105 /* rip/ip <-> addr suitable for passing to `objdump --start-address=` */
106 u64
map__rip_2objdump(struct map
*map
, u64 rip
);
107 u64
map__objdump_2ip(struct map
*map
, u64 addr
);
111 typedef int (*symbol_filter_t
)(struct map
*map
, struct symbol
*sym
);
113 void map__init(struct map
*self
, enum map_type type
,
114 u64 start
, u64 end
, u64 pgoff
, struct dso
*dso
);
115 struct map
*map__new(struct list_head
*dsos__list
, u64 start
, u64 len
,
116 u64 pgoff
, u32 pid
, char *filename
,
118 void map__delete(struct map
*self
);
119 struct map
*map__clone(struct map
*self
);
120 int map__overlap(struct map
*l
, struct map
*r
);
121 size_t map__fprintf(struct map
*self
, FILE *fp
);
122 size_t map__fprintf_dsoname(struct map
*map
, FILE *fp
);
124 int map__load(struct map
*self
, symbol_filter_t filter
);
125 struct symbol
*map__find_symbol(struct map
*self
,
126 u64 addr
, symbol_filter_t filter
);
127 struct symbol
*map__find_symbol_by_name(struct map
*self
, const char *name
,
128 symbol_filter_t filter
);
129 void map__fixup_start(struct map
*self
);
130 void map__fixup_end(struct map
*self
);
132 void map__reloc_vmlinux(struct map
*self
);
134 size_t __map_groups__fprintf_maps(struct map_groups
*mg
,
135 enum map_type type
, int verbose
, FILE *fp
);
136 void maps__insert(struct rb_root
*maps
, struct map
*map
);
137 void maps__remove(struct rb_root
*maps
, struct map
*map
);
138 struct map
*maps__find(struct rb_root
*maps
, u64 addr
);
139 void map_groups__init(struct map_groups
*mg
);
140 void map_groups__exit(struct map_groups
*mg
);
141 int map_groups__clone(struct map_groups
*mg
,
142 struct map_groups
*parent
, enum map_type type
);
143 size_t map_groups__fprintf(struct map_groups
*mg
, int verbose
, FILE *fp
);
144 size_t map_groups__fprintf_maps(struct map_groups
*mg
, int verbose
, FILE *fp
);
146 typedef void (*machine__process_t
)(struct machine
*self
, void *data
);
148 void machines__process(struct rb_root
*self
, machine__process_t process
, void *data
);
149 struct machine
*machines__add(struct rb_root
*self
, pid_t pid
,
150 const char *root_dir
);
151 struct machine
*machines__find_host(struct rb_root
*self
);
152 struct machine
*machines__find(struct rb_root
*self
, pid_t pid
);
153 struct machine
*machines__findnew(struct rb_root
*self
, pid_t pid
);
154 char *machine__mmap_name(struct machine
*self
, char *bf
, size_t size
);
155 int machine__init(struct machine
*self
, const char *root_dir
, pid_t pid
);
156 void machine__exit(struct machine
*self
);
157 void machine__delete(struct machine
*self
);
159 int machine__resolve_callchain(struct machine
*machine
,
160 struct perf_evsel
*evsel
, struct thread
*thread
,
161 struct ip_callchain
*chain
,
162 struct symbol
**parent
);
163 int maps__set_kallsyms_ref_reloc_sym(struct map
**maps
, const char *symbol_name
,
167 * Default guest kernel is defined by parameter --guestkallsyms
170 static inline bool machine__is_default_guest(struct machine
*self
)
172 return self
? self
->pid
== DEFAULT_GUEST_KERNEL_ID
: false;
175 static inline bool machine__is_host(struct machine
*self
)
177 return self
? self
->pid
== HOST_KERNEL_ID
: false;
180 static inline void map_groups__insert(struct map_groups
*mg
, struct map
*map
)
182 maps__insert(&mg
->maps
[map
->type
], map
);
186 static inline void map_groups__remove(struct map_groups
*mg
, struct map
*map
)
188 maps__remove(&mg
->maps
[map
->type
], map
);
191 static inline struct map
*map_groups__find(struct map_groups
*mg
,
192 enum map_type type
, u64 addr
)
194 return maps__find(&mg
->maps
[type
], addr
);
197 struct symbol
*map_groups__find_symbol(struct map_groups
*mg
,
198 enum map_type type
, u64 addr
,
200 symbol_filter_t filter
);
202 struct symbol
*map_groups__find_symbol_by_name(struct map_groups
*mg
,
206 symbol_filter_t filter
);
209 struct thread
*machine__findnew_thread(struct machine
*machine
, pid_t pid
);
210 void machine__remove_thread(struct machine
*machine
, struct thread
*th
);
212 size_t machine__fprintf(struct machine
*machine
, FILE *fp
);
215 struct symbol
*machine__find_kernel_symbol(struct machine
*self
,
216 enum map_type type
, u64 addr
,
218 symbol_filter_t filter
)
220 return map_groups__find_symbol(&self
->kmaps
, type
, addr
, mapp
, filter
);
224 struct symbol
*machine__find_kernel_function(struct machine
*self
, u64 addr
,
226 symbol_filter_t filter
)
228 return machine__find_kernel_symbol(self
, MAP__FUNCTION
, addr
, mapp
, filter
);
232 struct symbol
*map_groups__find_function_by_name(struct map_groups
*mg
,
233 const char *name
, struct map
**mapp
,
234 symbol_filter_t filter
)
236 return map_groups__find_symbol_by_name(mg
, MAP__FUNCTION
, name
, mapp
, filter
);
240 struct symbol
*machine__find_kernel_function_by_name(struct machine
*self
,
243 symbol_filter_t filter
)
245 return map_groups__find_function_by_name(&self
->kmaps
, name
, mapp
,
249 int map_groups__fixup_overlappings(struct map_groups
*mg
, struct map
*map
,
250 int verbose
, FILE *fp
);
252 struct map
*map_groups__find_by_name(struct map_groups
*mg
,
253 enum map_type type
, const char *name
);
254 struct map
*machine__new_module(struct machine
*self
, u64 start
, const char *filename
);
256 void map_groups__flush(struct map_groups
*mg
);
258 #endif /* __PERF_MAP_H */