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