brintos

brintos / linux-shallow public Read only

0
0
Text · 8.1 KiB · 4262f5a Raw
321 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#ifndef __PERF_MAP_H3#define __PERF_MAP_H4 5#include <linux/refcount.h>6#include <linux/compiler.h>7#include <linux/list.h>8#include <linux/rbtree.h>9#include <stdio.h>10#include <string.h>11#include <stdbool.h>12#include <linux/types.h>13#include <internal/rc_check.h>14 15struct dso;16struct maps;17struct machine;18 19enum mapping_type {20	/* map__map_ip/map__unmap_ip are given as offsets in the DSO. */21	MAPPING_TYPE__DSO,22	/* map__map_ip/map__unmap_ip are just the given ip value. */23	MAPPING_TYPE__IDENTITY,24};25 26DECLARE_RC_STRUCT(map) {27	u64			start;28	u64			end;29	u64			pgoff;30	u64			reloc;31	struct dso		*dso;32	refcount_t		refcnt;33	u32			prot;34	u32			flags;35	enum mapping_type	mapping_type:8;36	bool			erange_warned;37	bool			priv;38	bool			hit;39};40 41struct kmap;42 43struct kmap *__map__kmap(struct map *map);44struct kmap *map__kmap(struct map *map);45struct maps *map__kmaps(struct map *map);46 47static inline struct dso *map__dso(const struct map *map)48{49	return RC_CHK_ACCESS(map)->dso;50}51 52static inline u64 map__start(const struct map *map)53{54	return RC_CHK_ACCESS(map)->start;55}56 57static inline u64 map__end(const struct map *map)58{59	return RC_CHK_ACCESS(map)->end;60}61 62static inline u64 map__pgoff(const struct map *map)63{64	return RC_CHK_ACCESS(map)->pgoff;65}66 67static inline u64 map__reloc(const struct map *map)68{69	return RC_CHK_ACCESS(map)->reloc;70}71 72static inline u32 map__flags(const struct map *map)73{74	return RC_CHK_ACCESS(map)->flags;75}76 77static inline u32 map__prot(const struct map *map)78{79	return RC_CHK_ACCESS(map)->prot;80}81 82static inline bool map__priv(const struct map *map)83{84	return RC_CHK_ACCESS(map)->priv;85}86 87static inline bool map__hit(const struct map *map)88{89	return RC_CHK_ACCESS(map)->hit;90}91 92static inline refcount_t *map__refcnt(struct map *map)93{94	return &RC_CHK_ACCESS(map)->refcnt;95}96 97static inline bool map__erange_warned(struct map *map)98{99	return RC_CHK_ACCESS(map)->erange_warned;100}101 102static inline size_t map__size(const struct map *map)103{104	return map__end(map) - map__start(map);105}106 107/* ip -> dso rip */108static inline u64 map__dso_map_ip(const struct map *map, u64 ip)109{110	return ip - map__start(map) + map__pgoff(map);111}112 113/* dso rip -> ip */114static inline u64 map__dso_unmap_ip(const struct map *map, u64 rip)115{116	return rip + map__start(map) - map__pgoff(map);117}118 119static inline u64 map__map_ip(const struct map *map, u64 ip_or_rip)120{121	if ((RC_CHK_ACCESS(map)->mapping_type) == MAPPING_TYPE__DSO)122		return map__dso_map_ip(map, ip_or_rip);123	else124		return ip_or_rip;125}126 127static inline u64 map__unmap_ip(const struct map *map, u64 ip_or_rip)128{129	if ((RC_CHK_ACCESS(map)->mapping_type) == MAPPING_TYPE__DSO)130		return map__dso_unmap_ip(map, ip_or_rip);131	else132		return ip_or_rip;133}134 135/* rip/ip <-> addr suitable for passing to `objdump --start-address=` */136u64 map__rip_2objdump(struct map *map, u64 rip);137 138/* objdump address -> memory address */139u64 map__objdump_2mem(struct map *map, u64 ip);140 141/* objdump address -> rip */142u64 map__objdump_2rip(struct map *map, u64 ip);143 144struct symbol;145struct thread;146 147/* map__for_each_symbol - iterate over the symbols in the given map148 *149 * @map: the 'struct map *' in which symbols are iterated150 * @pos: the 'struct symbol *' to use as a loop cursor151 * @n: the 'struct rb_node *' to use as a temporary storage152 * Note: caller must ensure map->dso is not NULL (map is loaded).153 */154#define map__for_each_symbol(map, pos, n)	\155	dso__for_each_symbol(map__dso(map), pos, n)156 157/* map__for_each_symbol_with_name - iterate over the symbols in the given map158 *                                  that have the given name159 *160 * @map: the 'struct map *' in which symbols are iterated161 * @sym_name: the symbol name162 * @pos: the 'struct symbol *' to use as a loop cursor163 * @idx: the cursor index in the symbol names array164 */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);	\167	     pos &&						\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))171 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)174 175struct dso_id;176struct build_id;177 178struct 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);181struct map *map__new2(u64 start, struct dso *dso);182void map__delete(struct map *map);183struct map *map__clone(struct map *map);184 185static inline struct map *map__get(struct map *map)186{187	struct map *result;188 189	if (RC_CHK_GET(result, map))190		refcount_inc(map__refcnt(map));191 192	return result;193}194 195void map__put(struct map *map);196 197static inline void __map__zput(struct map **map)198{199	map__put(*map);200	*map = NULL;201}202 203#define map__zput(map) __map__zput(&map)204 205size_t map__fprintf(struct map *map, FILE *fp);206size_t map__fprintf_dsoname(struct map *map, FILE *fp);207size_t map__fprintf_dsoname_dsoff(struct map *map, bool print_off, u64 addr, FILE *fp);208char *map__srcline(struct map *map, u64 addr, struct symbol *sym);209int map__fprintf_srcline(struct map *map, u64 addr, const char *prefix,210			 FILE *fp);211 212int map__load(struct map *map);213struct symbol *map__find_symbol(struct map *map, u64 addr);214struct symbol *map__find_symbol_by_name(struct map *map, const char *name);215struct symbol *map__find_symbol_by_name_idx(struct map *map, const char *name, size_t *idx);216void map__fixup_start(struct map *map);217void map__fixup_end(struct map *map);218 219int map__set_kallsyms_ref_reloc_sym(struct map *map, const char *symbol_name,220				    u64 addr);221 222bool __map__is_kernel(const struct map *map);223bool __map__is_extra_kernel_map(const struct map *map);224bool __map__is_bpf_prog(const struct map *map);225bool __map__is_bpf_image(const struct map *map);226bool __map__is_ool(const struct map *map);227 228static inline bool __map__is_kmodule(const struct map *map)229{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);233}234 235bool map__has_symbols(const struct map *map);236 237bool map__contains_symbol(const struct map *map, const struct symbol *sym);238 239#define ENTRY_TRAMPOLINE_NAME "__entry_SYSCALL_64_trampoline"240 241static inline bool is_entry_trampoline(const char *name)242{243	return !strcmp(name, ENTRY_TRAMPOLINE_NAME);244}245 246static inline bool is_bpf_image(const char *name)247{248	return strncmp(name, "bpf_trampoline_", sizeof("bpf_trampoline_") - 1) == 0 ||249	       strncmp(name, "bpf_dispatcher_", sizeof("bpf_dispatcher_") - 1) == 0;250}251 252static inline int is_anon_memory(const char *filename)253{254	return !strcmp(filename, "//anon") ||255	       !strncmp(filename, "/dev/zero", sizeof("/dev/zero") - 1) ||256	       !strncmp(filename, "/anon_hugepage", sizeof("/anon_hugepage") - 1);257}258 259static inline int is_no_dso_memory(const char *filename)260{261	return !strncmp(filename, "[stack", 6) ||262	       !strncmp(filename, "/SYSV", 5)  ||263	       !strcmp(filename, "[heap]");264}265 266static inline void map__set_start(struct map *map, u64 start)267{268	RC_CHK_ACCESS(map)->start = start;269}270 271static inline void map__set_end(struct map *map, u64 end)272{273	RC_CHK_ACCESS(map)->end = end;274}275 276static inline void map__set_pgoff(struct map *map, u64 pgoff)277{278	RC_CHK_ACCESS(map)->pgoff = pgoff;279}280 281static inline void map__add_pgoff(struct map *map, u64 inc)282{283	RC_CHK_ACCESS(map)->pgoff += inc;284}285 286static inline void map__set_reloc(struct map *map, u64 reloc)287{288	RC_CHK_ACCESS(map)->reloc = reloc;289}290 291static inline void map__set_priv(struct map *map)292{293	RC_CHK_ACCESS(map)->priv = true;294}295 296static inline void map__set_hit(struct map *map)297{298	RC_CHK_ACCESS(map)->hit = true;299}300 301static inline void map__set_erange_warned(struct map *map)302{303	RC_CHK_ACCESS(map)->erange_warned = true;304}305 306static inline void map__set_dso(struct map *map, struct dso *dso)307{308	RC_CHK_ACCESS(map)->dso = dso;309}310 311static inline void map__set_mapping_type(struct map *map, enum mapping_type type)312{313	RC_CHK_ACCESS(map)->mapping_type = type;314}315 316static inline enum mapping_type map__mapping_type(struct map *map)317{318	return RC_CHK_ACCESS(map)->mapping_type;319}320#endif /* __PERF_MAP_H */321