1 /* SPDX-License-Identifier: GPL-2.0 */
5 #include <linux/refcount.h>
6 #include <linux/compiler.h>
7 #include <linux/list.h>
8 #include <linux/rbtree.h>
12 #include <linux/types.h>
13 #include <internal/rc_check.h>
20 /* map__map_ip/map__unmap_ip are given as offsets in the DSO. */
22 /* map__map_ip/map__unmap_ip are just the given ip value. */
23 MAPPING_TYPE__IDENTITY
,
26 DECLARE_RC_STRUCT(map
) {
35 enum mapping_type mapping_type
:8;
43 struct kmap
*__map__kmap(struct map
*map
);
44 struct kmap
*map__kmap(struct map
*map
);
45 struct maps
*map__kmaps(struct map
*map
);
47 static inline struct dso
*map__dso(const struct map
*map
)
49 return RC_CHK_ACCESS(map
)->dso
;
52 static inline u64
map__start(const struct map
*map
)
54 return RC_CHK_ACCESS(map
)->start
;
57 static inline u64
map__end(const struct map
*map
)
59 return RC_CHK_ACCESS(map
)->end
;
62 static inline u64
map__pgoff(const struct map
*map
)
64 return RC_CHK_ACCESS(map
)->pgoff
;
67 static inline u64
map__reloc(const struct map
*map
)
69 return RC_CHK_ACCESS(map
)->reloc
;
72 static inline u32
map__flags(const struct map
*map
)
74 return RC_CHK_ACCESS(map
)->flags
;
77 static inline u32
map__prot(const struct map
*map
)
79 return RC_CHK_ACCESS(map
)->prot
;
82 static inline bool map__priv(const struct map
*map
)
84 return RC_CHK_ACCESS(map
)->priv
;
87 static inline bool map__hit(const struct map
*map
)
89 return RC_CHK_ACCESS(map
)->hit
;
92 static inline refcount_t
*map__refcnt(struct map
*map
)
94 return &RC_CHK_ACCESS(map
)->refcnt
;
97 static inline bool map__erange_warned(struct map
*map
)
99 return RC_CHK_ACCESS(map
)->erange_warned
;
102 static inline size_t map__size(const struct map
*map
)
104 return map__end(map
) - map__start(map
);
108 static inline u64
map__dso_map_ip(const struct map
*map
, u64 ip
)
110 return ip
- map__start(map
) + map__pgoff(map
);
114 static inline u64
map__dso_unmap_ip(const struct map
*map
, u64 rip
)
116 return rip
+ map__start(map
) - map__pgoff(map
);
119 static inline u64
map__map_ip(const struct map
*map
, u64 ip_or_rip
)
121 if ((RC_CHK_ACCESS(map
)->mapping_type
) == MAPPING_TYPE__DSO
)
122 return map__dso_map_ip(map
, ip_or_rip
);
127 static inline u64
map__unmap_ip(const struct map
*map
, u64 ip_or_rip
)
129 if ((RC_CHK_ACCESS(map
)->mapping_type
) == MAPPING_TYPE__DSO
)
130 return map__dso_unmap_ip(map
, ip_or_rip
);
135 /* rip/ip <-> addr suitable for passing to `objdump --start-address=` */
136 u64
map__rip_2objdump(struct map
*map
, u64 rip
);
138 /* objdump address -> memory address */
139 u64
map__objdump_2mem(struct map
*map
, u64 ip
);
141 /* objdump address -> rip */
142 u64
map__objdump_2rip(struct map
*map
, u64 ip
);
147 /* map__for_each_symbol - iterate over the symbols in the given map
149 * @map: the 'struct map *' in which symbols are iterated
150 * @pos: the 'struct symbol *' to use as a loop cursor
151 * @n: the 'struct rb_node *' to use as a temporary storage
152 * Note: caller must ensure map->dso is not NULL (map is loaded).
154 #define map__for_each_symbol(map, pos, n) \
155 dso__for_each_symbol(map__dso(map), pos, n)
157 /* map__for_each_symbol_with_name - iterate over the symbols in the given map
158 * that have the given name
160 * @map: the 'struct map *' in which symbols are iterated
161 * @sym_name: the symbol name
162 * @pos: the 'struct symbol *' to use as a loop cursor
163 * @idx: the cursor index in the symbol names array
165 #define __map__for_each_symbol_by_name(map, sym_name, pos, idx) \
166 for (pos = map__find_symbol_by_name_idx(map, sym_name, &idx); \
168 !symbol__match_symbol_name(pos->name, sym_name, \
169 SYMBOL_TAG_INCLUDE__DEFAULT_ONLY); \
170 pos = dso__next_symbol_by_name(map__dso(map), &idx))
172 #define map__for_each_symbol_by_name(map, sym_name, pos, idx) \
173 __map__for_each_symbol_by_name(map, sym_name, (pos), idx)
178 struct map
*map__new(struct machine
*machine
, u64 start
, u64 len
,
179 u64 pgoff
, struct dso_id
*id
, u32 prot
, u32 flags
,
180 struct build_id
*bid
, char *filename
, struct thread
*thread
);
181 struct map
*map__new2(u64 start
, struct dso
*dso
);
182 void map__delete(struct map
*map
);
183 struct map
*map__clone(struct map
*map
);
185 static inline struct map
*map__get(struct map
*map
)
189 if (RC_CHK_GET(result
, map
))
190 refcount_inc(map__refcnt(map
));
195 void map__put(struct map
*map
);
197 static inline void __map__zput(struct map
**map
)
203 #define map__zput(map) __map__zput(&map)
205 size_t map__fprintf(struct map
*map
, FILE *fp
);
206 size_t map__fprintf_dsoname(struct map
*map
, FILE *fp
);
207 size_t map__fprintf_dsoname_dsoff(struct map
*map
, bool print_off
, u64 addr
, FILE *fp
);
208 char *map__srcline(struct map
*map
, u64 addr
, struct symbol
*sym
);
209 int map__fprintf_srcline(struct map
*map
, u64 addr
, const char *prefix
,
212 int map__load(struct map
*map
);
213 struct symbol
*map__find_symbol(struct map
*map
, u64 addr
);
214 struct symbol
*map__find_symbol_by_name(struct map
*map
, const char *name
);
215 struct symbol
*map__find_symbol_by_name_idx(struct map
*map
, const char *name
, size_t *idx
);
216 void map__fixup_start(struct map
*map
);
217 void map__fixup_end(struct map
*map
);
219 int map__set_kallsyms_ref_reloc_sym(struct map
*map
, const char *symbol_name
,
222 bool __map__is_kernel(const struct map
*map
);
223 bool __map__is_extra_kernel_map(const struct map
*map
);
224 bool __map__is_bpf_prog(const struct map
*map
);
225 bool __map__is_bpf_image(const struct map
*map
);
226 bool __map__is_ool(const struct map
*map
);
228 static inline bool __map__is_kmodule(const struct map
*map
)
230 return !__map__is_kernel(map
) && !__map__is_extra_kernel_map(map
) &&
231 !__map__is_bpf_prog(map
) && !__map__is_ool(map
) &&
232 !__map__is_bpf_image(map
);
235 bool map__has_symbols(const struct map
*map
);
237 bool map__contains_symbol(const struct map
*map
, const struct symbol
*sym
);
239 #define ENTRY_TRAMPOLINE_NAME "__entry_SYSCALL_64_trampoline"
241 static inline bool is_entry_trampoline(const char *name
)
243 return !strcmp(name
, ENTRY_TRAMPOLINE_NAME
);
246 static inline bool is_bpf_image(const char *name
)
248 return strncmp(name
, "bpf_trampoline_", sizeof("bpf_trampoline_") - 1) == 0 ||
249 strncmp(name
, "bpf_dispatcher_", sizeof("bpf_dispatcher_") - 1) == 0;
252 static inline int is_anon_memory(const char *filename
)
254 return !strcmp(filename
, "//anon") ||
255 !strncmp(filename
, "/dev/zero", sizeof("/dev/zero") - 1) ||
256 !strncmp(filename
, "/anon_hugepage", sizeof("/anon_hugepage") - 1);
259 static inline int is_no_dso_memory(const char *filename
)
261 return !strncmp(filename
, "[stack", 6) ||
262 !strncmp(filename
, "/SYSV", 5) ||
263 !strcmp(filename
, "[heap]");
266 static inline void map__set_start(struct map
*map
, u64 start
)
268 RC_CHK_ACCESS(map
)->start
= start
;
271 static inline void map__set_end(struct map
*map
, u64 end
)
273 RC_CHK_ACCESS(map
)->end
= end
;
276 static inline void map__set_pgoff(struct map
*map
, u64 pgoff
)
278 RC_CHK_ACCESS(map
)->pgoff
= pgoff
;
281 static inline void map__add_pgoff(struct map
*map
, u64 inc
)
283 RC_CHK_ACCESS(map
)->pgoff
+= inc
;
286 static inline void map__set_reloc(struct map
*map
, u64 reloc
)
288 RC_CHK_ACCESS(map
)->reloc
= reloc
;
291 static inline void map__set_priv(struct map
*map
)
293 RC_CHK_ACCESS(map
)->priv
= true;
296 static inline void map__set_hit(struct map
*map
)
298 RC_CHK_ACCESS(map
)->hit
= true;
301 static inline void map__set_erange_warned(struct map
*map
)
303 RC_CHK_ACCESS(map
)->erange_warned
= true;
306 static inline void map__set_dso(struct map
*map
, struct dso
*dso
)
308 RC_CHK_ACCESS(map
)->dso
= dso
;
311 static inline void map__set_mapping_type(struct map
*map
, enum mapping_type type
)
313 RC_CHK_ACCESS(map
)->mapping_type
= type
;
316 static inline enum mapping_type
map__mapping_type(struct map
*map
)
318 return RC_CHK_ACCESS(map
)->mapping_type
;
320 #endif /* __PERF_MAP_H */