162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef _PROBE_EVENT_H
362306a36Sopenharmony_ci#define _PROBE_EVENT_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <linux/compiler.h>
662306a36Sopenharmony_ci#include <stdbool.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_cistruct intlist;
962306a36Sopenharmony_cistruct nsinfo;
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci/* Probe related configurations */
1262306a36Sopenharmony_cistruct probe_conf {
1362306a36Sopenharmony_ci	bool	show_ext_vars;
1462306a36Sopenharmony_ci	bool	show_location_range;
1562306a36Sopenharmony_ci	bool	force_add;
1662306a36Sopenharmony_ci	bool	no_inlines;
1762306a36Sopenharmony_ci	bool	cache;
1862306a36Sopenharmony_ci	bool	bootconfig;
1962306a36Sopenharmony_ci	int	max_probes;
2062306a36Sopenharmony_ci	unsigned long	magic_num;
2162306a36Sopenharmony_ci};
2262306a36Sopenharmony_ciextern struct probe_conf probe_conf;
2362306a36Sopenharmony_ciextern bool probe_event_dry_run;
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci#define DEFAULT_PROBE_MAGIC_NUM	0xdeade12d	/* u32: 3735937325 */
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cistruct symbol;
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci/* kprobe-tracer and uprobe-tracer tracing point */
3062306a36Sopenharmony_cistruct probe_trace_point {
3162306a36Sopenharmony_ci	char		*realname;	/* function real name (if needed) */
3262306a36Sopenharmony_ci	char		*symbol;	/* Base symbol */
3362306a36Sopenharmony_ci	char		*module;	/* Module name */
3462306a36Sopenharmony_ci	unsigned long	offset;		/* Offset from symbol */
3562306a36Sopenharmony_ci	unsigned long	ref_ctr_offset;	/* SDT reference counter offset */
3662306a36Sopenharmony_ci	u64		address;	/* Actual address of the trace point */
3762306a36Sopenharmony_ci	bool		retprobe;	/* Return probe flag */
3862306a36Sopenharmony_ci};
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci/* probe-tracer tracing argument referencing offset */
4162306a36Sopenharmony_cistruct probe_trace_arg_ref {
4262306a36Sopenharmony_ci	struct probe_trace_arg_ref	*next;	/* Next reference */
4362306a36Sopenharmony_ci	long				offset;	/* Offset value */
4462306a36Sopenharmony_ci	bool				user_access;	/* User-memory access */
4562306a36Sopenharmony_ci};
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci/* kprobe-tracer and uprobe-tracer tracing argument */
4862306a36Sopenharmony_cistruct probe_trace_arg {
4962306a36Sopenharmony_ci	char				*name;	/* Argument name */
5062306a36Sopenharmony_ci	char				*value;	/* Base value */
5162306a36Sopenharmony_ci	char				*type;	/* Type name */
5262306a36Sopenharmony_ci	struct probe_trace_arg_ref	*ref;	/* Referencing offset */
5362306a36Sopenharmony_ci};
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci/* kprobe-tracer and uprobe-tracer tracing event (point + arg) */
5662306a36Sopenharmony_cistruct probe_trace_event {
5762306a36Sopenharmony_ci	char				*event;	/* Event name */
5862306a36Sopenharmony_ci	char				*group;	/* Group name */
5962306a36Sopenharmony_ci	struct probe_trace_point	point;	/* Trace point */
6062306a36Sopenharmony_ci	int				nargs;	/* Number of args */
6162306a36Sopenharmony_ci	bool				uprobes;	/* uprobes only */
6262306a36Sopenharmony_ci	struct probe_trace_arg		*args;	/* Arguments */
6362306a36Sopenharmony_ci};
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci/* Perf probe probing point */
6662306a36Sopenharmony_cistruct perf_probe_point {
6762306a36Sopenharmony_ci	char		*file;		/* File path */
6862306a36Sopenharmony_ci	char		*function;	/* Function name */
6962306a36Sopenharmony_ci	int		line;		/* Line number */
7062306a36Sopenharmony_ci	bool		retprobe;	/* Return probe flag */
7162306a36Sopenharmony_ci	char		*lazy_line;	/* Lazy matching pattern */
7262306a36Sopenharmony_ci	unsigned long	offset;		/* Offset from function entry */
7362306a36Sopenharmony_ci	u64		abs_address;	/* Absolute address of the point */
7462306a36Sopenharmony_ci};
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci/* Perf probe probing argument field chain */
7762306a36Sopenharmony_cistruct perf_probe_arg_field {
7862306a36Sopenharmony_ci	struct perf_probe_arg_field	*next;	/* Next field */
7962306a36Sopenharmony_ci	char				*name;	/* Name of the field */
8062306a36Sopenharmony_ci	long				index;	/* Array index number */
8162306a36Sopenharmony_ci	bool				ref;	/* Referencing flag */
8262306a36Sopenharmony_ci};
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci/* Perf probe probing argument */
8562306a36Sopenharmony_cistruct perf_probe_arg {
8662306a36Sopenharmony_ci	char				*name;	/* Argument name */
8762306a36Sopenharmony_ci	char				*var;	/* Variable name */
8862306a36Sopenharmony_ci	char				*type;	/* Type name */
8962306a36Sopenharmony_ci	struct perf_probe_arg_field	*field;	/* Structure fields */
9062306a36Sopenharmony_ci	bool				user_access;	/* User-memory access */
9162306a36Sopenharmony_ci};
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci/* Perf probe probing event (point + arg) */
9462306a36Sopenharmony_cistruct perf_probe_event {
9562306a36Sopenharmony_ci	char			*event;	/* Event name */
9662306a36Sopenharmony_ci	char			*group;	/* Group name */
9762306a36Sopenharmony_ci	struct perf_probe_point	point;	/* Probe point */
9862306a36Sopenharmony_ci	int			nargs;	/* Number of arguments */
9962306a36Sopenharmony_ci	bool			sdt;	/* SDT/cached event flag */
10062306a36Sopenharmony_ci	bool			uprobes;	/* Uprobe event flag */
10162306a36Sopenharmony_ci	char			*target;	/* Target binary */
10262306a36Sopenharmony_ci	struct perf_probe_arg	*args;	/* Arguments */
10362306a36Sopenharmony_ci	struct probe_trace_event *tevs;
10462306a36Sopenharmony_ci	int			ntevs;
10562306a36Sopenharmony_ci	struct nsinfo		*nsi;	/* Target namespace */
10662306a36Sopenharmony_ci};
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci/* Line range */
10962306a36Sopenharmony_cistruct line_range {
11062306a36Sopenharmony_ci	char			*file;		/* File name */
11162306a36Sopenharmony_ci	char			*function;	/* Function name */
11262306a36Sopenharmony_ci	int			start;		/* Start line number */
11362306a36Sopenharmony_ci	int			end;		/* End line number */
11462306a36Sopenharmony_ci	int			offset;		/* Start line offset */
11562306a36Sopenharmony_ci	char			*path;		/* Real path name */
11662306a36Sopenharmony_ci	char			*comp_dir;	/* Compile directory */
11762306a36Sopenharmony_ci	struct intlist		*line_list;	/* Visible lines */
11862306a36Sopenharmony_ci};
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_cistruct strlist;
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci/* List of variables */
12362306a36Sopenharmony_cistruct variable_list {
12462306a36Sopenharmony_ci	struct probe_trace_point	point;	/* Actual probepoint */
12562306a36Sopenharmony_ci	struct strlist			*vars;	/* Available variables */
12662306a36Sopenharmony_ci};
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_cistruct map;
12962306a36Sopenharmony_ciint init_probe_symbol_maps(bool user_only);
13062306a36Sopenharmony_civoid exit_probe_symbol_maps(void);
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci/* Command string to events */
13362306a36Sopenharmony_ciint parse_perf_probe_command(const char *cmd, struct perf_probe_event *pev);
13462306a36Sopenharmony_ciint parse_probe_trace_command(const char *cmd, struct probe_trace_event *tev);
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_ci/* Events to command string */
13762306a36Sopenharmony_cichar *synthesize_perf_probe_command(struct perf_probe_event *pev);
13862306a36Sopenharmony_cichar *synthesize_probe_trace_command(struct probe_trace_event *tev);
13962306a36Sopenharmony_cichar *synthesize_perf_probe_arg(struct perf_probe_arg *pa);
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ciint perf_probe_event__copy(struct perf_probe_event *dst,
14262306a36Sopenharmony_ci			   struct perf_probe_event *src);
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_cibool perf_probe_with_var(struct perf_probe_event *pev);
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ci/* Check the perf_probe_event needs debuginfo */
14762306a36Sopenharmony_cibool perf_probe_event_need_dwarf(struct perf_probe_event *pev);
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci/* Release event contents */
15062306a36Sopenharmony_civoid clear_perf_probe_event(struct perf_probe_event *pev);
15162306a36Sopenharmony_civoid clear_probe_trace_event(struct probe_trace_event *tev);
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci/* Command string to line-range */
15462306a36Sopenharmony_ciint parse_line_range_desc(const char *cmd, struct line_range *lr);
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_ci/* Release line range members */
15762306a36Sopenharmony_civoid line_range__clear(struct line_range *lr);
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_ci/* Initialize line range */
16062306a36Sopenharmony_ciint line_range__init(struct line_range *lr);
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ciint add_perf_probe_events(struct perf_probe_event *pevs, int npevs);
16362306a36Sopenharmony_ciint convert_perf_probe_events(struct perf_probe_event *pevs, int npevs);
16462306a36Sopenharmony_ciint apply_perf_probe_events(struct perf_probe_event *pevs, int npevs);
16562306a36Sopenharmony_ciint show_probe_trace_events(struct perf_probe_event *pevs, int npevs);
16662306a36Sopenharmony_ciint show_bootconfig_events(struct perf_probe_event *pevs, int npevs);
16762306a36Sopenharmony_civoid cleanup_perf_probe_events(struct perf_probe_event *pevs, int npevs);
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_cistruct strfilter;
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ciint del_perf_probe_events(struct strfilter *filter);
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ciint show_perf_probe_event(const char *group, const char *event,
17462306a36Sopenharmony_ci			  struct perf_probe_event *pev,
17562306a36Sopenharmony_ci			  const char *module, bool use_stdout);
17662306a36Sopenharmony_ciint show_perf_probe_events(struct strfilter *filter);
17762306a36Sopenharmony_ciint show_line_range(struct line_range *lr, const char *module,
17862306a36Sopenharmony_ci		    struct nsinfo *nsi, bool user);
17962306a36Sopenharmony_ciint show_available_vars(struct perf_probe_event *pevs, int npevs,
18062306a36Sopenharmony_ci			struct strfilter *filter);
18162306a36Sopenharmony_ciint show_available_funcs(const char *module, struct nsinfo *nsi,
18262306a36Sopenharmony_ci			 struct strfilter *filter, bool user);
18362306a36Sopenharmony_civoid arch__fix_tev_from_maps(struct perf_probe_event *pev,
18462306a36Sopenharmony_ci			     struct probe_trace_event *tev, struct map *map,
18562306a36Sopenharmony_ci			     struct symbol *sym);
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci/* If there is no space to write, returns -E2BIG. */
18862306a36Sopenharmony_ciint e_snprintf(char *str, size_t size, const char *format, ...) __printf(3, 4);
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ci/* Maximum index number of event-name postfix */
19162306a36Sopenharmony_ci#define MAX_EVENT_INDEX	1024
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_ciint copy_to_probe_trace_arg(struct probe_trace_arg *tvar,
19462306a36Sopenharmony_ci			    struct perf_probe_arg *pvar);
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_cistruct map *get_target_map(const char *target, struct nsinfo *nsi, bool user);
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_civoid arch__post_process_probe_trace_events(struct perf_probe_event *pev,
19962306a36Sopenharmony_ci					   int ntevs);
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ci#endif /*_PROBE_EVENT_H */
202