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 5*5478Sjhaslam * Common Development and Distribution License (the "License"). 6*5478Sjhaslam * You may not use this file except in compliance with the License. 70Sstevel@tonic-gate * 80Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 90Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 100Sstevel@tonic-gate * See the License for the specific language governing permissions 110Sstevel@tonic-gate * and limitations under the License. 120Sstevel@tonic-gate * 130Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 140Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 150Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 160Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 170Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 180Sstevel@tonic-gate * 190Sstevel@tonic-gate * CDDL HEADER END 200Sstevel@tonic-gate */ 211399Sahl 220Sstevel@tonic-gate /* 23*5478Sjhaslam * Copyright 2007 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 521399Sahl #define DTRACE_VERSION 3 /* 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 */ 116*5478Sjhaslam #define DTRACE_C_CTL 0x2000 /* Only process control directives */ 117*5478Sjhaslam #define DTRACE_C_MASK 0x3bff /* mask of all valid flags to dtrace_*compile */ 1180Sstevel@tonic-gate 1190Sstevel@tonic-gate extern dtrace_prog_t *dtrace_program_strcompile(dtrace_hdl_t *, 1200Sstevel@tonic-gate const char *, dtrace_probespec_t, uint_t, int, char *const []); 1210Sstevel@tonic-gate 1220Sstevel@tonic-gate extern dtrace_prog_t *dtrace_program_fcompile(dtrace_hdl_t *, 1230Sstevel@tonic-gate FILE *, uint_t, int, char *const []); 1240Sstevel@tonic-gate 1250Sstevel@tonic-gate extern int dtrace_program_exec(dtrace_hdl_t *, dtrace_prog_t *, 1260Sstevel@tonic-gate dtrace_proginfo_t *); 1270Sstevel@tonic-gate extern void dtrace_program_info(dtrace_hdl_t *, dtrace_prog_t *, 1280Sstevel@tonic-gate dtrace_proginfo_t *); 1290Sstevel@tonic-gate 1300Sstevel@tonic-gate #define DTRACE_D_STRIP 0x01 /* strip non-loadable sections from program */ 1310Sstevel@tonic-gate #define DTRACE_D_PROBES 0x02 /* include provider and probe definitions */ 1320Sstevel@tonic-gate #define DTRACE_D_MASK 0x03 /* mask of valid flags to dtrace_dof_create */ 1330Sstevel@tonic-gate 1340Sstevel@tonic-gate extern int dtrace_program_link(dtrace_hdl_t *, dtrace_prog_t *, 1350Sstevel@tonic-gate uint_t, const char *, int, char *const []); 1360Sstevel@tonic-gate 1371399Sahl extern int dtrace_program_header(dtrace_hdl_t *, FILE *, const char *); 1381399Sahl 1390Sstevel@tonic-gate extern void *dtrace_dof_create(dtrace_hdl_t *, dtrace_prog_t *, uint_t); 1400Sstevel@tonic-gate extern void dtrace_dof_destroy(dtrace_hdl_t *, void *); 1410Sstevel@tonic-gate 1420Sstevel@tonic-gate extern void *dtrace_getopt_dof(dtrace_hdl_t *); 1430Sstevel@tonic-gate extern void *dtrace_geterr_dof(dtrace_hdl_t *); 1440Sstevel@tonic-gate 1450Sstevel@tonic-gate typedef struct dtrace_stmtdesc { 1460Sstevel@tonic-gate dtrace_ecbdesc_t *dtsd_ecbdesc; /* ECB description */ 1470Sstevel@tonic-gate dtrace_actdesc_t *dtsd_action; /* action list */ 1480Sstevel@tonic-gate dtrace_actdesc_t *dtsd_action_last; /* last action in action list */ 1490Sstevel@tonic-gate void *dtsd_aggdata; /* aggregation data */ 1500Sstevel@tonic-gate void *dtsd_fmtdata; /* type-specific output data */ 1510Sstevel@tonic-gate void (*dtsd_callback)(); /* callback function for EPID */ 1520Sstevel@tonic-gate void *dtsd_data; /* callback data pointer */ 1530Sstevel@tonic-gate dtrace_attribute_t dtsd_descattr; /* probedesc attributes */ 1540Sstevel@tonic-gate dtrace_attribute_t dtsd_stmtattr; /* statement attributes */ 1550Sstevel@tonic-gate } dtrace_stmtdesc_t; 1560Sstevel@tonic-gate 1570Sstevel@tonic-gate typedef int dtrace_stmt_f(dtrace_hdl_t *, dtrace_prog_t *, 1580Sstevel@tonic-gate dtrace_stmtdesc_t *, void *); 1590Sstevel@tonic-gate 1600Sstevel@tonic-gate extern dtrace_stmtdesc_t *dtrace_stmt_create(dtrace_hdl_t *, 1610Sstevel@tonic-gate dtrace_ecbdesc_t *); 1620Sstevel@tonic-gate extern dtrace_actdesc_t *dtrace_stmt_action(dtrace_hdl_t *, 1630Sstevel@tonic-gate dtrace_stmtdesc_t *); 1640Sstevel@tonic-gate extern int dtrace_stmt_add(dtrace_hdl_t *, dtrace_prog_t *, 1650Sstevel@tonic-gate dtrace_stmtdesc_t *); 1660Sstevel@tonic-gate extern int dtrace_stmt_iter(dtrace_hdl_t *, dtrace_prog_t *, 1670Sstevel@tonic-gate dtrace_stmt_f *, void *); 168265Smws extern void dtrace_stmt_destroy(dtrace_hdl_t *, dtrace_stmtdesc_t *); 1690Sstevel@tonic-gate 1700Sstevel@tonic-gate /* 1710Sstevel@tonic-gate * DTrace Data Consumption Interface 1720Sstevel@tonic-gate */ 1730Sstevel@tonic-gate typedef enum { 1740Sstevel@tonic-gate DTRACEFLOW_ENTRY, 1750Sstevel@tonic-gate DTRACEFLOW_RETURN, 1760Sstevel@tonic-gate DTRACEFLOW_NONE 1770Sstevel@tonic-gate } dtrace_flowkind_t; 1780Sstevel@tonic-gate 1790Sstevel@tonic-gate #define DTRACE_CONSUME_ERROR -1 /* error while processing */ 1800Sstevel@tonic-gate #define DTRACE_CONSUME_THIS 0 /* consume this probe/record */ 1810Sstevel@tonic-gate #define DTRACE_CONSUME_NEXT 1 /* advance to next probe/rec */ 1820Sstevel@tonic-gate #define DTRACE_CONSUME_ABORT 2 /* abort consumption */ 1830Sstevel@tonic-gate 1840Sstevel@tonic-gate typedef struct dtrace_probedata { 1850Sstevel@tonic-gate dtrace_hdl_t *dtpda_handle; /* handle to DTrace library */ 1860Sstevel@tonic-gate dtrace_eprobedesc_t *dtpda_edesc; /* enabled probe description */ 1870Sstevel@tonic-gate dtrace_probedesc_t *dtpda_pdesc; /* probe description */ 1880Sstevel@tonic-gate processorid_t dtpda_cpu; /* CPU for data */ 1890Sstevel@tonic-gate caddr_t dtpda_data; /* pointer to raw data */ 1900Sstevel@tonic-gate dtrace_flowkind_t dtpda_flow; /* flow kind */ 1910Sstevel@tonic-gate const char *dtpda_prefix; /* recommended flow prefix */ 1920Sstevel@tonic-gate int dtpda_indent; /* recommended flow indent */ 1930Sstevel@tonic-gate } dtrace_probedata_t; 1940Sstevel@tonic-gate 1950Sstevel@tonic-gate typedef int dtrace_consume_probe_f(const dtrace_probedata_t *, void *); 1960Sstevel@tonic-gate typedef int dtrace_consume_rec_f(const dtrace_probedata_t *, 1970Sstevel@tonic-gate const dtrace_recdesc_t *, void *); 1980Sstevel@tonic-gate 1990Sstevel@tonic-gate extern int dtrace_consume(dtrace_hdl_t *, FILE *, 2000Sstevel@tonic-gate dtrace_consume_probe_f *, dtrace_consume_rec_f *, void *); 2010Sstevel@tonic-gate 2020Sstevel@tonic-gate #define DTRACE_STATUS_NONE 0 /* no status; not yet time */ 2030Sstevel@tonic-gate #define DTRACE_STATUS_OKAY 1 /* status okay */ 2040Sstevel@tonic-gate #define DTRACE_STATUS_EXITED 2 /* exit() was called; tracing stopped */ 2050Sstevel@tonic-gate #define DTRACE_STATUS_FILLED 3 /* fill buffer filled; tracing stoped */ 2060Sstevel@tonic-gate #define DTRACE_STATUS_STOPPED 4 /* tracing already stopped */ 2070Sstevel@tonic-gate 2080Sstevel@tonic-gate extern int dtrace_status(dtrace_hdl_t *); 2090Sstevel@tonic-gate 2100Sstevel@tonic-gate /* 2110Sstevel@tonic-gate * DTrace Formatted Output Interfaces 2120Sstevel@tonic-gate * 2130Sstevel@tonic-gate * To format output associated with a given dtrace_stmtdesc, the caller can 2140Sstevel@tonic-gate * invoke one of the following functions, passing the opaque dtsd_fmtdata and a 2150Sstevel@tonic-gate * list of record descriptions. These functions return either -1 to indicate 2160Sstevel@tonic-gate * an error, or a positive integer indicating the number of records consumed. 2170Sstevel@tonic-gate * For anonymous enablings, the consumer can use the dtrd_format member of 2180Sstevel@tonic-gate * the record description to obtain a format description. The dtfd_string 2190Sstevel@tonic-gate * member of the format description may be passed to dtrace_print{fa}_create() 2200Sstevel@tonic-gate * to create the opaque format data. 2210Sstevel@tonic-gate */ 2220Sstevel@tonic-gate extern void *dtrace_printf_create(dtrace_hdl_t *, const char *); 2230Sstevel@tonic-gate extern void *dtrace_printa_create(dtrace_hdl_t *, const char *); 2240Sstevel@tonic-gate extern size_t dtrace_printf_format(dtrace_hdl_t *, void *, char *, size_t); 2250Sstevel@tonic-gate 2260Sstevel@tonic-gate extern int dtrace_fprintf(dtrace_hdl_t *, FILE *, void *, 2270Sstevel@tonic-gate const dtrace_probedata_t *, const dtrace_recdesc_t *, uint_t, 2280Sstevel@tonic-gate const void *, size_t); 2290Sstevel@tonic-gate 2300Sstevel@tonic-gate extern int dtrace_fprinta(dtrace_hdl_t *, FILE *, void *, 2310Sstevel@tonic-gate const dtrace_probedata_t *, const dtrace_recdesc_t *, uint_t, 2320Sstevel@tonic-gate const void *, size_t); 2330Sstevel@tonic-gate 2340Sstevel@tonic-gate extern int dtrace_system(dtrace_hdl_t *, FILE *, void *, 2350Sstevel@tonic-gate const dtrace_probedata_t *, const dtrace_recdesc_t *, uint_t, 2360Sstevel@tonic-gate const void *, size_t); 2370Sstevel@tonic-gate 2380Sstevel@tonic-gate extern int dtrace_freopen(dtrace_hdl_t *, FILE *, void *, 2390Sstevel@tonic-gate const dtrace_probedata_t *, const dtrace_recdesc_t *, uint_t, 2400Sstevel@tonic-gate const void *, size_t); 2410Sstevel@tonic-gate 2420Sstevel@tonic-gate /* 2430Sstevel@tonic-gate * DTrace Work Interface 2440Sstevel@tonic-gate */ 2450Sstevel@tonic-gate typedef enum { 2460Sstevel@tonic-gate DTRACE_WORKSTATUS_ERROR = -1, 2470Sstevel@tonic-gate DTRACE_WORKSTATUS_OKAY, 2480Sstevel@tonic-gate DTRACE_WORKSTATUS_DONE 2490Sstevel@tonic-gate } dtrace_workstatus_t; 2500Sstevel@tonic-gate 2510Sstevel@tonic-gate extern dtrace_workstatus_t dtrace_work(dtrace_hdl_t *, FILE *, 2520Sstevel@tonic-gate dtrace_consume_probe_f *, dtrace_consume_rec_f *, void *); 2530Sstevel@tonic-gate 2540Sstevel@tonic-gate /* 2550Sstevel@tonic-gate * DTrace Handler Interface 2560Sstevel@tonic-gate */ 2570Sstevel@tonic-gate #define DTRACE_HANDLE_ABORT -1 /* abort current operation */ 2580Sstevel@tonic-gate #define DTRACE_HANDLE_OK 0 /* handled okay; continue */ 2590Sstevel@tonic-gate 2600Sstevel@tonic-gate typedef struct dtrace_errdata { 2610Sstevel@tonic-gate dtrace_hdl_t *dteda_handle; /* handle to DTrace library */ 2620Sstevel@tonic-gate dtrace_eprobedesc_t *dteda_edesc; /* enabled probe inducing err */ 2630Sstevel@tonic-gate dtrace_probedesc_t *dteda_pdesc; /* probe inducing error */ 2640Sstevel@tonic-gate processorid_t dteda_cpu; /* CPU of error */ 2650Sstevel@tonic-gate int dteda_action; /* action inducing error */ 2660Sstevel@tonic-gate int dteda_offset; /* offset in DIFO of error */ 2670Sstevel@tonic-gate int dteda_fault; /* specific fault */ 2680Sstevel@tonic-gate uint64_t dteda_addr; /* address of fault, if any */ 2690Sstevel@tonic-gate const char *dteda_msg; /* preconstructed message */ 2700Sstevel@tonic-gate } dtrace_errdata_t; 2710Sstevel@tonic-gate 272457Sbmc typedef int dtrace_handle_err_f(const dtrace_errdata_t *, void *); 2730Sstevel@tonic-gate extern int dtrace_handle_err(dtrace_hdl_t *, dtrace_handle_err_f *, void *); 2740Sstevel@tonic-gate 2750Sstevel@tonic-gate typedef enum { 2760Sstevel@tonic-gate DTRACEDROP_PRINCIPAL, /* drop to principal buffer */ 2770Sstevel@tonic-gate DTRACEDROP_AGGREGATION, /* drop to aggregation buffer */ 2780Sstevel@tonic-gate DTRACEDROP_DYNAMIC, /* dynamic drop */ 2790Sstevel@tonic-gate DTRACEDROP_DYNRINSE, /* dyn drop due to rinsing */ 2800Sstevel@tonic-gate DTRACEDROP_DYNDIRTY, /* dyn drop due to dirty */ 2810Sstevel@tonic-gate DTRACEDROP_SPEC, /* speculative drop */ 2820Sstevel@tonic-gate DTRACEDROP_SPECBUSY, /* spec drop due to busy */ 283457Sbmc DTRACEDROP_SPECUNAVAIL, /* spec drop due to unavail */ 284457Sbmc DTRACEDROP_STKSTROVERFLOW, /* stack string tab overflow */ 285457Sbmc DTRACEDROP_DBLERROR /* error in ERROR probe */ 2860Sstevel@tonic-gate } dtrace_dropkind_t; 2870Sstevel@tonic-gate 2880Sstevel@tonic-gate typedef struct dtrace_dropdata { 2890Sstevel@tonic-gate dtrace_hdl_t *dtdda_handle; /* handle to DTrace library */ 2900Sstevel@tonic-gate processorid_t dtdda_cpu; /* CPU, if any */ 2910Sstevel@tonic-gate dtrace_dropkind_t dtdda_kind; /* kind of drop */ 2920Sstevel@tonic-gate uint64_t dtdda_drops; /* number of drops */ 2930Sstevel@tonic-gate uint64_t dtdda_total; /* total drops */ 2940Sstevel@tonic-gate const char *dtdda_msg; /* preconstructed message */ 2950Sstevel@tonic-gate } dtrace_dropdata_t; 2960Sstevel@tonic-gate 297457Sbmc typedef int dtrace_handle_drop_f(const dtrace_dropdata_t *, void *); 2980Sstevel@tonic-gate extern int dtrace_handle_drop(dtrace_hdl_t *, dtrace_handle_drop_f *, void *); 2990Sstevel@tonic-gate 3001399Sahl typedef void dtrace_handle_proc_f(struct ps_prochandle *, const char *, void *); 3010Sstevel@tonic-gate extern int dtrace_handle_proc(dtrace_hdl_t *, dtrace_handle_proc_f *, void *); 3020Sstevel@tonic-gate 3031017Sbmc #define DTRACE_BUFDATA_AGGKEY 0x0001 /* aggregation key */ 3041017Sbmc #define DTRACE_BUFDATA_AGGVAL 0x0002 /* aggregation value */ 3051017Sbmc #define DTRACE_BUFDATA_AGGFORMAT 0x0004 /* aggregation format data */ 3061017Sbmc #define DTRACE_BUFDATA_AGGLAST 0x0008 /* last for this key/val */ 3071017Sbmc 3080Sstevel@tonic-gate typedef struct dtrace_bufdata { 3090Sstevel@tonic-gate dtrace_hdl_t *dtbda_handle; /* handle to DTrace library */ 3100Sstevel@tonic-gate const char *dtbda_buffered; /* buffered output */ 3110Sstevel@tonic-gate dtrace_probedata_t *dtbda_probe; /* probe data */ 312457Sbmc const dtrace_recdesc_t *dtbda_recdesc; /* record description */ 313457Sbmc const dtrace_aggdata_t *dtbda_aggdata; /* aggregation data, if agg. */ 3141017Sbmc uint32_t dtbda_flags; /* flags; see above */ 3150Sstevel@tonic-gate } dtrace_bufdata_t; 3160Sstevel@tonic-gate 317457Sbmc typedef int dtrace_handle_buffered_f(const dtrace_bufdata_t *, void *); 3180Sstevel@tonic-gate extern int dtrace_handle_buffered(dtrace_hdl_t *, 3190Sstevel@tonic-gate dtrace_handle_buffered_f *, void *); 3200Sstevel@tonic-gate 321457Sbmc typedef struct dtrace_setoptdata { 322457Sbmc dtrace_hdl_t *dtsda_handle; /* handle to DTrace library */ 323457Sbmc const dtrace_probedata_t *dtsda_probe; /* probe data */ 324457Sbmc const char *dtsda_option; /* option that was set */ 325457Sbmc dtrace_optval_t dtsda_oldval; /* old value */ 326457Sbmc dtrace_optval_t dtsda_newval; /* new value */ 327457Sbmc } dtrace_setoptdata_t; 328457Sbmc 329457Sbmc typedef int dtrace_handle_setopt_f(const dtrace_setoptdata_t *, void *); 330457Sbmc extern int dtrace_handle_setopt(dtrace_hdl_t *, 331457Sbmc dtrace_handle_setopt_f *, void *); 332457Sbmc 3330Sstevel@tonic-gate /* 3340Sstevel@tonic-gate * DTrace Aggregate Interface 3350Sstevel@tonic-gate */ 3360Sstevel@tonic-gate 3370Sstevel@tonic-gate #define DTRACE_A_PERCPU 0x0001 3380Sstevel@tonic-gate #define DTRACE_A_KEEPDELTA 0x0002 3390Sstevel@tonic-gate #define DTRACE_A_ANONYMOUS 0x0004 3400Sstevel@tonic-gate 3410Sstevel@tonic-gate #define DTRACE_AGGWALK_ERROR -1 /* error while processing */ 3420Sstevel@tonic-gate #define DTRACE_AGGWALK_NEXT 0 /* proceed to next element */ 3430Sstevel@tonic-gate #define DTRACE_AGGWALK_ABORT 1 /* abort aggregation walk */ 3440Sstevel@tonic-gate #define DTRACE_AGGWALK_CLEAR 2 /* clear this element */ 3450Sstevel@tonic-gate #define DTRACE_AGGWALK_NORMALIZE 3 /* normalize this element */ 3460Sstevel@tonic-gate #define DTRACE_AGGWALK_DENORMALIZE 4 /* denormalize this element */ 3470Sstevel@tonic-gate #define DTRACE_AGGWALK_REMOVE 5 /* remove this element */ 3480Sstevel@tonic-gate 3490Sstevel@tonic-gate struct dtrace_aggdata { 3500Sstevel@tonic-gate dtrace_hdl_t *dtada_handle; /* handle to DTrace library */ 3510Sstevel@tonic-gate dtrace_aggdesc_t *dtada_desc; /* aggregation description */ 3520Sstevel@tonic-gate dtrace_eprobedesc_t *dtada_edesc; /* enabled probe description */ 3530Sstevel@tonic-gate dtrace_probedesc_t *dtada_pdesc; /* probe description */ 3540Sstevel@tonic-gate caddr_t dtada_data; /* pointer to raw data */ 3550Sstevel@tonic-gate uint64_t dtada_normal; /* the normal -- 1 for denorm */ 3560Sstevel@tonic-gate size_t dtada_size; /* total size of the data */ 3570Sstevel@tonic-gate caddr_t dtada_delta; /* delta data, if available */ 3580Sstevel@tonic-gate caddr_t *dtada_percpu; /* per CPU data, if avail */ 3590Sstevel@tonic-gate caddr_t *dtada_percpu_delta; /* per CPU delta, if avail */ 3600Sstevel@tonic-gate }; 3610Sstevel@tonic-gate 362457Sbmc typedef int dtrace_aggregate_f(const dtrace_aggdata_t *, void *); 3630Sstevel@tonic-gate typedef int dtrace_aggregate_walk_f(dtrace_hdl_t *, 3640Sstevel@tonic-gate dtrace_aggregate_f *, void *); 3651017Sbmc typedef int dtrace_aggregate_walk_joined_f(const dtrace_aggdata_t **, 3661017Sbmc const int, void *); 3670Sstevel@tonic-gate 3680Sstevel@tonic-gate extern void dtrace_aggregate_clear(dtrace_hdl_t *); 3690Sstevel@tonic-gate extern int dtrace_aggregate_snap(dtrace_hdl_t *); 3700Sstevel@tonic-gate extern int dtrace_aggregate_print(dtrace_hdl_t *, FILE *, 3710Sstevel@tonic-gate dtrace_aggregate_walk_f *); 3720Sstevel@tonic-gate 3730Sstevel@tonic-gate extern int dtrace_aggregate_walk(dtrace_hdl_t *, dtrace_aggregate_f *, void *); 3740Sstevel@tonic-gate 3751017Sbmc extern int dtrace_aggregate_walk_joined(dtrace_hdl_t *, 3761017Sbmc dtrace_aggvarid_t *, int, dtrace_aggregate_walk_joined_f *, void *); 3771017Sbmc 3781017Sbmc extern int dtrace_aggregate_walk_sorted(dtrace_hdl_t *, 3791017Sbmc dtrace_aggregate_f *, void *); 3801017Sbmc 3810Sstevel@tonic-gate extern int dtrace_aggregate_walk_keysorted(dtrace_hdl_t *, 3820Sstevel@tonic-gate dtrace_aggregate_f *, void *); 3830Sstevel@tonic-gate 3840Sstevel@tonic-gate extern int dtrace_aggregate_walk_valsorted(dtrace_hdl_t *, 3850Sstevel@tonic-gate dtrace_aggregate_f *, void *); 3860Sstevel@tonic-gate 3870Sstevel@tonic-gate extern int dtrace_aggregate_walk_keyvarsorted(dtrace_hdl_t *, 3880Sstevel@tonic-gate dtrace_aggregate_f *, void *); 3890Sstevel@tonic-gate 3900Sstevel@tonic-gate extern int dtrace_aggregate_walk_valvarsorted(dtrace_hdl_t *, 3910Sstevel@tonic-gate dtrace_aggregate_f *, void *); 3920Sstevel@tonic-gate 3930Sstevel@tonic-gate extern int dtrace_aggregate_walk_keyrevsorted(dtrace_hdl_t *, 3940Sstevel@tonic-gate dtrace_aggregate_f *, void *); 3950Sstevel@tonic-gate 3960Sstevel@tonic-gate extern int dtrace_aggregate_walk_valrevsorted(dtrace_hdl_t *, 3970Sstevel@tonic-gate dtrace_aggregate_f *, void *); 3980Sstevel@tonic-gate 3990Sstevel@tonic-gate extern int dtrace_aggregate_walk_keyvarrevsorted(dtrace_hdl_t *, 4000Sstevel@tonic-gate dtrace_aggregate_f *, void *); 4010Sstevel@tonic-gate 4020Sstevel@tonic-gate extern int dtrace_aggregate_walk_valvarrevsorted(dtrace_hdl_t *, 4030Sstevel@tonic-gate dtrace_aggregate_f *, void *); 4040Sstevel@tonic-gate 4050Sstevel@tonic-gate #define DTRACE_AGD_PRINTED 0x1 /* aggregation printed in program */ 4060Sstevel@tonic-gate 4070Sstevel@tonic-gate /* 4080Sstevel@tonic-gate * DTrace Process Control Interface 4090Sstevel@tonic-gate * 4100Sstevel@tonic-gate * Library clients who wish to have libdtrace create or grab processes for 4110Sstevel@tonic-gate * monitoring of their symbol table changes may use these interfaces to 4120Sstevel@tonic-gate * request that libdtrace obtain control of the process using libproc. 4130Sstevel@tonic-gate */ 4140Sstevel@tonic-gate 4150Sstevel@tonic-gate extern struct ps_prochandle *dtrace_proc_create(dtrace_hdl_t *, 4160Sstevel@tonic-gate const char *, char *const *); 4170Sstevel@tonic-gate 4180Sstevel@tonic-gate extern struct ps_prochandle *dtrace_proc_grab(dtrace_hdl_t *, pid_t, int); 4190Sstevel@tonic-gate extern void dtrace_proc_release(dtrace_hdl_t *, struct ps_prochandle *); 4200Sstevel@tonic-gate extern void dtrace_proc_continue(dtrace_hdl_t *, struct ps_prochandle *); 4210Sstevel@tonic-gate 4220Sstevel@tonic-gate /* 4230Sstevel@tonic-gate * DTrace Object, Symbol, and Type Interfaces 4240Sstevel@tonic-gate * 4250Sstevel@tonic-gate * Library clients can use libdtrace to perform symbol and C type information 4260Sstevel@tonic-gate * lookups by symbol name, symbol address, or C type name, or to lookup meta- 4270Sstevel@tonic-gate * information cached for each of the program objects in use by DTrace. The 4280Sstevel@tonic-gate * resulting struct contain pointers to arbitrary-length strings, including 4290Sstevel@tonic-gate * object, symbol, and type names, that are persistent until the next call to 4300Sstevel@tonic-gate * dtrace_update(). Once dtrace_update() is called, any cached values must 4310Sstevel@tonic-gate * be flushed and not used subsequently by the client program. 4320Sstevel@tonic-gate */ 4330Sstevel@tonic-gate 4340Sstevel@tonic-gate #define DTRACE_OBJ_EXEC ((const char *)0L) /* primary executable file */ 4350Sstevel@tonic-gate #define DTRACE_OBJ_RTLD ((const char *)1L) /* run-time link-editor */ 4360Sstevel@tonic-gate #define DTRACE_OBJ_CDEFS ((const char *)2L) /* C include definitions */ 4370Sstevel@tonic-gate #define DTRACE_OBJ_DDEFS ((const char *)3L) /* D program definitions */ 4380Sstevel@tonic-gate #define DTRACE_OBJ_EVERY ((const char *)-1L) /* all known objects */ 4390Sstevel@tonic-gate #define DTRACE_OBJ_KMODS ((const char *)-2L) /* all kernel objects */ 4400Sstevel@tonic-gate #define DTRACE_OBJ_UMODS ((const char *)-3L) /* all user objects */ 4410Sstevel@tonic-gate 4420Sstevel@tonic-gate typedef struct dtrace_objinfo { 4430Sstevel@tonic-gate const char *dto_name; /* object file scope name */ 4440Sstevel@tonic-gate const char *dto_file; /* object file path (if any) */ 4450Sstevel@tonic-gate int dto_id; /* object file id (if any) */ 4460Sstevel@tonic-gate uint_t dto_flags; /* object flags (see below) */ 4470Sstevel@tonic-gate GElf_Addr dto_text_va; /* address of text section */ 4480Sstevel@tonic-gate GElf_Xword dto_text_size; /* size of text section */ 4490Sstevel@tonic-gate GElf_Addr dto_data_va; /* address of data section */ 4500Sstevel@tonic-gate GElf_Xword dto_data_size; /* size of data section */ 4510Sstevel@tonic-gate GElf_Addr dto_bss_va; /* address of BSS */ 4520Sstevel@tonic-gate GElf_Xword dto_bss_size; /* size of BSS */ 4530Sstevel@tonic-gate } dtrace_objinfo_t; 4540Sstevel@tonic-gate 4550Sstevel@tonic-gate #define DTRACE_OBJ_F_KERNEL 0x1 /* object is a kernel module */ 4560Sstevel@tonic-gate #define DTRACE_OBJ_F_PRIMARY 0x2 /* object is a primary module */ 4570Sstevel@tonic-gate 4580Sstevel@tonic-gate typedef int dtrace_obj_f(dtrace_hdl_t *, const dtrace_objinfo_t *, void *); 4590Sstevel@tonic-gate 4600Sstevel@tonic-gate extern int dtrace_object_iter(dtrace_hdl_t *, dtrace_obj_f *, void *); 4610Sstevel@tonic-gate extern int dtrace_object_info(dtrace_hdl_t *, const char *, dtrace_objinfo_t *); 4620Sstevel@tonic-gate 4630Sstevel@tonic-gate typedef struct dtrace_syminfo { 4640Sstevel@tonic-gate const char *dts_object; /* object name */ 4650Sstevel@tonic-gate const char *dts_name; /* symbol name */ 4660Sstevel@tonic-gate ulong_t dts_id; /* symbol id */ 4670Sstevel@tonic-gate } dtrace_syminfo_t; 4680Sstevel@tonic-gate 4690Sstevel@tonic-gate extern int dtrace_lookup_by_name(dtrace_hdl_t *, const char *, const char *, 4700Sstevel@tonic-gate GElf_Sym *, dtrace_syminfo_t *); 4710Sstevel@tonic-gate 4720Sstevel@tonic-gate extern int dtrace_lookup_by_addr(dtrace_hdl_t *, GElf_Addr addr, 4730Sstevel@tonic-gate GElf_Sym *, dtrace_syminfo_t *); 4740Sstevel@tonic-gate 4750Sstevel@tonic-gate typedef struct dtrace_typeinfo { 4760Sstevel@tonic-gate const char *dtt_object; /* object containing type */ 4770Sstevel@tonic-gate ctf_file_t *dtt_ctfp; /* CTF container handle */ 4780Sstevel@tonic-gate ctf_id_t dtt_type; /* CTF type identifier */ 4790Sstevel@tonic-gate } dtrace_typeinfo_t; 4800Sstevel@tonic-gate 4810Sstevel@tonic-gate extern int dtrace_lookup_by_type(dtrace_hdl_t *, const char *, const char *, 4820Sstevel@tonic-gate dtrace_typeinfo_t *); 4830Sstevel@tonic-gate 4840Sstevel@tonic-gate extern int dtrace_symbol_type(dtrace_hdl_t *, const GElf_Sym *, 4850Sstevel@tonic-gate const dtrace_syminfo_t *, dtrace_typeinfo_t *); 4860Sstevel@tonic-gate 4870Sstevel@tonic-gate extern int dtrace_type_strcompile(dtrace_hdl_t *, 4880Sstevel@tonic-gate const char *, dtrace_typeinfo_t *); 4890Sstevel@tonic-gate 4900Sstevel@tonic-gate extern int dtrace_type_fcompile(dtrace_hdl_t *, 4910Sstevel@tonic-gate FILE *, dtrace_typeinfo_t *); 4920Sstevel@tonic-gate 4930Sstevel@tonic-gate /* 4940Sstevel@tonic-gate * DTrace Probe Interface 4950Sstevel@tonic-gate * 4960Sstevel@tonic-gate * Library clients can use these functions to iterate over the set of available 4970Sstevel@tonic-gate * probe definitions and inquire as to their attributes. The probe iteration 4980Sstevel@tonic-gate * interfaces report probes that are declared as well as those from dtrace(7D). 4990Sstevel@tonic-gate */ 5000Sstevel@tonic-gate typedef struct dtrace_probeinfo { 5010Sstevel@tonic-gate dtrace_attribute_t dtp_attr; /* name attributes */ 5020Sstevel@tonic-gate dtrace_attribute_t dtp_arga; /* arg attributes */ 5030Sstevel@tonic-gate const dtrace_typeinfo_t *dtp_argv; /* arg types */ 5040Sstevel@tonic-gate int dtp_argc; /* arg count */ 5050Sstevel@tonic-gate } dtrace_probeinfo_t; 5060Sstevel@tonic-gate 5070Sstevel@tonic-gate typedef int dtrace_probe_f(dtrace_hdl_t *, const dtrace_probedesc_t *, void *); 5080Sstevel@tonic-gate 5090Sstevel@tonic-gate extern int dtrace_probe_iter(dtrace_hdl_t *, 5100Sstevel@tonic-gate const dtrace_probedesc_t *pdp, dtrace_probe_f *, void *); 5110Sstevel@tonic-gate 5120Sstevel@tonic-gate extern int dtrace_probe_info(dtrace_hdl_t *, 5130Sstevel@tonic-gate const dtrace_probedesc_t *, dtrace_probeinfo_t *); 5140Sstevel@tonic-gate 5150Sstevel@tonic-gate /* 5160Sstevel@tonic-gate * DTrace Vector Interface 5170Sstevel@tonic-gate * 5180Sstevel@tonic-gate * The DTrace library normally speaks directly to dtrace(7D). However, 5190Sstevel@tonic-gate * this communication may be vectored elsewhere. Consumers who wish to 5200Sstevel@tonic-gate * perform a vectored open must fill in the vector, and use the dtrace_vopen() 5210Sstevel@tonic-gate * entry point to obtain a library handle. 5220Sstevel@tonic-gate */ 5230Sstevel@tonic-gate struct dtrace_vector { 5240Sstevel@tonic-gate int (*dtv_ioctl)(void *, int, void *); 5250Sstevel@tonic-gate int (*dtv_lookup_by_addr)(void *, GElf_Addr, GElf_Sym *, 5260Sstevel@tonic-gate dtrace_syminfo_t *); 5270Sstevel@tonic-gate int (*dtv_status)(void *, processorid_t); 5280Sstevel@tonic-gate long (*dtv_sysconf)(void *, int); 5290Sstevel@tonic-gate }; 5300Sstevel@tonic-gate 5310Sstevel@tonic-gate /* 5320Sstevel@tonic-gate * DTrace Utility Functions 5330Sstevel@tonic-gate * 534457Sbmc * Library clients can use these functions to convert addresses strings, to 535457Sbmc * convert between string and integer probe descriptions and the 536457Sbmc * dtrace_probedesc_t representation, and to perform similar conversions on 537457Sbmc * stability attributes. 5380Sstevel@tonic-gate */ 539457Sbmc extern int dtrace_addr2str(dtrace_hdl_t *, uint64_t, char *, int); 540457Sbmc extern int dtrace_uaddr2str(dtrace_hdl_t *, pid_t, uint64_t, char *, int); 541457Sbmc 5420Sstevel@tonic-gate extern int dtrace_xstr2desc(dtrace_hdl_t *, dtrace_probespec_t, 5430Sstevel@tonic-gate const char *, int, char *const [], dtrace_probedesc_t *); 5440Sstevel@tonic-gate 5450Sstevel@tonic-gate extern int dtrace_str2desc(dtrace_hdl_t *, dtrace_probespec_t, 5460Sstevel@tonic-gate const char *, dtrace_probedesc_t *); 5470Sstevel@tonic-gate 5480Sstevel@tonic-gate extern int dtrace_id2desc(dtrace_hdl_t *, dtrace_id_t, dtrace_probedesc_t *); 5490Sstevel@tonic-gate 5500Sstevel@tonic-gate #define DTRACE_DESC2STR_MAX 1024 /* min buf size for dtrace_desc2str() */ 5510Sstevel@tonic-gate 5520Sstevel@tonic-gate extern char *dtrace_desc2str(const dtrace_probedesc_t *, char *, size_t); 5530Sstevel@tonic-gate 5540Sstevel@tonic-gate #define DTRACE_ATTR2STR_MAX 64 /* min buf size for dtrace_attr2str() */ 5550Sstevel@tonic-gate 5560Sstevel@tonic-gate extern char *dtrace_attr2str(dtrace_attribute_t, char *, size_t); 5570Sstevel@tonic-gate extern int dtrace_str2attr(const char *, dtrace_attribute_t *); 5580Sstevel@tonic-gate 5590Sstevel@tonic-gate extern const char *dtrace_stability_name(dtrace_stability_t); 5600Sstevel@tonic-gate extern const char *dtrace_class_name(dtrace_class_t); 5610Sstevel@tonic-gate 5620Sstevel@tonic-gate extern int dtrace_provider_modules(dtrace_hdl_t *, const char **, int); 5630Sstevel@tonic-gate 5640Sstevel@tonic-gate extern const char *const _dtrace_version; 5650Sstevel@tonic-gate extern int _dtrace_debug; 5660Sstevel@tonic-gate 5670Sstevel@tonic-gate #ifdef __cplusplus 5680Sstevel@tonic-gate } 5690Sstevel@tonic-gate #endif 5700Sstevel@tonic-gate 5710Sstevel@tonic-gate #endif /* _DTRACE_H */ 572