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
;
37 u64 (*map_ip
)(struct map
*, u64
);
39 u64 (*unmap_ip
)(struct map
*, u64
);
42 struct map_groups
*groups
;
46 struct ref_reloc_sym
*ref_reloc_sym
;
47 struct map_groups
*kmaps
;
51 struct rb_root maps
[MAP__NR_TYPES
];
52 struct list_head removed_maps
[MAP__NR_TYPES
];
53 struct machine
*machine
;
56 /* Native host kernel uses -1 as pid index in machine */
57 #define HOST_KERNEL_ID (-1)
58 #define DEFAULT_GUEST_KERNEL_ID (0)
61 struct rb_node rb_node
;
64 struct list_head user_dsos
;
65 struct list_head kernel_dsos
;
66 struct map_groups kmaps
;
67 struct map
*vmlinux_maps
[MAP__NR_TYPES
];
71 struct map
*machine__kernel_map(struct machine
*self
, enum map_type type
)
73 return self
->vmlinux_maps
[type
];
76 static inline struct kmap
*map__kmap(struct map
*self
)
78 return (struct kmap
*)(self
+ 1);
81 static inline u64
map__map_ip(struct map
*map
, u64 ip
)
83 return ip
- map
->start
+ map
->pgoff
;
86 static inline u64
map__unmap_ip(struct map
*map
, u64 ip
)
88 return ip
+ map
->start
- map
->pgoff
;
91 static inline u64
identity__map_ip(struct map
*map __used
, u64 ip
)
97 /* rip/ip <-> addr suitable for passing to `objdump --start-address=` */
98 u64
map__rip_2objdump(struct map
*map
, u64 rip
);
99 u64
map__objdump_2ip(struct map
*map
, u64 addr
);
103 typedef int (*symbol_filter_t
)(struct map
*map
, struct symbol
*sym
);
105 void map__init(struct map
*self
, enum map_type type
,
106 u64 start
, u64 end
, u64 pgoff
, struct dso
*dso
);
107 struct map
*map__new(struct list_head
*dsos__list
, u64 start
, u64 len
,
108 u64 pgoff
, u32 pid
, char *filename
,
110 void map__delete(struct map
*self
);
111 struct map
*map__clone(struct map
*self
);
112 int map__overlap(struct map
*l
, struct map
*r
);
113 size_t map__fprintf(struct map
*self
, FILE *fp
);
115 int map__load(struct map
*self
, symbol_filter_t filter
);
116 struct symbol
*map__find_symbol(struct map
*self
,
117 u64 addr
, symbol_filter_t filter
);
118 struct symbol
*map__find_symbol_by_name(struct map
*self
, const char *name
,
119 symbol_filter_t filter
);
120 void map__fixup_start(struct map
*self
);
121 void map__fixup_end(struct map
*self
);
123 void map__reloc_vmlinux(struct map
*self
);
125 size_t __map_groups__fprintf_maps(struct map_groups
*self
,
126 enum map_type type
, int verbose
, FILE *fp
);
127 void maps__insert(struct rb_root
*maps
, struct map
*map
);
128 struct map
*maps__find(struct rb_root
*maps
, u64 addr
);
129 void map_groups__init(struct map_groups
*self
);
130 void map_groups__exit(struct map_groups
*self
);
131 int map_groups__clone(struct map_groups
*self
,
132 struct map_groups
*parent
, enum map_type type
);
133 size_t map_groups__fprintf(struct map_groups
*self
, int verbose
, FILE *fp
);
134 size_t map_groups__fprintf_maps(struct map_groups
*self
, int verbose
, FILE *fp
);
136 typedef void (*machine__process_t
)(struct machine
*self
, void *data
);
138 void machines__process(struct rb_root
*self
, machine__process_t process
, void *data
);
139 struct machine
*machines__add(struct rb_root
*self
, pid_t pid
,
140 const char *root_dir
);
141 struct machine
*machines__find_host(struct rb_root
*self
);
142 struct machine
*machines__find(struct rb_root
*self
, pid_t pid
);
143 struct machine
*machines__findnew(struct rb_root
*self
, pid_t pid
);
144 char *machine__mmap_name(struct machine
*self
, char *bf
, size_t size
);
145 int machine__init(struct machine
*self
, const char *root_dir
, pid_t pid
);
146 void machine__exit(struct machine
*self
);
149 * Default guest kernel is defined by parameter --guestkallsyms
152 static inline bool machine__is_default_guest(struct machine
*self
)
154 return self
? self
->pid
== DEFAULT_GUEST_KERNEL_ID
: false;
157 static inline bool machine__is_host(struct machine
*self
)
159 return self
? self
->pid
== HOST_KERNEL_ID
: false;
162 static inline void map_groups__insert(struct map_groups
*self
, struct map
*map
)
164 maps__insert(&self
->maps
[map
->type
], map
);
168 static inline struct map
*map_groups__find(struct map_groups
*self
,
169 enum map_type type
, u64 addr
)
171 return maps__find(&self
->maps
[type
], addr
);
174 struct symbol
*map_groups__find_symbol(struct map_groups
*self
,
175 enum map_type type
, u64 addr
,
177 symbol_filter_t filter
);
179 struct symbol
*map_groups__find_symbol_by_name(struct map_groups
*self
,
183 symbol_filter_t filter
);
186 struct symbol
*machine__find_kernel_symbol(struct machine
*self
,
187 enum map_type type
, u64 addr
,
189 symbol_filter_t filter
)
191 return map_groups__find_symbol(&self
->kmaps
, type
, addr
, mapp
, filter
);
195 struct symbol
*machine__find_kernel_function(struct machine
*self
, u64 addr
,
197 symbol_filter_t filter
)
199 return machine__find_kernel_symbol(self
, MAP__FUNCTION
, addr
, mapp
, filter
);
203 struct symbol
*map_groups__find_function_by_name(struct map_groups
*self
,
204 const char *name
, struct map
**mapp
,
205 symbol_filter_t filter
)
207 return map_groups__find_symbol_by_name(self
, MAP__FUNCTION
, name
, mapp
, filter
);
210 int map_groups__fixup_overlappings(struct map_groups
*self
, struct map
*map
,
211 int verbose
, FILE *fp
);
213 struct map
*map_groups__find_by_name(struct map_groups
*self
,
214 enum map_type type
, const char *name
);
215 struct map
*machine__new_module(struct machine
*self
, u64 start
, const char *filename
);
217 void map_groups__flush(struct map_groups
*self
);
219 #endif /* __PERF_MAP_H */