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