Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
9d2f8e22 ACM |
2 | #ifndef __PERF_MACHINE_H |
3 | #define __PERF_MACHINE_H | |
4 | ||
5 | #include <sys/types.h> | |
69d2591a | 6 | #include <linux/rbtree.h> |
c54d241b | 7 | #include "maps.h" |
4a3cec84 | 8 | #include "dsos.h" |
0a7c74ea | 9 | #include "rwsem.h" |
93bb5b0d | 10 | #include "threads.h" |
9d2f8e22 | 11 | |
b21484f1 | 12 | struct addr_location; |
69d2591a | 13 | struct branch_stack; |
4a3cec84 | 14 | struct dso; |
0e3149f8 | 15 | struct dso_id; |
32dcd021 | 16 | struct evsel; |
69d2591a ACM |
17 | struct perf_sample; |
18 | struct symbol; | |
aeb00b1a | 19 | struct target; |
9d2f8e22 | 20 | struct thread; |
b0a7d1a0 | 21 | union perf_event; |
a088031c | 22 | struct machines; |
9d2f8e22 | 23 | |
69d2591a ACM |
24 | /* Native host kernel uses -1 as pid index in machine */ |
25 | #define HOST_KERNEL_ID (-1) | |
26 | #define DEFAULT_GUEST_KERNEL_ID (0) | |
27 | ||
5512cf24 AH |
28 | extern const char *ref_reloc_sym_names[]; |
29 | ||
d027b640 AH |
30 | struct vdso_info; |
31 | ||
69d2591a ACM |
32 | struct machine { |
33 | struct rb_node rb_node; | |
34 | pid_t pid; | |
35 | u16 id_hdr_size; | |
cfe1c414 | 36 | bool comm_exec; |
caf8a0d0 | 37 | bool kptr_restrict_warned; |
ec1891af | 38 | bool single_address_space; |
69d2591a | 39 | char *root_dir; |
8c7f1bb3 | 40 | char *mmap_name; |
a5367ecb | 41 | char *kallsyms_filename; |
d436f90a | 42 | struct threads threads; |
d027b640 | 43 | struct vdso_info *vdso_info; |
4cde998d | 44 | struct perf_env *env; |
3d39ac53 | 45 | struct dsos dsos; |
1a97cee6 | 46 | struct maps *kmaps; |
3183f8ca | 47 | struct map *vmlinux_map; |
fbe2af45 | 48 | u64 kernel_start; |
cc2367ee ACM |
49 | struct { |
50 | u64 text_start; | |
51 | u64 text_end; | |
2a5049b7 | 52 | } sched, lock, traceiter, trace; |
b9d266ba | 53 | pid_t *current_tid; |
eef8e06e | 54 | size_t current_tid_sz; |
0db15b1e AH |
55 | union { /* Tool specific area */ |
56 | void *priv; | |
57 | u64 db_id; | |
58 | }; | |
a088031c | 59 | struct machines *machines; |
1c5aae77 | 60 | bool trampolines_mapped; |
69d2591a ACM |
61 | }; |
62 | ||
68a74186 ACM |
63 | /* |
64 | * The main kernel (vmlinux) map | |
65 | */ | |
a5e813c6 ACM |
66 | static inline |
67 | struct map *machine__kernel_map(struct machine *machine) | |
68 | { | |
3183f8ca | 69 | return machine->vmlinux_map; |
a5e813c6 ACM |
70 | } |
71 | ||
68a74186 ACM |
72 | /* |
73 | * kernel (the one returned by machine__kernel_map()) plus kernel modules maps | |
74 | */ | |
75 | static inline | |
76 | struct maps *machine__kernel_maps(struct machine *machine) | |
77 | { | |
1a97cee6 | 78 | return machine->kmaps; |
68a74186 ACM |
79 | } |
80 | ||
fbe2af45 AH |
81 | int machine__get_kernel_start(struct machine *machine); |
82 | ||
83 | static inline u64 machine__kernel_start(struct machine *machine) | |
84 | { | |
85 | if (!machine->kernel_start) | |
86 | machine__get_kernel_start(machine); | |
87 | return machine->kernel_start; | |
88 | } | |
89 | ||
90 | static inline bool machine__kernel_ip(struct machine *machine, u64 ip) | |
91 | { | |
92 | u64 kernel_start = machine__kernel_start(machine); | |
93 | ||
94 | return ip >= kernel_start; | |
95 | } | |
96 | ||
8e80ad99 AH |
97 | u8 machine__addr_cpumode(struct machine *machine, u8 cpumode, u64 addr); |
98 | ||
d75e6097 JO |
99 | struct thread *machine__find_thread(struct machine *machine, pid_t pid, |
100 | pid_t tid); | |
3035cb6c | 101 | struct thread *machine__idle_thread(struct machine *machine); |
cfe1c414 AH |
102 | struct comm *machine__thread_exec_comm(struct machine *machine, |
103 | struct thread *thread); | |
9d2f8e22 | 104 | |
162f0bef FW |
105 | int machine__process_comm_event(struct machine *machine, union perf_event *event, |
106 | struct perf_sample *sample); | |
107 | int machine__process_exit_event(struct machine *machine, union perf_event *event, | |
108 | struct perf_sample *sample); | |
109 | int machine__process_fork_event(struct machine *machine, union perf_event *event, | |
110 | struct perf_sample *sample); | |
111 | int machine__process_lost_event(struct machine *machine, union perf_event *event, | |
112 | struct perf_sample *sample); | |
c4937a91 KL |
113 | int machine__process_lost_samples_event(struct machine *machine, union perf_event *event, |
114 | struct perf_sample *sample); | |
4a96f7a0 AH |
115 | int machine__process_aux_event(struct machine *machine, |
116 | union perf_event *event); | |
0ad21f68 AH |
117 | int machine__process_itrace_start_event(struct machine *machine, |
118 | union perf_event *event); | |
61750473 AH |
119 | int machine__process_aux_output_hw_id_event(struct machine *machine, |
120 | union perf_event *event); | |
b8f8eb84 | 121 | int machine__process_switch_event(struct machine *machine, |
0286039f | 122 | union perf_event *event); |
f3b3614a HB |
123 | int machine__process_namespaces_event(struct machine *machine, |
124 | union perf_event *event, | |
125 | struct perf_sample *sample); | |
ba78c1c5 NK |
126 | int machine__process_cgroup_event(struct machine *machine, |
127 | union perf_event *event, | |
128 | struct perf_sample *sample); | |
162f0bef FW |
129 | int machine__process_mmap_event(struct machine *machine, union perf_event *event, |
130 | struct perf_sample *sample); | |
131 | int machine__process_mmap2_event(struct machine *machine, union perf_event *event, | |
132 | struct perf_sample *sample); | |
9aa0bfa3 SL |
133 | int machine__process_ksymbol(struct machine *machine, |
134 | union perf_event *event, | |
135 | struct perf_sample *sample); | |
246eba8e AH |
136 | int machine__process_text_poke(struct machine *machine, |
137 | union perf_event *event, | |
138 | struct perf_sample *sample); | |
162f0bef FW |
139 | int machine__process_event(struct machine *machine, union perf_event *event, |
140 | struct perf_sample *sample); | |
b0a7d1a0 | 141 | |
69d2591a ACM |
142 | typedef void (*machine__process_t)(struct machine *machine, void *data); |
143 | ||
876650e6 ACM |
144 | struct machines { |
145 | struct machine host; | |
f3acb3a8 | 146 | struct rb_root_cached guests; |
876650e6 ACM |
147 | }; |
148 | ||
149 | void machines__init(struct machines *machines); | |
150 | void machines__exit(struct machines *machines); | |
151 | ||
152 | void machines__process_guests(struct machines *machines, | |
153 | machine__process_t process, void *data); | |
69d2591a | 154 | |
876650e6 | 155 | struct machine *machines__add(struct machines *machines, pid_t pid, |
69d2591a | 156 | const char *root_dir); |
876650e6 ACM |
157 | struct machine *machines__find(struct machines *machines, pid_t pid); |
158 | struct machine *machines__findnew(struct machines *machines, pid_t pid); | |
fcda5ff7 | 159 | struct machine *machines__find_guest(struct machines *machines, pid_t pid); |
096fc361 AH |
160 | struct thread *machines__findnew_guest_code(struct machines *machines, pid_t pid); |
161 | struct thread *machine__findnew_guest_code(struct machine *machine, pid_t pid); | |
69d2591a | 162 | |
876650e6 | 163 | void machines__set_id_hdr_size(struct machines *machines, u16 id_hdr_size); |
cfe1c414 | 164 | void machines__set_comm_exec(struct machines *machines, bool comm_exec); |
611a5ce8 | 165 | |
8fb598e5 | 166 | struct machine *machine__new_host(void); |
7d132caa | 167 | struct machine *machine__new_kallsyms(void); |
69d2591a ACM |
168 | int machine__init(struct machine *machine, const char *root_dir, pid_t pid); |
169 | void machine__exit(struct machine *machine); | |
3f067dca | 170 | void machine__delete_threads(struct machine *machine); |
69d2591a | 171 | void machine__delete(struct machine *machine); |
5e78c69b | 172 | void machine__remove_thread(struct machine *machine, struct thread *th); |
69d2591a | 173 | |
644f2df2 ACM |
174 | struct branch_info *sample__resolve_bstack(struct perf_sample *sample, |
175 | struct addr_location *al); | |
e80faac0 ACM |
176 | struct mem_info *sample__resolve_mem(struct perf_sample *sample, |
177 | struct addr_location *al); | |
91d7b2de ACM |
178 | |
179 | struct callchain_cursor; | |
180 | ||
cc8b7c2b | 181 | int thread__resolve_callchain(struct thread *thread, |
91d7b2de | 182 | struct callchain_cursor *cursor, |
32dcd021 | 183 | struct evsel *evsel, |
cc8b7c2b ACM |
184 | struct perf_sample *sample, |
185 | struct symbol **parent, | |
186 | struct addr_location *root_al, | |
187 | int max_stack); | |
69d2591a ACM |
188 | |
189 | /* | |
190 | * Default guest kernel is defined by parameter --guestkallsyms | |
191 | * and --guestmodules | |
192 | */ | |
193 | static inline bool machine__is_default_guest(struct machine *machine) | |
194 | { | |
195 | return machine ? machine->pid == DEFAULT_GUEST_KERNEL_ID : false; | |
196 | } | |
197 | ||
198 | static inline bool machine__is_host(struct machine *machine) | |
199 | { | |
200 | return machine ? machine->pid == HOST_KERNEL_ID : false; | |
201 | } | |
202 | ||
cc2367ee | 203 | bool machine__is_lock_function(struct machine *machine, u64 addr); |
dbbd34a6 | 204 | bool machine__is(struct machine *machine, const char *arch); |
b9f6fbb3 | 205 | bool machine__normalized_is(struct machine *machine, const char *arch); |
9cecca32 | 206 | int machine__nr_cpus_avail(struct machine *machine); |
dbbd34a6 | 207 | |
b91fc39f | 208 | struct thread *machine__findnew_thread(struct machine *machine, pid_t pid, pid_t tid); |
69d2591a | 209 | |
0e3149f8 | 210 | struct dso *machine__findnew_dso_id(struct machine *machine, const char *filename, struct dso_id *id); |
aa7cc2ae ACM |
211 | struct dso *machine__findnew_dso(struct machine *machine, const char *filename); |
212 | ||
69d2591a ACM |
213 | size_t machine__fprintf(struct machine *machine, FILE *fp); |
214 | ||
215 | static inline | |
3183f8ca | 216 | struct symbol *machine__find_kernel_symbol(struct machine *machine, u64 addr, |
be39db9f | 217 | struct map **mapp) |
69d2591a | 218 | { |
1a97cee6 | 219 | return maps__find_symbol(machine->kmaps, addr, mapp); |
69d2591a ACM |
220 | } |
221 | ||
8acd3da0 ACM |
222 | static inline |
223 | struct symbol *machine__find_kernel_symbol_by_name(struct machine *machine, | |
3183f8ca | 224 | const char *name, |
be39db9f | 225 | struct map **mapp) |
8acd3da0 | 226 | { |
1a97cee6 | 227 | return maps__find_symbol_by_name(machine->kmaps, name, mapp); |
8acd3da0 ACM |
228 | } |
229 | ||
12a6d294 | 230 | int arch__fix_module_text_start(u64 *start, u64 *size, const char *name); |
69d2591a | 231 | |
3183f8ca | 232 | int machine__load_kallsyms(struct machine *machine, const char *filename); |
329f0ade | 233 | |
1d1a2654 | 234 | int machine__load_vmlinux_path(struct machine *machine); |
69d2591a | 235 | |
417c2ff6 ACM |
236 | size_t machine__fprintf_dsos_buildid(struct machine *machine, FILE *fp, |
237 | bool (skip)(struct dso *dso, int parm), int parm); | |
876650e6 ACM |
238 | size_t machines__fprintf_dsos(struct machines *machines, FILE *fp); |
239 | size_t machines__fprintf_dsos_buildid(struct machines *machines, FILE *fp, | |
417c2ff6 | 240 | bool (skip)(struct dso *dso, int parm), int parm); |
69d2591a ACM |
241 | |
242 | void machine__destroy_kernel_maps(struct machine *machine); | |
69d2591a ACM |
243 | int machine__create_kernel_maps(struct machine *machine); |
244 | ||
876650e6 ACM |
245 | int machines__create_kernel_maps(struct machines *machines, pid_t pid); |
246 | int machines__create_guest_kernel_maps(struct machines *machines); | |
247 | void machines__destroy_kernel_maps(struct machines *machines); | |
69d2591a ACM |
248 | |
249 | size_t machine__fprintf_vmlinux_path(struct machine *machine, FILE *fp); | |
250 | ||
c57f5eaa JO |
251 | typedef int (*machine__dso_t)(struct dso *dso, struct machine *machine, void *priv); |
252 | ||
253 | int machine__for_each_dso(struct machine *machine, machine__dso_t fn, | |
254 | void *priv); | |
a6bd98c4 BJ |
255 | |
256 | typedef int (*machine__map_t)(struct map *map, void *priv); | |
257 | int machine__for_each_kernel_map(struct machine *machine, machine__map_t fn, | |
258 | void *priv); | |
259 | ||
35feee19 DA |
260 | int machine__for_each_thread(struct machine *machine, |
261 | int (*fn)(struct thread *thread, void *p), | |
262 | void *priv); | |
a5499b37 AH |
263 | int machines__for_each_thread(struct machines *machines, |
264 | int (*fn)(struct thread *thread, void *p), | |
265 | void *priv); | |
35feee19 | 266 | |
2f1e20fe IR |
267 | struct thread_list { |
268 | struct list_head list; | |
269 | struct thread *thread; | |
270 | }; | |
271 | ||
272 | /* Make a list of struct thread_list based on threads in the machine. */ | |
273 | int machine__thread_list(struct machine *machine, struct list_head *list); | |
274 | /* Free up the nodes within the thread_list list. */ | |
275 | void thread_list__delete(struct list_head *list); | |
276 | ||
b9d266ba AH |
277 | pid_t machine__get_current_tid(struct machine *machine, int cpu); |
278 | int machine__set_current_tid(struct machine *machine, int cpu, pid_t pid, | |
279 | pid_t tid); | |
c3168b0d | 280 | /* |
ece2a4f4 | 281 | * For use with libtraceevent's tep_set_function_resolver() |
c3168b0d ACM |
282 | */ |
283 | char *machine__resolve_kernel_addr(void *vmachine, unsigned long long *addrp, char **modp); | |
b9d266ba | 284 | |
1c5aae77 AH |
285 | void machine__get_kallsyms_filename(struct machine *machine, char *buf, |
286 | size_t bufsz); | |
287 | ||
288 | int machine__create_extra_kernel_maps(struct machine *machine, | |
289 | struct dso *kernel); | |
290 | ||
291 | /* Kernel-space maps for symbols that are outside the main kernel map and module maps */ | |
292 | struct extra_kernel_map { | |
293 | u64 start; | |
294 | u64 end; | |
295 | u64 pgoff; | |
296 | char name[KMAP_NAME_LEN]; | |
297 | }; | |
298 | ||
299 | int machine__create_extra_kernel_map(struct machine *machine, | |
300 | struct dso *kernel, | |
301 | struct extra_kernel_map *xm); | |
302 | ||
4d99e413 AH |
303 | int machine__map_x86_64_entry_trampolines(struct machine *machine, |
304 | struct dso *kernel); | |
305 | ||
7e5c6f2c ACM |
306 | int machine__resolve(struct machine *machine, struct addr_location *al, |
307 | struct perf_sample *sample); | |
308 | ||
83acca9f IR |
309 | int machine__hit_all_dsos(struct machine *machine); |
310 | ||
9d2f8e22 | 311 | #endif /* __PERF_MACHINE_H */ |