cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

probe-event.h (6568B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef _PROBE_EVENT_H
      3#define _PROBE_EVENT_H
      4
      5#include <linux/compiler.h>
      6#include <stdbool.h>
      7
      8struct intlist;
      9struct nsinfo;
     10
     11/* Probe related configurations */
     12struct probe_conf {
     13	bool	show_ext_vars;
     14	bool	show_location_range;
     15	bool	force_add;
     16	bool	no_inlines;
     17	bool	cache;
     18	bool	bootconfig;
     19	int	max_probes;
     20	unsigned long	magic_num;
     21};
     22extern struct probe_conf probe_conf;
     23extern bool probe_event_dry_run;
     24
     25#define DEFAULT_PROBE_MAGIC_NUM	0xdeade12d	/* u32: 3735937325 */
     26
     27struct symbol;
     28
     29/* kprobe-tracer and uprobe-tracer tracing point */
     30struct probe_trace_point {
     31	char		*realname;	/* function real name (if needed) */
     32	char		*symbol;	/* Base symbol */
     33	char		*module;	/* Module name */
     34	unsigned long	offset;		/* Offset from symbol */
     35	unsigned long	ref_ctr_offset;	/* SDT reference counter offset */
     36	u64		address;	/* Actual address of the trace point */
     37	bool		retprobe;	/* Return probe flag */
     38};
     39
     40/* probe-tracer tracing argument referencing offset */
     41struct probe_trace_arg_ref {
     42	struct probe_trace_arg_ref	*next;	/* Next reference */
     43	long				offset;	/* Offset value */
     44	bool				user_access;	/* User-memory access */
     45};
     46
     47/* kprobe-tracer and uprobe-tracer tracing argument */
     48struct probe_trace_arg {
     49	char				*name;	/* Argument name */
     50	char				*value;	/* Base value */
     51	char				*type;	/* Type name */
     52	struct probe_trace_arg_ref	*ref;	/* Referencing offset */
     53};
     54
     55/* kprobe-tracer and uprobe-tracer tracing event (point + arg) */
     56struct probe_trace_event {
     57	char				*event;	/* Event name */
     58	char				*group;	/* Group name */
     59	struct probe_trace_point	point;	/* Trace point */
     60	int				nargs;	/* Number of args */
     61	bool				uprobes;	/* uprobes only */
     62	struct probe_trace_arg		*args;	/* Arguments */
     63};
     64
     65/* Perf probe probing point */
     66struct perf_probe_point {
     67	char		*file;		/* File path */
     68	char		*function;	/* Function name */
     69	int		line;		/* Line number */
     70	bool		retprobe;	/* Return probe flag */
     71	char		*lazy_line;	/* Lazy matching pattern */
     72	unsigned long	offset;		/* Offset from function entry */
     73	u64		abs_address;	/* Absolute address of the point */
     74};
     75
     76/* Perf probe probing argument field chain */
     77struct perf_probe_arg_field {
     78	struct perf_probe_arg_field	*next;	/* Next field */
     79	char				*name;	/* Name of the field */
     80	long				index;	/* Array index number */
     81	bool				ref;	/* Referencing flag */
     82};
     83
     84/* Perf probe probing argument */
     85struct perf_probe_arg {
     86	char				*name;	/* Argument name */
     87	char				*var;	/* Variable name */
     88	char				*type;	/* Type name */
     89	struct perf_probe_arg_field	*field;	/* Structure fields */
     90	bool				user_access;	/* User-memory access */
     91};
     92
     93/* Perf probe probing event (point + arg) */
     94struct perf_probe_event {
     95	char			*event;	/* Event name */
     96	char			*group;	/* Group name */
     97	struct perf_probe_point	point;	/* Probe point */
     98	int			nargs;	/* Number of arguments */
     99	bool			sdt;	/* SDT/cached event flag */
    100	bool			uprobes;	/* Uprobe event flag */
    101	char			*target;	/* Target binary */
    102	struct perf_probe_arg	*args;	/* Arguments */
    103	struct probe_trace_event *tevs;
    104	int			ntevs;
    105	struct nsinfo		*nsi;	/* Target namespace */
    106};
    107
    108/* Line range */
    109struct line_range {
    110	char			*file;		/* File name */
    111	char			*function;	/* Function name */
    112	int			start;		/* Start line number */
    113	int			end;		/* End line number */
    114	int			offset;		/* Start line offset */
    115	char			*path;		/* Real path name */
    116	char			*comp_dir;	/* Compile directory */
    117	struct intlist		*line_list;	/* Visible lines */
    118};
    119
    120struct strlist;
    121
    122/* List of variables */
    123struct variable_list {
    124	struct probe_trace_point	point;	/* Actual probepoint */
    125	struct strlist			*vars;	/* Available variables */
    126};
    127
    128struct map;
    129int init_probe_symbol_maps(bool user_only);
    130void exit_probe_symbol_maps(void);
    131
    132/* Command string to events */
    133int parse_perf_probe_command(const char *cmd, struct perf_probe_event *pev);
    134int parse_probe_trace_command(const char *cmd, struct probe_trace_event *tev);
    135
    136/* Events to command string */
    137char *synthesize_perf_probe_command(struct perf_probe_event *pev);
    138char *synthesize_probe_trace_command(struct probe_trace_event *tev);
    139char *synthesize_perf_probe_arg(struct perf_probe_arg *pa);
    140char *synthesize_perf_probe_point(struct perf_probe_point *pp);
    141
    142int perf_probe_event__copy(struct perf_probe_event *dst,
    143			   struct perf_probe_event *src);
    144
    145bool perf_probe_with_var(struct perf_probe_event *pev);
    146
    147/* Check the perf_probe_event needs debuginfo */
    148bool perf_probe_event_need_dwarf(struct perf_probe_event *pev);
    149
    150/* Release event contents */
    151void clear_perf_probe_event(struct perf_probe_event *pev);
    152void clear_probe_trace_event(struct probe_trace_event *tev);
    153
    154/* Command string to line-range */
    155int parse_line_range_desc(const char *cmd, struct line_range *lr);
    156
    157/* Release line range members */
    158void line_range__clear(struct line_range *lr);
    159
    160/* Initialize line range */
    161int line_range__init(struct line_range *lr);
    162
    163int add_perf_probe_events(struct perf_probe_event *pevs, int npevs);
    164int convert_perf_probe_events(struct perf_probe_event *pevs, int npevs);
    165int apply_perf_probe_events(struct perf_probe_event *pevs, int npevs);
    166int show_probe_trace_events(struct perf_probe_event *pevs, int npevs);
    167int show_bootconfig_events(struct perf_probe_event *pevs, int npevs);
    168void cleanup_perf_probe_events(struct perf_probe_event *pevs, int npevs);
    169
    170struct strfilter;
    171
    172int del_perf_probe_events(struct strfilter *filter);
    173
    174int show_perf_probe_event(const char *group, const char *event,
    175			  struct perf_probe_event *pev,
    176			  const char *module, bool use_stdout);
    177int show_perf_probe_events(struct strfilter *filter);
    178int show_line_range(struct line_range *lr, const char *module,
    179		    struct nsinfo *nsi, bool user);
    180int show_available_vars(struct perf_probe_event *pevs, int npevs,
    181			struct strfilter *filter);
    182int show_available_funcs(const char *module, struct nsinfo *nsi,
    183			 struct strfilter *filter, bool user);
    184void arch__fix_tev_from_maps(struct perf_probe_event *pev,
    185			     struct probe_trace_event *tev, struct map *map,
    186			     struct symbol *sym);
    187
    188/* If there is no space to write, returns -E2BIG. */
    189int e_snprintf(char *str, size_t size, const char *format, ...) __printf(3, 4);
    190
    191/* Maximum index number of event-name postfix */
    192#define MAX_EVENT_INDEX	1024
    193
    194int copy_to_probe_trace_arg(struct probe_trace_arg *tvar,
    195			    struct perf_probe_arg *pvar);
    196
    197struct map *get_target_map(const char *target, struct nsinfo *nsi, bool user);
    198
    199void arch__post_process_probe_trace_events(struct perf_probe_event *pev,
    200					   int ntevs);
    201
    202#endif /*_PROBE_EVENT_H */