10Sstevel@tonic-gate /* 20Sstevel@tonic-gate * CDDL HEADER START 30Sstevel@tonic-gate * 40Sstevel@tonic-gate * The contents of this file are subject to the terms of the 50Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 60Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 70Sstevel@tonic-gate * with the License. 80Sstevel@tonic-gate * 90Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 100Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 110Sstevel@tonic-gate * See the License for the specific language governing permissions 120Sstevel@tonic-gate * and limitations under the License. 130Sstevel@tonic-gate * 140Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 150Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 160Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 170Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 180Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 190Sstevel@tonic-gate * 200Sstevel@tonic-gate * CDDL HEADER END 210Sstevel@tonic-gate */ 220Sstevel@tonic-gate /* 230Sstevel@tonic-gate * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 240Sstevel@tonic-gate * Use is subject to license terms. 250Sstevel@tonic-gate */ 260Sstevel@tonic-gate 270Sstevel@tonic-gate #ifndef _DTRACE_H 280Sstevel@tonic-gate #define _DTRACE_H 290Sstevel@tonic-gate 300Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 310Sstevel@tonic-gate 320Sstevel@tonic-gate #include <sys/dtrace.h> 330Sstevel@tonic-gate #include <stdarg.h> 340Sstevel@tonic-gate #include <stdio.h> 350Sstevel@tonic-gate #include <gelf.h> 360Sstevel@tonic-gate 370Sstevel@tonic-gate #ifdef __cplusplus 380Sstevel@tonic-gate extern "C" { 390Sstevel@tonic-gate #endif 400Sstevel@tonic-gate 410Sstevel@tonic-gate /* 420Sstevel@tonic-gate * DTrace Dynamic Tracing Software: Library Interfaces 430Sstevel@tonic-gate * 440Sstevel@tonic-gate * Note: The contents of this file are private to the implementation of the 450Sstevel@tonic-gate * Solaris system and DTrace subsystem and are subject to change at any time 460Sstevel@tonic-gate * without notice. Applications and drivers using these interfaces will fail 470Sstevel@tonic-gate * to run on future releases. These interfaces should not be used for any 480Sstevel@tonic-gate * purpose except those expressly outlined in dtrace(7D) and libdtrace(3LIB). 490Sstevel@tonic-gate * Please refer to the "Solaris Dynamic Tracing Guide" for more information. 500Sstevel@tonic-gate */ 510Sstevel@tonic-gate 52*1017Sbmc #define DTRACE_VERSION 2 /* library ABI interface version */ 530Sstevel@tonic-gate 540Sstevel@tonic-gate struct ps_prochandle; 550Sstevel@tonic-gate typedef struct dtrace_hdl dtrace_hdl_t; 560Sstevel@tonic-gate typedef struct dtrace_prog dtrace_prog_t; 570Sstevel@tonic-gate typedef struct dtrace_vector dtrace_vector_t; 580Sstevel@tonic-gate typedef struct dtrace_aggdata dtrace_aggdata_t; 590Sstevel@tonic-gate 600Sstevel@tonic-gate #define DTRACE_O_NODEV 0x01 /* do not open dtrace(7D) device */ 610Sstevel@tonic-gate #define DTRACE_O_NOSYS 0x02 /* do not load /system/object modules */ 620Sstevel@tonic-gate #define DTRACE_O_LP64 0x04 /* force D compiler to be LP64 */ 630Sstevel@tonic-gate #define DTRACE_O_ILP32 0x08 /* force D compiler to be ILP32 */ 640Sstevel@tonic-gate #define DTRACE_O_MASK 0x0f /* mask of valid flags to dtrace_open */ 650Sstevel@tonic-gate 660Sstevel@tonic-gate extern dtrace_hdl_t *dtrace_open(int, int, int *); 670Sstevel@tonic-gate extern dtrace_hdl_t *dtrace_vopen(int, int, int *, 680Sstevel@tonic-gate const dtrace_vector_t *, void *); 690Sstevel@tonic-gate 700Sstevel@tonic-gate extern int dtrace_go(dtrace_hdl_t *); 710Sstevel@tonic-gate extern int dtrace_stop(dtrace_hdl_t *); 720Sstevel@tonic-gate extern void dtrace_sleep(dtrace_hdl_t *); 730Sstevel@tonic-gate extern void dtrace_close(dtrace_hdl_t *); 740Sstevel@tonic-gate 750Sstevel@tonic-gate extern int dtrace_errno(dtrace_hdl_t *); 760Sstevel@tonic-gate extern const char *dtrace_errmsg(dtrace_hdl_t *, int); 770Sstevel@tonic-gate extern const char *dtrace_faultstr(dtrace_hdl_t *, int); 78265Smws extern const char *dtrace_subrstr(dtrace_hdl_t *, int); 790Sstevel@tonic-gate 800Sstevel@tonic-gate extern int dtrace_setopt(dtrace_hdl_t *, const char *, const char *); 810Sstevel@tonic-gate extern int dtrace_getopt(dtrace_hdl_t *, const char *, dtrace_optval_t *); 820Sstevel@tonic-gate 830Sstevel@tonic-gate extern void dtrace_update(dtrace_hdl_t *); 840Sstevel@tonic-gate extern int dtrace_ctlfd(dtrace_hdl_t *); 850Sstevel@tonic-gate 860Sstevel@tonic-gate /* 870Sstevel@tonic-gate * DTrace Program Interface 880Sstevel@tonic-gate * 890Sstevel@tonic-gate * DTrace programs can be created by compiling ASCII text files containing 90265Smws * D programs or by compiling in-memory C strings that specify a D program. 910Sstevel@tonic-gate * Once created, callers can examine the list of program statements and 920Sstevel@tonic-gate * enable the probes and actions described by these statements. 930Sstevel@tonic-gate */ 940Sstevel@tonic-gate 950Sstevel@tonic-gate typedef struct dtrace_proginfo { 960Sstevel@tonic-gate dtrace_attribute_t dpi_descattr; /* minimum probedesc attributes */ 970Sstevel@tonic-gate dtrace_attribute_t dpi_stmtattr; /* minimum statement attributes */ 980Sstevel@tonic-gate uint_t dpi_aggregates; /* number of aggregates specified in program */ 990Sstevel@tonic-gate uint_t dpi_recgens; /* number of record generating probes in prog */ 1000Sstevel@tonic-gate uint_t dpi_matches; /* number of probes matched by program */ 1010Sstevel@tonic-gate uint_t dpi_speculations; /* number of speculations specified in prog */ 1020Sstevel@tonic-gate } dtrace_proginfo_t; 1030Sstevel@tonic-gate 1040Sstevel@tonic-gate #define DTRACE_C_DIFV 0x0001 /* DIF verbose mode: show each compiled DIFO */ 1050Sstevel@tonic-gate #define DTRACE_C_EMPTY 0x0002 /* Permit compilation of empty D source files */ 1060Sstevel@tonic-gate #define DTRACE_C_ZDEFS 0x0004 /* Permit probe defs that match zero probes */ 1070Sstevel@tonic-gate #define DTRACE_C_EATTR 0x0008 /* Error if program attributes less than min */ 1080Sstevel@tonic-gate #define DTRACE_C_CPP 0x0010 /* Preprocess input file with cpp(1) utility */ 1090Sstevel@tonic-gate #define DTRACE_C_KNODEF 0x0020 /* Permit unresolved kernel symbols in DIFO */ 1100Sstevel@tonic-gate #define DTRACE_C_UNODEF 0x0040 /* Permit unresolved user symbols in DIFO */ 1110Sstevel@tonic-gate #define DTRACE_C_PSPEC 0x0080 /* Intepret ambiguous specifiers as probes */ 1120Sstevel@tonic-gate #define DTRACE_C_ETAGS 0x0100 /* Prefix error messages with error tags */ 1130Sstevel@tonic-gate #define DTRACE_C_ARGREF 0x0200 /* Do not require all macro args to be used */ 1140Sstevel@tonic-gate #define DTRACE_C_DEFARG 0x0800 /* Use 0/"" as value for unspecified args */ 1150Sstevel@tonic-gate #define DTRACE_C_NOLIBS 0x1000 /* Do not process D system libraries */ 1160Sstevel@tonic-gate #define DTRACE_C_MASK 0x1bff /* mask of all valid flags to dtrace_*compile */ 1170Sstevel@tonic-gate 1180Sstevel@tonic-gate extern dtrace_prog_t *dtrace_program_strcompile(dtrace_hdl_t *, 1190Sstevel@tonic-gate const char *, dtrace_probespec_t, uint_t, int, char *const []); 1200Sstevel@tonic-gate 1210Sstevel@tonic-gate extern dtrace_prog_t *dtrace_program_fcompile(dtrace_hdl_t *, 1220Sstevel@tonic-gate FILE *, uint_t, int, char *const []); 1230Sstevel@tonic-gate 1240Sstevel@tonic-gate extern int dtrace_program_exec(dtrace_hdl_t *, dtrace_prog_t *, 1250Sstevel@tonic-gate dtrace_proginfo_t *); 1260Sstevel@tonic-gate extern void dtrace_program_info(dtrace_hdl_t *, dtrace_prog_t *, 1270Sstevel@tonic-gate dtrace_proginfo_t *); 1280Sstevel@tonic-gate 1290Sstevel@tonic-gate #define DTRACE_D_STRIP 0x01 /* strip non-loadable sections from program */ 1300Sstevel@tonic-gate #define DTRACE_D_PROBES 0x02 /* include provider and probe definitions */ 1310Sstevel@tonic-gate #define DTRACE_D_MASK 0x03 /* mask of valid flags to dtrace_dof_create */ 1320Sstevel@tonic-gate 1330Sstevel@tonic-gate extern int dtrace_program_link(dtrace_hdl_t *, dtrace_prog_t *, 1340Sstevel@tonic-gate uint_t, const char *, int, char *const []); 1350Sstevel@tonic-gate 1360Sstevel@tonic-gate extern void *dtrace_dof_create(dtrace_hdl_t *, dtrace_prog_t *, uint_t); 1370Sstevel@tonic-gate extern void dtrace_dof_destroy(dtrace_hdl_t *, void *); 1380Sstevel@tonic-gate 1390Sstevel@tonic-gate extern void *dtrace_getopt_dof(dtrace_hdl_t *); 1400Sstevel@tonic-gate extern void *dtrace_geterr_dof(dtrace_hdl_t *); 1410Sstevel@tonic-gate 1420Sstevel@tonic-gate typedef struct dtrace_stmtdesc { 1430Sstevel@tonic-gate dtrace_ecbdesc_t *dtsd_ecbdesc; /* ECB description */ 1440Sstevel@tonic-gate dtrace_actdesc_t *dtsd_action; /* action list */ 1450Sstevel@tonic-gate dtrace_actdesc_t *dtsd_action_last; /* last action in action list */ 1460Sstevel@tonic-gate void *dtsd_aggdata; /* aggregation data */ 1470Sstevel@tonic-gate void *dtsd_fmtdata; /* type-specific output data */ 1480Sstevel@tonic-gate void (*dtsd_callback)(); /* callback function for EPID */ 1490Sstevel@tonic-gate void *dtsd_data; /* callback data pointer */ 1500Sstevel@tonic-gate dtrace_attribute_t dtsd_descattr; /* probedesc attributes */ 1510Sstevel@tonic-gate dtrace_attribute_t dtsd_stmtattr; /* statement attributes */ 1520Sstevel@tonic-gate } dtrace_stmtdesc_t; 1530Sstevel@tonic-gate 1540Sstevel@tonic-gate typedef int dtrace_stmt_f(dtrace_hdl_t *, dtrace_prog_t *, 1550Sstevel@tonic-gate dtrace_stmtdesc_t *, void *); 1560Sstevel@tonic-gate 1570Sstevel@tonic-gate extern dtrace_stmtdesc_t *dtrace_stmt_create(dtrace_hdl_t *, 1580Sstevel@tonic-gate dtrace_ecbdesc_t *); 1590Sstevel@tonic-gate extern dtrace_actdesc_t *dtrace_stmt_action(dtrace_hdl_t *, 1600Sstevel@tonic-gate dtrace_stmtdesc_t *); 1610Sstevel@tonic-gate extern int dtrace_stmt_add(dtrace_hdl_t *, dtrace_prog_t *, 1620Sstevel@tonic-gate dtrace_stmtdesc_t *); 1630Sstevel@tonic-gate extern int dtrace_stmt_iter(dtrace_hdl_t *, dtrace_prog_t *, 1640Sstevel@tonic-gate dtrace_stmt_f *, void *); 165265Smws extern void dtrace_stmt_destroy(dtrace_hdl_t *, dtrace_stmtdesc_t *); 1660Sstevel@tonic-gate 1670Sstevel@tonic-gate /* 1680Sstevel@tonic-gate * DTrace Data Consumption Interface 1690Sstevel@tonic-gate */ 1700Sstevel@tonic-gate typedef enum { 1710Sstevel@tonic-gate DTRACEFLOW_ENTRY, 1720Sstevel@tonic-gate DTRACEFLOW_RETURN, 1730Sstevel@tonic-gate DTRACEFLOW_NONE 1740Sstevel@tonic-gate } dtrace_flowkind_t; 1750Sstevel@tonic-gate 1760Sstevel@tonic-gate #define DTRACE_CONSUME_ERROR -1 /* error while processing */ 1770Sstevel@tonic-gate #define DTRACE_CONSUME_THIS 0 /* consume this probe/record */ 1780Sstevel@tonic-gate #define DTRACE_CONSUME_NEXT 1 /* advance to next probe/rec */ 1790Sstevel@tonic-gate #define DTRACE_CONSUME_ABORT 2 /* abort consumption */ 1800Sstevel@tonic-gate 1810Sstevel@tonic-gate typedef struct dtrace_probedata { 1820Sstevel@tonic-gate dtrace_hdl_t *dtpda_handle; /* handle to DTrace library */ 1830Sstevel@tonic-gate dtrace_eprobedesc_t *dtpda_edesc; /* enabled probe description */ 1840Sstevel@tonic-gate dtrace_probedesc_t *dtpda_pdesc; /* probe description */ 1850Sstevel@tonic-gate processorid_t dtpda_cpu; /* CPU for data */ 1860Sstevel@tonic-gate caddr_t dtpda_data; /* pointer to raw data */ 1870Sstevel@tonic-gate dtrace_flowkind_t dtpda_flow; /* flow kind */ 1880Sstevel@tonic-gate const char *dtpda_prefix; /* recommended flow prefix */ 1890Sstevel@tonic-gate int dtpda_indent; /* recommended flow indent */ 1900Sstevel@tonic-gate } dtrace_probedata_t; 1910Sstevel@tonic-gate 1920Sstevel@tonic-gate typedef int dtrace_consume_probe_f(const dtrace_probedata_t *, void *); 1930Sstevel@tonic-gate typedef int dtrace_consume_rec_f(const dtrace_probedata_t *, 1940Sstevel@tonic-gate const dtrace_recdesc_t *, void *); 1950Sstevel@tonic-gate 1960Sstevel@tonic-gate extern int dtrace_consume(dtrace_hdl_t *, FILE *, 1970Sstevel@tonic-gate dtrace_consume_probe_f *, dtrace_consume_rec_f *, void *); 1980Sstevel@tonic-gate 1990Sstevel@tonic-gate #define DTRACE_STATUS_NONE 0 /* no status; not yet time */ 2000Sstevel@tonic-gate #define DTRACE_STATUS_OKAY 1 /* status okay */ 2010Sstevel@tonic-gate #define DTRACE_STATUS_EXITED 2 /* exit() was called; tracing stopped */ 2020Sstevel@tonic-gate #define DTRACE_STATUS_FILLED 3 /* fill buffer filled; tracing stoped */ 2030Sstevel@tonic-gate #define DTRACE_STATUS_STOPPED 4 /* tracing already stopped */ 2040Sstevel@tonic-gate 2050Sstevel@tonic-gate extern int dtrace_status(dtrace_hdl_t *); 2060Sstevel@tonic-gate 2070Sstevel@tonic-gate /* 2080Sstevel@tonic-gate * DTrace Formatted Output Interfaces 2090Sstevel@tonic-gate * 2100Sstevel@tonic-gate * To format output associated with a given dtrace_stmtdesc, the caller can 2110Sstevel@tonic-gate * invoke one of the following functions, passing the opaque dtsd_fmtdata and a 2120Sstevel@tonic-gate * list of record descriptions. These functions return either -1 to indicate 2130Sstevel@tonic-gate * an error, or a positive integer indicating the number of records consumed. 2140Sstevel@tonic-gate * For anonymous enablings, the consumer can use the dtrd_format member of 2150Sstevel@tonic-gate * the record description to obtain a format description. The dtfd_string 2160Sstevel@tonic-gate * member of the format description may be passed to dtrace_print{fa}_create() 2170Sstevel@tonic-gate * to create the opaque format data. 2180Sstevel@tonic-gate */ 2190Sstevel@tonic-gate extern void *dtrace_printf_create(dtrace_hdl_t *, const char *); 2200Sstevel@tonic-gate extern void *dtrace_printa_create(dtrace_hdl_t *, const char *); 2210Sstevel@tonic-gate extern size_t dtrace_printf_format(dtrace_hdl_t *, void *, char *, size_t); 2220Sstevel@tonic-gate 2230Sstevel@tonic-gate extern int dtrace_fprintf(dtrace_hdl_t *, FILE *, void *, 2240Sstevel@tonic-gate const dtrace_probedata_t *, const dtrace_recdesc_t *, uint_t, 2250Sstevel@tonic-gate const void *, size_t); 2260Sstevel@tonic-gate 2270Sstevel@tonic-gate extern int dtrace_fprinta(dtrace_hdl_t *, FILE *, void *, 2280Sstevel@tonic-gate const dtrace_probedata_t *, const dtrace_recdesc_t *, uint_t, 2290Sstevel@tonic-gate const void *, size_t); 2300Sstevel@tonic-gate 2310Sstevel@tonic-gate extern int dtrace_system(dtrace_hdl_t *, FILE *, void *, 2320Sstevel@tonic-gate const dtrace_probedata_t *, const dtrace_recdesc_t *, uint_t, 2330Sstevel@tonic-gate const void *, size_t); 2340Sstevel@tonic-gate 2350Sstevel@tonic-gate extern int dtrace_freopen(dtrace_hdl_t *, FILE *, void *, 2360Sstevel@tonic-gate const dtrace_probedata_t *, const dtrace_recdesc_t *, uint_t, 2370Sstevel@tonic-gate const void *, size_t); 2380Sstevel@tonic-gate 2390Sstevel@tonic-gate /* 2400Sstevel@tonic-gate * DTrace Work Interface 2410Sstevel@tonic-gate */ 2420Sstevel@tonic-gate typedef enum { 2430Sstevel@tonic-gate DTRACE_WORKSTATUS_ERROR = -1, 2440Sstevel@tonic-gate DTRACE_WORKSTATUS_OKAY, 2450Sstevel@tonic-gate DTRACE_WORKSTATUS_DONE 2460Sstevel@tonic-gate } dtrace_workstatus_t; 2470Sstevel@tonic-gate 2480Sstevel@tonic-gate extern dtrace_workstatus_t dtrace_work(dtrace_hdl_t *, FILE *, 2490Sstevel@tonic-gate dtrace_consume_probe_f *, dtrace_consume_rec_f *, void *); 2500Sstevel@tonic-gate 2510Sstevel@tonic-gate /* 2520Sstevel@tonic-gate * DTrace Handler Interface 2530Sstevel@tonic-gate */ 2540Sstevel@tonic-gate #define DTRACE_HANDLE_ABORT -1 /* abort current operation */ 2550Sstevel@tonic-gate #define DTRACE_HANDLE_OK 0 /* handled okay; continue */ 2560Sstevel@tonic-gate 2570Sstevel@tonic-gate typedef struct dtrace_errdata { 2580Sstevel@tonic-gate dtrace_hdl_t *dteda_handle; /* handle to DTrace library */ 2590Sstevel@tonic-gate dtrace_eprobedesc_t *dteda_edesc; /* enabled probe inducing err */ 2600Sstevel@tonic-gate dtrace_probedesc_t *dteda_pdesc; /* probe inducing error */ 2610Sstevel@tonic-gate processorid_t dteda_cpu; /* CPU of error */ 2620Sstevel@tonic-gate int dteda_action; /* action inducing error */ 2630Sstevel@tonic-gate int dteda_offset; /* offset in DIFO of error */ 2640Sstevel@tonic-gate int dteda_fault; /* specific fault */ 2650Sstevel@tonic-gate uint64_t dteda_addr; /* address of fault, if any */ 2660Sstevel@tonic-gate const char *dteda_msg; /* preconstructed message */ 2670Sstevel@tonic-gate } dtrace_errdata_t; 2680Sstevel@tonic-gate 269457Sbmc typedef int dtrace_handle_err_f(const dtrace_errdata_t *, void *); 2700Sstevel@tonic-gate extern int dtrace_handle_err(dtrace_hdl_t *, dtrace_handle_err_f *, void *); 2710Sstevel@tonic-gate 2720Sstevel@tonic-gate typedef enum { 2730Sstevel@tonic-gate DTRACEDROP_PRINCIPAL, /* drop to principal buffer */ 2740Sstevel@tonic-gate DTRACEDROP_AGGREGATION, /* drop to aggregation buffer */ 2750Sstevel@tonic-gate DTRACEDROP_DYNAMIC, /* dynamic drop */ 2760Sstevel@tonic-gate DTRACEDROP_DYNRINSE, /* dyn drop due to rinsing */ 2770Sstevel@tonic-gate DTRACEDROP_DYNDIRTY, /* dyn drop due to dirty */ 2780Sstevel@tonic-gate DTRACEDROP_SPEC, /* speculative drop */ 2790Sstevel@tonic-gate DTRACEDROP_SPECBUSY, /* spec drop due to busy */ 280457Sbmc DTRACEDROP_SPECUNAVAIL, /* spec drop due to unavail */ 281457Sbmc DTRACEDROP_STKSTROVERFLOW, /* stack string tab overflow */ 282457Sbmc DTRACEDROP_DBLERROR /* error in ERROR probe */ 2830Sstevel@tonic-gate } dtrace_dropkind_t; 2840Sstevel@tonic-gate 2850Sstevel@tonic-gate typedef struct dtrace_dropdata { 2860Sstevel@tonic-gate dtrace_hdl_t *dtdda_handle; /* handle to DTrace library */ 2870Sstevel@tonic-gate processorid_t dtdda_cpu; /* CPU, if any */ 2880Sstevel@tonic-gate dtrace_dropkind_t dtdda_kind; /* kind of drop */ 2890Sstevel@tonic-gate uint64_t dtdda_drops; /* number of drops */ 2900Sstevel@tonic-gate uint64_t dtdda_total; /* total drops */ 2910Sstevel@tonic-gate const char *dtdda_msg; /* preconstructed message */ 2920Sstevel@tonic-gate } dtrace_dropdata_t; 2930Sstevel@tonic-gate 294457Sbmc typedef int dtrace_handle_drop_f(const dtrace_dropdata_t *, void *); 2950Sstevel@tonic-gate extern int dtrace_handle_drop(dtrace_hdl_t *, dtrace_handle_drop_f *, void *); 2960Sstevel@tonic-gate 2970Sstevel@tonic-gate typedef void dtrace_handle_proc_f(struct ps_prochandle *, void *); 2980Sstevel@tonic-gate extern int dtrace_handle_proc(dtrace_hdl_t *, dtrace_handle_proc_f *, void *); 2990Sstevel@tonic-gate 300*1017Sbmc #define DTRACE_BUFDATA_AGGKEY 0x0001 /* aggregation key */ 301*1017Sbmc #define DTRACE_BUFDATA_AGGVAL 0x0002 /* aggregation value */ 302*1017Sbmc #define DTRACE_BUFDATA_AGGFORMAT 0x0004 /* aggregation format data */ 303*1017Sbmc #define DTRACE_BUFDATA_AGGLAST 0x0008 /* last for this key/val */ 304*1017Sbmc 3050Sstevel@tonic-gate typedef struct dtrace_bufdata { 3060Sstevel@tonic-gate dtrace_hdl_t *dtbda_handle; /* handle to DTrace library */ 3070Sstevel@tonic-gate const char *dtbda_buffered; /* buffered output */ 3080Sstevel@tonic-gate dtrace_probedata_t *dtbda_probe; /* probe data */ 309457Sbmc const dtrace_recdesc_t *dtbda_recdesc; /* record description */ 310457Sbmc const dtrace_aggdata_t *dtbda_aggdata; /* aggregation data, if agg. */ 311*1017Sbmc uint32_t dtbda_flags; /* flags; see above */ 3120Sstevel@tonic-gate } dtrace_bufdata_t; 3130Sstevel@tonic-gate 314457Sbmc typedef int dtrace_handle_buffered_f(const dtrace_bufdata_t *, void *); 3150Sstevel@tonic-gate extern int dtrace_handle_buffered(dtrace_hdl_t *, 3160Sstevel@tonic-gate dtrace_handle_buffered_f *, void *); 3170Sstevel@tonic-gate 318457Sbmc typedef struct dtrace_setoptdata { 319457Sbmc dtrace_hdl_t *dtsda_handle; /* handle to DTrace library */ 320457Sbmc const dtrace_probedata_t *dtsda_probe; /* probe data */ 321457Sbmc const char *dtsda_option; /* option that was set */ 322457Sbmc dtrace_optval_t dtsda_oldval; /* old value */ 323457Sbmc dtrace_optval_t dtsda_newval; /* new value */ 324457Sbmc } dtrace_setoptdata_t; 325457Sbmc 326457Sbmc typedef int dtrace_handle_setopt_f(const dtrace_setoptdata_t *, void *); 327457Sbmc extern int dtrace_handle_setopt(dtrace_hdl_t *, 328457Sbmc dtrace_handle_setopt_f *, void *); 329457Sbmc 3300Sstevel@tonic-gate /* 3310Sstevel@tonic-gate * DTrace Aggregate Interface 3320Sstevel@tonic-gate */ 3330Sstevel@tonic-gate 3340Sstevel@tonic-gate #define DTRACE_A_PERCPU 0x0001 3350Sstevel@tonic-gate #define DTRACE_A_KEEPDELTA 0x0002 3360Sstevel@tonic-gate #define DTRACE_A_ANONYMOUS 0x0004 3370Sstevel@tonic-gate 3380Sstevel@tonic-gate #define DTRACE_AGGWALK_ERROR -1 /* error while processing */ 3390Sstevel@tonic-gate #define DTRACE_AGGWALK_NEXT 0 /* proceed to next element */ 3400Sstevel@tonic-gate #define DTRACE_AGGWALK_ABORT 1 /* abort aggregation walk */ 3410Sstevel@tonic-gate #define DTRACE_AGGWALK_CLEAR 2 /* clear this element */ 3420Sstevel@tonic-gate #define DTRACE_AGGWALK_NORMALIZE 3 /* normalize this element */ 3430Sstevel@tonic-gate #define DTRACE_AGGWALK_DENORMALIZE 4 /* denormalize this element */ 3440Sstevel@tonic-gate #define DTRACE_AGGWALK_REMOVE 5 /* remove this element */ 3450Sstevel@tonic-gate 3460Sstevel@tonic-gate struct dtrace_aggdata { 3470Sstevel@tonic-gate dtrace_hdl_t *dtada_handle; /* handle to DTrace library */ 3480Sstevel@tonic-gate dtrace_aggdesc_t *dtada_desc; /* aggregation description */ 3490Sstevel@tonic-gate dtrace_eprobedesc_t *dtada_edesc; /* enabled probe description */ 3500Sstevel@tonic-gate dtrace_probedesc_t *dtada_pdesc; /* probe description */ 3510Sstevel@tonic-gate caddr_t dtada_data; /* pointer to raw data */ 3520Sstevel@tonic-gate uint64_t dtada_normal; /* the normal -- 1 for denorm */ 3530Sstevel@tonic-gate size_t dtada_size; /* total size of the data */ 3540Sstevel@tonic-gate caddr_t dtada_delta; /* delta data, if available */ 3550Sstevel@tonic-gate caddr_t *dtada_percpu; /* per CPU data, if avail */ 3560Sstevel@tonic-gate caddr_t *dtada_percpu_delta; /* per CPU delta, if avail */ 3570Sstevel@tonic-gate }; 3580Sstevel@tonic-gate 359457Sbmc typedef int dtrace_aggregate_f(const dtrace_aggdata_t *, void *); 3600Sstevel@tonic-gate typedef int dtrace_aggregate_walk_f(dtrace_hdl_t *, 3610Sstevel@tonic-gate dtrace_aggregate_f *, void *); 362*1017Sbmc typedef int dtrace_aggregate_walk_joined_f(const dtrace_aggdata_t **, 363*1017Sbmc const int, void *); 3640Sstevel@tonic-gate 3650Sstevel@tonic-gate extern void dtrace_aggregate_clear(dtrace_hdl_t *); 3660Sstevel@tonic-gate extern int dtrace_aggregate_snap(dtrace_hdl_t *); 3670Sstevel@tonic-gate extern int dtrace_aggregate_print(dtrace_hdl_t *, FILE *, 3680Sstevel@tonic-gate dtrace_aggregate_walk_f *); 3690Sstevel@tonic-gate 3700Sstevel@tonic-gate extern int dtrace_aggregate_walk(dtrace_hdl_t *, dtrace_aggregate_f *, void *); 3710Sstevel@tonic-gate 372*1017Sbmc extern int dtrace_aggregate_walk_joined(dtrace_hdl_t *, 373*1017Sbmc dtrace_aggvarid_t *, int, dtrace_aggregate_walk_joined_f *, void *); 374*1017Sbmc 375*1017Sbmc extern int dtrace_aggregate_walk_sorted(dtrace_hdl_t *, 376*1017Sbmc dtrace_aggregate_f *, void *); 377*1017Sbmc 3780Sstevel@tonic-gate extern int dtrace_aggregate_walk_keysorted(dtrace_hdl_t *, 3790Sstevel@tonic-gate dtrace_aggregate_f *, void *); 3800Sstevel@tonic-gate 3810Sstevel@tonic-gate extern int dtrace_aggregate_walk_valsorted(dtrace_hdl_t *, 3820Sstevel@tonic-gate dtrace_aggregate_f *, void *); 3830Sstevel@tonic-gate 3840Sstevel@tonic-gate extern int dtrace_aggregate_walk_keyvarsorted(dtrace_hdl_t *, 3850Sstevel@tonic-gate dtrace_aggregate_f *, void *); 3860Sstevel@tonic-gate 3870Sstevel@tonic-gate extern int dtrace_aggregate_walk_valvarsorted(dtrace_hdl_t *, 3880Sstevel@tonic-gate dtrace_aggregate_f *, void *); 3890Sstevel@tonic-gate 3900Sstevel@tonic-gate extern int dtrace_aggregate_walk_keyrevsorted(dtrace_hdl_t *, 3910Sstevel@tonic-gate dtrace_aggregate_f *, void *); 3920Sstevel@tonic-gate 3930Sstevel@tonic-gate extern int dtrace_aggregate_walk_valrevsorted(dtrace_hdl_t *, 3940Sstevel@tonic-gate dtrace_aggregate_f *, void *); 3950Sstevel@tonic-gate 3960Sstevel@tonic-gate extern int dtrace_aggregate_walk_keyvarrevsorted(dtrace_hdl_t *, 3970Sstevel@tonic-gate dtrace_aggregate_f *, void *); 3980Sstevel@tonic-gate 3990Sstevel@tonic-gate extern int dtrace_aggregate_walk_valvarrevsorted(dtrace_hdl_t *, 4000Sstevel@tonic-gate dtrace_aggregate_f *, void *); 4010Sstevel@tonic-gate 4020Sstevel@tonic-gate #define DTRACE_AGD_PRINTED 0x1 /* aggregation printed in program */ 4030Sstevel@tonic-gate 4040Sstevel@tonic-gate /* 4050Sstevel@tonic-gate * DTrace Process Control Interface 4060Sstevel@tonic-gate * 4070Sstevel@tonic-gate * Library clients who wish to have libdtrace create or grab processes for 4080Sstevel@tonic-gate * monitoring of their symbol table changes may use these interfaces to 4090Sstevel@tonic-gate * request that libdtrace obtain control of the process using libproc. 4100Sstevel@tonic-gate */ 4110Sstevel@tonic-gate 4120Sstevel@tonic-gate extern struct ps_prochandle *dtrace_proc_create(dtrace_hdl_t *, 4130Sstevel@tonic-gate const char *, char *const *); 4140Sstevel@tonic-gate 4150Sstevel@tonic-gate extern struct ps_prochandle *dtrace_proc_grab(dtrace_hdl_t *, pid_t, int); 4160Sstevel@tonic-gate extern void dtrace_proc_release(dtrace_hdl_t *, struct ps_prochandle *); 4170Sstevel@tonic-gate extern void dtrace_proc_continue(dtrace_hdl_t *, struct ps_prochandle *); 4180Sstevel@tonic-gate 4190Sstevel@tonic-gate /* 4200Sstevel@tonic-gate * DTrace Object, Symbol, and Type Interfaces 4210Sstevel@tonic-gate * 4220Sstevel@tonic-gate * Library clients can use libdtrace to perform symbol and C type information 4230Sstevel@tonic-gate * lookups by symbol name, symbol address, or C type name, or to lookup meta- 4240Sstevel@tonic-gate * information cached for each of the program objects in use by DTrace. The 4250Sstevel@tonic-gate * resulting struct contain pointers to arbitrary-length strings, including 4260Sstevel@tonic-gate * object, symbol, and type names, that are persistent until the next call to 4270Sstevel@tonic-gate * dtrace_update(). Once dtrace_update() is called, any cached values must 4280Sstevel@tonic-gate * be flushed and not used subsequently by the client program. 4290Sstevel@tonic-gate */ 4300Sstevel@tonic-gate 4310Sstevel@tonic-gate #define DTRACE_OBJ_EXEC ((const char *)0L) /* primary executable file */ 4320Sstevel@tonic-gate #define DTRACE_OBJ_RTLD ((const char *)1L) /* run-time link-editor */ 4330Sstevel@tonic-gate #define DTRACE_OBJ_CDEFS ((const char *)2L) /* C include definitions */ 4340Sstevel@tonic-gate #define DTRACE_OBJ_DDEFS ((const char *)3L) /* D program definitions */ 4350Sstevel@tonic-gate #define DTRACE_OBJ_EVERY ((const char *)-1L) /* all known objects */ 4360Sstevel@tonic-gate #define DTRACE_OBJ_KMODS ((const char *)-2L) /* all kernel objects */ 4370Sstevel@tonic-gate #define DTRACE_OBJ_UMODS ((const char *)-3L) /* all user objects */ 4380Sstevel@tonic-gate 4390Sstevel@tonic-gate typedef struct dtrace_objinfo { 4400Sstevel@tonic-gate const char *dto_name; /* object file scope name */ 4410Sstevel@tonic-gate const char *dto_file; /* object file path (if any) */ 4420Sstevel@tonic-gate int dto_id; /* object file id (if any) */ 4430Sstevel@tonic-gate uint_t dto_flags; /* object flags (see below) */ 4440Sstevel@tonic-gate GElf_Addr dto_text_va; /* address of text section */ 4450Sstevel@tonic-gate GElf_Xword dto_text_size; /* size of text section */ 4460Sstevel@tonic-gate GElf_Addr dto_data_va; /* address of data section */ 4470Sstevel@tonic-gate GElf_Xword dto_data_size; /* size of data section */ 4480Sstevel@tonic-gate GElf_Addr dto_bss_va; /* address of BSS */ 4490Sstevel@tonic-gate GElf_Xword dto_bss_size; /* size of BSS */ 4500Sstevel@tonic-gate } dtrace_objinfo_t; 4510Sstevel@tonic-gate 4520Sstevel@tonic-gate #define DTRACE_OBJ_F_KERNEL 0x1 /* object is a kernel module */ 4530Sstevel@tonic-gate #define DTRACE_OBJ_F_PRIMARY 0x2 /* object is a primary module */ 4540Sstevel@tonic-gate 4550Sstevel@tonic-gate typedef int dtrace_obj_f(dtrace_hdl_t *, const dtrace_objinfo_t *, void *); 4560Sstevel@tonic-gate 4570Sstevel@tonic-gate extern int dtrace_object_iter(dtrace_hdl_t *, dtrace_obj_f *, void *); 4580Sstevel@tonic-gate extern int dtrace_object_info(dtrace_hdl_t *, const char *, dtrace_objinfo_t *); 4590Sstevel@tonic-gate 4600Sstevel@tonic-gate typedef struct dtrace_syminfo { 4610Sstevel@tonic-gate const char *dts_object; /* object name */ 4620Sstevel@tonic-gate const char *dts_name; /* symbol name */ 4630Sstevel@tonic-gate ulong_t dts_id; /* symbol id */ 4640Sstevel@tonic-gate } dtrace_syminfo_t; 4650Sstevel@tonic-gate 4660Sstevel@tonic-gate extern int dtrace_lookup_by_name(dtrace_hdl_t *, const char *, const char *, 4670Sstevel@tonic-gate GElf_Sym *, dtrace_syminfo_t *); 4680Sstevel@tonic-gate 4690Sstevel@tonic-gate extern int dtrace_lookup_by_addr(dtrace_hdl_t *, GElf_Addr addr, 4700Sstevel@tonic-gate GElf_Sym *, dtrace_syminfo_t *); 4710Sstevel@tonic-gate 4720Sstevel@tonic-gate typedef struct dtrace_typeinfo { 4730Sstevel@tonic-gate const char *dtt_object; /* object containing type */ 4740Sstevel@tonic-gate ctf_file_t *dtt_ctfp; /* CTF container handle */ 4750Sstevel@tonic-gate ctf_id_t dtt_type; /* CTF type identifier */ 4760Sstevel@tonic-gate } dtrace_typeinfo_t; 4770Sstevel@tonic-gate 4780Sstevel@tonic-gate extern int dtrace_lookup_by_type(dtrace_hdl_t *, const char *, const char *, 4790Sstevel@tonic-gate dtrace_typeinfo_t *); 4800Sstevel@tonic-gate 4810Sstevel@tonic-gate extern int dtrace_symbol_type(dtrace_hdl_t *, const GElf_Sym *, 4820Sstevel@tonic-gate const dtrace_syminfo_t *, dtrace_typeinfo_t *); 4830Sstevel@tonic-gate 4840Sstevel@tonic-gate extern int dtrace_type_strcompile(dtrace_hdl_t *, 4850Sstevel@tonic-gate const char *, dtrace_typeinfo_t *); 4860Sstevel@tonic-gate 4870Sstevel@tonic-gate extern int dtrace_type_fcompile(dtrace_hdl_t *, 4880Sstevel@tonic-gate FILE *, dtrace_typeinfo_t *); 4890Sstevel@tonic-gate 4900Sstevel@tonic-gate /* 4910Sstevel@tonic-gate * DTrace Probe Interface 4920Sstevel@tonic-gate * 4930Sstevel@tonic-gate * Library clients can use these functions to iterate over the set of available 4940Sstevel@tonic-gate * probe definitions and inquire as to their attributes. The probe iteration 4950Sstevel@tonic-gate * interfaces report probes that are declared as well as those from dtrace(7D). 4960Sstevel@tonic-gate */ 4970Sstevel@tonic-gate typedef struct dtrace_probeinfo { 4980Sstevel@tonic-gate dtrace_attribute_t dtp_attr; /* name attributes */ 4990Sstevel@tonic-gate dtrace_attribute_t dtp_arga; /* arg attributes */ 5000Sstevel@tonic-gate const dtrace_typeinfo_t *dtp_argv; /* arg types */ 5010Sstevel@tonic-gate int dtp_argc; /* arg count */ 5020Sstevel@tonic-gate } dtrace_probeinfo_t; 5030Sstevel@tonic-gate 5040Sstevel@tonic-gate typedef int dtrace_probe_f(dtrace_hdl_t *, const dtrace_probedesc_t *, void *); 5050Sstevel@tonic-gate 5060Sstevel@tonic-gate extern int dtrace_probe_iter(dtrace_hdl_t *, 5070Sstevel@tonic-gate const dtrace_probedesc_t *pdp, dtrace_probe_f *, void *); 5080Sstevel@tonic-gate 5090Sstevel@tonic-gate extern int dtrace_probe_info(dtrace_hdl_t *, 5100Sstevel@tonic-gate const dtrace_probedesc_t *, dtrace_probeinfo_t *); 5110Sstevel@tonic-gate 5120Sstevel@tonic-gate /* 5130Sstevel@tonic-gate * DTrace Vector Interface 5140Sstevel@tonic-gate * 5150Sstevel@tonic-gate * The DTrace library normally speaks directly to dtrace(7D). However, 5160Sstevel@tonic-gate * this communication may be vectored elsewhere. Consumers who wish to 5170Sstevel@tonic-gate * perform a vectored open must fill in the vector, and use the dtrace_vopen() 5180Sstevel@tonic-gate * entry point to obtain a library handle. 5190Sstevel@tonic-gate */ 5200Sstevel@tonic-gate struct dtrace_vector { 5210Sstevel@tonic-gate int (*dtv_ioctl)(void *, int, void *); 5220Sstevel@tonic-gate int (*dtv_lookup_by_addr)(void *, GElf_Addr, GElf_Sym *, 5230Sstevel@tonic-gate dtrace_syminfo_t *); 5240Sstevel@tonic-gate int (*dtv_status)(void *, processorid_t); 5250Sstevel@tonic-gate long (*dtv_sysconf)(void *, int); 5260Sstevel@tonic-gate }; 5270Sstevel@tonic-gate 5280Sstevel@tonic-gate /* 5290Sstevel@tonic-gate * DTrace Utility Functions 5300Sstevel@tonic-gate * 531457Sbmc * Library clients can use these functions to convert addresses strings, to 532457Sbmc * convert between string and integer probe descriptions and the 533457Sbmc * dtrace_probedesc_t representation, and to perform similar conversions on 534457Sbmc * stability attributes. 5350Sstevel@tonic-gate */ 536457Sbmc extern int dtrace_addr2str(dtrace_hdl_t *, uint64_t, char *, int); 537457Sbmc extern int dtrace_uaddr2str(dtrace_hdl_t *, pid_t, uint64_t, char *, int); 538457Sbmc 5390Sstevel@tonic-gate extern int dtrace_xstr2desc(dtrace_hdl_t *, dtrace_probespec_t, 5400Sstevel@tonic-gate const char *, int, char *const [], dtrace_probedesc_t *); 5410Sstevel@tonic-gate 5420Sstevel@tonic-gate extern int dtrace_str2desc(dtrace_hdl_t *, dtrace_probespec_t, 5430Sstevel@tonic-gate const char *, dtrace_probedesc_t *); 5440Sstevel@tonic-gate 5450Sstevel@tonic-gate extern int dtrace_id2desc(dtrace_hdl_t *, dtrace_id_t, dtrace_probedesc_t *); 5460Sstevel@tonic-gate 5470Sstevel@tonic-gate #define DTRACE_DESC2STR_MAX 1024 /* min buf size for dtrace_desc2str() */ 5480Sstevel@tonic-gate 5490Sstevel@tonic-gate extern char *dtrace_desc2str(const dtrace_probedesc_t *, char *, size_t); 5500Sstevel@tonic-gate 5510Sstevel@tonic-gate #define DTRACE_ATTR2STR_MAX 64 /* min buf size for dtrace_attr2str() */ 5520Sstevel@tonic-gate 5530Sstevel@tonic-gate extern char *dtrace_attr2str(dtrace_attribute_t, char *, size_t); 5540Sstevel@tonic-gate extern int dtrace_str2attr(const char *, dtrace_attribute_t *); 5550Sstevel@tonic-gate 5560Sstevel@tonic-gate extern const char *dtrace_stability_name(dtrace_stability_t); 5570Sstevel@tonic-gate extern const char *dtrace_class_name(dtrace_class_t); 5580Sstevel@tonic-gate 5590Sstevel@tonic-gate extern int dtrace_provider_modules(dtrace_hdl_t *, const char **, int); 5600Sstevel@tonic-gate 5610Sstevel@tonic-gate extern const char *const _dtrace_version; 5620Sstevel@tonic-gate extern int _dtrace_debug; 5630Sstevel@tonic-gate 5640Sstevel@tonic-gate #ifdef __cplusplus 5650Sstevel@tonic-gate } 5660Sstevel@tonic-gate #endif 5670Sstevel@tonic-gate 5680Sstevel@tonic-gate #endif /* _DTRACE_H */ 569