diff options
Diffstat (limited to 'tools/perf/util/map.h')
-rw-r--r-- | tools/perf/util/map.h | 131 |
1 files changed, 127 insertions, 4 deletions
diff --git a/tools/perf/util/map.h b/tools/perf/util/map.h index b756368076c6..f39134512829 100644 --- a/tools/perf/util/map.h +++ b/tools/perf/util/map.h | |||
@@ -4,7 +4,9 @@ | |||
4 | #include <linux/compiler.h> | 4 | #include <linux/compiler.h> |
5 | #include <linux/list.h> | 5 | #include <linux/list.h> |
6 | #include <linux/rbtree.h> | 6 | #include <linux/rbtree.h> |
7 | #include <linux/types.h> | 7 | #include <stdio.h> |
8 | #include <stdbool.h> | ||
9 | #include "types.h" | ||
8 | 10 | ||
9 | enum map_type { | 11 | enum map_type { |
10 | MAP__FUNCTION = 0, | 12 | MAP__FUNCTION = 0, |
@@ -18,6 +20,7 @@ extern const char *map_type__name[MAP__NR_TYPES]; | |||
18 | struct dso; | 20 | struct dso; |
19 | struct ref_reloc_sym; | 21 | struct ref_reloc_sym; |
20 | struct map_groups; | 22 | struct map_groups; |
23 | struct machine; | ||
21 | 24 | ||
22 | struct map { | 25 | struct map { |
23 | union { | 26 | union { |
@@ -27,6 +30,7 @@ struct map { | |||
27 | u64 start; | 30 | u64 start; |
28 | u64 end; | 31 | u64 end; |
29 | enum map_type type; | 32 | enum map_type type; |
33 | u32 priv; | ||
30 | u64 pgoff; | 34 | u64 pgoff; |
31 | 35 | ||
32 | /* ip -> dso rip */ | 36 | /* ip -> dso rip */ |
@@ -35,6 +39,7 @@ struct map { | |||
35 | u64 (*unmap_ip)(struct map *, u64); | 39 | u64 (*unmap_ip)(struct map *, u64); |
36 | 40 | ||
37 | struct dso *dso; | 41 | struct dso *dso; |
42 | struct map_groups *groups; | ||
38 | }; | 43 | }; |
39 | 44 | ||
40 | struct kmap { | 45 | struct kmap { |
@@ -42,6 +47,32 @@ struct kmap { | |||
42 | struct map_groups *kmaps; | 47 | struct map_groups *kmaps; |
43 | }; | 48 | }; |
44 | 49 | ||
50 | struct map_groups { | ||
51 | struct rb_root maps[MAP__NR_TYPES]; | ||
52 | struct list_head removed_maps[MAP__NR_TYPES]; | ||
53 | struct machine *machine; | ||
54 | }; | ||
55 | |||
56 | /* Native host kernel uses -1 as pid index in machine */ | ||
57 | #define HOST_KERNEL_ID (-1) | ||
58 | #define DEFAULT_GUEST_KERNEL_ID (0) | ||
59 | |||
60 | struct machine { | ||
61 | struct rb_node rb_node; | ||
62 | pid_t pid; | ||
63 | char *root_dir; | ||
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]; | ||
68 | }; | ||
69 | |||
70 | static inline | ||
71 | struct map *machine__kernel_map(struct machine *self, enum map_type type) | ||
72 | { | ||
73 | return self->vmlinux_maps[type]; | ||
74 | } | ||
75 | |||
45 | static inline struct kmap *map__kmap(struct map *self) | 76 | static inline struct kmap *map__kmap(struct map *self) |
46 | { | 77 | { |
47 | return (struct kmap *)(self + 1); | 78 | return (struct kmap *)(self + 1); |
@@ -68,14 +99,14 @@ u64 map__rip_2objdump(struct map *map, u64 rip); | |||
68 | u64 map__objdump_2ip(struct map *map, u64 addr); | 99 | u64 map__objdump_2ip(struct map *map, u64 addr); |
69 | 100 | ||
70 | struct symbol; | 101 | struct symbol; |
71 | struct mmap_event; | ||
72 | 102 | ||
73 | typedef int (*symbol_filter_t)(struct map *map, struct symbol *sym); | 103 | typedef int (*symbol_filter_t)(struct map *map, struct symbol *sym); |
74 | 104 | ||
75 | void map__init(struct map *self, enum map_type type, | 105 | void map__init(struct map *self, enum map_type type, |
76 | u64 start, u64 end, u64 pgoff, struct dso *dso); | 106 | u64 start, u64 end, u64 pgoff, struct dso *dso); |
77 | struct map *map__new(struct mmap_event *event, enum map_type, | 107 | struct map *map__new(struct list_head *dsos__list, u64 start, u64 len, |
78 | char *cwd, int cwdlen); | 108 | u64 pgoff, u32 pid, char *filename, |
109 | enum map_type type, char *cwd, int cwdlen); | ||
79 | void map__delete(struct map *self); | 110 | void map__delete(struct map *self); |
80 | struct map *map__clone(struct map *self); | 111 | struct map *map__clone(struct map *self); |
81 | int map__overlap(struct map *l, struct map *r); | 112 | int map__overlap(struct map *l, struct map *r); |
@@ -91,4 +122,96 @@ void map__fixup_end(struct map *self); | |||
91 | 122 | ||
92 | void map__reloc_vmlinux(struct map *self); | 123 | void map__reloc_vmlinux(struct map *self); |
93 | 124 | ||
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 | int map_groups__clone(struct map_groups *self, | ||
131 | struct map_groups *parent, enum map_type type); | ||
132 | size_t map_groups__fprintf(struct map_groups *self, int verbose, FILE *fp); | ||
133 | size_t map_groups__fprintf_maps(struct map_groups *self, int verbose, FILE *fp); | ||
134 | |||
135 | typedef void (*machine__process_t)(struct machine *self, void *data); | ||
136 | |||
137 | void machines__process(struct rb_root *self, machine__process_t process, void *data); | ||
138 | struct machine *machines__add(struct rb_root *self, pid_t pid, | ||
139 | const char *root_dir); | ||
140 | struct machine *machines__find_host(struct rb_root *self); | ||
141 | struct machine *machines__find(struct rb_root *self, pid_t pid); | ||
142 | struct machine *machines__findnew(struct rb_root *self, pid_t pid); | ||
143 | char *machine__mmap_name(struct machine *self, char *bf, size_t size); | ||
144 | int machine__init(struct machine *self, const char *root_dir, pid_t pid); | ||
145 | |||
146 | /* | ||
147 | * Default guest kernel is defined by parameter --guestkallsyms | ||
148 | * and --guestmodules | ||
149 | */ | ||
150 | static inline bool machine__is_default_guest(struct machine *self) | ||
151 | { | ||
152 | return self ? self->pid == DEFAULT_GUEST_KERNEL_ID : false; | ||
153 | } | ||
154 | |||
155 | static inline bool machine__is_host(struct machine *self) | ||
156 | { | ||
157 | return self ? self->pid == HOST_KERNEL_ID : false; | ||
158 | } | ||
159 | |||
160 | static inline void map_groups__insert(struct map_groups *self, struct map *map) | ||
161 | { | ||
162 | maps__insert(&self->maps[map->type], map); | ||
163 | map->groups = self; | ||
164 | } | ||
165 | |||
166 | static inline struct map *map_groups__find(struct map_groups *self, | ||
167 | enum map_type type, u64 addr) | ||
168 | { | ||
169 | return maps__find(&self->maps[type], addr); | ||
170 | } | ||
171 | |||
172 | struct symbol *map_groups__find_symbol(struct map_groups *self, | ||
173 | enum map_type type, u64 addr, | ||
174 | struct map **mapp, | ||
175 | symbol_filter_t filter); | ||
176 | |||
177 | struct symbol *map_groups__find_symbol_by_name(struct map_groups *self, | ||
178 | enum map_type type, | ||
179 | const char *name, | ||
180 | struct map **mapp, | ||
181 | symbol_filter_t filter); | ||
182 | |||
183 | static inline | ||
184 | struct symbol *machine__find_kernel_symbol(struct machine *self, | ||
185 | enum map_type type, u64 addr, | ||
186 | struct map **mapp, | ||
187 | symbol_filter_t filter) | ||
188 | { | ||
189 | return map_groups__find_symbol(&self->kmaps, type, addr, mapp, filter); | ||
190 | } | ||
191 | |||
192 | static inline | ||
193 | struct symbol *machine__find_kernel_function(struct machine *self, u64 addr, | ||
194 | struct map **mapp, | ||
195 | symbol_filter_t filter) | ||
196 | { | ||
197 | return machine__find_kernel_symbol(self, MAP__FUNCTION, addr, mapp, filter); | ||
198 | } | ||
199 | |||
200 | static inline | ||
201 | struct symbol *map_groups__find_function_by_name(struct map_groups *self, | ||
202 | const char *name, struct map **mapp, | ||
203 | symbol_filter_t filter) | ||
204 | { | ||
205 | return map_groups__find_symbol_by_name(self, MAP__FUNCTION, name, mapp, filter); | ||
206 | } | ||
207 | |||
208 | int map_groups__fixup_overlappings(struct map_groups *self, struct map *map, | ||
209 | int verbose, FILE *fp); | ||
210 | |||
211 | struct map *map_groups__find_by_name(struct map_groups *self, | ||
212 | enum map_type type, const char *name); | ||
213 | struct map *machine__new_module(struct machine *self, u64 start, const char *filename); | ||
214 | |||
215 | void map_groups__flush(struct map_groups *self); | ||
216 | |||
94 | #endif /* __PERF_MAP_H */ | 217 | #endif /* __PERF_MAP_H */ |