Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
4a58e611 ACM |
2 | #ifndef __PERF_MAP_H |
3 | #define __PERF_MAP_H | |
4 | ||
e3a42cdd | 5 | #include <linux/refcount.h> |
4a58e611 ACM |
6 | #include <linux/compiler.h> |
7 | #include <linux/list.h> | |
8 | #include <linux/rbtree.h> | |
4b8cf846 | 9 | #include <stdio.h> |
4d004365 | 10 | #include <string.h> |
23346f21 | 11 | #include <stdbool.h> |
d944c4ee | 12 | #include <linux/types.h> |
4a58e611 | 13 | |
4a58e611 | 14 | struct dso; |
743eb868 | 15 | struct ip_callchain; |
9de89fe7 ACM |
16 | struct ref_reloc_sym; |
17 | struct map_groups; | |
23346f21 | 18 | struct machine; |
32dcd021 | 19 | struct evsel; |
4a58e611 ACM |
20 | |
21 | struct map { | |
22 | union { | |
23 | struct rb_node rb_node; | |
24 | struct list_head node; | |
25 | }; | |
1e628569 | 26 | struct rb_node rb_node_name; |
4a58e611 ACM |
27 | u64 start; |
28 | u64 end; | |
31d68e7b | 29 | bool erange_warned; |
5c0541d5 | 30 | u32 priv; |
7ef80703 DZ |
31 | u32 prot; |
32 | u32 flags; | |
4a58e611 | 33 | u64 pgoff; |
9176753d | 34 | u64 reloc; |
5c5e854b SE |
35 | u32 maj, min; /* only valid for MMAP2 record */ |
36 | u64 ino; /* only valid for MMAP2 record */ | |
37 | u64 ino_generation;/* only valid for MMAP2 record */ | |
7a2b6209 KS |
38 | |
39 | /* ip -> dso rip */ | |
4a58e611 | 40 | u64 (*map_ip)(struct map *, u64); |
7a2b6209 | 41 | /* dso rip -> ip */ |
4a58e611 | 42 | u64 (*unmap_ip)(struct map *, u64); |
7a2b6209 | 43 | |
4a58e611 | 44 | struct dso *dso; |
a1645ce1 | 45 | struct map_groups *groups; |
e3a42cdd | 46 | refcount_t refcnt; |
4a58e611 ACM |
47 | }; |
48 | ||
41f30914 | 49 | struct kmap; |
a26ca671 | 50 | |
5759a682 | 51 | struct kmap *__map__kmap(struct map *map); |
ba92732e WN |
52 | struct kmap *map__kmap(struct map *map); |
53 | struct map_groups *map__kmaps(struct map *map); | |
9de89fe7 | 54 | |
4a58e611 ACM |
55 | static inline u64 map__map_ip(struct map *map, u64 ip) |
56 | { | |
57 | return ip - map->start + map->pgoff; | |
58 | } | |
59 | ||
60 | static inline u64 map__unmap_ip(struct map *map, u64 ip) | |
61 | { | |
62 | return ip + map->start - map->pgoff; | |
63 | } | |
64 | ||
1d037ca1 | 65 | static inline u64 identity__map_ip(struct map *map __maybe_unused, u64 ip) |
4a58e611 ACM |
66 | { |
67 | return ip; | |
68 | } | |
69 | ||
b74d12d5 KP |
70 | static inline size_t map__size(const struct map *map) |
71 | { | |
72 | return map->end - map->start; | |
73 | } | |
7a2b6209 | 74 | |
ee11b90b | 75 | /* rip/ip <-> addr suitable for passing to `objdump --start-address=` */ |
7a2b6209 | 76 | u64 map__rip_2objdump(struct map *map, u64 rip); |
7a2b6209 | 77 | |
1d5077bd AH |
78 | /* objdump address -> memory address */ |
79 | u64 map__objdump_2mem(struct map *map, u64 ip); | |
80 | ||
4a58e611 | 81 | struct symbol; |
5835edda | 82 | struct thread; |
4a58e611 | 83 | |
eb948e50 MH |
84 | /* map__for_each_symbol - iterate over the symbols in the given map |
85 | * | |
86 | * @map: the 'struct map *' in which symbols itereated | |
87 | * @pos: the 'struct symbol *' to use as a loop cursor | |
88 | * @n: the 'struct rb_node *' to use as a temporary storage | |
89 | * Note: caller must ensure map->dso is not NULL (map is loaded). | |
90 | */ | |
91 | #define map__for_each_symbol(map, pos, n) \ | |
3183f8ca | 92 | dso__for_each_symbol(map->dso, pos, n) |
eb948e50 | 93 | |
0a3873a8 ACM |
94 | /* map__for_each_symbol_with_name - iterate over the symbols in the given map |
95 | * that have the given name | |
96 | * | |
97 | * @map: the 'struct map *' in which symbols itereated | |
98 | * @sym_name: the symbol name | |
99 | * @pos: the 'struct symbol *' to use as a loop cursor | |
0a3873a8 | 100 | */ |
be39db9f ACM |
101 | #define __map__for_each_symbol_by_name(map, sym_name, pos) \ |
102 | for (pos = map__find_symbol_by_name(map, sym_name); \ | |
d8040645 PC |
103 | pos && \ |
104 | !symbol__match_symbol_name(pos->name, sym_name, \ | |
105 | SYMBOL_TAG_INCLUDE__DEFAULT_ONLY); \ | |
0a3873a8 ACM |
106 | pos = symbol__next_by_name(pos)) |
107 | ||
108 | #define map__for_each_symbol_by_name(map, sym_name, pos) \ | |
be39db9f | 109 | __map__for_each_symbol_by_name(map, sym_name, (pos)) |
4a58e611 | 110 | |
3183f8ca | 111 | void map__init(struct map *map, |
4a58e611 | 112 | u64 start, u64 end, u64 pgoff, struct dso *dso); |
2a03068c | 113 | struct map *map__new(struct machine *machine, u64 start, u64 len, |
bf2e710b | 114 | u64 pgoff, u32 d_maj, u32 d_min, u64 ino, |
7ef80703 | 115 | u64 ino_gen, u32 prot, u32 flags, |
3183f8ca ACM |
116 | char *filename, struct thread *thread); |
117 | struct map *map__new2(u64 start, struct dso *dso); | |
237a7e04 ACM |
118 | void map__delete(struct map *map); |
119 | struct map *map__clone(struct map *map); | |
84c2cafa ACM |
120 | |
121 | static inline struct map *map__get(struct map *map) | |
122 | { | |
123 | if (map) | |
e3a42cdd | 124 | refcount_inc(&map->refcnt); |
84c2cafa ACM |
125 | return map; |
126 | } | |
127 | ||
128 | void map__put(struct map *map); | |
129 | ||
5c24b67a ACM |
130 | static inline void __map__zput(struct map **map) |
131 | { | |
132 | map__put(*map); | |
133 | *map = NULL; | |
134 | } | |
135 | ||
136 | #define map__zput(map) __map__zput(&map) | |
137 | ||
237a7e04 | 138 | size_t map__fprintf(struct map *map, FILE *fp); |
547a92e0 | 139 | size_t map__fprintf_dsoname(struct map *map, FILE *fp); |
e2d88aaa | 140 | char *map__srcline(struct map *map, u64 addr, struct symbol *sym); |
cc8fae1d AH |
141 | int map__fprintf_srcline(struct map *map, u64 addr, const char *prefix, |
142 | FILE *fp); | |
4a58e611 | 143 | |
4fed0726 | 144 | struct srccode_state; |
dd2e18e9 AK |
145 | |
146 | int map__fprintf_srccode(struct map *map, u64 addr, | |
147 | FILE *fp, struct srccode_state *state); | |
148 | ||
be39db9f ACM |
149 | int map__load(struct map *map); |
150 | struct symbol *map__find_symbol(struct map *map, u64 addr); | |
151 | struct symbol *map__find_symbol_by_name(struct map *map, const char *name); | |
237a7e04 ACM |
152 | void map__fixup_start(struct map *map); |
153 | void map__fixup_end(struct map *map); | |
4a58e611 | 154 | |
237a7e04 | 155 | void map__reloc_vmlinux(struct map *map); |
9de89fe7 | 156 | |
3183f8ca ACM |
157 | int map__set_kallsyms_ref_reloc_sym(struct map *map, const char *symbol_name, |
158 | u64 addr); | |
743eb868 | 159 | |
e6ce7126 | 160 | bool __map__is_kernel(const struct map *map); |
5759a682 | 161 | bool __map__is_extra_kernel_map(const struct map *map); |
a93e0b23 | 162 | bool __map__is_bpf_prog(const struct map *map); |
e6ce7126 ACM |
163 | |
164 | static inline bool __map__is_kmodule(const struct map *map) | |
165 | { | |
a93e0b23 SL |
166 | return !__map__is_kernel(map) && !__map__is_extra_kernel_map(map) && |
167 | !__map__is_bpf_prog(map); | |
e6ce7126 ACM |
168 | } |
169 | ||
e94b861a ACM |
170 | bool map__has_symbols(const struct map *map); |
171 | ||
4d004365 AH |
172 | #define ENTRY_TRAMPOLINE_NAME "__entry_SYSCALL_64_trampoline" |
173 | ||
174 | static inline bool is_entry_trampoline(const char *name) | |
175 | { | |
176 | return !strcmp(name, ENTRY_TRAMPOLINE_NAME); | |
177 | } | |
178 | ||
4a58e611 | 179 | #endif /* __PERF_MAP_H */ |