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 520Sstevel@tonic-gate #define DTRACE_VERSION 1 /* 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 typedef int64_t dtrace_aggvarid_t; 600Sstevel@tonic-gate 610Sstevel@tonic-gate #define DTRACE_O_NODEV 0x01 /* do not open dtrace(7D) device */ 620Sstevel@tonic-gate #define DTRACE_O_NOSYS 0x02 /* do not load /system/object modules */ 630Sstevel@tonic-gate #define DTRACE_O_LP64 0x04 /* force D compiler to be LP64 */ 640Sstevel@tonic-gate #define DTRACE_O_ILP32 0x08 /* force D compiler to be ILP32 */ 650Sstevel@tonic-gate #define DTRACE_O_MASK 0x0f /* mask of valid flags to dtrace_open */ 660Sstevel@tonic-gate 670Sstevel@tonic-gate extern dtrace_hdl_t *dtrace_open(int, int, int *); 680Sstevel@tonic-gate extern dtrace_hdl_t *dtrace_vopen(int, int, int *, 690Sstevel@tonic-gate const dtrace_vector_t *, void *); 700Sstevel@tonic-gate 710Sstevel@tonic-gate extern int dtrace_go(dtrace_hdl_t *); 720Sstevel@tonic-gate extern int dtrace_stop(dtrace_hdl_t *); 730Sstevel@tonic-gate extern void dtrace_sleep(dtrace_hdl_t *); 740Sstevel@tonic-gate extern void dtrace_close(dtrace_hdl_t *); 750Sstevel@tonic-gate 760Sstevel@tonic-gate extern int dtrace_errno(dtrace_hdl_t *); 770Sstevel@tonic-gate extern const char *dtrace_errmsg(dtrace_hdl_t *, int); 780Sstevel@tonic-gate extern const char *dtrace_faultstr(dtrace_hdl_t *, int); 79*265Smws extern const char *dtrace_subrstr(dtrace_hdl_t *, int); 800Sstevel@tonic-gate 810Sstevel@tonic-gate extern int dtrace_setopt(dtrace_hdl_t *, const char *, const char *); 820Sstevel@tonic-gate extern int dtrace_getopt(dtrace_hdl_t *, const char *, dtrace_optval_t *); 830Sstevel@tonic-gate 840Sstevel@tonic-gate extern void dtrace_update(dtrace_hdl_t *); 850Sstevel@tonic-gate extern int dtrace_ctlfd(dtrace_hdl_t *); 860Sstevel@tonic-gate 870Sstevel@tonic-gate /* 880Sstevel@tonic-gate * DTrace Program Interface 890Sstevel@tonic-gate * 900Sstevel@tonic-gate * DTrace programs can be created by compiling ASCII text files containing 91*265Smws * D programs or by compiling in-memory C strings that specify a D program. 920Sstevel@tonic-gate * Once created, callers can examine the list of program statements and 930Sstevel@tonic-gate * enable the probes and actions described by these statements. 940Sstevel@tonic-gate */ 950Sstevel@tonic-gate 960Sstevel@tonic-gate typedef struct dtrace_proginfo { 970Sstevel@tonic-gate dtrace_attribute_t dpi_descattr; /* minimum probedesc attributes */ 980Sstevel@tonic-gate dtrace_attribute_t dpi_stmtattr; /* minimum statement attributes */ 990Sstevel@tonic-gate uint_t dpi_aggregates; /* number of aggregates specified in program */ 1000Sstevel@tonic-gate uint_t dpi_recgens; /* number of record generating probes in prog */ 1010Sstevel@tonic-gate uint_t dpi_matches; /* number of probes matched by program */ 1020Sstevel@tonic-gate uint_t dpi_speculations; /* number of speculations specified in prog */ 1030Sstevel@tonic-gate } dtrace_proginfo_t; 1040Sstevel@tonic-gate 1050Sstevel@tonic-gate #define DTRACE_C_DIFV 0x0001 /* DIF verbose mode: show each compiled DIFO */ 1060Sstevel@tonic-gate #define DTRACE_C_EMPTY 0x0002 /* Permit compilation of empty D source files */ 1070Sstevel@tonic-gate #define DTRACE_C_ZDEFS 0x0004 /* Permit probe defs that match zero probes */ 1080Sstevel@tonic-gate #define DTRACE_C_EATTR 0x0008 /* Error if program attributes less than min */ 1090Sstevel@tonic-gate #define DTRACE_C_CPP 0x0010 /* Preprocess input file with cpp(1) utility */ 1100Sstevel@tonic-gate #define DTRACE_C_KNODEF 0x0020 /* Permit unresolved kernel symbols in DIFO */ 1110Sstevel@tonic-gate #define DTRACE_C_UNODEF 0x0040 /* Permit unresolved user symbols in DIFO */ 1120Sstevel@tonic-gate #define DTRACE_C_PSPEC 0x0080 /* Intepret ambiguous specifiers as probes */ 1130Sstevel@tonic-gate #define DTRACE_C_ETAGS 0x0100 /* Prefix error messages with error tags */ 1140Sstevel@tonic-gate #define DTRACE_C_ARGREF 0x0200 /* Do not require all macro args to be used */ 1150Sstevel@tonic-gate #define DTRACE_C_DEFARG 0x0800 /* Use 0/"" as value for unspecified args */ 1160Sstevel@tonic-gate #define DTRACE_C_NOLIBS 0x1000 /* Do not process D system libraries */ 1170Sstevel@tonic-gate #define DTRACE_C_MASK 0x1bff /* 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 1370Sstevel@tonic-gate extern void *dtrace_dof_create(dtrace_hdl_t *, dtrace_prog_t *, uint_t); 1380Sstevel@tonic-gate extern void dtrace_dof_destroy(dtrace_hdl_t *, void *); 1390Sstevel@tonic-gate 1400Sstevel@tonic-gate extern void *dtrace_getopt_dof(dtrace_hdl_t *); 1410Sstevel@tonic-gate extern void *dtrace_geterr_dof(dtrace_hdl_t *); 1420Sstevel@tonic-gate 1430Sstevel@tonic-gate typedef struct dtrace_stmtdesc { 1440Sstevel@tonic-gate dtrace_ecbdesc_t *dtsd_ecbdesc; /* ECB description */ 1450Sstevel@tonic-gate dtrace_actdesc_t *dtsd_action; /* action list */ 1460Sstevel@tonic-gate dtrace_actdesc_t *dtsd_action_last; /* last action in action list */ 1470Sstevel@tonic-gate void *dtsd_aggdata; /* aggregation data */ 1480Sstevel@tonic-gate void *dtsd_fmtdata; /* type-specific output data */ 1490Sstevel@tonic-gate void (*dtsd_callback)(); /* callback function for EPID */ 1500Sstevel@tonic-gate void *dtsd_data; /* callback data pointer */ 1510Sstevel@tonic-gate dtrace_attribute_t dtsd_descattr; /* probedesc attributes */ 1520Sstevel@tonic-gate dtrace_attribute_t dtsd_stmtattr; /* statement attributes */ 1530Sstevel@tonic-gate } dtrace_stmtdesc_t; 1540Sstevel@tonic-gate 1550Sstevel@tonic-gate typedef int dtrace_stmt_f(dtrace_hdl_t *, dtrace_prog_t *, 1560Sstevel@tonic-gate dtrace_stmtdesc_t *, void *); 1570Sstevel@tonic-gate 1580Sstevel@tonic-gate extern dtrace_stmtdesc_t *dtrace_stmt_create(dtrace_hdl_t *, 1590Sstevel@tonic-gate dtrace_ecbdesc_t *); 1600Sstevel@tonic-gate extern dtrace_actdesc_t *dtrace_stmt_action(dtrace_hdl_t *, 1610Sstevel@tonic-gate dtrace_stmtdesc_t *); 1620Sstevel@tonic-gate extern int dtrace_stmt_add(dtrace_hdl_t *, dtrace_prog_t *, 1630Sstevel@tonic-gate dtrace_stmtdesc_t *); 1640Sstevel@tonic-gate extern int dtrace_stmt_iter(dtrace_hdl_t *, dtrace_prog_t *, 1650Sstevel@tonic-gate dtrace_stmt_f *, void *); 166*265Smws extern void dtrace_stmt_destroy(dtrace_hdl_t *, dtrace_stmtdesc_t *); 1670Sstevel@tonic-gate 1680Sstevel@tonic-gate /* 1690Sstevel@tonic-gate * DTrace Data Consumption Interface 1700Sstevel@tonic-gate */ 1710Sstevel@tonic-gate typedef enum { 1720Sstevel@tonic-gate DTRACEFLOW_ENTRY, 1730Sstevel@tonic-gate DTRACEFLOW_RETURN, 1740Sstevel@tonic-gate DTRACEFLOW_NONE 1750Sstevel@tonic-gate } dtrace_flowkind_t; 1760Sstevel@tonic-gate 1770Sstevel@tonic-gate #define DTRACE_CONSUME_ERROR -1 /* error while processing */ 1780Sstevel@tonic-gate #define DTRACE_CONSUME_THIS 0 /* consume this probe/record */ 1790Sstevel@tonic-gate #define DTRACE_CONSUME_NEXT 1 /* advance to next probe/rec */ 1800Sstevel@tonic-gate #define DTRACE_CONSUME_ABORT 2 /* abort consumption */ 1810Sstevel@tonic-gate 1820Sstevel@tonic-gate typedef struct dtrace_probedata { 1830Sstevel@tonic-gate dtrace_hdl_t *dtpda_handle; /* handle to DTrace library */ 1840Sstevel@tonic-gate dtrace_eprobedesc_t *dtpda_edesc; /* enabled probe description */ 1850Sstevel@tonic-gate dtrace_probedesc_t *dtpda_pdesc; /* probe description */ 1860Sstevel@tonic-gate processorid_t dtpda_cpu; /* CPU for data */ 1870Sstevel@tonic-gate caddr_t dtpda_data; /* pointer to raw data */ 1880Sstevel@tonic-gate dtrace_flowkind_t dtpda_flow; /* flow kind */ 1890Sstevel@tonic-gate const char *dtpda_prefix; /* recommended flow prefix */ 1900Sstevel@tonic-gate int dtpda_indent; /* recommended flow indent */ 1910Sstevel@tonic-gate } dtrace_probedata_t; 1920Sstevel@tonic-gate 1930Sstevel@tonic-gate typedef int dtrace_consume_probe_f(const dtrace_probedata_t *, void *); 1940Sstevel@tonic-gate typedef int dtrace_consume_rec_f(const dtrace_probedata_t *, 1950Sstevel@tonic-gate const dtrace_recdesc_t *, void *); 1960Sstevel@tonic-gate 1970Sstevel@tonic-gate extern int dtrace_consume(dtrace_hdl_t *, FILE *, 1980Sstevel@tonic-gate dtrace_consume_probe_f *, dtrace_consume_rec_f *, void *); 1990Sstevel@tonic-gate 2000Sstevel@tonic-gate #define DTRACE_STATUS_NONE 0 /* no status; not yet time */ 2010Sstevel@tonic-gate #define DTRACE_STATUS_OKAY 1 /* status okay */ 2020Sstevel@tonic-gate #define DTRACE_STATUS_EXITED 2 /* exit() was called; tracing stopped */ 2030Sstevel@tonic-gate #define DTRACE_STATUS_FILLED 3 /* fill buffer filled; tracing stoped */ 2040Sstevel@tonic-gate #define DTRACE_STATUS_STOPPED 4 /* tracing already stopped */ 2050Sstevel@tonic-gate 2060Sstevel@tonic-gate extern int dtrace_status(dtrace_hdl_t *); 2070Sstevel@tonic-gate 2080Sstevel@tonic-gate /* 2090Sstevel@tonic-gate * DTrace Formatted Output Interfaces 2100Sstevel@tonic-gate * 2110Sstevel@tonic-gate * To format output associated with a given dtrace_stmtdesc, the caller can 2120Sstevel@tonic-gate * invoke one of the following functions, passing the opaque dtsd_fmtdata and a 2130Sstevel@tonic-gate * list of record descriptions. These functions return either -1 to indicate 2140Sstevel@tonic-gate * an error, or a positive integer indicating the number of records consumed. 2150Sstevel@tonic-gate * For anonymous enablings, the consumer can use the dtrd_format member of 2160Sstevel@tonic-gate * the record description to obtain a format description. The dtfd_string 2170Sstevel@tonic-gate * member of the format description may be passed to dtrace_print{fa}_create() 2180Sstevel@tonic-gate * to create the opaque format data. 2190Sstevel@tonic-gate */ 2200Sstevel@tonic-gate extern void *dtrace_printf_create(dtrace_hdl_t *, const char *); 2210Sstevel@tonic-gate extern void *dtrace_printa_create(dtrace_hdl_t *, const char *); 2220Sstevel@tonic-gate extern size_t dtrace_printf_format(dtrace_hdl_t *, void *, char *, size_t); 2230Sstevel@tonic-gate 2240Sstevel@tonic-gate extern int dtrace_fprintf(dtrace_hdl_t *, FILE *, void *, 2250Sstevel@tonic-gate const dtrace_probedata_t *, const dtrace_recdesc_t *, uint_t, 2260Sstevel@tonic-gate const void *, size_t); 2270Sstevel@tonic-gate 2280Sstevel@tonic-gate extern int dtrace_fprinta(dtrace_hdl_t *, FILE *, void *, 2290Sstevel@tonic-gate const dtrace_probedata_t *, const dtrace_recdesc_t *, uint_t, 2300Sstevel@tonic-gate const void *, size_t); 2310Sstevel@tonic-gate 2320Sstevel@tonic-gate extern int dtrace_system(dtrace_hdl_t *, FILE *, void *, 2330Sstevel@tonic-gate const dtrace_probedata_t *, const dtrace_recdesc_t *, uint_t, 2340Sstevel@tonic-gate const void *, size_t); 2350Sstevel@tonic-gate 2360Sstevel@tonic-gate extern int dtrace_freopen(dtrace_hdl_t *, FILE *, void *, 2370Sstevel@tonic-gate const dtrace_probedata_t *, const dtrace_recdesc_t *, uint_t, 2380Sstevel@tonic-gate const void *, size_t); 2390Sstevel@tonic-gate 2400Sstevel@tonic-gate /* 2410Sstevel@tonic-gate * DTrace Work Interface 2420Sstevel@tonic-gate */ 2430Sstevel@tonic-gate typedef enum { 2440Sstevel@tonic-gate DTRACE_WORKSTATUS_ERROR = -1, 2450Sstevel@tonic-gate DTRACE_WORKSTATUS_OKAY, 2460Sstevel@tonic-gate DTRACE_WORKSTATUS_DONE 2470Sstevel@tonic-gate } dtrace_workstatus_t; 2480Sstevel@tonic-gate 2490Sstevel@tonic-gate extern dtrace_workstatus_t dtrace_work(dtrace_hdl_t *, FILE *, 2500Sstevel@tonic-gate dtrace_consume_probe_f *, dtrace_consume_rec_f *, void *); 2510Sstevel@tonic-gate 2520Sstevel@tonic-gate /* 2530Sstevel@tonic-gate * DTrace Handler Interface 2540Sstevel@tonic-gate */ 2550Sstevel@tonic-gate #define DTRACE_HANDLE_ABORT -1 /* abort current operation */ 2560Sstevel@tonic-gate #define DTRACE_HANDLE_OK 0 /* handled okay; continue */ 2570Sstevel@tonic-gate 2580Sstevel@tonic-gate typedef struct dtrace_errdata { 2590Sstevel@tonic-gate dtrace_hdl_t *dteda_handle; /* handle to DTrace library */ 2600Sstevel@tonic-gate dtrace_eprobedesc_t *dteda_edesc; /* enabled probe inducing err */ 2610Sstevel@tonic-gate dtrace_probedesc_t *dteda_pdesc; /* probe inducing error */ 2620Sstevel@tonic-gate processorid_t dteda_cpu; /* CPU of error */ 2630Sstevel@tonic-gate int dteda_action; /* action inducing error */ 2640Sstevel@tonic-gate int dteda_offset; /* offset in DIFO of error */ 2650Sstevel@tonic-gate int dteda_fault; /* specific fault */ 2660Sstevel@tonic-gate uint64_t dteda_addr; /* address of fault, if any */ 2670Sstevel@tonic-gate const char *dteda_msg; /* preconstructed message */ 2680Sstevel@tonic-gate } dtrace_errdata_t; 2690Sstevel@tonic-gate 2700Sstevel@tonic-gate typedef int dtrace_handle_err_f(dtrace_errdata_t *, void *); 2710Sstevel@tonic-gate extern int dtrace_handle_err(dtrace_hdl_t *, dtrace_handle_err_f *, void *); 2720Sstevel@tonic-gate 2730Sstevel@tonic-gate typedef enum { 2740Sstevel@tonic-gate DTRACEDROP_PRINCIPAL, /* drop to principal buffer */ 2750Sstevel@tonic-gate DTRACEDROP_AGGREGATION, /* drop to aggregation buffer */ 2760Sstevel@tonic-gate DTRACEDROP_DYNAMIC, /* dynamic drop */ 2770Sstevel@tonic-gate DTRACEDROP_DYNRINSE, /* dyn drop due to rinsing */ 2780Sstevel@tonic-gate DTRACEDROP_DYNDIRTY, /* dyn drop due to dirty */ 2790Sstevel@tonic-gate DTRACEDROP_SPEC, /* speculative drop */ 2800Sstevel@tonic-gate DTRACEDROP_SPECBUSY, /* spec drop due to busy */ 2810Sstevel@tonic-gate DTRACEDROP_SPECUNAVAIL /* spec drop due to unavail */ 2820Sstevel@tonic-gate } dtrace_dropkind_t; 2830Sstevel@tonic-gate 2840Sstevel@tonic-gate typedef struct dtrace_dropdata { 2850Sstevel@tonic-gate dtrace_hdl_t *dtdda_handle; /* handle to DTrace library */ 2860Sstevel@tonic-gate processorid_t dtdda_cpu; /* CPU, if any */ 2870Sstevel@tonic-gate dtrace_dropkind_t dtdda_kind; /* kind of drop */ 2880Sstevel@tonic-gate uint64_t dtdda_drops; /* number of drops */ 2890Sstevel@tonic-gate uint64_t dtdda_total; /* total drops */ 2900Sstevel@tonic-gate const char *dtdda_msg; /* preconstructed message */ 2910Sstevel@tonic-gate } dtrace_dropdata_t; 2920Sstevel@tonic-gate 2930Sstevel@tonic-gate typedef int dtrace_handle_drop_f(dtrace_dropdata_t *, void *); 2940Sstevel@tonic-gate extern int dtrace_handle_drop(dtrace_hdl_t *, dtrace_handle_drop_f *, void *); 2950Sstevel@tonic-gate 2960Sstevel@tonic-gate typedef void dtrace_handle_proc_f(struct ps_prochandle *, void *); 2970Sstevel@tonic-gate extern int dtrace_handle_proc(dtrace_hdl_t *, dtrace_handle_proc_f *, void *); 2980Sstevel@tonic-gate 2990Sstevel@tonic-gate typedef struct dtrace_bufdata { 3000Sstevel@tonic-gate dtrace_hdl_t *dtbda_handle; /* handle to DTrace library */ 3010Sstevel@tonic-gate const char *dtbda_buffered; /* buffered output */ 3020Sstevel@tonic-gate dtrace_probedata_t *dtbda_probe; /* probe data */ 3030Sstevel@tonic-gate dtrace_recdesc_t *dtbda_recdesc; /* record description */ 3040Sstevel@tonic-gate dtrace_aggdata_t *dtbda_aggdata; /* aggregation data, if agg. */ 3050Sstevel@tonic-gate } dtrace_bufdata_t; 3060Sstevel@tonic-gate 3070Sstevel@tonic-gate typedef int dtrace_handle_buffered_f(dtrace_bufdata_t *, void *); 3080Sstevel@tonic-gate extern int dtrace_handle_buffered(dtrace_hdl_t *, 3090Sstevel@tonic-gate dtrace_handle_buffered_f *, void *); 3100Sstevel@tonic-gate 3110Sstevel@tonic-gate /* 3120Sstevel@tonic-gate * DTrace Aggregate Interface 3130Sstevel@tonic-gate */ 3140Sstevel@tonic-gate 3150Sstevel@tonic-gate #define DTRACE_A_PERCPU 0x0001 3160Sstevel@tonic-gate #define DTRACE_A_KEEPDELTA 0x0002 3170Sstevel@tonic-gate #define DTRACE_A_ANONYMOUS 0x0004 3180Sstevel@tonic-gate 3190Sstevel@tonic-gate #define DTRACE_AGGWALK_ERROR -1 /* error while processing */ 3200Sstevel@tonic-gate #define DTRACE_AGGWALK_NEXT 0 /* proceed to next element */ 3210Sstevel@tonic-gate #define DTRACE_AGGWALK_ABORT 1 /* abort aggregation walk */ 3220Sstevel@tonic-gate #define DTRACE_AGGWALK_CLEAR 2 /* clear this element */ 3230Sstevel@tonic-gate #define DTRACE_AGGWALK_NORMALIZE 3 /* normalize this element */ 3240Sstevel@tonic-gate #define DTRACE_AGGWALK_DENORMALIZE 4 /* denormalize this element */ 3250Sstevel@tonic-gate #define DTRACE_AGGWALK_REMOVE 5 /* remove this element */ 3260Sstevel@tonic-gate 3270Sstevel@tonic-gate struct dtrace_aggdata { 3280Sstevel@tonic-gate dtrace_hdl_t *dtada_handle; /* handle to DTrace library */ 3290Sstevel@tonic-gate dtrace_aggdesc_t *dtada_desc; /* aggregation description */ 3300Sstevel@tonic-gate dtrace_eprobedesc_t *dtada_edesc; /* enabled probe description */ 3310Sstevel@tonic-gate dtrace_probedesc_t *dtada_pdesc; /* probe description */ 3320Sstevel@tonic-gate caddr_t dtada_data; /* pointer to raw data */ 3330Sstevel@tonic-gate uint64_t dtada_normal; /* the normal -- 1 for denorm */ 3340Sstevel@tonic-gate size_t dtada_size; /* total size of the data */ 3350Sstevel@tonic-gate caddr_t dtada_delta; /* delta data, if available */ 3360Sstevel@tonic-gate caddr_t *dtada_percpu; /* per CPU data, if avail */ 3370Sstevel@tonic-gate caddr_t *dtada_percpu_delta; /* per CPU delta, if avail */ 3380Sstevel@tonic-gate }; 3390Sstevel@tonic-gate 3400Sstevel@tonic-gate typedef int dtrace_aggregate_f(dtrace_aggdata_t *, void *); 3410Sstevel@tonic-gate typedef int dtrace_aggregate_walk_f(dtrace_hdl_t *, 3420Sstevel@tonic-gate dtrace_aggregate_f *, void *); 3430Sstevel@tonic-gate 3440Sstevel@tonic-gate extern void dtrace_aggregate_clear(dtrace_hdl_t *); 3450Sstevel@tonic-gate extern int dtrace_aggregate_snap(dtrace_hdl_t *); 3460Sstevel@tonic-gate extern int dtrace_aggregate_print(dtrace_hdl_t *, FILE *, 3470Sstevel@tonic-gate dtrace_aggregate_walk_f *); 3480Sstevel@tonic-gate 3490Sstevel@tonic-gate extern int dtrace_aggregate_walk(dtrace_hdl_t *, dtrace_aggregate_f *, void *); 3500Sstevel@tonic-gate 3510Sstevel@tonic-gate extern int dtrace_aggregate_walk_keysorted(dtrace_hdl_t *, 3520Sstevel@tonic-gate dtrace_aggregate_f *, void *); 3530Sstevel@tonic-gate 3540Sstevel@tonic-gate extern int dtrace_aggregate_walk_valsorted(dtrace_hdl_t *, 3550Sstevel@tonic-gate dtrace_aggregate_f *, void *); 3560Sstevel@tonic-gate 3570Sstevel@tonic-gate extern int dtrace_aggregate_walk_keyvarsorted(dtrace_hdl_t *, 3580Sstevel@tonic-gate dtrace_aggregate_f *, void *); 3590Sstevel@tonic-gate 3600Sstevel@tonic-gate extern int dtrace_aggregate_walk_valvarsorted(dtrace_hdl_t *, 3610Sstevel@tonic-gate dtrace_aggregate_f *, void *); 3620Sstevel@tonic-gate 3630Sstevel@tonic-gate extern int dtrace_aggregate_walk_keyrevsorted(dtrace_hdl_t *, 3640Sstevel@tonic-gate dtrace_aggregate_f *, void *); 3650Sstevel@tonic-gate 3660Sstevel@tonic-gate extern int dtrace_aggregate_walk_valrevsorted(dtrace_hdl_t *, 3670Sstevel@tonic-gate dtrace_aggregate_f *, void *); 3680Sstevel@tonic-gate 3690Sstevel@tonic-gate extern int dtrace_aggregate_walk_keyvarrevsorted(dtrace_hdl_t *, 3700Sstevel@tonic-gate dtrace_aggregate_f *, void *); 3710Sstevel@tonic-gate 3720Sstevel@tonic-gate extern int dtrace_aggregate_walk_valvarrevsorted(dtrace_hdl_t *, 3730Sstevel@tonic-gate dtrace_aggregate_f *, void *); 3740Sstevel@tonic-gate 3750Sstevel@tonic-gate #define DTRACE_AGD_PRINTED 0x1 /* aggregation printed in program */ 3760Sstevel@tonic-gate 3770Sstevel@tonic-gate /* 3780Sstevel@tonic-gate * DTrace Process Control Interface 3790Sstevel@tonic-gate * 3800Sstevel@tonic-gate * Library clients who wish to have libdtrace create or grab processes for 3810Sstevel@tonic-gate * monitoring of their symbol table changes may use these interfaces to 3820Sstevel@tonic-gate * request that libdtrace obtain control of the process using libproc. 3830Sstevel@tonic-gate */ 3840Sstevel@tonic-gate 3850Sstevel@tonic-gate extern struct ps_prochandle *dtrace_proc_create(dtrace_hdl_t *, 3860Sstevel@tonic-gate const char *, char *const *); 3870Sstevel@tonic-gate 3880Sstevel@tonic-gate extern struct ps_prochandle *dtrace_proc_grab(dtrace_hdl_t *, pid_t, int); 3890Sstevel@tonic-gate extern void dtrace_proc_release(dtrace_hdl_t *, struct ps_prochandle *); 3900Sstevel@tonic-gate extern void dtrace_proc_continue(dtrace_hdl_t *, struct ps_prochandle *); 3910Sstevel@tonic-gate 3920Sstevel@tonic-gate /* 3930Sstevel@tonic-gate * DTrace Object, Symbol, and Type Interfaces 3940Sstevel@tonic-gate * 3950Sstevel@tonic-gate * Library clients can use libdtrace to perform symbol and C type information 3960Sstevel@tonic-gate * lookups by symbol name, symbol address, or C type name, or to lookup meta- 3970Sstevel@tonic-gate * information cached for each of the program objects in use by DTrace. The 3980Sstevel@tonic-gate * resulting struct contain pointers to arbitrary-length strings, including 3990Sstevel@tonic-gate * object, symbol, and type names, that are persistent until the next call to 4000Sstevel@tonic-gate * dtrace_update(). Once dtrace_update() is called, any cached values must 4010Sstevel@tonic-gate * be flushed and not used subsequently by the client program. 4020Sstevel@tonic-gate */ 4030Sstevel@tonic-gate 4040Sstevel@tonic-gate #define DTRACE_OBJ_EXEC ((const char *)0L) /* primary executable file */ 4050Sstevel@tonic-gate #define DTRACE_OBJ_RTLD ((const char *)1L) /* run-time link-editor */ 4060Sstevel@tonic-gate #define DTRACE_OBJ_CDEFS ((const char *)2L) /* C include definitions */ 4070Sstevel@tonic-gate #define DTRACE_OBJ_DDEFS ((const char *)3L) /* D program definitions */ 4080Sstevel@tonic-gate #define DTRACE_OBJ_EVERY ((const char *)-1L) /* all known objects */ 4090Sstevel@tonic-gate #define DTRACE_OBJ_KMODS ((const char *)-2L) /* all kernel objects */ 4100Sstevel@tonic-gate #define DTRACE_OBJ_UMODS ((const char *)-3L) /* all user objects */ 4110Sstevel@tonic-gate 4120Sstevel@tonic-gate typedef struct dtrace_objinfo { 4130Sstevel@tonic-gate const char *dto_name; /* object file scope name */ 4140Sstevel@tonic-gate const char *dto_file; /* object file path (if any) */ 4150Sstevel@tonic-gate int dto_id; /* object file id (if any) */ 4160Sstevel@tonic-gate uint_t dto_flags; /* object flags (see below) */ 4170Sstevel@tonic-gate GElf_Addr dto_text_va; /* address of text section */ 4180Sstevel@tonic-gate GElf_Xword dto_text_size; /* size of text section */ 4190Sstevel@tonic-gate GElf_Addr dto_data_va; /* address of data section */ 4200Sstevel@tonic-gate GElf_Xword dto_data_size; /* size of data section */ 4210Sstevel@tonic-gate GElf_Addr dto_bss_va; /* address of BSS */ 4220Sstevel@tonic-gate GElf_Xword dto_bss_size; /* size of BSS */ 4230Sstevel@tonic-gate } dtrace_objinfo_t; 4240Sstevel@tonic-gate 4250Sstevel@tonic-gate #define DTRACE_OBJ_F_KERNEL 0x1 /* object is a kernel module */ 4260Sstevel@tonic-gate #define DTRACE_OBJ_F_PRIMARY 0x2 /* object is a primary module */ 4270Sstevel@tonic-gate 4280Sstevel@tonic-gate typedef int dtrace_obj_f(dtrace_hdl_t *, const dtrace_objinfo_t *, void *); 4290Sstevel@tonic-gate 4300Sstevel@tonic-gate extern int dtrace_object_iter(dtrace_hdl_t *, dtrace_obj_f *, void *); 4310Sstevel@tonic-gate extern int dtrace_object_info(dtrace_hdl_t *, const char *, dtrace_objinfo_t *); 4320Sstevel@tonic-gate 4330Sstevel@tonic-gate typedef struct dtrace_syminfo { 4340Sstevel@tonic-gate const char *dts_object; /* object name */ 4350Sstevel@tonic-gate const char *dts_name; /* symbol name */ 4360Sstevel@tonic-gate ulong_t dts_id; /* symbol id */ 4370Sstevel@tonic-gate } dtrace_syminfo_t; 4380Sstevel@tonic-gate 4390Sstevel@tonic-gate extern int dtrace_lookup_by_name(dtrace_hdl_t *, const char *, const char *, 4400Sstevel@tonic-gate GElf_Sym *, dtrace_syminfo_t *); 4410Sstevel@tonic-gate 4420Sstevel@tonic-gate extern int dtrace_lookup_by_addr(dtrace_hdl_t *, GElf_Addr addr, 4430Sstevel@tonic-gate GElf_Sym *, dtrace_syminfo_t *); 4440Sstevel@tonic-gate 4450Sstevel@tonic-gate typedef struct dtrace_typeinfo { 4460Sstevel@tonic-gate const char *dtt_object; /* object containing type */ 4470Sstevel@tonic-gate ctf_file_t *dtt_ctfp; /* CTF container handle */ 4480Sstevel@tonic-gate ctf_id_t dtt_type; /* CTF type identifier */ 4490Sstevel@tonic-gate } dtrace_typeinfo_t; 4500Sstevel@tonic-gate 4510Sstevel@tonic-gate extern int dtrace_lookup_by_type(dtrace_hdl_t *, const char *, const char *, 4520Sstevel@tonic-gate dtrace_typeinfo_t *); 4530Sstevel@tonic-gate 4540Sstevel@tonic-gate extern int dtrace_symbol_type(dtrace_hdl_t *, const GElf_Sym *, 4550Sstevel@tonic-gate const dtrace_syminfo_t *, dtrace_typeinfo_t *); 4560Sstevel@tonic-gate 4570Sstevel@tonic-gate extern int dtrace_type_strcompile(dtrace_hdl_t *, 4580Sstevel@tonic-gate const char *, dtrace_typeinfo_t *); 4590Sstevel@tonic-gate 4600Sstevel@tonic-gate extern int dtrace_type_fcompile(dtrace_hdl_t *, 4610Sstevel@tonic-gate FILE *, dtrace_typeinfo_t *); 4620Sstevel@tonic-gate 4630Sstevel@tonic-gate /* 4640Sstevel@tonic-gate * DTrace Probe Interface 4650Sstevel@tonic-gate * 4660Sstevel@tonic-gate * Library clients can use these functions to iterate over the set of available 4670Sstevel@tonic-gate * probe definitions and inquire as to their attributes. The probe iteration 4680Sstevel@tonic-gate * interfaces report probes that are declared as well as those from dtrace(7D). 4690Sstevel@tonic-gate */ 4700Sstevel@tonic-gate typedef struct dtrace_probeinfo { 4710Sstevel@tonic-gate dtrace_attribute_t dtp_attr; /* name attributes */ 4720Sstevel@tonic-gate dtrace_attribute_t dtp_arga; /* arg attributes */ 4730Sstevel@tonic-gate const dtrace_typeinfo_t *dtp_argv; /* arg types */ 4740Sstevel@tonic-gate int dtp_argc; /* arg count */ 4750Sstevel@tonic-gate } dtrace_probeinfo_t; 4760Sstevel@tonic-gate 4770Sstevel@tonic-gate typedef int dtrace_probe_f(dtrace_hdl_t *, const dtrace_probedesc_t *, void *); 4780Sstevel@tonic-gate 4790Sstevel@tonic-gate extern int dtrace_probe_iter(dtrace_hdl_t *, 4800Sstevel@tonic-gate const dtrace_probedesc_t *pdp, dtrace_probe_f *, void *); 4810Sstevel@tonic-gate 4820Sstevel@tonic-gate extern int dtrace_probe_info(dtrace_hdl_t *, 4830Sstevel@tonic-gate const dtrace_probedesc_t *, dtrace_probeinfo_t *); 4840Sstevel@tonic-gate 4850Sstevel@tonic-gate /* 4860Sstevel@tonic-gate * DTrace Vector Interface 4870Sstevel@tonic-gate * 4880Sstevel@tonic-gate * The DTrace library normally speaks directly to dtrace(7D). However, 4890Sstevel@tonic-gate * this communication may be vectored elsewhere. Consumers who wish to 4900Sstevel@tonic-gate * perform a vectored open must fill in the vector, and use the dtrace_vopen() 4910Sstevel@tonic-gate * entry point to obtain a library handle. 4920Sstevel@tonic-gate */ 4930Sstevel@tonic-gate struct dtrace_vector { 4940Sstevel@tonic-gate int (*dtv_ioctl)(void *, int, void *); 4950Sstevel@tonic-gate int (*dtv_lookup_by_addr)(void *, GElf_Addr, GElf_Sym *, 4960Sstevel@tonic-gate dtrace_syminfo_t *); 4970Sstevel@tonic-gate int (*dtv_status)(void *, processorid_t); 4980Sstevel@tonic-gate long (*dtv_sysconf)(void *, int); 4990Sstevel@tonic-gate }; 5000Sstevel@tonic-gate 5010Sstevel@tonic-gate /* 5020Sstevel@tonic-gate * DTrace Utility Functions 5030Sstevel@tonic-gate * 5040Sstevel@tonic-gate * Library clients can use these functions to convert between string and 5050Sstevel@tonic-gate * integer probe descriptions and the dtrace_probedesc_t representation 5060Sstevel@tonic-gate * and to perform similar conversions on stability attributes. 5070Sstevel@tonic-gate */ 5080Sstevel@tonic-gate extern int dtrace_xstr2desc(dtrace_hdl_t *, dtrace_probespec_t, 5090Sstevel@tonic-gate const char *, int, char *const [], dtrace_probedesc_t *); 5100Sstevel@tonic-gate 5110Sstevel@tonic-gate extern int dtrace_str2desc(dtrace_hdl_t *, dtrace_probespec_t, 5120Sstevel@tonic-gate const char *, dtrace_probedesc_t *); 5130Sstevel@tonic-gate 5140Sstevel@tonic-gate extern int dtrace_id2desc(dtrace_hdl_t *, dtrace_id_t, dtrace_probedesc_t *); 5150Sstevel@tonic-gate 5160Sstevel@tonic-gate #define DTRACE_DESC2STR_MAX 1024 /* min buf size for dtrace_desc2str() */ 5170Sstevel@tonic-gate 5180Sstevel@tonic-gate extern char *dtrace_desc2str(const dtrace_probedesc_t *, char *, size_t); 5190Sstevel@tonic-gate 5200Sstevel@tonic-gate #define DTRACE_ATTR2STR_MAX 64 /* min buf size for dtrace_attr2str() */ 5210Sstevel@tonic-gate 5220Sstevel@tonic-gate extern char *dtrace_attr2str(dtrace_attribute_t, char *, size_t); 5230Sstevel@tonic-gate extern int dtrace_str2attr(const char *, dtrace_attribute_t *); 5240Sstevel@tonic-gate 5250Sstevel@tonic-gate extern const char *dtrace_stability_name(dtrace_stability_t); 5260Sstevel@tonic-gate extern const char *dtrace_class_name(dtrace_class_t); 5270Sstevel@tonic-gate 5280Sstevel@tonic-gate extern int dtrace_provider_modules(dtrace_hdl_t *, const char **, int); 5290Sstevel@tonic-gate 5300Sstevel@tonic-gate extern const char *const _dtrace_version; 5310Sstevel@tonic-gate extern int _dtrace_debug; 5320Sstevel@tonic-gate 5330Sstevel@tonic-gate #ifdef __cplusplus 5340Sstevel@tonic-gate } 5350Sstevel@tonic-gate #endif 5360Sstevel@tonic-gate 5370Sstevel@tonic-gate #endif /* _DTRACE_H */ 538