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
;
32 u8
/* enum map_type */ type
;
38 u64 (*map_ip
)(struct map
*, u64
);
40 u64 (*unmap_ip
)(struct map
*, u64
);
43 struct map_groups
*groups
;
47 struct ref_reloc_sym
*ref_reloc_sym
;
48 struct map_groups
*kmaps
;
52 struct rb_root maps
[MAP__NR_TYPES
];
53 struct list_head removed_maps
[MAP__NR_TYPES
];
54 struct machine
*machine
;
57 /* Native host kernel uses -1 as pid index in machine */
58 #define HOST_KERNEL_ID (-1)
59 #define DEFAULT_GUEST_KERNEL_ID (0)
62 struct rb_node rb_node
;
65 struct list_head user_dsos
;
66 struct list_head kernel_dsos
;
67 struct map_groups kmaps
;
68 struct map
*vmlinux_maps
[MAP__NR_TYPES
];
72 struct map
*machine__kernel_map(struct machine
*self
, enum map_type type
)
74 return self
->vmlinux_maps
[type
];
77 static inline struct kmap
*map__kmap(struct map
*self
)
79 return (struct kmap
*)(self
+ 1);
82 static inline u64
map__map_ip(struct map
*map
, u64 ip
)
84 return ip
- map
->start
+ map
->pgoff
;
87 static inline u64
map__unmap_ip(struct map
*map
, u64 ip
)
89 return ip
+ map
->start
- map
->pgoff
;
92 static inline u64
identity__map_ip(struct map
*map __used
, u64 ip
)
98 /* rip/ip <-> addr suitable for passing to `objdump --start-address=` */
99 u64
map__rip_2objdump(struct map
*map
, u64 rip
);
100 u64
map__objdump_2ip(struct map
*map
, u64 addr
);
104 typedef int (*symbol_filter_t
)(struct map
*map
, struct symbol
*sym
);
106 void map__init(struct map
*self
, enum map_type type
,
107 u64 start
, u64 end
, u64 pgoff
, struct dso
*dso
);
108 struct map
*map__new(struct list_head
*dsos__list
, u64 start
, u64 len
,
109 u64 pgoff
, u32 pid
, char *filename
,
111 void map__delete(struct map
*self
);
112 struct map
*map__clone(struct map
*self
);
113 int map__overlap(struct map
*l
, struct map
*r
);
114 size_t map__fprintf(struct map
*self
, FILE *fp
);
116 int map__load(struct map
*self
, symbol_filter_t filter
);
117 struct symbol
*map__find_symbol(struct map
*self
,
118 u64 addr
, symbol_filter_t filter
);
119 struct symbol
*map__find_symbol_by_name(struct map
*self
, const char *name
,
120 symbol_filter_t filter
);
121 void map__fixup_start(struct map
*self
);
122 void map__fixup_end(struct map
*self
);
124 void map__reloc_vmlinux(struct map
*self
);
126 size_t __map_groups__fprintf_maps(struct map_groups
*mg
,
127 enum map_type type
, int verbose
, FILE *fp
);
128 void maps__insert(struct rb_root
*maps
, struct map
*map
);
129 void maps__remove(struct rb_root
*maps
, struct map
*map
);
130 struct map
*maps__find(struct rb_root
*maps
, u64 addr
);
131 void map_groups__init(struct map_groups
*mg
);
132 void map_groups__exit(struct map_groups
*mg
);
133 int map_groups__clone(struct map_groups
*mg
,
134 struct map_groups
*parent
, enum map_type type
);
135 size_t map_groups__fprintf(struct map_groups
*mg
, int verbose
, FILE *fp
);
136 size_t map_groups__fprintf_maps(struct map_groups
*mg
, int verbose
, FILE *fp
);
138 typedef void (*machine__process_t
)(struct machine
*self
, void *data
);
140 void machines__process(struct rb_root
*self
, machine__process_t process
, void *data
);
141 struct machine
*machines__add(struct rb_root
*self
, pid_t pid
,
142 const char *root_dir
);
143 struct machine
*machines__find_host(struct rb_root
*self
);
144 struct machine
*machines__find(struct rb_root
*self
, pid_t pid
);
145 struct machine
*machines__findnew(struct rb_root
*self
, pid_t pid
);
146 char *machine__mmap_name(struct machine
*self
, char *bf
, size_t size
);
147 int machine__init(struct machine
*self
, const char *root_dir
, pid_t pid
);
148 void machine__exit(struct machine
*self
);
149 void machine__delete(struct machine
*self
);
152 * Default guest kernel is defined by parameter --guestkallsyms
155 static inline bool machine__is_default_guest(struct machine
*self
)
157 return self
? self
->pid
== DEFAULT_GUEST_KERNEL_ID
: false;
160 static inline bool machine__is_host(struct machine
*self
)
162 return self
? self
->pid
== HOST_KERNEL_ID
: false;
165 static inline void map_groups__insert(struct map_groups
*mg
, struct map
*map
)
167 maps__insert(&mg
->maps
[map
->type
], map
);
171 static inline void map_groups__remove(struct map_groups
*mg
, struct map
*map
)
173 maps__remove(&mg
->maps
[map
->type
], map
);
176 static inline struct map
*map_groups__find(struct map_groups
*mg
,
177 enum map_type type
, u64 addr
)
179 return maps__find(&mg
->maps
[type
], addr
);
182 struct symbol
*map_groups__find_symbol(struct map_groups
*mg
,
183 enum map_type type
, u64 addr
,
185 symbol_filter_t filter
);
187 struct symbol
*map_groups__find_symbol_by_name(struct map_groups
*mg
,
191 symbol_filter_t filter
);
194 struct symbol
*machine__find_kernel_symbol(struct machine
*self
,
195 enum map_type type
, u64 addr
,
197 symbol_filter_t filter
)
199 return map_groups__find_symbol(&self
->kmaps
, type
, addr
, mapp
, filter
);
203 struct symbol
*machine__find_kernel_function(struct machine
*self
, u64 addr
,
205 symbol_filter_t filter
)
207 return machine__find_kernel_symbol(self
, MAP__FUNCTION
, addr
, mapp
, filter
);
211 struct symbol
*map_groups__find_function_by_name(struct map_groups
*mg
,
212 const char *name
, struct map
**mapp
,
213 symbol_filter_t filter
)
215 return map_groups__find_symbol_by_name(mg
, MAP__FUNCTION
, name
, mapp
, filter
);
219 struct symbol
*machine__find_kernel_function_by_name(struct machine
*self
,
222 symbol_filter_t filter
)
224 return map_groups__find_function_by_name(&self
->kmaps
, name
, mapp
,
228 int map_groups__fixup_overlappings(struct map_groups
*mg
, struct map
*map
,
229 int verbose
, FILE *fp
);
231 struct map
*map_groups__find_by_name(struct map_groups
*mg
,
232 enum map_type type
, const char *name
);
233 struct map
*machine__new_module(struct machine
*self
, u64 start
, const char *filename
);
235 void map_groups__flush(struct map_groups
*mg
);
237 #endif /* __PERF_MAP_H */