18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci#ifndef __PERF_MACHINE_H 38c2ecf20Sopenharmony_ci#define __PERF_MACHINE_H 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci#include <sys/types.h> 68c2ecf20Sopenharmony_ci#include <linux/rbtree.h> 78c2ecf20Sopenharmony_ci#include "maps.h" 88c2ecf20Sopenharmony_ci#include "dsos.h" 98c2ecf20Sopenharmony_ci#include "rwsem.h" 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_cistruct addr_location; 128c2ecf20Sopenharmony_cistruct branch_stack; 138c2ecf20Sopenharmony_cistruct dso; 148c2ecf20Sopenharmony_cistruct dso_id; 158c2ecf20Sopenharmony_cistruct evsel; 168c2ecf20Sopenharmony_cistruct perf_sample; 178c2ecf20Sopenharmony_cistruct symbol; 188c2ecf20Sopenharmony_cistruct target; 198c2ecf20Sopenharmony_cistruct thread; 208c2ecf20Sopenharmony_ciunion perf_event; 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci/* Native host kernel uses -1 as pid index in machine */ 238c2ecf20Sopenharmony_ci#define HOST_KERNEL_ID (-1) 248c2ecf20Sopenharmony_ci#define DEFAULT_GUEST_KERNEL_ID (0) 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ciextern const char *ref_reloc_sym_names[]; 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_cistruct vdso_info; 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci#define THREADS__TABLE_BITS 8 318c2ecf20Sopenharmony_ci#define THREADS__TABLE_SIZE (1 << THREADS__TABLE_BITS) 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_cistruct threads { 348c2ecf20Sopenharmony_ci struct rb_root_cached entries; 358c2ecf20Sopenharmony_ci struct rw_semaphore lock; 368c2ecf20Sopenharmony_ci unsigned int nr; 378c2ecf20Sopenharmony_ci struct list_head dead; 388c2ecf20Sopenharmony_ci struct thread *last_match; 398c2ecf20Sopenharmony_ci}; 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_cistruct machine { 428c2ecf20Sopenharmony_ci struct rb_node rb_node; 438c2ecf20Sopenharmony_ci pid_t pid; 448c2ecf20Sopenharmony_ci u16 id_hdr_size; 458c2ecf20Sopenharmony_ci bool comm_exec; 468c2ecf20Sopenharmony_ci bool kptr_restrict_warned; 478c2ecf20Sopenharmony_ci bool single_address_space; 488c2ecf20Sopenharmony_ci char *root_dir; 498c2ecf20Sopenharmony_ci char *mmap_name; 508c2ecf20Sopenharmony_ci struct threads threads[THREADS__TABLE_SIZE]; 518c2ecf20Sopenharmony_ci struct vdso_info *vdso_info; 528c2ecf20Sopenharmony_ci struct perf_env *env; 538c2ecf20Sopenharmony_ci struct dsos dsos; 548c2ecf20Sopenharmony_ci struct maps kmaps; 558c2ecf20Sopenharmony_ci struct map *vmlinux_map; 568c2ecf20Sopenharmony_ci u64 kernel_start; 578c2ecf20Sopenharmony_ci pid_t *current_tid; 588c2ecf20Sopenharmony_ci union { /* Tool specific area */ 598c2ecf20Sopenharmony_ci void *priv; 608c2ecf20Sopenharmony_ci u64 db_id; 618c2ecf20Sopenharmony_ci }; 628c2ecf20Sopenharmony_ci bool trampolines_mapped; 638c2ecf20Sopenharmony_ci}; 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_cistatic inline struct threads *machine__threads(struct machine *machine, pid_t tid) 668c2ecf20Sopenharmony_ci{ 678c2ecf20Sopenharmony_ci /* Cast it to handle tid == -1 */ 688c2ecf20Sopenharmony_ci return &machine->threads[(unsigned int)tid % THREADS__TABLE_SIZE]; 698c2ecf20Sopenharmony_ci} 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_ci/* 728c2ecf20Sopenharmony_ci * The main kernel (vmlinux) map 738c2ecf20Sopenharmony_ci */ 748c2ecf20Sopenharmony_cistatic inline 758c2ecf20Sopenharmony_cistruct map *machine__kernel_map(struct machine *machine) 768c2ecf20Sopenharmony_ci{ 778c2ecf20Sopenharmony_ci return machine->vmlinux_map; 788c2ecf20Sopenharmony_ci} 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci/* 818c2ecf20Sopenharmony_ci * kernel (the one returned by machine__kernel_map()) plus kernel modules maps 828c2ecf20Sopenharmony_ci */ 838c2ecf20Sopenharmony_cistatic inline 848c2ecf20Sopenharmony_cistruct maps *machine__kernel_maps(struct machine *machine) 858c2ecf20Sopenharmony_ci{ 868c2ecf20Sopenharmony_ci return &machine->kmaps; 878c2ecf20Sopenharmony_ci} 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ciint machine__get_kernel_start(struct machine *machine); 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_cistatic inline u64 machine__kernel_start(struct machine *machine) 928c2ecf20Sopenharmony_ci{ 938c2ecf20Sopenharmony_ci if (!machine->kernel_start) 948c2ecf20Sopenharmony_ci machine__get_kernel_start(machine); 958c2ecf20Sopenharmony_ci return machine->kernel_start; 968c2ecf20Sopenharmony_ci} 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_cistatic inline bool machine__kernel_ip(struct machine *machine, u64 ip) 998c2ecf20Sopenharmony_ci{ 1008c2ecf20Sopenharmony_ci u64 kernel_start = machine__kernel_start(machine); 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci return ip >= kernel_start; 1038c2ecf20Sopenharmony_ci} 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ciu8 machine__addr_cpumode(struct machine *machine, u8 cpumode, u64 addr); 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_cistruct thread *machine__find_thread(struct machine *machine, pid_t pid, 1088c2ecf20Sopenharmony_ci pid_t tid); 1098c2ecf20Sopenharmony_cistruct comm *machine__thread_exec_comm(struct machine *machine, 1108c2ecf20Sopenharmony_ci struct thread *thread); 1118c2ecf20Sopenharmony_ci 1128c2ecf20Sopenharmony_ciint machine__process_comm_event(struct machine *machine, union perf_event *event, 1138c2ecf20Sopenharmony_ci struct perf_sample *sample); 1148c2ecf20Sopenharmony_ciint machine__process_exit_event(struct machine *machine, union perf_event *event, 1158c2ecf20Sopenharmony_ci struct perf_sample *sample); 1168c2ecf20Sopenharmony_ciint machine__process_fork_event(struct machine *machine, union perf_event *event, 1178c2ecf20Sopenharmony_ci struct perf_sample *sample); 1188c2ecf20Sopenharmony_ciint machine__process_lost_event(struct machine *machine, union perf_event *event, 1198c2ecf20Sopenharmony_ci struct perf_sample *sample); 1208c2ecf20Sopenharmony_ciint machine__process_lost_samples_event(struct machine *machine, union perf_event *event, 1218c2ecf20Sopenharmony_ci struct perf_sample *sample); 1228c2ecf20Sopenharmony_ciint machine__process_aux_event(struct machine *machine, 1238c2ecf20Sopenharmony_ci union perf_event *event); 1248c2ecf20Sopenharmony_ciint machine__process_itrace_start_event(struct machine *machine, 1258c2ecf20Sopenharmony_ci union perf_event *event); 1268c2ecf20Sopenharmony_ciint machine__process_switch_event(struct machine *machine, 1278c2ecf20Sopenharmony_ci union perf_event *event); 1288c2ecf20Sopenharmony_ciint machine__process_namespaces_event(struct machine *machine, 1298c2ecf20Sopenharmony_ci union perf_event *event, 1308c2ecf20Sopenharmony_ci struct perf_sample *sample); 1318c2ecf20Sopenharmony_ciint machine__process_cgroup_event(struct machine *machine, 1328c2ecf20Sopenharmony_ci union perf_event *event, 1338c2ecf20Sopenharmony_ci struct perf_sample *sample); 1348c2ecf20Sopenharmony_ciint machine__process_mmap_event(struct machine *machine, union perf_event *event, 1358c2ecf20Sopenharmony_ci struct perf_sample *sample); 1368c2ecf20Sopenharmony_ciint machine__process_mmap2_event(struct machine *machine, union perf_event *event, 1378c2ecf20Sopenharmony_ci struct perf_sample *sample); 1388c2ecf20Sopenharmony_ciint machine__process_ksymbol(struct machine *machine, 1398c2ecf20Sopenharmony_ci union perf_event *event, 1408c2ecf20Sopenharmony_ci struct perf_sample *sample); 1418c2ecf20Sopenharmony_ciint machine__process_text_poke(struct machine *machine, 1428c2ecf20Sopenharmony_ci union perf_event *event, 1438c2ecf20Sopenharmony_ci struct perf_sample *sample); 1448c2ecf20Sopenharmony_ciint machine__process_event(struct machine *machine, union perf_event *event, 1458c2ecf20Sopenharmony_ci struct perf_sample *sample); 1468c2ecf20Sopenharmony_ci 1478c2ecf20Sopenharmony_citypedef void (*machine__process_t)(struct machine *machine, void *data); 1488c2ecf20Sopenharmony_ci 1498c2ecf20Sopenharmony_cistruct machines { 1508c2ecf20Sopenharmony_ci struct machine host; 1518c2ecf20Sopenharmony_ci struct rb_root_cached guests; 1528c2ecf20Sopenharmony_ci}; 1538c2ecf20Sopenharmony_ci 1548c2ecf20Sopenharmony_civoid machines__init(struct machines *machines); 1558c2ecf20Sopenharmony_civoid machines__exit(struct machines *machines); 1568c2ecf20Sopenharmony_ci 1578c2ecf20Sopenharmony_civoid machines__process_guests(struct machines *machines, 1588c2ecf20Sopenharmony_ci machine__process_t process, void *data); 1598c2ecf20Sopenharmony_ci 1608c2ecf20Sopenharmony_cistruct machine *machines__add(struct machines *machines, pid_t pid, 1618c2ecf20Sopenharmony_ci const char *root_dir); 1628c2ecf20Sopenharmony_cistruct machine *machines__find_host(struct machines *machines); 1638c2ecf20Sopenharmony_cistruct machine *machines__find(struct machines *machines, pid_t pid); 1648c2ecf20Sopenharmony_cistruct machine *machines__findnew(struct machines *machines, pid_t pid); 1658c2ecf20Sopenharmony_ci 1668c2ecf20Sopenharmony_civoid machines__set_id_hdr_size(struct machines *machines, u16 id_hdr_size); 1678c2ecf20Sopenharmony_civoid machines__set_comm_exec(struct machines *machines, bool comm_exec); 1688c2ecf20Sopenharmony_ci 1698c2ecf20Sopenharmony_cistruct machine *machine__new_host(void); 1708c2ecf20Sopenharmony_cistruct machine *machine__new_kallsyms(void); 1718c2ecf20Sopenharmony_ciint machine__init(struct machine *machine, const char *root_dir, pid_t pid); 1728c2ecf20Sopenharmony_civoid machine__exit(struct machine *machine); 1738c2ecf20Sopenharmony_civoid machine__delete_threads(struct machine *machine); 1748c2ecf20Sopenharmony_civoid machine__delete(struct machine *machine); 1758c2ecf20Sopenharmony_civoid machine__remove_thread(struct machine *machine, struct thread *th); 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_cistruct branch_info *sample__resolve_bstack(struct perf_sample *sample, 1788c2ecf20Sopenharmony_ci struct addr_location *al); 1798c2ecf20Sopenharmony_cistruct mem_info *sample__resolve_mem(struct perf_sample *sample, 1808c2ecf20Sopenharmony_ci struct addr_location *al); 1818c2ecf20Sopenharmony_ci 1828c2ecf20Sopenharmony_cistruct callchain_cursor; 1838c2ecf20Sopenharmony_ci 1848c2ecf20Sopenharmony_ciint thread__resolve_callchain(struct thread *thread, 1858c2ecf20Sopenharmony_ci struct callchain_cursor *cursor, 1868c2ecf20Sopenharmony_ci struct evsel *evsel, 1878c2ecf20Sopenharmony_ci struct perf_sample *sample, 1888c2ecf20Sopenharmony_ci struct symbol **parent, 1898c2ecf20Sopenharmony_ci struct addr_location *root_al, 1908c2ecf20Sopenharmony_ci int max_stack); 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_ci/* 1938c2ecf20Sopenharmony_ci * Default guest kernel is defined by parameter --guestkallsyms 1948c2ecf20Sopenharmony_ci * and --guestmodules 1958c2ecf20Sopenharmony_ci */ 1968c2ecf20Sopenharmony_cistatic inline bool machine__is_default_guest(struct machine *machine) 1978c2ecf20Sopenharmony_ci{ 1988c2ecf20Sopenharmony_ci return machine ? machine->pid == DEFAULT_GUEST_KERNEL_ID : false; 1998c2ecf20Sopenharmony_ci} 2008c2ecf20Sopenharmony_ci 2018c2ecf20Sopenharmony_cistatic inline bool machine__is_host(struct machine *machine) 2028c2ecf20Sopenharmony_ci{ 2038c2ecf20Sopenharmony_ci return machine ? machine->pid == HOST_KERNEL_ID : false; 2048c2ecf20Sopenharmony_ci} 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_cibool machine__is(struct machine *machine, const char *arch); 2078c2ecf20Sopenharmony_ciint machine__nr_cpus_avail(struct machine *machine); 2088c2ecf20Sopenharmony_ci 2098c2ecf20Sopenharmony_cistruct thread *__machine__findnew_thread(struct machine *machine, pid_t pid, pid_t tid); 2108c2ecf20Sopenharmony_cistruct thread *machine__findnew_thread(struct machine *machine, pid_t pid, pid_t tid); 2118c2ecf20Sopenharmony_ci 2128c2ecf20Sopenharmony_cistruct dso *machine__findnew_dso_id(struct machine *machine, const char *filename, struct dso_id *id); 2138c2ecf20Sopenharmony_cistruct dso *machine__findnew_dso(struct machine *machine, const char *filename); 2148c2ecf20Sopenharmony_ci 2158c2ecf20Sopenharmony_cisize_t machine__fprintf(struct machine *machine, FILE *fp); 2168c2ecf20Sopenharmony_ci 2178c2ecf20Sopenharmony_cistatic inline 2188c2ecf20Sopenharmony_cistruct symbol *machine__find_kernel_symbol(struct machine *machine, u64 addr, 2198c2ecf20Sopenharmony_ci struct map **mapp) 2208c2ecf20Sopenharmony_ci{ 2218c2ecf20Sopenharmony_ci return maps__find_symbol(&machine->kmaps, addr, mapp); 2228c2ecf20Sopenharmony_ci} 2238c2ecf20Sopenharmony_ci 2248c2ecf20Sopenharmony_cistatic inline 2258c2ecf20Sopenharmony_cistruct symbol *machine__find_kernel_symbol_by_name(struct machine *machine, 2268c2ecf20Sopenharmony_ci const char *name, 2278c2ecf20Sopenharmony_ci struct map **mapp) 2288c2ecf20Sopenharmony_ci{ 2298c2ecf20Sopenharmony_ci return maps__find_symbol_by_name(&machine->kmaps, name, mapp); 2308c2ecf20Sopenharmony_ci} 2318c2ecf20Sopenharmony_ci 2328c2ecf20Sopenharmony_ciint arch__fix_module_text_start(u64 *start, u64 *size, const char *name); 2338c2ecf20Sopenharmony_ci 2348c2ecf20Sopenharmony_ciint machine__load_kallsyms(struct machine *machine, const char *filename); 2358c2ecf20Sopenharmony_ci 2368c2ecf20Sopenharmony_ciint machine__load_vmlinux_path(struct machine *machine); 2378c2ecf20Sopenharmony_ci 2388c2ecf20Sopenharmony_cisize_t machine__fprintf_dsos_buildid(struct machine *machine, FILE *fp, 2398c2ecf20Sopenharmony_ci bool (skip)(struct dso *dso, int parm), int parm); 2408c2ecf20Sopenharmony_cisize_t machines__fprintf_dsos(struct machines *machines, FILE *fp); 2418c2ecf20Sopenharmony_cisize_t machines__fprintf_dsos_buildid(struct machines *machines, FILE *fp, 2428c2ecf20Sopenharmony_ci bool (skip)(struct dso *dso, int parm), int parm); 2438c2ecf20Sopenharmony_ci 2448c2ecf20Sopenharmony_civoid machine__destroy_kernel_maps(struct machine *machine); 2458c2ecf20Sopenharmony_ciint machine__create_kernel_maps(struct machine *machine); 2468c2ecf20Sopenharmony_ci 2478c2ecf20Sopenharmony_ciint machines__create_kernel_maps(struct machines *machines, pid_t pid); 2488c2ecf20Sopenharmony_ciint machines__create_guest_kernel_maps(struct machines *machines); 2498c2ecf20Sopenharmony_civoid machines__destroy_kernel_maps(struct machines *machines); 2508c2ecf20Sopenharmony_ci 2518c2ecf20Sopenharmony_cisize_t machine__fprintf_vmlinux_path(struct machine *machine, FILE *fp); 2528c2ecf20Sopenharmony_ci 2538c2ecf20Sopenharmony_citypedef int (*machine__dso_t)(struct dso *dso, struct machine *machine, void *priv); 2548c2ecf20Sopenharmony_ci 2558c2ecf20Sopenharmony_ciint machine__for_each_dso(struct machine *machine, machine__dso_t fn, 2568c2ecf20Sopenharmony_ci void *priv); 2578c2ecf20Sopenharmony_ciint machine__for_each_thread(struct machine *machine, 2588c2ecf20Sopenharmony_ci int (*fn)(struct thread *thread, void *p), 2598c2ecf20Sopenharmony_ci void *priv); 2608c2ecf20Sopenharmony_ciint machines__for_each_thread(struct machines *machines, 2618c2ecf20Sopenharmony_ci int (*fn)(struct thread *thread, void *p), 2628c2ecf20Sopenharmony_ci void *priv); 2638c2ecf20Sopenharmony_ci 2648c2ecf20Sopenharmony_cipid_t machine__get_current_tid(struct machine *machine, int cpu); 2658c2ecf20Sopenharmony_ciint machine__set_current_tid(struct machine *machine, int cpu, pid_t pid, 2668c2ecf20Sopenharmony_ci pid_t tid); 2678c2ecf20Sopenharmony_ci/* 2688c2ecf20Sopenharmony_ci * For use with libtraceevent's tep_set_function_resolver() 2698c2ecf20Sopenharmony_ci */ 2708c2ecf20Sopenharmony_cichar *machine__resolve_kernel_addr(void *vmachine, unsigned long long *addrp, char **modp); 2718c2ecf20Sopenharmony_ci 2728c2ecf20Sopenharmony_civoid machine__get_kallsyms_filename(struct machine *machine, char *buf, 2738c2ecf20Sopenharmony_ci size_t bufsz); 2748c2ecf20Sopenharmony_ci 2758c2ecf20Sopenharmony_ciint machine__create_extra_kernel_maps(struct machine *machine, 2768c2ecf20Sopenharmony_ci struct dso *kernel); 2778c2ecf20Sopenharmony_ci 2788c2ecf20Sopenharmony_ci/* Kernel-space maps for symbols that are outside the main kernel map and module maps */ 2798c2ecf20Sopenharmony_cistruct extra_kernel_map { 2808c2ecf20Sopenharmony_ci u64 start; 2818c2ecf20Sopenharmony_ci u64 end; 2828c2ecf20Sopenharmony_ci u64 pgoff; 2838c2ecf20Sopenharmony_ci char name[KMAP_NAME_LEN]; 2848c2ecf20Sopenharmony_ci}; 2858c2ecf20Sopenharmony_ci 2868c2ecf20Sopenharmony_ciint machine__create_extra_kernel_map(struct machine *machine, 2878c2ecf20Sopenharmony_ci struct dso *kernel, 2888c2ecf20Sopenharmony_ci struct extra_kernel_map *xm); 2898c2ecf20Sopenharmony_ci 2908c2ecf20Sopenharmony_ciint machine__map_x86_64_entry_trampolines(struct machine *machine, 2918c2ecf20Sopenharmony_ci struct dso *kernel); 2928c2ecf20Sopenharmony_ci 2938c2ecf20Sopenharmony_ci#endif /* __PERF_MACHINE_H */ 294