brintos

brintos / linux-shallow public Read only

0
0
Text · 10.5 KiB · 2e5a4cb Raw
332 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#ifndef __PERF_MACHINE_H3#define __PERF_MACHINE_H4 5#include <sys/types.h>6#include <linux/rbtree.h>7#include "maps.h"8#include "dsos.h"9#include "rwsem.h"10#include "threads.h"11 12struct addr_location;13struct branch_stack;14struct dso;15struct dso_id;16struct evsel;17struct perf_sample;18struct symbol;19struct target;20struct thread;21union perf_event;22struct machines;23 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 28extern const char *ref_reloc_sym_names[];29 30struct vdso_info;31 32struct machine {33	struct rb_node	  rb_node;34	pid_t		  pid;35	u16		  id_hdr_size;36	bool		  comm_exec;37	bool		  kptr_restrict_warned;38	bool		  single_address_space;39	char		  *root_dir;40	char		  *mmap_name;41	char		  *kallsyms_filename;42	struct threads    threads;43	struct vdso_info  *vdso_info;44	struct perf_env   *env;45	struct dsos	  dsos;46	struct maps	  *kmaps;47	struct map	  *vmlinux_map;48	u64		  kernel_start;49	struct {50		u64	  text_start;51		u64	  text_end;52	} sched, lock, traceiter, trace;53	pid_t		  *current_tid;54	size_t		  current_tid_sz;55	union { /* Tool specific area */56		void	  *priv;57		u64	  db_id;58	};59	struct machines   *machines;60	bool		  trampolines_mapped;61};62 63/*64 * The main kernel (vmlinux) map65 */66static inline67struct map *machine__kernel_map(struct machine *machine)68{69	return machine->vmlinux_map;70}71 72/*73 * kernel (the one returned by machine__kernel_map()) plus kernel modules maps74 */75static inline76struct maps *machine__kernel_maps(struct machine *machine)77{78	return machine->kmaps;79}80 81int machine__get_kernel_start(struct machine *machine);82 83static 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 90static 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 97u8 machine__addr_cpumode(struct machine *machine, u8 cpumode, u64 addr);98 99struct thread *machine__find_thread(struct machine *machine, pid_t pid,100				    pid_t tid);101struct thread *machine__idle_thread(struct machine *machine);102struct comm *machine__thread_exec_comm(struct machine *machine,103				       struct thread *thread);104 105int machine__process_comm_event(struct machine *machine, union perf_event *event,106				struct perf_sample *sample);107int machine__process_exit_event(struct machine *machine, union perf_event *event,108				struct perf_sample *sample);109int machine__process_fork_event(struct machine *machine, union perf_event *event,110				struct perf_sample *sample);111int machine__process_lost_event(struct machine *machine, union perf_event *event,112				struct perf_sample *sample);113int machine__process_lost_samples_event(struct machine *machine, union perf_event *event,114					struct perf_sample *sample);115int machine__process_aux_event(struct machine *machine,116			       union perf_event *event);117int machine__process_itrace_start_event(struct machine *machine,118					union perf_event *event);119int machine__process_aux_output_hw_id_event(struct machine *machine,120					    union perf_event *event);121int machine__process_switch_event(struct machine *machine,122				  union perf_event *event);123int machine__process_namespaces_event(struct machine *machine,124				      union perf_event *event,125				      struct perf_sample *sample);126int machine__process_cgroup_event(struct machine *machine,127				  union perf_event *event,128				  struct perf_sample *sample);129int machine__process_mmap_event(struct machine *machine, union perf_event *event,130				struct perf_sample *sample);131int machine__process_mmap2_event(struct machine *machine, union perf_event *event,132				 struct perf_sample *sample);133int machine__process_ksymbol(struct machine *machine,134			     union perf_event *event,135			     struct perf_sample *sample);136int machine__process_text_poke(struct machine *machine,137			       union perf_event *event,138			       struct perf_sample *sample);139int machine__process_event(struct machine *machine, union perf_event *event,140				struct perf_sample *sample);141 142typedef void (*machine__process_t)(struct machine *machine, void *data);143 144struct machines {145	struct machine host;146	struct rb_root_cached guests;147};148 149void machines__init(struct machines *machines);150void machines__exit(struct machines *machines);151 152void machines__process_guests(struct machines *machines,153			      machine__process_t process, void *data);154 155struct machine *machines__add(struct machines *machines, pid_t pid,156			      const char *root_dir);157struct machine *machines__find(struct machines *machines, pid_t pid);158struct machine *machines__findnew(struct machines *machines, pid_t pid);159struct machine *machines__find_guest(struct machines *machines, pid_t pid);160struct thread *machines__findnew_guest_code(struct machines *machines, pid_t pid);161struct thread *machine__findnew_guest_code(struct machine *machine, pid_t pid);162 163void machines__set_id_hdr_size(struct machines *machines, u16 id_hdr_size);164void machines__set_comm_exec(struct machines *machines, bool comm_exec);165 166struct machine *machine__new_host(void);167struct machine *machine__new_kallsyms(void);168int machine__init(struct machine *machine, const char *root_dir, pid_t pid);169void machine__exit(struct machine *machine);170void machine__delete_threads(struct machine *machine);171void machine__delete(struct machine *machine);172void machine__remove_thread(struct machine *machine, struct thread *th);173 174struct branch_info *sample__resolve_bstack(struct perf_sample *sample,175					   struct addr_location *al);176struct mem_info *sample__resolve_mem(struct perf_sample *sample,177				     struct addr_location *al);178 179struct callchain_cursor;180 181int __thread__resolve_callchain(struct thread *thread,182				struct callchain_cursor *cursor,183				struct evsel *evsel,184				struct perf_sample *sample,185				struct symbol **parent,186				struct addr_location *root_al,187				int max_stack,188				bool symbols);189 190static inline int thread__resolve_callchain(struct thread *thread,191					    struct callchain_cursor *cursor,192					    struct evsel *evsel,193					    struct perf_sample *sample,194					    struct symbol **parent,195					    struct addr_location *root_al,196					    int max_stack)197{198	return __thread__resolve_callchain(thread,199					   cursor,200					   evsel,201					   sample,202					   parent,203					   root_al,204					   max_stack,205					   /*symbols=*/true);206}207 208/*209 * Default guest kernel is defined by parameter --guestkallsyms210 * and --guestmodules211 */212static inline bool machine__is_default_guest(struct machine *machine)213{214	return machine ? machine->pid == DEFAULT_GUEST_KERNEL_ID : false;215}216 217static inline bool machine__is_host(struct machine *machine)218{219	return machine ? machine->pid == HOST_KERNEL_ID : false;220}221 222bool machine__is_lock_function(struct machine *machine, u64 addr);223bool machine__is(struct machine *machine, const char *arch);224bool machine__normalized_is(struct machine *machine, const char *arch);225int machine__nr_cpus_avail(struct machine *machine);226 227struct thread *machine__findnew_thread(struct machine *machine, pid_t pid, pid_t tid);228 229struct dso *machine__findnew_dso_id(struct machine *machine, const char *filename,230				    const struct dso_id *id);231struct dso *machine__findnew_dso(struct machine *machine, const char *filename);232 233size_t machine__fprintf(struct machine *machine, FILE *fp);234 235static inline236struct symbol *machine__find_kernel_symbol(struct machine *machine, u64 addr,237					   struct map **mapp)238{239	return maps__find_symbol(machine->kmaps, addr, mapp);240}241 242static inline243struct symbol *machine__find_kernel_symbol_by_name(struct machine *machine,244						   const char *name,245						   struct map **mapp)246{247	return maps__find_symbol_by_name(machine->kmaps, name, mapp);248}249 250int arch__fix_module_text_start(u64 *start, u64 *size, const char *name);251 252int machine__load_kallsyms(struct machine *machine, const char *filename);253 254int machine__load_vmlinux_path(struct machine *machine);255 256size_t machine__fprintf_dsos_buildid(struct machine *machine, FILE *fp,257				     bool (skip)(struct dso *dso, int parm), int parm);258size_t machines__fprintf_dsos(struct machines *machines, FILE *fp);259size_t machines__fprintf_dsos_buildid(struct machines *machines, FILE *fp,260				     bool (skip)(struct dso *dso, int parm), int parm);261 262void machine__destroy_kernel_maps(struct machine *machine);263int machine__create_kernel_maps(struct machine *machine);264 265int machines__create_kernel_maps(struct machines *machines, pid_t pid);266int machines__create_guest_kernel_maps(struct machines *machines);267void machines__destroy_kernel_maps(struct machines *machines);268 269size_t machine__fprintf_vmlinux_path(struct machine *machine, FILE *fp);270 271typedef int (*machine__dso_t)(struct dso *dso, struct machine *machine, void *priv);272 273int machine__for_each_dso(struct machine *machine, machine__dso_t fn,274			  void *priv);275 276typedef int (*machine__map_t)(struct map *map, void *priv);277int machine__for_each_kernel_map(struct machine *machine, machine__map_t fn,278				 void *priv);279 280int machine__for_each_thread(struct machine *machine,281			     int (*fn)(struct thread *thread, void *p),282			     void *priv);283int machines__for_each_thread(struct machines *machines,284			      int (*fn)(struct thread *thread, void *p),285			      void *priv);286 287struct thread_list {288	struct list_head	 list;289	struct thread		*thread;290};291 292/* Make a list of struct thread_list based on threads in the machine. */293int machine__thread_list(struct machine *machine, struct list_head *list);294/* Free up the nodes within the thread_list list. */295void thread_list__delete(struct list_head *list);296 297pid_t machine__get_current_tid(struct machine *machine, int cpu);298int machine__set_current_tid(struct machine *machine, int cpu, pid_t pid,299			     pid_t tid);300/*301 * For use with libtraceevent's tep_set_function_resolver()302 */303char *machine__resolve_kernel_addr(void *vmachine, unsigned long long *addrp, char **modp);304 305void machine__get_kallsyms_filename(struct machine *machine, char *buf,306				    size_t bufsz);307 308int machine__create_extra_kernel_maps(struct machine *machine,309				      struct dso *kernel);310 311/* Kernel-space maps for symbols that are outside the main kernel map and module maps */312struct extra_kernel_map {313	u64 start;314	u64 end;315	u64 pgoff;316	char name[KMAP_NAME_LEN];317};318 319int machine__create_extra_kernel_map(struct machine *machine,320				     struct dso *kernel,321				     struct extra_kernel_map *xm);322 323int machine__map_x86_64_entry_trampolines(struct machine *machine,324					  struct dso *kernel);325 326int machine__resolve(struct machine *machine, struct addr_location *al,327		     struct perf_sample *sample);328 329int machine__hit_all_dsos(struct machine *machine);330 331#endif /* __PERF_MACHINE_H */332