18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef _PROBE_EVENT_H
38c2ecf20Sopenharmony_ci#define _PROBE_EVENT_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#include <linux/compiler.h>
68c2ecf20Sopenharmony_ci#include <stdbool.h>
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_cistruct intlist;
98c2ecf20Sopenharmony_cistruct nsinfo;
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci/* Probe related configurations */
128c2ecf20Sopenharmony_cistruct probe_conf {
138c2ecf20Sopenharmony_ci	bool	show_ext_vars;
148c2ecf20Sopenharmony_ci	bool	show_location_range;
158c2ecf20Sopenharmony_ci	bool	force_add;
168c2ecf20Sopenharmony_ci	bool	no_inlines;
178c2ecf20Sopenharmony_ci	bool	cache;
188c2ecf20Sopenharmony_ci	int	max_probes;
198c2ecf20Sopenharmony_ci	unsigned long	magic_num;
208c2ecf20Sopenharmony_ci};
218c2ecf20Sopenharmony_ciextern struct probe_conf probe_conf;
228c2ecf20Sopenharmony_ciextern bool probe_event_dry_run;
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci#define DEFAULT_PROBE_MAGIC_NUM	0xdeade12d	/* u32: 3735937325 */
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_cistruct symbol;
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci/* kprobe-tracer and uprobe-tracer tracing point */
298c2ecf20Sopenharmony_cistruct probe_trace_point {
308c2ecf20Sopenharmony_ci	char		*realname;	/* function real name (if needed) */
318c2ecf20Sopenharmony_ci	char		*symbol;	/* Base symbol */
328c2ecf20Sopenharmony_ci	char		*module;	/* Module name */
338c2ecf20Sopenharmony_ci	unsigned long	offset;		/* Offset from symbol */
348c2ecf20Sopenharmony_ci	unsigned long	ref_ctr_offset;	/* SDT reference counter offset */
358c2ecf20Sopenharmony_ci	unsigned long	address;	/* Actual address of the trace point */
368c2ecf20Sopenharmony_ci	bool		retprobe;	/* Return probe flag */
378c2ecf20Sopenharmony_ci};
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci/* probe-tracer tracing argument referencing offset */
408c2ecf20Sopenharmony_cistruct probe_trace_arg_ref {
418c2ecf20Sopenharmony_ci	struct probe_trace_arg_ref	*next;	/* Next reference */
428c2ecf20Sopenharmony_ci	long				offset;	/* Offset value */
438c2ecf20Sopenharmony_ci	bool				user_access;	/* User-memory access */
448c2ecf20Sopenharmony_ci};
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci/* kprobe-tracer and uprobe-tracer tracing argument */
478c2ecf20Sopenharmony_cistruct probe_trace_arg {
488c2ecf20Sopenharmony_ci	char				*name;	/* Argument name */
498c2ecf20Sopenharmony_ci	char				*value;	/* Base value */
508c2ecf20Sopenharmony_ci	char				*type;	/* Type name */
518c2ecf20Sopenharmony_ci	struct probe_trace_arg_ref	*ref;	/* Referencing offset */
528c2ecf20Sopenharmony_ci};
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ci/* kprobe-tracer and uprobe-tracer tracing event (point + arg) */
558c2ecf20Sopenharmony_cistruct probe_trace_event {
568c2ecf20Sopenharmony_ci	char				*event;	/* Event name */
578c2ecf20Sopenharmony_ci	char				*group;	/* Group name */
588c2ecf20Sopenharmony_ci	struct probe_trace_point	point;	/* Trace point */
598c2ecf20Sopenharmony_ci	int				nargs;	/* Number of args */
608c2ecf20Sopenharmony_ci	bool				uprobes;	/* uprobes only */
618c2ecf20Sopenharmony_ci	struct probe_trace_arg		*args;	/* Arguments */
628c2ecf20Sopenharmony_ci};
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ci/* Perf probe probing point */
658c2ecf20Sopenharmony_cistruct perf_probe_point {
668c2ecf20Sopenharmony_ci	char		*file;		/* File path */
678c2ecf20Sopenharmony_ci	char		*function;	/* Function name */
688c2ecf20Sopenharmony_ci	int		line;		/* Line number */
698c2ecf20Sopenharmony_ci	bool		retprobe;	/* Return probe flag */
708c2ecf20Sopenharmony_ci	char		*lazy_line;	/* Lazy matching pattern */
718c2ecf20Sopenharmony_ci	unsigned long	offset;		/* Offset from function entry */
728c2ecf20Sopenharmony_ci	unsigned long	abs_address;	/* Absolute address of the point */
738c2ecf20Sopenharmony_ci};
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_ci/* Perf probe probing argument field chain */
768c2ecf20Sopenharmony_cistruct perf_probe_arg_field {
778c2ecf20Sopenharmony_ci	struct perf_probe_arg_field	*next;	/* Next field */
788c2ecf20Sopenharmony_ci	char				*name;	/* Name of the field */
798c2ecf20Sopenharmony_ci	long				index;	/* Array index number */
808c2ecf20Sopenharmony_ci	bool				ref;	/* Referencing flag */
818c2ecf20Sopenharmony_ci};
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci/* Perf probe probing argument */
848c2ecf20Sopenharmony_cistruct perf_probe_arg {
858c2ecf20Sopenharmony_ci	char				*name;	/* Argument name */
868c2ecf20Sopenharmony_ci	char				*var;	/* Variable name */
878c2ecf20Sopenharmony_ci	char				*type;	/* Type name */
888c2ecf20Sopenharmony_ci	struct perf_probe_arg_field	*field;	/* Structure fields */
898c2ecf20Sopenharmony_ci	bool				user_access;	/* User-memory access */
908c2ecf20Sopenharmony_ci};
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_ci/* Perf probe probing event (point + arg) */
938c2ecf20Sopenharmony_cistruct perf_probe_event {
948c2ecf20Sopenharmony_ci	char			*event;	/* Event name */
958c2ecf20Sopenharmony_ci	char			*group;	/* Group name */
968c2ecf20Sopenharmony_ci	struct perf_probe_point	point;	/* Probe point */
978c2ecf20Sopenharmony_ci	int			nargs;	/* Number of arguments */
988c2ecf20Sopenharmony_ci	bool			sdt;	/* SDT/cached event flag */
998c2ecf20Sopenharmony_ci	bool			uprobes;	/* Uprobe event flag */
1008c2ecf20Sopenharmony_ci	char			*target;	/* Target binary */
1018c2ecf20Sopenharmony_ci	struct perf_probe_arg	*args;	/* Arguments */
1028c2ecf20Sopenharmony_ci	struct probe_trace_event *tevs;
1038c2ecf20Sopenharmony_ci	int			ntevs;
1048c2ecf20Sopenharmony_ci	struct nsinfo		*nsi;	/* Target namespace */
1058c2ecf20Sopenharmony_ci};
1068c2ecf20Sopenharmony_ci
1078c2ecf20Sopenharmony_ci/* Line range */
1088c2ecf20Sopenharmony_cistruct line_range {
1098c2ecf20Sopenharmony_ci	char			*file;		/* File name */
1108c2ecf20Sopenharmony_ci	char			*function;	/* Function name */
1118c2ecf20Sopenharmony_ci	int			start;		/* Start line number */
1128c2ecf20Sopenharmony_ci	int			end;		/* End line number */
1138c2ecf20Sopenharmony_ci	int			offset;		/* Start line offset */
1148c2ecf20Sopenharmony_ci	char			*path;		/* Real path name */
1158c2ecf20Sopenharmony_ci	char			*comp_dir;	/* Compile directory */
1168c2ecf20Sopenharmony_ci	struct intlist		*line_list;	/* Visible lines */
1178c2ecf20Sopenharmony_ci};
1188c2ecf20Sopenharmony_ci
1198c2ecf20Sopenharmony_cistruct strlist;
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_ci/* List of variables */
1228c2ecf20Sopenharmony_cistruct variable_list {
1238c2ecf20Sopenharmony_ci	struct probe_trace_point	point;	/* Actual probepoint */
1248c2ecf20Sopenharmony_ci	struct strlist			*vars;	/* Available variables */
1258c2ecf20Sopenharmony_ci};
1268c2ecf20Sopenharmony_ci
1278c2ecf20Sopenharmony_cistruct map;
1288c2ecf20Sopenharmony_ciint init_probe_symbol_maps(bool user_only);
1298c2ecf20Sopenharmony_civoid exit_probe_symbol_maps(void);
1308c2ecf20Sopenharmony_ci
1318c2ecf20Sopenharmony_ci/* Command string to events */
1328c2ecf20Sopenharmony_ciint parse_perf_probe_command(const char *cmd, struct perf_probe_event *pev);
1338c2ecf20Sopenharmony_ciint parse_probe_trace_command(const char *cmd, struct probe_trace_event *tev);
1348c2ecf20Sopenharmony_ci
1358c2ecf20Sopenharmony_ci/* Events to command string */
1368c2ecf20Sopenharmony_cichar *synthesize_perf_probe_command(struct perf_probe_event *pev);
1378c2ecf20Sopenharmony_cichar *synthesize_probe_trace_command(struct probe_trace_event *tev);
1388c2ecf20Sopenharmony_cichar *synthesize_perf_probe_arg(struct perf_probe_arg *pa);
1398c2ecf20Sopenharmony_cichar *synthesize_perf_probe_point(struct perf_probe_point *pp);
1408c2ecf20Sopenharmony_ci
1418c2ecf20Sopenharmony_ciint perf_probe_event__copy(struct perf_probe_event *dst,
1428c2ecf20Sopenharmony_ci			   struct perf_probe_event *src);
1438c2ecf20Sopenharmony_ci
1448c2ecf20Sopenharmony_cibool perf_probe_with_var(struct perf_probe_event *pev);
1458c2ecf20Sopenharmony_ci
1468c2ecf20Sopenharmony_ci/* Check the perf_probe_event needs debuginfo */
1478c2ecf20Sopenharmony_cibool perf_probe_event_need_dwarf(struct perf_probe_event *pev);
1488c2ecf20Sopenharmony_ci
1498c2ecf20Sopenharmony_ci/* Release event contents */
1508c2ecf20Sopenharmony_civoid clear_perf_probe_event(struct perf_probe_event *pev);
1518c2ecf20Sopenharmony_civoid clear_probe_trace_event(struct probe_trace_event *tev);
1528c2ecf20Sopenharmony_ci
1538c2ecf20Sopenharmony_ci/* Command string to line-range */
1548c2ecf20Sopenharmony_ciint parse_line_range_desc(const char *cmd, struct line_range *lr);
1558c2ecf20Sopenharmony_ci
1568c2ecf20Sopenharmony_ci/* Release line range members */
1578c2ecf20Sopenharmony_civoid line_range__clear(struct line_range *lr);
1588c2ecf20Sopenharmony_ci
1598c2ecf20Sopenharmony_ci/* Initialize line range */
1608c2ecf20Sopenharmony_ciint line_range__init(struct line_range *lr);
1618c2ecf20Sopenharmony_ci
1628c2ecf20Sopenharmony_ciint add_perf_probe_events(struct perf_probe_event *pevs, int npevs);
1638c2ecf20Sopenharmony_ciint convert_perf_probe_events(struct perf_probe_event *pevs, int npevs);
1648c2ecf20Sopenharmony_ciint apply_perf_probe_events(struct perf_probe_event *pevs, int npevs);
1658c2ecf20Sopenharmony_ciint show_probe_trace_events(struct perf_probe_event *pevs, int npevs);
1668c2ecf20Sopenharmony_civoid cleanup_perf_probe_events(struct perf_probe_event *pevs, int npevs);
1678c2ecf20Sopenharmony_ci
1688c2ecf20Sopenharmony_cistruct strfilter;
1698c2ecf20Sopenharmony_ci
1708c2ecf20Sopenharmony_ciint del_perf_probe_events(struct strfilter *filter);
1718c2ecf20Sopenharmony_ci
1728c2ecf20Sopenharmony_ciint show_perf_probe_event(const char *group, const char *event,
1738c2ecf20Sopenharmony_ci			  struct perf_probe_event *pev,
1748c2ecf20Sopenharmony_ci			  const char *module, bool use_stdout);
1758c2ecf20Sopenharmony_ciint show_perf_probe_events(struct strfilter *filter);
1768c2ecf20Sopenharmony_ciint show_line_range(struct line_range *lr, const char *module,
1778c2ecf20Sopenharmony_ci		    struct nsinfo *nsi, bool user);
1788c2ecf20Sopenharmony_ciint show_available_vars(struct perf_probe_event *pevs, int npevs,
1798c2ecf20Sopenharmony_ci			struct strfilter *filter);
1808c2ecf20Sopenharmony_ciint show_available_funcs(const char *module, struct nsinfo *nsi,
1818c2ecf20Sopenharmony_ci			 struct strfilter *filter, bool user);
1828c2ecf20Sopenharmony_civoid arch__fix_tev_from_maps(struct perf_probe_event *pev,
1838c2ecf20Sopenharmony_ci			     struct probe_trace_event *tev, struct map *map,
1848c2ecf20Sopenharmony_ci			     struct symbol *sym);
1858c2ecf20Sopenharmony_ci
1868c2ecf20Sopenharmony_ci/* If there is no space to write, returns -E2BIG. */
1878c2ecf20Sopenharmony_ciint e_snprintf(char *str, size_t size, const char *format, ...) __printf(3, 4);
1888c2ecf20Sopenharmony_ci
1898c2ecf20Sopenharmony_ci/* Maximum index number of event-name postfix */
1908c2ecf20Sopenharmony_ci#define MAX_EVENT_INDEX	1024
1918c2ecf20Sopenharmony_ci
1928c2ecf20Sopenharmony_ciint copy_to_probe_trace_arg(struct probe_trace_arg *tvar,
1938c2ecf20Sopenharmony_ci			    struct perf_probe_arg *pvar);
1948c2ecf20Sopenharmony_ci
1958c2ecf20Sopenharmony_cistruct map *get_target_map(const char *target, struct nsinfo *nsi, bool user);
1968c2ecf20Sopenharmony_ci
1978c2ecf20Sopenharmony_civoid arch__post_process_probe_trace_events(struct perf_probe_event *pev,
1988c2ecf20Sopenharmony_ci					   int ntevs);
1998c2ecf20Sopenharmony_ci
2008c2ecf20Sopenharmony_ci#endif /*_PROBE_EVENT_H */
201