xref: /titanic_44/usr/src/lib/libdtrace/common/dtrace.h (revision 7c478bd95313f5f23a4c958a745db2134aa03244)
1*7c478bd9Sstevel@tonic-gate /*
2*7c478bd9Sstevel@tonic-gate  * CDDL HEADER START
3*7c478bd9Sstevel@tonic-gate  *
4*7c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5*7c478bd9Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
6*7c478bd9Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
7*7c478bd9Sstevel@tonic-gate  * with the License.
8*7c478bd9Sstevel@tonic-gate  *
9*7c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*7c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
11*7c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
12*7c478bd9Sstevel@tonic-gate  * and limitations under the License.
13*7c478bd9Sstevel@tonic-gate  *
14*7c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
15*7c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*7c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
17*7c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
18*7c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
19*7c478bd9Sstevel@tonic-gate  *
20*7c478bd9Sstevel@tonic-gate  * CDDL HEADER END
21*7c478bd9Sstevel@tonic-gate  */
22*7c478bd9Sstevel@tonic-gate /*
23*7c478bd9Sstevel@tonic-gate  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24*7c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
25*7c478bd9Sstevel@tonic-gate  */
26*7c478bd9Sstevel@tonic-gate 
27*7c478bd9Sstevel@tonic-gate #ifndef	_DTRACE_H
28*7c478bd9Sstevel@tonic-gate #define	_DTRACE_H
29*7c478bd9Sstevel@tonic-gate 
30*7c478bd9Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
31*7c478bd9Sstevel@tonic-gate 
32*7c478bd9Sstevel@tonic-gate #include <sys/dtrace.h>
33*7c478bd9Sstevel@tonic-gate #include <stdarg.h>
34*7c478bd9Sstevel@tonic-gate #include <stdio.h>
35*7c478bd9Sstevel@tonic-gate #include <gelf.h>
36*7c478bd9Sstevel@tonic-gate 
37*7c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
38*7c478bd9Sstevel@tonic-gate extern "C" {
39*7c478bd9Sstevel@tonic-gate #endif
40*7c478bd9Sstevel@tonic-gate 
41*7c478bd9Sstevel@tonic-gate /*
42*7c478bd9Sstevel@tonic-gate  * DTrace Dynamic Tracing Software: Library Interfaces
43*7c478bd9Sstevel@tonic-gate  *
44*7c478bd9Sstevel@tonic-gate  * Note: The contents of this file are private to the implementation of the
45*7c478bd9Sstevel@tonic-gate  * Solaris system and DTrace subsystem and are subject to change at any time
46*7c478bd9Sstevel@tonic-gate  * without notice.  Applications and drivers using these interfaces will fail
47*7c478bd9Sstevel@tonic-gate  * to run on future releases.  These interfaces should not be used for any
48*7c478bd9Sstevel@tonic-gate  * purpose except those expressly outlined in dtrace(7D) and libdtrace(3LIB).
49*7c478bd9Sstevel@tonic-gate  * Please refer to the "Solaris Dynamic Tracing Guide" for more information.
50*7c478bd9Sstevel@tonic-gate  */
51*7c478bd9Sstevel@tonic-gate 
52*7c478bd9Sstevel@tonic-gate #define	DTRACE_VERSION	1		/* library ABI interface version */
53*7c478bd9Sstevel@tonic-gate 
54*7c478bd9Sstevel@tonic-gate struct ps_prochandle;
55*7c478bd9Sstevel@tonic-gate typedef struct dtrace_hdl dtrace_hdl_t;
56*7c478bd9Sstevel@tonic-gate typedef struct dtrace_prog dtrace_prog_t;
57*7c478bd9Sstevel@tonic-gate typedef struct dtrace_vector dtrace_vector_t;
58*7c478bd9Sstevel@tonic-gate typedef struct dtrace_aggdata dtrace_aggdata_t;
59*7c478bd9Sstevel@tonic-gate typedef int64_t dtrace_aggvarid_t;
60*7c478bd9Sstevel@tonic-gate 
61*7c478bd9Sstevel@tonic-gate #define	DTRACE_O_NODEV		0x01	/* do not open dtrace(7D) device */
62*7c478bd9Sstevel@tonic-gate #define	DTRACE_O_NOSYS		0x02	/* do not load /system/object modules */
63*7c478bd9Sstevel@tonic-gate #define	DTRACE_O_LP64		0x04	/* force D compiler to be LP64 */
64*7c478bd9Sstevel@tonic-gate #define	DTRACE_O_ILP32		0x08	/* force D compiler to be ILP32 */
65*7c478bd9Sstevel@tonic-gate #define	DTRACE_O_MASK		0x0f	/* mask of valid flags to dtrace_open */
66*7c478bd9Sstevel@tonic-gate 
67*7c478bd9Sstevel@tonic-gate extern dtrace_hdl_t *dtrace_open(int, int, int *);
68*7c478bd9Sstevel@tonic-gate extern dtrace_hdl_t *dtrace_vopen(int, int, int *,
69*7c478bd9Sstevel@tonic-gate     const dtrace_vector_t *, void *);
70*7c478bd9Sstevel@tonic-gate 
71*7c478bd9Sstevel@tonic-gate extern int dtrace_go(dtrace_hdl_t *);
72*7c478bd9Sstevel@tonic-gate extern int dtrace_stop(dtrace_hdl_t *);
73*7c478bd9Sstevel@tonic-gate extern void dtrace_sleep(dtrace_hdl_t *);
74*7c478bd9Sstevel@tonic-gate extern void dtrace_close(dtrace_hdl_t *);
75*7c478bd9Sstevel@tonic-gate 
76*7c478bd9Sstevel@tonic-gate extern int dtrace_errno(dtrace_hdl_t *);
77*7c478bd9Sstevel@tonic-gate extern const char *dtrace_errmsg(dtrace_hdl_t *, int);
78*7c478bd9Sstevel@tonic-gate extern const char *dtrace_faultstr(dtrace_hdl_t *, int);
79*7c478bd9Sstevel@tonic-gate 
80*7c478bd9Sstevel@tonic-gate extern int dtrace_setopt(dtrace_hdl_t *, const char *, const char *);
81*7c478bd9Sstevel@tonic-gate extern int dtrace_getopt(dtrace_hdl_t *, const char *, dtrace_optval_t *);
82*7c478bd9Sstevel@tonic-gate 
83*7c478bd9Sstevel@tonic-gate extern void dtrace_update(dtrace_hdl_t *);
84*7c478bd9Sstevel@tonic-gate extern int dtrace_ctlfd(dtrace_hdl_t *);
85*7c478bd9Sstevel@tonic-gate 
86*7c478bd9Sstevel@tonic-gate /*
87*7c478bd9Sstevel@tonic-gate  * DTrace Program Interface
88*7c478bd9Sstevel@tonic-gate  *
89*7c478bd9Sstevel@tonic-gate  * DTrace programs can be created by compiling ASCII text files containing
90*7c478bd9Sstevel@tonic-gate  * D programs, by compiling C strings that specify a D program, or by
91*7c478bd9Sstevel@tonic-gate  * manually constructing statements and adding them to an existing program.
92*7c478bd9Sstevel@tonic-gate  * The dtrace_program_create() function can be used to create an empty program.
93*7c478bd9Sstevel@tonic-gate  * Once created, callers can examine the list of program statements and
94*7c478bd9Sstevel@tonic-gate  * enable the probes and actions described by these statements.
95*7c478bd9Sstevel@tonic-gate  */
96*7c478bd9Sstevel@tonic-gate 
97*7c478bd9Sstevel@tonic-gate typedef struct dtrace_proginfo {
98*7c478bd9Sstevel@tonic-gate 	dtrace_attribute_t dpi_descattr; /* minimum probedesc attributes */
99*7c478bd9Sstevel@tonic-gate 	dtrace_attribute_t dpi_stmtattr; /* minimum statement attributes */
100*7c478bd9Sstevel@tonic-gate 	uint_t dpi_aggregates;	/* number of aggregates specified in program */
101*7c478bd9Sstevel@tonic-gate 	uint_t dpi_recgens;	/* number of record generating probes in prog */
102*7c478bd9Sstevel@tonic-gate 	uint_t dpi_matches;	/* number of probes matched by program */
103*7c478bd9Sstevel@tonic-gate 	uint_t dpi_speculations; /* number of speculations specified in prog */
104*7c478bd9Sstevel@tonic-gate } dtrace_proginfo_t;
105*7c478bd9Sstevel@tonic-gate 
106*7c478bd9Sstevel@tonic-gate #define	DTRACE_C_DIFV	0x0001	/* DIF verbose mode: show each compiled DIFO */
107*7c478bd9Sstevel@tonic-gate #define	DTRACE_C_EMPTY	0x0002	/* Permit compilation of empty D source files */
108*7c478bd9Sstevel@tonic-gate #define	DTRACE_C_ZDEFS	0x0004	/* Permit probe defs that match zero probes */
109*7c478bd9Sstevel@tonic-gate #define	DTRACE_C_EATTR	0x0008	/* Error if program attributes less than min */
110*7c478bd9Sstevel@tonic-gate #define	DTRACE_C_CPP	0x0010	/* Preprocess input file with cpp(1) utility */
111*7c478bd9Sstevel@tonic-gate #define	DTRACE_C_KNODEF	0x0020	/* Permit unresolved kernel symbols in DIFO */
112*7c478bd9Sstevel@tonic-gate #define	DTRACE_C_UNODEF	0x0040	/* Permit unresolved user symbols in DIFO */
113*7c478bd9Sstevel@tonic-gate #define	DTRACE_C_PSPEC	0x0080	/* Intepret ambiguous specifiers as probes */
114*7c478bd9Sstevel@tonic-gate #define	DTRACE_C_ETAGS	0x0100	/* Prefix error messages with error tags */
115*7c478bd9Sstevel@tonic-gate #define	DTRACE_C_ARGREF	0x0200	/* Do not require all macro args to be used */
116*7c478bd9Sstevel@tonic-gate #define	DTRACE_C_DEFARG	0x0800	/* Use 0/"" as value for unspecified args */
117*7c478bd9Sstevel@tonic-gate #define	DTRACE_C_NOLIBS	0x1000	/* Do not process D system libraries */
118*7c478bd9Sstevel@tonic-gate #define	DTRACE_C_MASK	0x1bff	/* mask of all valid flags to dtrace_*compile */
119*7c478bd9Sstevel@tonic-gate 
120*7c478bd9Sstevel@tonic-gate extern dtrace_prog_t *dtrace_program_strcompile(dtrace_hdl_t *,
121*7c478bd9Sstevel@tonic-gate     const char *, dtrace_probespec_t, uint_t, int, char *const []);
122*7c478bd9Sstevel@tonic-gate 
123*7c478bd9Sstevel@tonic-gate extern dtrace_prog_t *dtrace_program_fcompile(dtrace_hdl_t *,
124*7c478bd9Sstevel@tonic-gate     FILE *, uint_t, int, char *const []);
125*7c478bd9Sstevel@tonic-gate 
126*7c478bd9Sstevel@tonic-gate extern int dtrace_program_exec(dtrace_hdl_t *, dtrace_prog_t *,
127*7c478bd9Sstevel@tonic-gate     dtrace_proginfo_t *);
128*7c478bd9Sstevel@tonic-gate extern void dtrace_program_info(dtrace_hdl_t *, dtrace_prog_t *,
129*7c478bd9Sstevel@tonic-gate     dtrace_proginfo_t *);
130*7c478bd9Sstevel@tonic-gate 
131*7c478bd9Sstevel@tonic-gate #define	DTRACE_D_STRIP	0x01	/* strip non-loadable sections from program */
132*7c478bd9Sstevel@tonic-gate #define	DTRACE_D_PROBES	0x02	/* include provider and probe definitions */
133*7c478bd9Sstevel@tonic-gate #define	DTRACE_D_MASK	0x03	/* mask of valid flags to dtrace_dof_create */
134*7c478bd9Sstevel@tonic-gate 
135*7c478bd9Sstevel@tonic-gate extern int dtrace_program_link(dtrace_hdl_t *, dtrace_prog_t *,
136*7c478bd9Sstevel@tonic-gate     uint_t, const char *, int, char *const []);
137*7c478bd9Sstevel@tonic-gate 
138*7c478bd9Sstevel@tonic-gate extern void *dtrace_dof_create(dtrace_hdl_t *, dtrace_prog_t *, uint_t);
139*7c478bd9Sstevel@tonic-gate extern void dtrace_dof_destroy(dtrace_hdl_t *, void *);
140*7c478bd9Sstevel@tonic-gate 
141*7c478bd9Sstevel@tonic-gate extern void *dtrace_getopt_dof(dtrace_hdl_t *);
142*7c478bd9Sstevel@tonic-gate extern void *dtrace_geterr_dof(dtrace_hdl_t *);
143*7c478bd9Sstevel@tonic-gate 
144*7c478bd9Sstevel@tonic-gate extern dtrace_prog_t *dtrace_program_create(dtrace_hdl_t *);
145*7c478bd9Sstevel@tonic-gate extern void dtrace_program_destroy(dtrace_hdl_t *, dtrace_prog_t *);
146*7c478bd9Sstevel@tonic-gate 
147*7c478bd9Sstevel@tonic-gate typedef struct dtrace_stmtdesc {
148*7c478bd9Sstevel@tonic-gate 	dtrace_ecbdesc_t *dtsd_ecbdesc;		/* ECB description */
149*7c478bd9Sstevel@tonic-gate 	dtrace_actdesc_t *dtsd_action;		/* action list */
150*7c478bd9Sstevel@tonic-gate 	dtrace_actdesc_t *dtsd_action_last;	/* last action in action list */
151*7c478bd9Sstevel@tonic-gate 	void *dtsd_aggdata;			/* aggregation data */
152*7c478bd9Sstevel@tonic-gate 	void *dtsd_fmtdata;			/* type-specific output data */
153*7c478bd9Sstevel@tonic-gate 	void (*dtsd_callback)();		/* callback function for EPID */
154*7c478bd9Sstevel@tonic-gate 	void *dtsd_data;			/* callback data pointer */
155*7c478bd9Sstevel@tonic-gate 	dtrace_attribute_t dtsd_descattr;	/* probedesc attributes */
156*7c478bd9Sstevel@tonic-gate 	dtrace_attribute_t dtsd_stmtattr;	/* statement attributes */
157*7c478bd9Sstevel@tonic-gate } dtrace_stmtdesc_t;
158*7c478bd9Sstevel@tonic-gate 
159*7c478bd9Sstevel@tonic-gate typedef int dtrace_stmt_f(dtrace_hdl_t *, dtrace_prog_t *,
160*7c478bd9Sstevel@tonic-gate     dtrace_stmtdesc_t *, void *);
161*7c478bd9Sstevel@tonic-gate 
162*7c478bd9Sstevel@tonic-gate extern dtrace_stmtdesc_t *dtrace_stmt_create(dtrace_hdl_t *,
163*7c478bd9Sstevel@tonic-gate     dtrace_ecbdesc_t *);
164*7c478bd9Sstevel@tonic-gate extern dtrace_actdesc_t *dtrace_stmt_action(dtrace_hdl_t *,
165*7c478bd9Sstevel@tonic-gate     dtrace_stmtdesc_t *);
166*7c478bd9Sstevel@tonic-gate extern int dtrace_stmt_add(dtrace_hdl_t *, dtrace_prog_t *,
167*7c478bd9Sstevel@tonic-gate     dtrace_stmtdesc_t *);
168*7c478bd9Sstevel@tonic-gate extern int dtrace_stmt_iter(dtrace_hdl_t *, dtrace_prog_t *,
169*7c478bd9Sstevel@tonic-gate     dtrace_stmt_f *, void *);
170*7c478bd9Sstevel@tonic-gate extern void dtrace_stmt_destroy(dtrace_stmtdesc_t *);
171*7c478bd9Sstevel@tonic-gate 
172*7c478bd9Sstevel@tonic-gate extern dtrace_ecbdesc_t *dtrace_ecbdesc_create(dtrace_hdl_t *,
173*7c478bd9Sstevel@tonic-gate     const dtrace_probedesc_t *);
174*7c478bd9Sstevel@tonic-gate extern void dtrace_ecbdesc_hold(dtrace_ecbdesc_t *);
175*7c478bd9Sstevel@tonic-gate extern void dtrace_ecbdesc_release(dtrace_ecbdesc_t *);
176*7c478bd9Sstevel@tonic-gate 
177*7c478bd9Sstevel@tonic-gate /*
178*7c478bd9Sstevel@tonic-gate  * DTrace Data Consumption Interface
179*7c478bd9Sstevel@tonic-gate  */
180*7c478bd9Sstevel@tonic-gate typedef enum {
181*7c478bd9Sstevel@tonic-gate 	DTRACEFLOW_ENTRY,
182*7c478bd9Sstevel@tonic-gate 	DTRACEFLOW_RETURN,
183*7c478bd9Sstevel@tonic-gate 	DTRACEFLOW_NONE
184*7c478bd9Sstevel@tonic-gate } dtrace_flowkind_t;
185*7c478bd9Sstevel@tonic-gate 
186*7c478bd9Sstevel@tonic-gate #define	DTRACE_CONSUME_ERROR		-1	/* error while processing */
187*7c478bd9Sstevel@tonic-gate #define	DTRACE_CONSUME_THIS		0	/* consume this probe/record */
188*7c478bd9Sstevel@tonic-gate #define	DTRACE_CONSUME_NEXT		1	/* advance to next probe/rec */
189*7c478bd9Sstevel@tonic-gate #define	DTRACE_CONSUME_ABORT		2	/* abort consumption */
190*7c478bd9Sstevel@tonic-gate 
191*7c478bd9Sstevel@tonic-gate typedef struct dtrace_probedata {
192*7c478bd9Sstevel@tonic-gate 	dtrace_hdl_t *dtpda_handle;		/* handle to DTrace library */
193*7c478bd9Sstevel@tonic-gate 	dtrace_eprobedesc_t *dtpda_edesc;	/* enabled probe description */
194*7c478bd9Sstevel@tonic-gate 	dtrace_probedesc_t *dtpda_pdesc;	/* probe description */
195*7c478bd9Sstevel@tonic-gate 	processorid_t dtpda_cpu;		/* CPU for data */
196*7c478bd9Sstevel@tonic-gate 	caddr_t dtpda_data;			/* pointer to raw data */
197*7c478bd9Sstevel@tonic-gate 	dtrace_flowkind_t dtpda_flow;		/* flow kind */
198*7c478bd9Sstevel@tonic-gate 	const char *dtpda_prefix;		/* recommended flow prefix */
199*7c478bd9Sstevel@tonic-gate 	int dtpda_indent;			/* recommended flow indent */
200*7c478bd9Sstevel@tonic-gate } dtrace_probedata_t;
201*7c478bd9Sstevel@tonic-gate 
202*7c478bd9Sstevel@tonic-gate typedef int dtrace_consume_probe_f(const dtrace_probedata_t *, void *);
203*7c478bd9Sstevel@tonic-gate typedef int dtrace_consume_rec_f(const dtrace_probedata_t *,
204*7c478bd9Sstevel@tonic-gate     const dtrace_recdesc_t *, void *);
205*7c478bd9Sstevel@tonic-gate 
206*7c478bd9Sstevel@tonic-gate extern int dtrace_consume(dtrace_hdl_t *, FILE *,
207*7c478bd9Sstevel@tonic-gate     dtrace_consume_probe_f *, dtrace_consume_rec_f *, void *);
208*7c478bd9Sstevel@tonic-gate 
209*7c478bd9Sstevel@tonic-gate #define	DTRACE_STATUS_NONE	0	/* no status; not yet time */
210*7c478bd9Sstevel@tonic-gate #define	DTRACE_STATUS_OKAY	1	/* status okay */
211*7c478bd9Sstevel@tonic-gate #define	DTRACE_STATUS_EXITED	2	/* exit() was called; tracing stopped */
212*7c478bd9Sstevel@tonic-gate #define	DTRACE_STATUS_FILLED	3	/* fill buffer filled; tracing stoped */
213*7c478bd9Sstevel@tonic-gate #define	DTRACE_STATUS_STOPPED	4	/* tracing already stopped */
214*7c478bd9Sstevel@tonic-gate 
215*7c478bd9Sstevel@tonic-gate extern int dtrace_status(dtrace_hdl_t *);
216*7c478bd9Sstevel@tonic-gate 
217*7c478bd9Sstevel@tonic-gate /*
218*7c478bd9Sstevel@tonic-gate  * DTrace Formatted Output Interfaces
219*7c478bd9Sstevel@tonic-gate  *
220*7c478bd9Sstevel@tonic-gate  * To format output associated with a given dtrace_stmtdesc, the caller can
221*7c478bd9Sstevel@tonic-gate  * invoke one of the following functions, passing the opaque dtsd_fmtdata and a
222*7c478bd9Sstevel@tonic-gate  * list of record descriptions.  These functions return either -1 to indicate
223*7c478bd9Sstevel@tonic-gate  * an error, or a positive integer indicating the number of records consumed.
224*7c478bd9Sstevel@tonic-gate  * For anonymous enablings, the consumer can use the dtrd_format member of
225*7c478bd9Sstevel@tonic-gate  * the record description to obtain a format description.  The dtfd_string
226*7c478bd9Sstevel@tonic-gate  * member of the format description may be passed to dtrace_print{fa}_create()
227*7c478bd9Sstevel@tonic-gate  * to create the opaque format data.
228*7c478bd9Sstevel@tonic-gate  */
229*7c478bd9Sstevel@tonic-gate extern void *dtrace_printf_create(dtrace_hdl_t *, const char *);
230*7c478bd9Sstevel@tonic-gate extern void *dtrace_printa_create(dtrace_hdl_t *, const char *);
231*7c478bd9Sstevel@tonic-gate extern size_t dtrace_printf_format(dtrace_hdl_t *, void *, char *, size_t);
232*7c478bd9Sstevel@tonic-gate 
233*7c478bd9Sstevel@tonic-gate extern int dtrace_fprintf(dtrace_hdl_t *, FILE *, void *,
234*7c478bd9Sstevel@tonic-gate     const dtrace_probedata_t *, const dtrace_recdesc_t *, uint_t,
235*7c478bd9Sstevel@tonic-gate     const void *, size_t);
236*7c478bd9Sstevel@tonic-gate 
237*7c478bd9Sstevel@tonic-gate extern int dtrace_fprinta(dtrace_hdl_t *, FILE *, void *,
238*7c478bd9Sstevel@tonic-gate     const dtrace_probedata_t *, const dtrace_recdesc_t *, uint_t,
239*7c478bd9Sstevel@tonic-gate     const void *, size_t);
240*7c478bd9Sstevel@tonic-gate 
241*7c478bd9Sstevel@tonic-gate extern int dtrace_system(dtrace_hdl_t *, FILE *, void *,
242*7c478bd9Sstevel@tonic-gate     const dtrace_probedata_t *, const dtrace_recdesc_t *, uint_t,
243*7c478bd9Sstevel@tonic-gate     const void *, size_t);
244*7c478bd9Sstevel@tonic-gate 
245*7c478bd9Sstevel@tonic-gate extern int dtrace_freopen(dtrace_hdl_t *, FILE *, void *,
246*7c478bd9Sstevel@tonic-gate     const dtrace_probedata_t *, const dtrace_recdesc_t *, uint_t,
247*7c478bd9Sstevel@tonic-gate     const void *, size_t);
248*7c478bd9Sstevel@tonic-gate 
249*7c478bd9Sstevel@tonic-gate /*
250*7c478bd9Sstevel@tonic-gate  * DTrace Work Interface
251*7c478bd9Sstevel@tonic-gate  */
252*7c478bd9Sstevel@tonic-gate typedef enum {
253*7c478bd9Sstevel@tonic-gate 	DTRACE_WORKSTATUS_ERROR = -1,
254*7c478bd9Sstevel@tonic-gate 	DTRACE_WORKSTATUS_OKAY,
255*7c478bd9Sstevel@tonic-gate 	DTRACE_WORKSTATUS_DONE
256*7c478bd9Sstevel@tonic-gate } dtrace_workstatus_t;
257*7c478bd9Sstevel@tonic-gate 
258*7c478bd9Sstevel@tonic-gate extern dtrace_workstatus_t dtrace_work(dtrace_hdl_t *, FILE *,
259*7c478bd9Sstevel@tonic-gate     dtrace_consume_probe_f *, dtrace_consume_rec_f *, void *);
260*7c478bd9Sstevel@tonic-gate 
261*7c478bd9Sstevel@tonic-gate /*
262*7c478bd9Sstevel@tonic-gate  * DTrace Handler Interface
263*7c478bd9Sstevel@tonic-gate  */
264*7c478bd9Sstevel@tonic-gate #define	DTRACE_HANDLE_ABORT		-1	/* abort current operation */
265*7c478bd9Sstevel@tonic-gate #define	DTRACE_HANDLE_OK		0	/* handled okay; continue */
266*7c478bd9Sstevel@tonic-gate 
267*7c478bd9Sstevel@tonic-gate typedef struct dtrace_errdata {
268*7c478bd9Sstevel@tonic-gate 	dtrace_hdl_t *dteda_handle;		/* handle to DTrace library */
269*7c478bd9Sstevel@tonic-gate 	dtrace_eprobedesc_t *dteda_edesc;	/* enabled probe inducing err */
270*7c478bd9Sstevel@tonic-gate 	dtrace_probedesc_t *dteda_pdesc;	/* probe inducing error */
271*7c478bd9Sstevel@tonic-gate 	processorid_t dteda_cpu;		/* CPU of error */
272*7c478bd9Sstevel@tonic-gate 	int dteda_action;			/* action inducing error */
273*7c478bd9Sstevel@tonic-gate 	int dteda_offset;			/* offset in DIFO of error */
274*7c478bd9Sstevel@tonic-gate 	int dteda_fault;			/* specific fault */
275*7c478bd9Sstevel@tonic-gate 	uint64_t dteda_addr;			/* address of fault, if any */
276*7c478bd9Sstevel@tonic-gate 	const char *dteda_msg;			/* preconstructed message */
277*7c478bd9Sstevel@tonic-gate } dtrace_errdata_t;
278*7c478bd9Sstevel@tonic-gate 
279*7c478bd9Sstevel@tonic-gate typedef int dtrace_handle_err_f(dtrace_errdata_t *, void *);
280*7c478bd9Sstevel@tonic-gate extern int dtrace_handle_err(dtrace_hdl_t *, dtrace_handle_err_f *, void *);
281*7c478bd9Sstevel@tonic-gate 
282*7c478bd9Sstevel@tonic-gate typedef enum {
283*7c478bd9Sstevel@tonic-gate 	DTRACEDROP_PRINCIPAL,			/* drop to principal buffer */
284*7c478bd9Sstevel@tonic-gate 	DTRACEDROP_AGGREGATION,			/* drop to aggregation buffer */
285*7c478bd9Sstevel@tonic-gate 	DTRACEDROP_DYNAMIC,			/* dynamic drop */
286*7c478bd9Sstevel@tonic-gate 	DTRACEDROP_DYNRINSE,			/* dyn drop due to rinsing */
287*7c478bd9Sstevel@tonic-gate 	DTRACEDROP_DYNDIRTY,			/* dyn drop due to dirty */
288*7c478bd9Sstevel@tonic-gate 	DTRACEDROP_SPEC,			/* speculative drop */
289*7c478bd9Sstevel@tonic-gate 	DTRACEDROP_SPECBUSY,			/* spec drop due to busy */
290*7c478bd9Sstevel@tonic-gate 	DTRACEDROP_SPECUNAVAIL			/* spec drop due to unavail */
291*7c478bd9Sstevel@tonic-gate } dtrace_dropkind_t;
292*7c478bd9Sstevel@tonic-gate 
293*7c478bd9Sstevel@tonic-gate typedef struct dtrace_dropdata {
294*7c478bd9Sstevel@tonic-gate 	dtrace_hdl_t *dtdda_handle;		/* handle to DTrace library */
295*7c478bd9Sstevel@tonic-gate 	processorid_t dtdda_cpu;		/* CPU, if any */
296*7c478bd9Sstevel@tonic-gate 	dtrace_dropkind_t dtdda_kind;		/* kind of drop */
297*7c478bd9Sstevel@tonic-gate 	uint64_t dtdda_drops;			/* number of drops */
298*7c478bd9Sstevel@tonic-gate 	uint64_t dtdda_total;			/* total drops */
299*7c478bd9Sstevel@tonic-gate 	const char *dtdda_msg;			/* preconstructed message */
300*7c478bd9Sstevel@tonic-gate } dtrace_dropdata_t;
301*7c478bd9Sstevel@tonic-gate 
302*7c478bd9Sstevel@tonic-gate typedef int dtrace_handle_drop_f(dtrace_dropdata_t *, void *);
303*7c478bd9Sstevel@tonic-gate extern int dtrace_handle_drop(dtrace_hdl_t *, dtrace_handle_drop_f *, void *);
304*7c478bd9Sstevel@tonic-gate 
305*7c478bd9Sstevel@tonic-gate typedef void dtrace_handle_proc_f(struct ps_prochandle *, void *);
306*7c478bd9Sstevel@tonic-gate extern int dtrace_handle_proc(dtrace_hdl_t *, dtrace_handle_proc_f *, void *);
307*7c478bd9Sstevel@tonic-gate 
308*7c478bd9Sstevel@tonic-gate typedef struct dtrace_bufdata {
309*7c478bd9Sstevel@tonic-gate 	dtrace_hdl_t *dtbda_handle;		/* handle to DTrace library */
310*7c478bd9Sstevel@tonic-gate 	const char *dtbda_buffered;		/* buffered output */
311*7c478bd9Sstevel@tonic-gate 	dtrace_probedata_t *dtbda_probe;	/* probe data */
312*7c478bd9Sstevel@tonic-gate 	dtrace_recdesc_t *dtbda_recdesc;	/* record description */
313*7c478bd9Sstevel@tonic-gate 	dtrace_aggdata_t *dtbda_aggdata;	/* aggregation data, if agg. */
314*7c478bd9Sstevel@tonic-gate } dtrace_bufdata_t;
315*7c478bd9Sstevel@tonic-gate 
316*7c478bd9Sstevel@tonic-gate typedef int dtrace_handle_buffered_f(dtrace_bufdata_t *, void *);
317*7c478bd9Sstevel@tonic-gate extern int dtrace_handle_buffered(dtrace_hdl_t *,
318*7c478bd9Sstevel@tonic-gate     dtrace_handle_buffered_f *, void *);
319*7c478bd9Sstevel@tonic-gate 
320*7c478bd9Sstevel@tonic-gate /*
321*7c478bd9Sstevel@tonic-gate  * DTrace Aggregate Interface
322*7c478bd9Sstevel@tonic-gate  */
323*7c478bd9Sstevel@tonic-gate 
324*7c478bd9Sstevel@tonic-gate #define	DTRACE_A_PERCPU		0x0001
325*7c478bd9Sstevel@tonic-gate #define	DTRACE_A_KEEPDELTA	0x0002
326*7c478bd9Sstevel@tonic-gate #define	DTRACE_A_ANONYMOUS	0x0004
327*7c478bd9Sstevel@tonic-gate 
328*7c478bd9Sstevel@tonic-gate #define	DTRACE_AGGWALK_ERROR		-1	/* error while processing */
329*7c478bd9Sstevel@tonic-gate #define	DTRACE_AGGWALK_NEXT		0	/* proceed to next element */
330*7c478bd9Sstevel@tonic-gate #define	DTRACE_AGGWALK_ABORT		1	/* abort aggregation walk */
331*7c478bd9Sstevel@tonic-gate #define	DTRACE_AGGWALK_CLEAR		2	/* clear this element */
332*7c478bd9Sstevel@tonic-gate #define	DTRACE_AGGWALK_NORMALIZE	3	/* normalize this element */
333*7c478bd9Sstevel@tonic-gate #define	DTRACE_AGGWALK_DENORMALIZE	4	/* denormalize this element */
334*7c478bd9Sstevel@tonic-gate #define	DTRACE_AGGWALK_REMOVE		5	/* remove this element */
335*7c478bd9Sstevel@tonic-gate 
336*7c478bd9Sstevel@tonic-gate struct dtrace_aggdata {
337*7c478bd9Sstevel@tonic-gate 	dtrace_hdl_t *dtada_handle;		/* handle to DTrace library */
338*7c478bd9Sstevel@tonic-gate 	dtrace_aggdesc_t *dtada_desc;		/* aggregation description */
339*7c478bd9Sstevel@tonic-gate 	dtrace_eprobedesc_t *dtada_edesc;	/* enabled probe description */
340*7c478bd9Sstevel@tonic-gate 	dtrace_probedesc_t *dtada_pdesc;	/* probe description */
341*7c478bd9Sstevel@tonic-gate 	caddr_t dtada_data;			/* pointer to raw data */
342*7c478bd9Sstevel@tonic-gate 	uint64_t dtada_normal;			/* the normal -- 1 for denorm */
343*7c478bd9Sstevel@tonic-gate 	size_t dtada_size;			/* total size of the data */
344*7c478bd9Sstevel@tonic-gate 	caddr_t dtada_delta;			/* delta data, if available */
345*7c478bd9Sstevel@tonic-gate 	caddr_t *dtada_percpu;			/* per CPU data, if avail */
346*7c478bd9Sstevel@tonic-gate 	caddr_t *dtada_percpu_delta;		/* per CPU delta, if avail */
347*7c478bd9Sstevel@tonic-gate };
348*7c478bd9Sstevel@tonic-gate 
349*7c478bd9Sstevel@tonic-gate typedef int dtrace_aggregate_f(dtrace_aggdata_t *, void *);
350*7c478bd9Sstevel@tonic-gate typedef int dtrace_aggregate_walk_f(dtrace_hdl_t *,
351*7c478bd9Sstevel@tonic-gate     dtrace_aggregate_f *, void *);
352*7c478bd9Sstevel@tonic-gate 
353*7c478bd9Sstevel@tonic-gate extern void dtrace_aggregate_clear(dtrace_hdl_t *);
354*7c478bd9Sstevel@tonic-gate extern int dtrace_aggregate_snap(dtrace_hdl_t *);
355*7c478bd9Sstevel@tonic-gate extern int dtrace_aggregate_print(dtrace_hdl_t *, FILE *,
356*7c478bd9Sstevel@tonic-gate     dtrace_aggregate_walk_f *);
357*7c478bd9Sstevel@tonic-gate 
358*7c478bd9Sstevel@tonic-gate extern int dtrace_aggregate_walk(dtrace_hdl_t *, dtrace_aggregate_f *, void *);
359*7c478bd9Sstevel@tonic-gate 
360*7c478bd9Sstevel@tonic-gate extern int dtrace_aggregate_walk_keysorted(dtrace_hdl_t *,
361*7c478bd9Sstevel@tonic-gate     dtrace_aggregate_f *, void *);
362*7c478bd9Sstevel@tonic-gate 
363*7c478bd9Sstevel@tonic-gate extern int dtrace_aggregate_walk_valsorted(dtrace_hdl_t *,
364*7c478bd9Sstevel@tonic-gate     dtrace_aggregate_f *, void *);
365*7c478bd9Sstevel@tonic-gate 
366*7c478bd9Sstevel@tonic-gate extern int dtrace_aggregate_walk_keyvarsorted(dtrace_hdl_t *,
367*7c478bd9Sstevel@tonic-gate     dtrace_aggregate_f *, void *);
368*7c478bd9Sstevel@tonic-gate 
369*7c478bd9Sstevel@tonic-gate extern int dtrace_aggregate_walk_valvarsorted(dtrace_hdl_t *,
370*7c478bd9Sstevel@tonic-gate     dtrace_aggregate_f *, void *);
371*7c478bd9Sstevel@tonic-gate 
372*7c478bd9Sstevel@tonic-gate extern int dtrace_aggregate_walk_keyrevsorted(dtrace_hdl_t *,
373*7c478bd9Sstevel@tonic-gate     dtrace_aggregate_f *, void *);
374*7c478bd9Sstevel@tonic-gate 
375*7c478bd9Sstevel@tonic-gate extern int dtrace_aggregate_walk_valrevsorted(dtrace_hdl_t *,
376*7c478bd9Sstevel@tonic-gate     dtrace_aggregate_f *, void *);
377*7c478bd9Sstevel@tonic-gate 
378*7c478bd9Sstevel@tonic-gate extern int dtrace_aggregate_walk_keyvarrevsorted(dtrace_hdl_t *,
379*7c478bd9Sstevel@tonic-gate     dtrace_aggregate_f *, void *);
380*7c478bd9Sstevel@tonic-gate 
381*7c478bd9Sstevel@tonic-gate extern int dtrace_aggregate_walk_valvarrevsorted(dtrace_hdl_t *,
382*7c478bd9Sstevel@tonic-gate     dtrace_aggregate_f *, void *);
383*7c478bd9Sstevel@tonic-gate 
384*7c478bd9Sstevel@tonic-gate #define	DTRACE_AGD_PRINTED	0x1	/* aggregation printed in program */
385*7c478bd9Sstevel@tonic-gate 
386*7c478bd9Sstevel@tonic-gate /*
387*7c478bd9Sstevel@tonic-gate  * DTrace Process Control Interface
388*7c478bd9Sstevel@tonic-gate  *
389*7c478bd9Sstevel@tonic-gate  * Library clients who wish to have libdtrace create or grab processes for
390*7c478bd9Sstevel@tonic-gate  * monitoring of their symbol table changes may use these interfaces to
391*7c478bd9Sstevel@tonic-gate  * request that libdtrace obtain control of the process using libproc.
392*7c478bd9Sstevel@tonic-gate  */
393*7c478bd9Sstevel@tonic-gate 
394*7c478bd9Sstevel@tonic-gate extern struct ps_prochandle *dtrace_proc_create(dtrace_hdl_t *,
395*7c478bd9Sstevel@tonic-gate     const char *, char *const *);
396*7c478bd9Sstevel@tonic-gate 
397*7c478bd9Sstevel@tonic-gate extern struct ps_prochandle *dtrace_proc_grab(dtrace_hdl_t *, pid_t, int);
398*7c478bd9Sstevel@tonic-gate extern void dtrace_proc_release(dtrace_hdl_t *, struct ps_prochandle *);
399*7c478bd9Sstevel@tonic-gate extern void dtrace_proc_continue(dtrace_hdl_t *, struct ps_prochandle *);
400*7c478bd9Sstevel@tonic-gate 
401*7c478bd9Sstevel@tonic-gate /*
402*7c478bd9Sstevel@tonic-gate  * DTrace DIF Object (DIFO) Interface
403*7c478bd9Sstevel@tonic-gate  *
404*7c478bd9Sstevel@tonic-gate  * Library clients who wish to create their own custom DIF programs can use
405*7c478bd9Sstevel@tonic-gate  * the functions below to create a DIFO from a C string containing a D
406*7c478bd9Sstevel@tonic-gate  * expression statement.  Clients may also create raw DIF on-the-fly without
407*7c478bd9Sstevel@tonic-gate  * invoking the D compiler by simply constructing the dtrace_difo_t by hand.
408*7c478bd9Sstevel@tonic-gate  */
409*7c478bd9Sstevel@tonic-gate 
410*7c478bd9Sstevel@tonic-gate extern dtrace_difo_t *dtrace_difo_create(dtrace_hdl_t *, const char *);
411*7c478bd9Sstevel@tonic-gate extern void dtrace_difo_print(const dtrace_difo_t *, FILE *);
412*7c478bd9Sstevel@tonic-gate extern void dtrace_difo_hold(dtrace_difo_t *);
413*7c478bd9Sstevel@tonic-gate extern void dtrace_difo_release(dtrace_difo_t *);
414*7c478bd9Sstevel@tonic-gate 
415*7c478bd9Sstevel@tonic-gate /*
416*7c478bd9Sstevel@tonic-gate  * DTrace Object, Symbol, and Type Interfaces
417*7c478bd9Sstevel@tonic-gate  *
418*7c478bd9Sstevel@tonic-gate  * Library clients can use libdtrace to perform symbol and C type information
419*7c478bd9Sstevel@tonic-gate  * lookups by symbol name, symbol address, or C type name, or to lookup meta-
420*7c478bd9Sstevel@tonic-gate  * information cached for each of the program objects in use by DTrace.  The
421*7c478bd9Sstevel@tonic-gate  * resulting struct contain pointers to arbitrary-length strings, including
422*7c478bd9Sstevel@tonic-gate  * object, symbol, and type names, that are persistent until the next call to
423*7c478bd9Sstevel@tonic-gate  * dtrace_update().  Once dtrace_update() is called, any cached values must
424*7c478bd9Sstevel@tonic-gate  * be flushed and not used subsequently by the client program.
425*7c478bd9Sstevel@tonic-gate  */
426*7c478bd9Sstevel@tonic-gate 
427*7c478bd9Sstevel@tonic-gate #define	DTRACE_OBJ_EXEC	 ((const char *)0L)	/* primary executable file */
428*7c478bd9Sstevel@tonic-gate #define	DTRACE_OBJ_RTLD	 ((const char *)1L)	/* run-time link-editor */
429*7c478bd9Sstevel@tonic-gate #define	DTRACE_OBJ_CDEFS ((const char *)2L)	/* C include definitions */
430*7c478bd9Sstevel@tonic-gate #define	DTRACE_OBJ_DDEFS ((const char *)3L)	/* D program definitions */
431*7c478bd9Sstevel@tonic-gate #define	DTRACE_OBJ_EVERY ((const char *)-1L)	/* all known objects */
432*7c478bd9Sstevel@tonic-gate #define	DTRACE_OBJ_KMODS ((const char *)-2L)	/* all kernel objects */
433*7c478bd9Sstevel@tonic-gate #define	DTRACE_OBJ_UMODS ((const char *)-3L)	/* all user objects */
434*7c478bd9Sstevel@tonic-gate 
435*7c478bd9Sstevel@tonic-gate typedef struct dtrace_objinfo {
436*7c478bd9Sstevel@tonic-gate 	const char *dto_name;			/* object file scope name */
437*7c478bd9Sstevel@tonic-gate 	const char *dto_file;			/* object file path (if any) */
438*7c478bd9Sstevel@tonic-gate 	int dto_id;				/* object file id (if any) */
439*7c478bd9Sstevel@tonic-gate 	uint_t dto_flags;			/* object flags (see below) */
440*7c478bd9Sstevel@tonic-gate 	GElf_Addr dto_text_va;			/* address of text section */
441*7c478bd9Sstevel@tonic-gate 	GElf_Xword dto_text_size;		/* size of text section */
442*7c478bd9Sstevel@tonic-gate 	GElf_Addr dto_data_va;			/* address of data section */
443*7c478bd9Sstevel@tonic-gate 	GElf_Xword dto_data_size;		/* size of data section */
444*7c478bd9Sstevel@tonic-gate 	GElf_Addr dto_bss_va;			/* address of BSS */
445*7c478bd9Sstevel@tonic-gate 	GElf_Xword dto_bss_size;		/* size of BSS */
446*7c478bd9Sstevel@tonic-gate } dtrace_objinfo_t;
447*7c478bd9Sstevel@tonic-gate 
448*7c478bd9Sstevel@tonic-gate #define	DTRACE_OBJ_F_KERNEL	0x1		/* object is a kernel module */
449*7c478bd9Sstevel@tonic-gate #define	DTRACE_OBJ_F_PRIMARY	0x2		/* object is a primary module */
450*7c478bd9Sstevel@tonic-gate 
451*7c478bd9Sstevel@tonic-gate typedef int dtrace_obj_f(dtrace_hdl_t *, const dtrace_objinfo_t *, void *);
452*7c478bd9Sstevel@tonic-gate 
453*7c478bd9Sstevel@tonic-gate extern int dtrace_object_iter(dtrace_hdl_t *, dtrace_obj_f *, void *);
454*7c478bd9Sstevel@tonic-gate extern int dtrace_object_info(dtrace_hdl_t *, const char *, dtrace_objinfo_t *);
455*7c478bd9Sstevel@tonic-gate 
456*7c478bd9Sstevel@tonic-gate typedef struct dtrace_syminfo {
457*7c478bd9Sstevel@tonic-gate 	const char *dts_object;			/* object name */
458*7c478bd9Sstevel@tonic-gate 	const char *dts_name;			/* symbol name */
459*7c478bd9Sstevel@tonic-gate 	ulong_t dts_id;				/* symbol id */
460*7c478bd9Sstevel@tonic-gate } dtrace_syminfo_t;
461*7c478bd9Sstevel@tonic-gate 
462*7c478bd9Sstevel@tonic-gate extern int dtrace_lookup_by_name(dtrace_hdl_t *, const char *, const char *,
463*7c478bd9Sstevel@tonic-gate     GElf_Sym *, dtrace_syminfo_t *);
464*7c478bd9Sstevel@tonic-gate 
465*7c478bd9Sstevel@tonic-gate extern int dtrace_lookup_by_addr(dtrace_hdl_t *, GElf_Addr addr,
466*7c478bd9Sstevel@tonic-gate     GElf_Sym *, dtrace_syminfo_t *);
467*7c478bd9Sstevel@tonic-gate 
468*7c478bd9Sstevel@tonic-gate typedef struct dtrace_typeinfo {
469*7c478bd9Sstevel@tonic-gate 	const char *dtt_object;			/* object containing type */
470*7c478bd9Sstevel@tonic-gate 	ctf_file_t *dtt_ctfp;			/* CTF container handle */
471*7c478bd9Sstevel@tonic-gate 	ctf_id_t dtt_type;			/* CTF type identifier */
472*7c478bd9Sstevel@tonic-gate } dtrace_typeinfo_t;
473*7c478bd9Sstevel@tonic-gate 
474*7c478bd9Sstevel@tonic-gate extern int dtrace_lookup_by_type(dtrace_hdl_t *, const char *, const char *,
475*7c478bd9Sstevel@tonic-gate     dtrace_typeinfo_t *);
476*7c478bd9Sstevel@tonic-gate 
477*7c478bd9Sstevel@tonic-gate extern int dtrace_symbol_type(dtrace_hdl_t *, const GElf_Sym *,
478*7c478bd9Sstevel@tonic-gate     const dtrace_syminfo_t *, dtrace_typeinfo_t *);
479*7c478bd9Sstevel@tonic-gate 
480*7c478bd9Sstevel@tonic-gate extern int dtrace_type_strcompile(dtrace_hdl_t *,
481*7c478bd9Sstevel@tonic-gate     const char *, dtrace_typeinfo_t *);
482*7c478bd9Sstevel@tonic-gate 
483*7c478bd9Sstevel@tonic-gate extern int dtrace_type_fcompile(dtrace_hdl_t *,
484*7c478bd9Sstevel@tonic-gate     FILE *, dtrace_typeinfo_t *);
485*7c478bd9Sstevel@tonic-gate 
486*7c478bd9Sstevel@tonic-gate /*
487*7c478bd9Sstevel@tonic-gate  * DTrace Probe Interface
488*7c478bd9Sstevel@tonic-gate  *
489*7c478bd9Sstevel@tonic-gate  * Library clients can use these functions to iterate over the set of available
490*7c478bd9Sstevel@tonic-gate  * probe definitions and inquire as to their attributes.  The probe iteration
491*7c478bd9Sstevel@tonic-gate  * interfaces report probes that are declared as well as those from dtrace(7D).
492*7c478bd9Sstevel@tonic-gate  */
493*7c478bd9Sstevel@tonic-gate typedef struct dtrace_probeinfo {
494*7c478bd9Sstevel@tonic-gate 	dtrace_attribute_t dtp_attr;		/* name attributes */
495*7c478bd9Sstevel@tonic-gate 	dtrace_attribute_t dtp_arga;		/* arg attributes */
496*7c478bd9Sstevel@tonic-gate 	const dtrace_typeinfo_t *dtp_argv;	/* arg types */
497*7c478bd9Sstevel@tonic-gate 	int dtp_argc;				/* arg count */
498*7c478bd9Sstevel@tonic-gate } dtrace_probeinfo_t;
499*7c478bd9Sstevel@tonic-gate 
500*7c478bd9Sstevel@tonic-gate typedef int dtrace_probe_f(dtrace_hdl_t *, const dtrace_probedesc_t *, void *);
501*7c478bd9Sstevel@tonic-gate 
502*7c478bd9Sstevel@tonic-gate extern int dtrace_probe_iter(dtrace_hdl_t *,
503*7c478bd9Sstevel@tonic-gate     const dtrace_probedesc_t *pdp, dtrace_probe_f *, void *);
504*7c478bd9Sstevel@tonic-gate 
505*7c478bd9Sstevel@tonic-gate extern int dtrace_probe_info(dtrace_hdl_t *,
506*7c478bd9Sstevel@tonic-gate     const dtrace_probedesc_t *, dtrace_probeinfo_t *);
507*7c478bd9Sstevel@tonic-gate 
508*7c478bd9Sstevel@tonic-gate /*
509*7c478bd9Sstevel@tonic-gate  * DTrace Vector Interface
510*7c478bd9Sstevel@tonic-gate  *
511*7c478bd9Sstevel@tonic-gate  * The DTrace library normally speaks directly to dtrace(7D).  However,
512*7c478bd9Sstevel@tonic-gate  * this communication may be vectored elsewhere.  Consumers who wish to
513*7c478bd9Sstevel@tonic-gate  * perform a vectored open must fill in the vector, and use the dtrace_vopen()
514*7c478bd9Sstevel@tonic-gate  * entry point to obtain a library handle.
515*7c478bd9Sstevel@tonic-gate  */
516*7c478bd9Sstevel@tonic-gate struct dtrace_vector {
517*7c478bd9Sstevel@tonic-gate 	int (*dtv_ioctl)(void *, int, void *);
518*7c478bd9Sstevel@tonic-gate 	int (*dtv_lookup_by_addr)(void *, GElf_Addr, GElf_Sym *,
519*7c478bd9Sstevel@tonic-gate 	    dtrace_syminfo_t *);
520*7c478bd9Sstevel@tonic-gate 	int (*dtv_status)(void *, processorid_t);
521*7c478bd9Sstevel@tonic-gate 	long (*dtv_sysconf)(void *, int);
522*7c478bd9Sstevel@tonic-gate };
523*7c478bd9Sstevel@tonic-gate 
524*7c478bd9Sstevel@tonic-gate /*
525*7c478bd9Sstevel@tonic-gate  * DTrace Utility Functions
526*7c478bd9Sstevel@tonic-gate  *
527*7c478bd9Sstevel@tonic-gate  * Library clients can use these functions to convert between string and
528*7c478bd9Sstevel@tonic-gate  * integer probe descriptions and the dtrace_probedesc_t representation
529*7c478bd9Sstevel@tonic-gate  * and to perform similar conversions on stability attributes.
530*7c478bd9Sstevel@tonic-gate  */
531*7c478bd9Sstevel@tonic-gate extern int dtrace_xstr2desc(dtrace_hdl_t *, dtrace_probespec_t,
532*7c478bd9Sstevel@tonic-gate     const char *, int, char *const [], dtrace_probedesc_t *);
533*7c478bd9Sstevel@tonic-gate 
534*7c478bd9Sstevel@tonic-gate extern int dtrace_str2desc(dtrace_hdl_t *, dtrace_probespec_t,
535*7c478bd9Sstevel@tonic-gate     const char *, dtrace_probedesc_t *);
536*7c478bd9Sstevel@tonic-gate 
537*7c478bd9Sstevel@tonic-gate extern int dtrace_id2desc(dtrace_hdl_t *, dtrace_id_t, dtrace_probedesc_t *);
538*7c478bd9Sstevel@tonic-gate 
539*7c478bd9Sstevel@tonic-gate #define	DTRACE_DESC2STR_MAX	1024	/* min buf size for dtrace_desc2str() */
540*7c478bd9Sstevel@tonic-gate 
541*7c478bd9Sstevel@tonic-gate extern char *dtrace_desc2str(const dtrace_probedesc_t *, char *, size_t);
542*7c478bd9Sstevel@tonic-gate 
543*7c478bd9Sstevel@tonic-gate #define	DTRACE_ATTR2STR_MAX	64	/* min buf size for dtrace_attr2str() */
544*7c478bd9Sstevel@tonic-gate 
545*7c478bd9Sstevel@tonic-gate extern char *dtrace_attr2str(dtrace_attribute_t, char *, size_t);
546*7c478bd9Sstevel@tonic-gate extern int dtrace_str2attr(const char *, dtrace_attribute_t *);
547*7c478bd9Sstevel@tonic-gate 
548*7c478bd9Sstevel@tonic-gate extern const char *dtrace_stability_name(dtrace_stability_t);
549*7c478bd9Sstevel@tonic-gate extern const char *dtrace_class_name(dtrace_class_t);
550*7c478bd9Sstevel@tonic-gate 
551*7c478bd9Sstevel@tonic-gate extern int dtrace_provider_modules(dtrace_hdl_t *, const char **, int);
552*7c478bd9Sstevel@tonic-gate 
553*7c478bd9Sstevel@tonic-gate extern const char *const _dtrace_version;
554*7c478bd9Sstevel@tonic-gate extern int _dtrace_debug;
555*7c478bd9Sstevel@tonic-gate 
556*7c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
557*7c478bd9Sstevel@tonic-gate }
558*7c478bd9Sstevel@tonic-gate #endif
559*7c478bd9Sstevel@tonic-gate 
560*7c478bd9Sstevel@tonic-gate #endif	/* _DTRACE_H */
561