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; |
f13bc61b DV |
53 | /* |
54 | * The current parallelism level (number of threads that run on CPUs). | |
55 | * This value can be less than 1, or larger than the total number | |
56 | * of CPUs, if events are poorly ordered. | |
57 | */ | |
58 | int parallelism; | |
b9d266ba | 59 | pid_t *current_tid; |
eef8e06e | 60 | size_t current_tid_sz; |
0db15b1e AH |
61 | union { /* Tool specific area */ |
62 | void *priv; | |
63 | u64 db_id; | |
64 | }; | |
a088031c | 65 | struct machines *machines; |
1c5aae77 | 66 | bool trampolines_mapped; |
69d2591a ACM |
67 | }; |
68 | ||
68a74186 ACM |
69 | /* |
70 | * The main kernel (vmlinux) map | |
71 | */ | |
a5e813c6 ACM |
72 | static inline |
73 | struct map *machine__kernel_map(struct machine *machine) | |
74 | { | |
3183f8ca | 75 | return machine->vmlinux_map; |
a5e813c6 ACM |
76 | } |
77 | ||
68a74186 ACM |
78 | /* |
79 | * kernel (the one returned by machine__kernel_map()) plus kernel modules maps | |
80 | */ | |
81 | static inline | |
82 | struct maps *machine__kernel_maps(struct machine *machine) | |
83 | { | |
1a97cee6 | 84 | return machine->kmaps; |
68a74186 ACM |
85 | } |
86 | ||
fbe2af45 AH |
87 | int machine__get_kernel_start(struct machine *machine); |
88 | ||
89 | static inline u64 machine__kernel_start(struct machine *machine) | |
90 | { | |
91 | if (!machine->kernel_start) | |
92 | machine__get_kernel_start(machine); | |
93 | return machine->kernel_start; | |
94 | } | |
95 | ||
96 | static inline bool machine__kernel_ip(struct machine *machine, u64 ip) | |
97 | { | |
98 | u64 kernel_start = machine__kernel_start(machine); | |
99 | ||
100 | return ip >= kernel_start; | |
101 | } | |
102 | ||
8e80ad99 AH |
103 | u8 machine__addr_cpumode(struct machine *machine, u8 cpumode, u64 addr); |
104 | ||
d75e6097 JO |
105 | struct thread *machine__find_thread(struct machine *machine, pid_t pid, |
106 | pid_t tid); | |
3035cb6c | 107 | struct thread *machine__idle_thread(struct machine *machine); |
cfe1c414 AH |
108 | struct comm *machine__thread_exec_comm(struct machine *machine, |
109 | struct thread *thread); | |
9d2f8e22 | 110 | |
162f0bef FW |
111 | int machine__process_comm_event(struct machine *machine, union perf_event *event, |
112 | struct perf_sample *sample); | |
113 | int machine__process_exit_event(struct machine *machine, union perf_event *event, | |
114 | struct perf_sample *sample); | |
115 | int machine__process_fork_event(struct machine *machine, union perf_event *event, | |
116 | struct perf_sample *sample); | |
117 | int machine__process_lost_event(struct machine *machine, union perf_event *event, | |
118 | struct perf_sample *sample); | |
c4937a91 KL |
119 | int machine__process_lost_samples_event(struct machine *machine, union perf_event *event, |
120 | struct perf_sample *sample); | |
4a96f7a0 AH |
121 | int machine__process_aux_event(struct machine *machine, |
122 | union perf_event *event); | |
0ad21f68 AH |
123 | int machine__process_itrace_start_event(struct machine *machine, |
124 | union perf_event *event); | |
61750473 AH |
125 | int machine__process_aux_output_hw_id_event(struct machine *machine, |
126 | union perf_event *event); | |
b8f8eb84 | 127 | int machine__process_switch_event(struct machine *machine, |
0286039f | 128 | union perf_event *event); |
f3b3614a HB |
129 | int machine__process_namespaces_event(struct machine *machine, |
130 | union perf_event *event, | |
131 | struct perf_sample *sample); | |
ba78c1c5 NK |
132 | int machine__process_cgroup_event(struct machine *machine, |
133 | union perf_event *event, | |
134 | struct perf_sample *sample); | |
162f0bef FW |
135 | int machine__process_mmap_event(struct machine *machine, union perf_event *event, |
136 | struct perf_sample *sample); | |
137 | int machine__process_mmap2_event(struct machine *machine, union perf_event *event, | |
138 | struct perf_sample *sample); | |
9aa0bfa3 SL |
139 | int machine__process_ksymbol(struct machine *machine, |
140 | union perf_event *event, | |
141 | struct perf_sample *sample); | |
246eba8e AH |
142 | int machine__process_text_poke(struct machine *machine, |
143 | union perf_event *event, | |
144 | struct perf_sample *sample); | |
162f0bef FW |
145 | int machine__process_event(struct machine *machine, union perf_event *event, |
146 | struct perf_sample *sample); | |
b0a7d1a0 | 147 | |
69d2591a ACM |
148 | typedef void (*machine__process_t)(struct machine *machine, void *data); |
149 | ||
876650e6 ACM |
150 | struct machines { |
151 | struct machine host; | |
f3acb3a8 | 152 | struct rb_root_cached guests; |
876650e6 ACM |
153 | }; |
154 | ||
155 | void machines__init(struct machines *machines); | |
156 | void machines__exit(struct machines *machines); | |
157 | ||
158 | void machines__process_guests(struct machines *machines, | |
159 | machine__process_t process, void *data); | |
69d2591a | 160 | |
876650e6 | 161 | struct machine *machines__add(struct machines *machines, pid_t pid, |
69d2591a | 162 | const char *root_dir); |
876650e6 ACM |
163 | struct machine *machines__find(struct machines *machines, pid_t pid); |
164 | struct machine *machines__findnew(struct machines *machines, pid_t pid); | |
fcda5ff7 | 165 | struct machine *machines__find_guest(struct machines *machines, pid_t pid); |
096fc361 AH |
166 | struct thread *machines__findnew_guest_code(struct machines *machines, pid_t pid); |
167 | struct thread *machine__findnew_guest_code(struct machine *machine, pid_t pid); | |
69d2591a | 168 | |
876650e6 | 169 | void machines__set_id_hdr_size(struct machines *machines, u16 id_hdr_size); |
cfe1c414 | 170 | void machines__set_comm_exec(struct machines *machines, bool comm_exec); |
611a5ce8 | 171 | |
8fb598e5 | 172 | struct machine *machine__new_host(void); |
7d132caa | 173 | struct machine *machine__new_kallsyms(void); |
4c046544 | 174 | struct machine *machine__new_live(bool kernel_maps, pid_t pid); |
69d2591a ACM |
175 | int machine__init(struct machine *machine, const char *root_dir, pid_t pid); |
176 | void machine__exit(struct machine *machine); | |
3f067dca | 177 | void machine__delete_threads(struct machine *machine); |
69d2591a | 178 | void machine__delete(struct machine *machine); |
5e78c69b | 179 | void machine__remove_thread(struct machine *machine, struct thread *th); |
69d2591a | 180 | |
644f2df2 ACM |
181 | struct branch_info *sample__resolve_bstack(struct perf_sample *sample, |
182 | struct addr_location *al); | |
e80faac0 ACM |
183 | struct mem_info *sample__resolve_mem(struct perf_sample *sample, |
184 | struct addr_location *al); | |
91d7b2de ACM |
185 | |
186 | struct callchain_cursor; | |
187 | ||
02b27050 IR |
188 | int __thread__resolve_callchain(struct thread *thread, |
189 | struct callchain_cursor *cursor, | |
190 | struct evsel *evsel, | |
191 | struct perf_sample *sample, | |
192 | struct symbol **parent, | |
193 | struct addr_location *root_al, | |
194 | int max_stack, | |
195 | bool symbols); | |
196 | ||
197 | static inline int thread__resolve_callchain(struct thread *thread, | |
198 | struct callchain_cursor *cursor, | |
199 | struct evsel *evsel, | |
200 | struct perf_sample *sample, | |
201 | struct symbol **parent, | |
202 | struct addr_location *root_al, | |
203 | int max_stack) | |
204 | { | |
205 | return __thread__resolve_callchain(thread, | |
206 | cursor, | |
207 | evsel, | |
208 | sample, | |
209 | parent, | |
210 | root_al, | |
211 | max_stack, | |
212 | /*symbols=*/true); | |
213 | } | |
69d2591a ACM |
214 | |
215 | /* | |
216 | * Default guest kernel is defined by parameter --guestkallsyms | |
217 | * and --guestmodules | |
218 | */ | |
219 | static inline bool machine__is_default_guest(struct machine *machine) | |
220 | { | |
221 | return machine ? machine->pid == DEFAULT_GUEST_KERNEL_ID : false; | |
222 | } | |
223 | ||
224 | static inline bool machine__is_host(struct machine *machine) | |
225 | { | |
226 | return machine ? machine->pid == HOST_KERNEL_ID : false; | |
227 | } | |
228 | ||
cc2367ee | 229 | bool machine__is_lock_function(struct machine *machine, u64 addr); |
dbbd34a6 | 230 | bool machine__is(struct machine *machine, const char *arch); |
b9f6fbb3 | 231 | bool machine__normalized_is(struct machine *machine, const char *arch); |
9cecca32 | 232 | int machine__nr_cpus_avail(struct machine *machine); |
dbbd34a6 | 233 | |
b91fc39f | 234 | struct thread *machine__findnew_thread(struct machine *machine, pid_t pid, pid_t tid); |
69d2591a | 235 | |
e4bb4caa IR |
236 | struct dso *machine__findnew_dso_id(struct machine *machine, const char *filename, |
237 | const struct dso_id *id); | |
aa7cc2ae ACM |
238 | struct dso *machine__findnew_dso(struct machine *machine, const char *filename); |
239 | ||
69d2591a ACM |
240 | size_t machine__fprintf(struct machine *machine, FILE *fp); |
241 | ||
242 | static inline | |
3183f8ca | 243 | struct symbol *machine__find_kernel_symbol(struct machine *machine, u64 addr, |
be39db9f | 244 | struct map **mapp) |
69d2591a | 245 | { |
1a97cee6 | 246 | return maps__find_symbol(machine->kmaps, addr, mapp); |
69d2591a ACM |
247 | } |
248 | ||
8acd3da0 ACM |
249 | static inline |
250 | struct symbol *machine__find_kernel_symbol_by_name(struct machine *machine, | |
3183f8ca | 251 | const char *name, |
be39db9f | 252 | struct map **mapp) |
8acd3da0 | 253 | { |
1a97cee6 | 254 | return maps__find_symbol_by_name(machine->kmaps, name, mapp); |
8acd3da0 ACM |
255 | } |
256 | ||
12a6d294 | 257 | int arch__fix_module_text_start(u64 *start, u64 *size, const char *name); |
69d2591a | 258 | |
3183f8ca | 259 | int machine__load_kallsyms(struct machine *machine, const char *filename); |
329f0ade | 260 | |
1d1a2654 | 261 | int machine__load_vmlinux_path(struct machine *machine); |
69d2591a | 262 | |
417c2ff6 ACM |
263 | size_t machine__fprintf_dsos_buildid(struct machine *machine, FILE *fp, |
264 | bool (skip)(struct dso *dso, int parm), int parm); | |
876650e6 ACM |
265 | size_t machines__fprintf_dsos(struct machines *machines, FILE *fp); |
266 | size_t machines__fprintf_dsos_buildid(struct machines *machines, FILE *fp, | |
417c2ff6 | 267 | bool (skip)(struct dso *dso, int parm), int parm); |
69d2591a ACM |
268 | |
269 | void machine__destroy_kernel_maps(struct machine *machine); | |
69d2591a ACM |
270 | int machine__create_kernel_maps(struct machine *machine); |
271 | ||
876650e6 ACM |
272 | int machines__create_kernel_maps(struct machines *machines, pid_t pid); |
273 | int machines__create_guest_kernel_maps(struct machines *machines); | |
274 | void machines__destroy_kernel_maps(struct machines *machines); | |
69d2591a | 275 | |
c57f5eaa JO |
276 | typedef int (*machine__dso_t)(struct dso *dso, struct machine *machine, void *priv); |
277 | ||
278 | int machine__for_each_dso(struct machine *machine, machine__dso_t fn, | |
279 | void *priv); | |
a6bd98c4 BJ |
280 | |
281 | typedef int (*machine__map_t)(struct map *map, void *priv); | |
282 | int machine__for_each_kernel_map(struct machine *machine, machine__map_t fn, | |
283 | void *priv); | |
284 | ||
35feee19 DA |
285 | int machine__for_each_thread(struct machine *machine, |
286 | int (*fn)(struct thread *thread, void *p), | |
287 | void *priv); | |
a5499b37 AH |
288 | int machines__for_each_thread(struct machines *machines, |
289 | int (*fn)(struct thread *thread, void *p), | |
290 | void *priv); | |
35feee19 | 291 | |
2f1e20fe IR |
292 | struct thread_list { |
293 | struct list_head list; | |
294 | struct thread *thread; | |
295 | }; | |
296 | ||
297 | /* Make a list of struct thread_list based on threads in the machine. */ | |
298 | int machine__thread_list(struct machine *machine, struct list_head *list); | |
299 | /* Free up the nodes within the thread_list list. */ | |
300 | void thread_list__delete(struct list_head *list); | |
301 | ||
b9d266ba AH |
302 | pid_t machine__get_current_tid(struct machine *machine, int cpu); |
303 | int machine__set_current_tid(struct machine *machine, int cpu, pid_t pid, | |
304 | pid_t tid); | |
c3168b0d | 305 | /* |
ece2a4f4 | 306 | * For use with libtraceevent's tep_set_function_resolver() |
c3168b0d ACM |
307 | */ |
308 | char *machine__resolve_kernel_addr(void *vmachine, unsigned long long *addrp, char **modp); | |
b9d266ba | 309 | |
1c5aae77 AH |
310 | void machine__get_kallsyms_filename(struct machine *machine, char *buf, |
311 | size_t bufsz); | |
312 | ||
313 | int machine__create_extra_kernel_maps(struct machine *machine, | |
314 | struct dso *kernel); | |
315 | ||
316 | /* Kernel-space maps for symbols that are outside the main kernel map and module maps */ | |
317 | struct extra_kernel_map { | |
318 | u64 start; | |
319 | u64 end; | |
320 | u64 pgoff; | |
321 | char name[KMAP_NAME_LEN]; | |
322 | }; | |
323 | ||
324 | int machine__create_extra_kernel_map(struct machine *machine, | |
325 | struct dso *kernel, | |
326 | struct extra_kernel_map *xm); | |
327 | ||
4d99e413 AH |
328 | int machine__map_x86_64_entry_trampolines(struct machine *machine, |
329 | struct dso *kernel); | |
330 | ||
7e5c6f2c ACM |
331 | int machine__resolve(struct machine *machine, struct addr_location *al, |
332 | struct perf_sample *sample); | |
333 | ||
83acca9f IR |
334 | int machine__hit_all_dsos(struct machine *machine); |
335 | ||
9d2f8e22 | 336 | #endif /* __PERF_MACHINE_H */ |