Linux Perf
map.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __PERF_MAP_H
3 #define __PERF_MAP_H
4 
5 #include <linux/refcount.h>
6 #include <linux/compiler.h>
7 #include <linux/list.h>
8 #include <linux/rbtree.h>
9 #include <pthread.h>
10 #include <stdio.h>
11 #include <string.h>
12 #include <stdbool.h>
13 #include <linux/types.h>
14 #include "rwsem.h"
15 
16 struct dso;
17 struct ip_callchain;
18 struct ref_reloc_sym;
19 struct map_groups;
20 struct machine;
21 struct perf_evsel;
22 
23 struct map {
24  union {
25  struct rb_node rb_node;
26  struct list_head node;
27  };
28  u64 start;
29  u64 end;
31  u32 priv;
32  u32 prot;
33  u32 flags;
34  u64 pgoff;
35  u64 reloc;
36  u32 maj, min; /* only valid for MMAP2 record */
37  u64 ino; /* only valid for MMAP2 record */
38  u64 ino_generation;/* only valid for MMAP2 record */
39 
40  /* ip -> dso rip */
41  u64 (*map_ip)(struct map *, u64);
42  /* dso rip -> ip */
43  u64 (*unmap_ip)(struct map *, u64);
44 
45  struct dso *dso;
46  struct map_groups *groups;
47  refcount_t refcnt;
48 };
49 
50 #define KMAP_NAME_LEN 256
51 
52 struct kmap {
54  struct map_groups *kmaps;
56 };
57 
58 struct maps {
59  struct rb_root entries;
61 };
62 
63 struct map_groups {
64  struct maps maps;
65  struct machine *machine;
66  refcount_t refcnt;
67 };
68 
69 struct map_groups *map_groups__new(struct machine *machine);
70 void map_groups__delete(struct map_groups *mg);
71 bool map_groups__empty(struct map_groups *mg);
72 
73 static inline struct map_groups *map_groups__get(struct map_groups *mg)
74 {
75  if (mg)
76  refcount_inc(&mg->refcnt);
77  return mg;
78 }
79 
80 void map_groups__put(struct map_groups *mg);
81 
82 struct kmap *__map__kmap(struct map *map);
83 struct kmap *map__kmap(struct map *map);
84 struct map_groups *map__kmaps(struct map *map);
85 
86 static inline u64 map__map_ip(struct map *map, u64 ip)
87 {
88  return ip - map->start + map->pgoff;
89 }
90 
91 static inline u64 map__unmap_ip(struct map *map, u64 ip)
92 {
93  return ip + map->start - map->pgoff;
94 }
95 
96 static inline u64 identity__map_ip(struct map *map __maybe_unused, u64 ip)
97 {
98  return ip;
99 }
100 
101 static inline size_t map__size(const struct map *map)
102 {
103  return map->end - map->start;
104 }
105 
106 /* rip/ip <-> addr suitable for passing to `objdump --start-address=` */
107 u64 map__rip_2objdump(struct map *map, u64 rip);
108 
109 /* objdump address -> memory address */
110 u64 map__objdump_2mem(struct map *map, u64 ip);
111 
112 struct symbol;
113 struct thread;
114 
115 /* map__for_each_symbol - iterate over the symbols in the given map
116  *
117  * @map: the 'struct map *' in which symbols itereated
118  * @pos: the 'struct symbol *' to use as a loop cursor
119  * @n: the 'struct rb_node *' to use as a temporary storage
120  * Note: caller must ensure map->dso is not NULL (map is loaded).
121  */
122 #define map__for_each_symbol(map, pos, n) \
123  dso__for_each_symbol(map->dso, pos, n)
124 
125 /* map__for_each_symbol_with_name - iterate over the symbols in the given map
126  * that have the given name
127  *
128  * @map: the 'struct map *' in which symbols itereated
129  * @sym_name: the symbol name
130  * @pos: the 'struct symbol *' to use as a loop cursor
131  */
132 #define __map__for_each_symbol_by_name(map, sym_name, pos) \
133  for (pos = map__find_symbol_by_name(map, sym_name); \
134  pos && \
135  !symbol__match_symbol_name(pos->name, sym_name, \
136  SYMBOL_TAG_INCLUDE__DEFAULT_ONLY); \
137  pos = symbol__next_by_name(pos))
138 
139 #define map__for_each_symbol_by_name(map, sym_name, pos) \
140  __map__for_each_symbol_by_name(map, sym_name, (pos))
141 
142 void map__init(struct map *map,
143  u64 start, u64 end, u64 pgoff, struct dso *dso);
144 struct map *map__new(struct machine *machine, u64 start, u64 len,
145  u64 pgoff, u32 d_maj, u32 d_min, u64 ino,
146  u64 ino_gen, u32 prot, u32 flags,
147  char *filename, struct thread *thread);
148 struct map *map__new2(u64 start, struct dso *dso);
149 void map__delete(struct map *map);
150 struct map *map__clone(struct map *map);
151 
152 static inline struct map *map__get(struct map *map)
153 {
154  if (map)
155  refcount_inc(&map->refcnt);
156  return map;
157 }
158 
159 void map__put(struct map *map);
160 
161 static inline void __map__zput(struct map **map)
162 {
163  map__put(*map);
164  *map = NULL;
165 }
166 
167 #define map__zput(map) __map__zput(&map)
168 
169 int map__overlap(struct map *l, struct map *r);
170 size_t map__fprintf(struct map *map, FILE *fp);
171 size_t map__fprintf_dsoname(struct map *map, FILE *fp);
172 char *map__srcline(struct map *map, u64 addr, struct symbol *sym);
173 int map__fprintf_srcline(struct map *map, u64 addr, const char *prefix,
174  FILE *fp);
175 
176 int map__load(struct map *map);
177 struct symbol *map__find_symbol(struct map *map, u64 addr);
178 struct symbol *map__find_symbol_by_name(struct map *map, const char *name);
179 void map__fixup_start(struct map *map);
180 void map__fixup_end(struct map *map);
181 
182 void map__reloc_vmlinux(struct map *map);
183 
184 void maps__insert(struct maps *maps, struct map *map);
185 void maps__remove(struct maps *maps, struct map *map);
186 struct map *maps__find(struct maps *maps, u64 addr);
187 struct map *maps__first(struct maps *maps);
188 struct map *map__next(struct map *map);
189 struct symbol *maps__find_symbol_by_name(struct maps *maps, const char *name,
190  struct map **mapp);
191 void map_groups__init(struct map_groups *mg, struct machine *machine);
192 void map_groups__exit(struct map_groups *mg);
193 int map_groups__clone(struct thread *thread,
194  struct map_groups *parent);
195 size_t map_groups__fprintf(struct map_groups *mg, FILE *fp);
196 
197 int map__set_kallsyms_ref_reloc_sym(struct map *map, const char *symbol_name,
198  u64 addr);
199 
200 static inline void map_groups__insert(struct map_groups *mg, struct map *map)
201 {
202  maps__insert(&mg->maps, map);
203  map->groups = mg;
204 }
205 
206 static inline void map_groups__remove(struct map_groups *mg, struct map *map)
207 {
208  maps__remove(&mg->maps, map);
209 }
210 
211 static inline struct map *map_groups__find(struct map_groups *mg, u64 addr)
212 {
213  return maps__find(&mg->maps, addr);
214 }
215 
216 struct map *map_groups__first(struct map_groups *mg);
217 
218 static inline struct map *map_groups__next(struct map *map)
219 {
220  return map__next(map);
221 }
222 
223 struct symbol *map_groups__find_symbol(struct map_groups *mg,
224  u64 addr, struct map **mapp);
225 
227  const char *name,
228  struct map **mapp);
229 
230 struct addr_map_symbol;
231 
232 int map_groups__find_ams(struct addr_map_symbol *ams);
233 
234 int map_groups__fixup_overlappings(struct map_groups *mg, struct map *map,
235  FILE *fp);
236 
237 struct map *map_groups__find_by_name(struct map_groups *mg, const char *name);
238 
239 bool __map__is_kernel(const struct map *map);
240 bool __map__is_extra_kernel_map(const struct map *map);
241 
242 static inline bool __map__is_kmodule(const struct map *map)
243 {
244  return !__map__is_kernel(map) && !__map__is_extra_kernel_map(map);
245 }
246 
247 bool map__has_symbols(const struct map *map);
248 
249 #define ENTRY_TRAMPOLINE_NAME "__entry_SYSCALL_64_trampoline"
250 
251 static inline bool is_entry_trampoline(const char *name)
252 {
253  return !strcmp(name, ENTRY_TRAMPOLINE_NAME);
254 }
255 
256 #endif /* __PERF_MAP_H */
struct map * maps__find(struct maps *maps, u64 addr)
Definition: map.c:831
struct maps maps
Definition: map.h:64
#define KMAP_NAME_LEN
Definition: map.h:50
bool map__has_symbols(const struct map *map)
Definition: map.c:262
int map_groups__fixup_overlappings(struct map_groups *mg, struct map *map, FILE *fp)
Definition: map.c:753
u64(* map_ip)(struct map *, u64)
Definition: map.h:41
Definition: mem2node.c:7
int map_groups__clone(struct thread *thread, struct map_groups *parent)
Definition: map.c:762
struct map * map_groups__find_by_name(struct map_groups *mg, const char *name)
Definition: symbol.c:1679
struct map * map__next(struct map *map)
Definition: map.c:865
void map__delete(struct map *map)
Definition: map.c:273
static u64 map__unmap_ip(struct map *map, u64 ip)
Definition: map.h:91
u32 flags
Definition: map.h:33
struct symbol * map_groups__find_symbol_by_name(struct map_groups *mg, const char *name, struct map **mapp)
Definition: map.c:619
void map__put(struct map *map)
Definition: map.c:279
u64 pgoff
Definition: map.h:34
static u64 map__map_ip(struct map *map, u64 ip)
Definition: map.h:86
pthread_rwlock_t lock
Definition: rwsem.h:7
void maps__insert(struct maps *maps, struct map *map)
Definition: map.c:811
static void __map__zput(struct map **map)
Definition: map.h:161
const char * filename
Definition: hists_common.c:26
int map__load(struct map *map)
Definition: map.c:307
static u64 identity__map_ip(struct map *map __maybe_unused, u64 ip)
Definition: map.h:96
Definition: map.h:52
refcount_t refcnt
Definition: map.h:66
int map__fprintf_srcline(struct map *map, u64 addr, const char *prefix, FILE *fp)
Definition: map.c:425
#define ENTRY_TRAMPOLINE_NAME
Definition: map.h:249
void maps__remove(struct maps *maps, struct map *map)
Definition: map.c:824
static bool is_entry_trampoline(const char *name)
Definition: map.h:251
void map_groups__init(struct map_groups *mg, struct machine *machine)
Definition: map.c:518
struct map * map_groups__first(struct map_groups *mg)
Definition: symbol.c:1027
void map__fixup_start(struct map *map)
Definition: map.c:285
bool __map__is_extra_kernel_map(const struct map *map)
Definition: map.c:255
struct map * map__clone(struct map *map)
Definition: map.c:370
void map__reloc_vmlinux(struct map *map)
struct map_groups * map_groups__new(struct machine *machine)
Definition: map.c:556
size_t map__fprintf(struct map *map, FILE *fp)
Definition: map.c:398
int map__set_kallsyms_ref_reloc_sym(struct map *map, const char *symbol_name, u64 addr)
Definition: session.c:1976
u64 start
Definition: map.h:28
static bool __map__is_kmodule(const struct map *map)
Definition: map.h:242
struct kmap * __map__kmap(struct map *map)
Definition: map.c:874
void map_groups__delete(struct map_groups *mg)
Definition: map.c:566
void map_groups__exit(struct map_groups *mg)
Definition: map.c:546
char * map__srcline(struct map *map, u64 addr, struct symbol *sym)
Definition: map.c:418
Definition: thread.h:18
struct map * map__new2(u64 start, struct dso *dso)
Definition: map.c:227
const char * name
struct map_groups * groups
Definition: map.h:46
struct map * map__new(struct machine *machine, u64 start, u64 len, u64 pgoff, u32 d_maj, u32 d_min, u64 ino, u64 ino_gen, u32 prot, u32 flags, char *filename, struct thread *thread)
Definition: map.c:142
static size_t map__size(const struct map *map)
Definition: map.h:101
bool erange_warned
Definition: map.h:30
u64 map__objdump_2mem(struct map *map, u64 ip)
Definition: map.c:494
struct dso * dso
Definition: map.h:45
struct kmap * map__kmap(struct map *map)
Definition: map.c:881
void map_groups__put(struct map_groups *mg)
Definition: map.c:572
size_t map_groups__fprintf(struct map_groups *mg, FILE *fp)
Definition: map.c:664
struct symbol * map_groups__find_symbol(struct map_groups *mg, u64 addr, struct map **mapp)
Definition: map.c:578
int map_groups__find_ams(struct addr_map_symbol *ams)
Definition: map.c:626
Definition: map.h:58
struct symbol * map__find_symbol_by_name(struct map *map, const char *name)
Definition: map.c:359
Definition: dso.h:138
Definition: map.h:63
struct map_groups * kmaps
Definition: map.h:54
struct ref_reloc_sym * ref_reloc_sym
Definition: map.h:53
bool __map__is_kernel(const struct map *map)
Definition: map.c:250
static void map_groups__remove(struct map_groups *mg, struct map *map)
Definition: map.h:206
u32 min
Definition: map.h:36
static struct map * map_groups__next(struct map *map)
Definition: map.h:218
static struct map * map__get(struct map *map)
Definition: map.h:152
static struct map * map_groups__find(struct map_groups *mg, u64 addr)
Definition: map.h:211
struct symbol * map__find_symbol(struct map *map, u64 addr)
Definition: map.c:351
struct rb_node rb_node
Definition: map.h:25
u32 maj
Definition: map.h:36
bool map_groups__empty(struct map_groups *mg)
Definition: map.c:551
Definition: jevents.c:228
u64 reloc
Definition: map.h:35
static int sym(yyscan_t scanner, int type, int config)
struct symbol * maps__find_symbol_by_name(struct maps *maps, const char *name, struct map **mapp)
Definition: map.c:593
static struct map_groups * map_groups__get(struct map_groups *mg)
Definition: map.h:73
u64 ino_generation
Definition: map.h:38
u64 map__rip_2objdump(struct map *map, u64 rip)
Definition: map.c:450
int map__overlap(struct map *l, struct map *r)
Definition: map.c:384
u64(* unmap_ip)(struct map *, u64)
Definition: map.h:43
Definition: symbol.h:55
void map__fixup_end(struct map *map)
Definition: map.c:295
refcount_t refcnt
Definition: map.h:47
u32 prot
Definition: map.h:32
u64 ino
Definition: map.h:37
struct map_groups * map__kmaps(struct map *map)
Definition: map.c:890
struct machine * machine
Definition: map.h:65
static void map_groups__insert(struct map_groups *mg, struct map *map)
Definition: map.h:200
void map__init(struct map *map, u64 start, u64 end, u64 pgoff, struct dso *dso)
Definition: map.c:127
size_t map__fprintf_dsoname(struct map *map, FILE *fp)
Definition: map.c:404
u64 end
Definition: map.h:29
u32 priv
Definition: map.h:31
struct map * maps__first(struct maps *maps)
Definition: map.c:856