Linux Audio

Check our new training course

In-person Linux kernel drivers training

Jun 16-20, 2025
Register
Loading...
v6.8
  1/* SPDX-License-Identifier: GPL-2.0 */
  2#ifndef _PROBE_FINDER_H
  3#define _PROBE_FINDER_H
  4
  5#include <stdbool.h>
 
  6#include "intlist.h"
  7#include "build-id.h"
  8#include "probe-event.h"
  9#include <linux/ctype.h>
 10
 11#define MAX_PROBE_BUFFER	1024
 12#define MAX_PROBES		 128
 13#define MAX_PROBE_ARGS		 128
 14
 15#define PROBE_ARG_VARS		"$vars"
 16#define PROBE_ARG_PARAMS	"$params"
 17
 18static inline int is_c_varname(const char *name)
 19{
 20	/* TODO */
 21	return isalpha(name[0]) || name[0] == '_';
 22}
 23
 24#ifdef HAVE_DWARF_SUPPORT
 25
 26#include "dwarf-aux.h"
 27#include "debuginfo.h"
 
 
 
 
 
 
 
 
 
 
 
 
 
 28
 29/* Find probe_trace_events specified by perf_probe_event from debuginfo */
 30int debuginfo__find_trace_events(struct debuginfo *dbg,
 31				 struct perf_probe_event *pev,
 32				 struct probe_trace_event **tevs);
 33
 34/* Find a perf_probe_point from debuginfo */
 35int debuginfo__find_probe_point(struct debuginfo *dbg, u64 addr,
 36				struct perf_probe_point *ppt);
 37
 38/* Find a line range */
 39int debuginfo__find_line_range(struct debuginfo *dbg, struct line_range *lr);
 40
 41/* Find available variables */
 42int debuginfo__find_available_vars_at(struct debuginfo *dbg,
 43				      struct perf_probe_event *pev,
 44				      struct variable_list **vls);
 45
 46/* Find a src file from a DWARF tag path */
 47int find_source_path(const char *raw_path, const char *sbuild_id,
 48		     const char *comp_dir, char **new_path);
 49
 50struct probe_finder {
 51	struct perf_probe_event	*pev;		/* Target probe event */
 52	struct debuginfo	*dbg;
 53
 54	/* Callback when a probe point is found */
 55	int (*callback)(Dwarf_Die *sc_die, struct probe_finder *pf);
 56
 57	/* For function searching */
 58	int			lno;		/* Line number */
 59	Dwarf_Addr		addr;		/* Address */
 60	const char		*fname;		/* Real file name */
 61	Dwarf_Die		cu_die;		/* Current CU */
 62	Dwarf_Die		sp_die;
 63	struct intlist		*lcache;	/* Line cache for lazy match */
 64
 65	/* For variable searching */
 66#if _ELFUTILS_PREREQ(0, 142)
 67	/* Call Frame Information from .eh_frame */
 68	Dwarf_CFI		*cfi_eh;
 69	/* Call Frame Information from .debug_frame */
 70	Dwarf_CFI		*cfi_dbg;
 71#endif
 72	Dwarf_Op		*fb_ops;	/* Frame base attribute */
 73	unsigned int		machine;	/* Target machine arch */
 74	struct perf_probe_arg	*pvar;		/* Current target variable */
 75	struct probe_trace_arg	*tvar;		/* Current result variable */
 76	bool			skip_empty_arg;	/* Skip non-exist args */
 77};
 78
 79struct trace_event_finder {
 80	struct probe_finder	pf;
 81	Dwfl_Module		*mod;		/* For solving symbols */
 82	struct probe_trace_event *tevs;		/* Found trace events */
 83	int			ntevs;		/* Number of trace events */
 84	int			max_tevs;	/* Max number of trace events */
 85};
 86
 87struct available_var_finder {
 88	struct probe_finder	pf;
 89	Dwfl_Module		*mod;		/* For solving symbols */
 90	struct variable_list	*vls;		/* Found variable lists */
 91	int			nvls;		/* Number of variable lists */
 92	int			max_vls;	/* Max no. of variable lists */
 93	bool			child;		/* Search child scopes */
 94};
 95
 96struct line_finder {
 97	struct line_range	*lr;		/* Target line range */
 98
 99	const char		*fname;		/* File name */
100	int			lno_s;		/* Start line number */
101	int			lno_e;		/* End line number */
102	Dwarf_Die		cu_die;		/* Current CU */
103	Dwarf_Die		sp_die;
104	int			found;
105};
106
107#endif /* HAVE_DWARF_SUPPORT */
108
109#endif /*_PROBE_FINDER_H */
v4.6
 
  1#ifndef _PROBE_FINDER_H
  2#define _PROBE_FINDER_H
  3
  4#include <stdbool.h>
  5#include "util.h"
  6#include "intlist.h"
 
  7#include "probe-event.h"
 
  8
  9#define MAX_PROBE_BUFFER	1024
 10#define MAX_PROBES		 128
 11#define MAX_PROBE_ARGS		 128
 12
 13#define PROBE_ARG_VARS		"$vars"
 14#define PROBE_ARG_PARAMS	"$params"
 15
 16static inline int is_c_varname(const char *name)
 17{
 18	/* TODO */
 19	return isalpha(name[0]) || name[0] == '_';
 20}
 21
 22#ifdef HAVE_DWARF_SUPPORT
 23
 24#include "dwarf-aux.h"
 25
 26/* TODO: export debuginfo data structure even if no dwarf support */
 27
 28/* debug information structure */
 29struct debuginfo {
 30	Dwarf		*dbg;
 31	Dwfl_Module	*mod;
 32	Dwfl		*dwfl;
 33	Dwarf_Addr	bias;
 34};
 35
 36/* This also tries to open distro debuginfo */
 37struct debuginfo *debuginfo__new(const char *path);
 38void debuginfo__delete(struct debuginfo *dbg);
 39
 40/* Find probe_trace_events specified by perf_probe_event from debuginfo */
 41int debuginfo__find_trace_events(struct debuginfo *dbg,
 42				 struct perf_probe_event *pev,
 43				 struct probe_trace_event **tevs);
 44
 45/* Find a perf_probe_point from debuginfo */
 46int debuginfo__find_probe_point(struct debuginfo *dbg, unsigned long addr,
 47				struct perf_probe_point *ppt);
 48
 49/* Find a line range */
 50int debuginfo__find_line_range(struct debuginfo *dbg, struct line_range *lr);
 51
 52/* Find available variables */
 53int debuginfo__find_available_vars_at(struct debuginfo *dbg,
 54				      struct perf_probe_event *pev,
 55				      struct variable_list **vls);
 56
 57/* Find a src file from a DWARF tag path */
 58int get_real_path(const char *raw_path, const char *comp_dir,
 59			 char **new_path);
 60
 61struct probe_finder {
 62	struct perf_probe_event	*pev;		/* Target probe event */
 
 63
 64	/* Callback when a probe point is found */
 65	int (*callback)(Dwarf_Die *sc_die, struct probe_finder *pf);
 66
 67	/* For function searching */
 68	int			lno;		/* Line number */
 69	Dwarf_Addr		addr;		/* Address */
 70	const char		*fname;		/* Real file name */
 71	Dwarf_Die		cu_die;		/* Current CU */
 72	Dwarf_Die		sp_die;
 73	struct intlist		*lcache;	/* Line cache for lazy match */
 74
 75	/* For variable searching */
 76#if _ELFUTILS_PREREQ(0, 142)
 77	/* Call Frame Information from .eh_frame */
 78	Dwarf_CFI		*cfi_eh;
 79	/* Call Frame Information from .debug_frame */
 80	Dwarf_CFI		*cfi_dbg;
 81#endif
 82	Dwarf_Op		*fb_ops;	/* Frame base attribute */
 
 83	struct perf_probe_arg	*pvar;		/* Current target variable */
 84	struct probe_trace_arg	*tvar;		/* Current result variable */
 
 85};
 86
 87struct trace_event_finder {
 88	struct probe_finder	pf;
 89	Dwfl_Module		*mod;		/* For solving symbols */
 90	struct probe_trace_event *tevs;		/* Found trace events */
 91	int			ntevs;		/* Number of trace events */
 92	int			max_tevs;	/* Max number of trace events */
 93};
 94
 95struct available_var_finder {
 96	struct probe_finder	pf;
 97	Dwfl_Module		*mod;		/* For solving symbols */
 98	struct variable_list	*vls;		/* Found variable lists */
 99	int			nvls;		/* Number of variable lists */
100	int			max_vls;	/* Max no. of variable lists */
101	bool			child;		/* Search child scopes */
102};
103
104struct line_finder {
105	struct line_range	*lr;		/* Target line range */
106
107	const char		*fname;		/* File name */
108	int			lno_s;		/* Start line number */
109	int			lno_e;		/* End line number */
110	Dwarf_Die		cu_die;		/* Current CU */
111	Dwarf_Die		sp_die;
112	int			found;
113};
114
115#endif /* HAVE_DWARF_SUPPORT */
116
117#endif /*_PROBE_FINDER_H */