1178479Sjb/* 2178479Sjb * CDDL HEADER START 3178479Sjb * 4178479Sjb * The contents of this file are subject to the terms of the 5178479Sjb * Common Development and Distribution License (the "License"). 6178479Sjb * You may not use this file except in compliance with the License. 7178479Sjb * 8178479Sjb * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9178479Sjb * or http://www.opensolaris.org/os/licensing. 10178479Sjb * See the License for the specific language governing permissions 11178479Sjb * and limitations under the License. 12178479Sjb * 13178479Sjb * When distributing Covered Code, include this CDDL HEADER in each 14178479Sjb * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15178479Sjb * If applicable, add the following below this CDDL HEADER, with the 16178479Sjb * fields enclosed by brackets "[]" replaced with your own identifying 17178479Sjb * information: Portions Copyright [yyyy] [name of copyright owner] 18178479Sjb * 19178479Sjb * CDDL HEADER END 20178479Sjb */ 21178479Sjb 22178479Sjb/* 23178479Sjb * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 24178479Sjb * Use is subject to license terms. 25178479Sjb */ 26178479Sjb 27237624Spfg/* 28237624Spfg * Copyright (c) 2011, Joyent, Inc. All rights reserved. 29237624Spfg */ 30237624Spfg 31178479Sjb#ifndef _DTRACE_H 32178479Sjb#define _DTRACE_H 33178479Sjb 34178479Sjb#include <sys/dtrace.h> 35178479Sjb#include <stdarg.h> 36178479Sjb#include <stdio.h> 37178479Sjb#include <gelf.h> 38184696Srodrigc#include <libproc.h> 39211554Srpaulo#if !defined(sun) 40211554Srpaulo#include <rtld_db.h> 41211554Srpaulo#endif 42178479Sjb 43178479Sjb#ifdef __cplusplus 44178479Sjbextern "C" { 45178479Sjb#endif 46178479Sjb 47178479Sjb/* 48178479Sjb * DTrace Dynamic Tracing Software: Library Interfaces 49178479Sjb * 50178479Sjb * Note: The contents of this file are private to the implementation of the 51178479Sjb * Solaris system and DTrace subsystem and are subject to change at any time 52178479Sjb * without notice. Applications and drivers using these interfaces will fail 53178479Sjb * to run on future releases. These interfaces should not be used for any 54178479Sjb * purpose except those expressly outlined in dtrace(7D) and libdtrace(3LIB). 55178479Sjb * Please refer to the "Solaris Dynamic Tracing Guide" for more information. 56178479Sjb */ 57178479Sjb 58178479Sjb#define DTRACE_VERSION 3 /* library ABI interface version */ 59178479Sjb 60178479Sjbstruct ps_prochandle; 61178479Sjbtypedef struct dtrace_hdl dtrace_hdl_t; 62178479Sjbtypedef struct dtrace_prog dtrace_prog_t; 63178479Sjbtypedef struct dtrace_vector dtrace_vector_t; 64178479Sjbtypedef struct dtrace_aggdata dtrace_aggdata_t; 65178479Sjb 66178479Sjb#define DTRACE_O_NODEV 0x01 /* do not open dtrace(7D) device */ 67178479Sjb#define DTRACE_O_NOSYS 0x02 /* do not load /system/object modules */ 68178479Sjb#define DTRACE_O_LP64 0x04 /* force D compiler to be LP64 */ 69178479Sjb#define DTRACE_O_ILP32 0x08 /* force D compiler to be ILP32 */ 70178479Sjb#define DTRACE_O_MASK 0x0f /* mask of valid flags to dtrace_open */ 71178479Sjb 72178479Sjbextern dtrace_hdl_t *dtrace_open(int, int, int *); 73178479Sjbextern dtrace_hdl_t *dtrace_vopen(int, int, int *, 74178479Sjb const dtrace_vector_t *, void *); 75178479Sjb 76178479Sjbextern int dtrace_go(dtrace_hdl_t *); 77178479Sjbextern int dtrace_stop(dtrace_hdl_t *); 78178479Sjbextern void dtrace_sleep(dtrace_hdl_t *); 79178479Sjbextern void dtrace_close(dtrace_hdl_t *); 80178479Sjb 81178479Sjbextern int dtrace_errno(dtrace_hdl_t *); 82178479Sjbextern const char *dtrace_errmsg(dtrace_hdl_t *, int); 83178479Sjbextern const char *dtrace_faultstr(dtrace_hdl_t *, int); 84178479Sjbextern const char *dtrace_subrstr(dtrace_hdl_t *, int); 85178479Sjb 86178479Sjbextern int dtrace_setopt(dtrace_hdl_t *, const char *, const char *); 87178479Sjbextern int dtrace_getopt(dtrace_hdl_t *, const char *, dtrace_optval_t *); 88178479Sjb 89178479Sjbextern void dtrace_update(dtrace_hdl_t *); 90178479Sjbextern int dtrace_ctlfd(dtrace_hdl_t *); 91178479Sjb 92178479Sjb/* 93178479Sjb * DTrace Program Interface 94178479Sjb * 95178479Sjb * DTrace programs can be created by compiling ASCII text files containing 96178479Sjb * D programs or by compiling in-memory C strings that specify a D program. 97178479Sjb * Once created, callers can examine the list of program statements and 98178479Sjb * enable the probes and actions described by these statements. 99178479Sjb */ 100178479Sjb 101178479Sjbtypedef struct dtrace_proginfo { 102178479Sjb dtrace_attribute_t dpi_descattr; /* minimum probedesc attributes */ 103178479Sjb dtrace_attribute_t dpi_stmtattr; /* minimum statement attributes */ 104178479Sjb uint_t dpi_aggregates; /* number of aggregates specified in program */ 105178479Sjb uint_t dpi_recgens; /* number of record generating probes in prog */ 106178479Sjb uint_t dpi_matches; /* number of probes matched by program */ 107178479Sjb uint_t dpi_speculations; /* number of speculations specified in prog */ 108178479Sjb} dtrace_proginfo_t; 109178479Sjb 110178479Sjb#define DTRACE_C_DIFV 0x0001 /* DIF verbose mode: show each compiled DIFO */ 111178479Sjb#define DTRACE_C_EMPTY 0x0002 /* Permit compilation of empty D source files */ 112178479Sjb#define DTRACE_C_ZDEFS 0x0004 /* Permit probe defs that match zero probes */ 113178479Sjb#define DTRACE_C_EATTR 0x0008 /* Error if program attributes less than min */ 114178479Sjb#define DTRACE_C_CPP 0x0010 /* Preprocess input file with cpp(1) utility */ 115178479Sjb#define DTRACE_C_KNODEF 0x0020 /* Permit unresolved kernel symbols in DIFO */ 116178479Sjb#define DTRACE_C_UNODEF 0x0040 /* Permit unresolved user symbols in DIFO */ 117178479Sjb#define DTRACE_C_PSPEC 0x0080 /* Intepret ambiguous specifiers as probes */ 118178479Sjb#define DTRACE_C_ETAGS 0x0100 /* Prefix error messages with error tags */ 119178479Sjb#define DTRACE_C_ARGREF 0x0200 /* Do not require all macro args to be used */ 120178479Sjb#define DTRACE_C_DEFARG 0x0800 /* Use 0/"" as value for unspecified args */ 121178479Sjb#define DTRACE_C_NOLIBS 0x1000 /* Do not process D system libraries */ 122178479Sjb#define DTRACE_C_CTL 0x2000 /* Only process control directives */ 123178479Sjb#define DTRACE_C_MASK 0x3bff /* mask of all valid flags to dtrace_*compile */ 124178479Sjb 125178479Sjbextern dtrace_prog_t *dtrace_program_strcompile(dtrace_hdl_t *, 126178479Sjb const char *, dtrace_probespec_t, uint_t, int, char *const []); 127178479Sjb 128178479Sjbextern dtrace_prog_t *dtrace_program_fcompile(dtrace_hdl_t *, 129178479Sjb FILE *, uint_t, int, char *const []); 130178479Sjb 131178479Sjbextern int dtrace_program_exec(dtrace_hdl_t *, dtrace_prog_t *, 132178479Sjb dtrace_proginfo_t *); 133178479Sjbextern void dtrace_program_info(dtrace_hdl_t *, dtrace_prog_t *, 134178479Sjb dtrace_proginfo_t *); 135178479Sjb 136178479Sjb#define DTRACE_D_STRIP 0x01 /* strip non-loadable sections from program */ 137178479Sjb#define DTRACE_D_PROBES 0x02 /* include provider and probe definitions */ 138178479Sjb#define DTRACE_D_MASK 0x03 /* mask of valid flags to dtrace_dof_create */ 139178479Sjb 140178479Sjbextern int dtrace_program_link(dtrace_hdl_t *, dtrace_prog_t *, 141178479Sjb uint_t, const char *, int, char *const []); 142178479Sjb 143178479Sjbextern int dtrace_program_header(dtrace_hdl_t *, FILE *, const char *); 144178479Sjb 145178479Sjbextern void *dtrace_dof_create(dtrace_hdl_t *, dtrace_prog_t *, uint_t); 146178479Sjbextern void dtrace_dof_destroy(dtrace_hdl_t *, void *); 147178479Sjb 148178479Sjbextern void *dtrace_getopt_dof(dtrace_hdl_t *); 149178479Sjbextern void *dtrace_geterr_dof(dtrace_hdl_t *); 150178479Sjb 151178479Sjbtypedef struct dtrace_stmtdesc { 152178479Sjb dtrace_ecbdesc_t *dtsd_ecbdesc; /* ECB description */ 153178479Sjb dtrace_actdesc_t *dtsd_action; /* action list */ 154178479Sjb dtrace_actdesc_t *dtsd_action_last; /* last action in action list */ 155178479Sjb void *dtsd_aggdata; /* aggregation data */ 156178479Sjb void *dtsd_fmtdata; /* type-specific output data */ 157248708Spfg void *dtsd_strdata; /* type-specific string data */ 158178550Sjb void (*dtsd_callback)(void); /* callback function for EPID */ 159178479Sjb void *dtsd_data; /* callback data pointer */ 160178479Sjb dtrace_attribute_t dtsd_descattr; /* probedesc attributes */ 161178479Sjb dtrace_attribute_t dtsd_stmtattr; /* statement attributes */ 162178479Sjb} dtrace_stmtdesc_t; 163178479Sjb 164178479Sjbtypedef int dtrace_stmt_f(dtrace_hdl_t *, dtrace_prog_t *, 165178479Sjb dtrace_stmtdesc_t *, void *); 166178479Sjb 167178479Sjbextern dtrace_stmtdesc_t *dtrace_stmt_create(dtrace_hdl_t *, 168178479Sjb dtrace_ecbdesc_t *); 169178479Sjbextern dtrace_actdesc_t *dtrace_stmt_action(dtrace_hdl_t *, 170178479Sjb dtrace_stmtdesc_t *); 171178479Sjbextern int dtrace_stmt_add(dtrace_hdl_t *, dtrace_prog_t *, 172178479Sjb dtrace_stmtdesc_t *); 173178479Sjbextern int dtrace_stmt_iter(dtrace_hdl_t *, dtrace_prog_t *, 174178479Sjb dtrace_stmt_f *, void *); 175178479Sjbextern void dtrace_stmt_destroy(dtrace_hdl_t *, dtrace_stmtdesc_t *); 176178479Sjb 177178479Sjb/* 178178479Sjb * DTrace Data Consumption Interface 179178479Sjb */ 180178479Sjbtypedef enum { 181178479Sjb DTRACEFLOW_ENTRY, 182178479Sjb DTRACEFLOW_RETURN, 183178479Sjb DTRACEFLOW_NONE 184178479Sjb} dtrace_flowkind_t; 185178479Sjb 186178479Sjb#define DTRACE_CONSUME_ERROR -1 /* error while processing */ 187178479Sjb#define DTRACE_CONSUME_THIS 0 /* consume this probe/record */ 188178479Sjb#define DTRACE_CONSUME_NEXT 1 /* advance to next probe/rec */ 189178479Sjb#define DTRACE_CONSUME_ABORT 2 /* abort consumption */ 190178479Sjb 191178479Sjbtypedef struct dtrace_probedata { 192178479Sjb dtrace_hdl_t *dtpda_handle; /* handle to DTrace library */ 193178479Sjb dtrace_eprobedesc_t *dtpda_edesc; /* enabled probe description */ 194178479Sjb dtrace_probedesc_t *dtpda_pdesc; /* probe description */ 195178479Sjb processorid_t dtpda_cpu; /* CPU for data */ 196178479Sjb caddr_t dtpda_data; /* pointer to raw data */ 197178479Sjb dtrace_flowkind_t dtpda_flow; /* flow kind */ 198178479Sjb const char *dtpda_prefix; /* recommended flow prefix */ 199178479Sjb int dtpda_indent; /* recommended flow indent */ 200178479Sjb} dtrace_probedata_t; 201178479Sjb 202178479Sjbtypedef int dtrace_consume_probe_f(const dtrace_probedata_t *, void *); 203178479Sjbtypedef int dtrace_consume_rec_f(const dtrace_probedata_t *, 204178479Sjb const dtrace_recdesc_t *, void *); 205178479Sjb 206178479Sjbextern int dtrace_consume(dtrace_hdl_t *, FILE *, 207178479Sjb dtrace_consume_probe_f *, dtrace_consume_rec_f *, void *); 208178479Sjb 209178479Sjb#define DTRACE_STATUS_NONE 0 /* no status; not yet time */ 210178479Sjb#define DTRACE_STATUS_OKAY 1 /* status okay */ 211178479Sjb#define DTRACE_STATUS_EXITED 2 /* exit() was called; tracing stopped */ 212178479Sjb#define DTRACE_STATUS_FILLED 3 /* fill buffer filled; tracing stoped */ 213178479Sjb#define DTRACE_STATUS_STOPPED 4 /* tracing already stopped */ 214178479Sjb 215178479Sjbextern int dtrace_status(dtrace_hdl_t *); 216178479Sjb 217178479Sjb/* 218178479Sjb * DTrace Formatted Output Interfaces 219178479Sjb * 220178479Sjb * To format output associated with a given dtrace_stmtdesc, the caller can 221178479Sjb * invoke one of the following functions, passing the opaque dtsd_fmtdata and a 222178479Sjb * list of record descriptions. These functions return either -1 to indicate 223178479Sjb * an error, or a positive integer indicating the number of records consumed. 224178479Sjb * For anonymous enablings, the consumer can use the dtrd_format member of 225178479Sjb * the record description to obtain a format description. The dtfd_string 226178479Sjb * member of the format description may be passed to dtrace_print{fa}_create() 227178479Sjb * to create the opaque format data. 228178479Sjb */ 229178479Sjbextern void *dtrace_printf_create(dtrace_hdl_t *, const char *); 230178479Sjbextern void *dtrace_printa_create(dtrace_hdl_t *, const char *); 231178479Sjbextern size_t dtrace_printf_format(dtrace_hdl_t *, void *, char *, size_t); 232178479Sjb 233178479Sjbextern int dtrace_fprintf(dtrace_hdl_t *, FILE *, void *, 234178479Sjb const dtrace_probedata_t *, const dtrace_recdesc_t *, uint_t, 235178479Sjb const void *, size_t); 236178479Sjb 237178479Sjbextern int dtrace_fprinta(dtrace_hdl_t *, FILE *, void *, 238178479Sjb const dtrace_probedata_t *, const dtrace_recdesc_t *, uint_t, 239178479Sjb const void *, size_t); 240178479Sjb 241178479Sjbextern int dtrace_system(dtrace_hdl_t *, FILE *, void *, 242178479Sjb const dtrace_probedata_t *, const dtrace_recdesc_t *, uint_t, 243178479Sjb const void *, size_t); 244178479Sjb 245178479Sjbextern int dtrace_freopen(dtrace_hdl_t *, FILE *, void *, 246178479Sjb const dtrace_probedata_t *, const dtrace_recdesc_t *, uint_t, 247178479Sjb const void *, size_t); 248178479Sjb 249178479Sjb/* 250248708Spfg * Type-specific output printing 251248708Spfg * 252248708Spfg * The print() action will associate a string data record that is actually the 253248708Spfg * fully-qualified type name of the data traced by the DIFEXPR action. This is 254248708Spfg * stored in the same 'format' record from the kernel, but we know by virtue of 255248708Spfg * the fact that the action is still DIFEXPR that it is actually a reference to 256248708Spfg * plain string data. 257248708Spfg */ 258248708Spfgextern int dtrace_print(dtrace_hdl_t *, FILE *, const char *, 259248708Spfg caddr_t, size_t); 260248708Spfg 261248708Spfg/* 262178479Sjb * DTrace Work Interface 263178479Sjb */ 264178479Sjbtypedef enum { 265178479Sjb DTRACE_WORKSTATUS_ERROR = -1, 266178479Sjb DTRACE_WORKSTATUS_OKAY, 267178479Sjb DTRACE_WORKSTATUS_DONE 268178479Sjb} dtrace_workstatus_t; 269178479Sjb 270178479Sjbextern dtrace_workstatus_t dtrace_work(dtrace_hdl_t *, FILE *, 271178479Sjb dtrace_consume_probe_f *, dtrace_consume_rec_f *, void *); 272178479Sjb 273178479Sjb/* 274178479Sjb * DTrace Handler Interface 275178479Sjb */ 276178479Sjb#define DTRACE_HANDLE_ABORT -1 /* abort current operation */ 277178479Sjb#define DTRACE_HANDLE_OK 0 /* handled okay; continue */ 278178479Sjb 279178479Sjbtypedef struct dtrace_errdata { 280178479Sjb dtrace_hdl_t *dteda_handle; /* handle to DTrace library */ 281178479Sjb dtrace_eprobedesc_t *dteda_edesc; /* enabled probe inducing err */ 282178479Sjb dtrace_probedesc_t *dteda_pdesc; /* probe inducing error */ 283178479Sjb processorid_t dteda_cpu; /* CPU of error */ 284178479Sjb int dteda_action; /* action inducing error */ 285178479Sjb int dteda_offset; /* offset in DIFO of error */ 286178479Sjb int dteda_fault; /* specific fault */ 287178479Sjb uint64_t dteda_addr; /* address of fault, if any */ 288178479Sjb const char *dteda_msg; /* preconstructed message */ 289178479Sjb} dtrace_errdata_t; 290178479Sjb 291178479Sjbtypedef int dtrace_handle_err_f(const dtrace_errdata_t *, void *); 292178479Sjbextern int dtrace_handle_err(dtrace_hdl_t *, dtrace_handle_err_f *, void *); 293178479Sjb 294178479Sjbtypedef enum { 295178479Sjb DTRACEDROP_PRINCIPAL, /* drop to principal buffer */ 296178479Sjb DTRACEDROP_AGGREGATION, /* drop to aggregation buffer */ 297178479Sjb DTRACEDROP_DYNAMIC, /* dynamic drop */ 298178479Sjb DTRACEDROP_DYNRINSE, /* dyn drop due to rinsing */ 299178479Sjb DTRACEDROP_DYNDIRTY, /* dyn drop due to dirty */ 300178479Sjb DTRACEDROP_SPEC, /* speculative drop */ 301178479Sjb DTRACEDROP_SPECBUSY, /* spec drop due to busy */ 302178479Sjb DTRACEDROP_SPECUNAVAIL, /* spec drop due to unavail */ 303178479Sjb DTRACEDROP_STKSTROVERFLOW, /* stack string tab overflow */ 304178479Sjb DTRACEDROP_DBLERROR /* error in ERROR probe */ 305178479Sjb} dtrace_dropkind_t; 306178479Sjb 307178479Sjbtypedef struct dtrace_dropdata { 308178479Sjb dtrace_hdl_t *dtdda_handle; /* handle to DTrace library */ 309178479Sjb processorid_t dtdda_cpu; /* CPU, if any */ 310178479Sjb dtrace_dropkind_t dtdda_kind; /* kind of drop */ 311178479Sjb uint64_t dtdda_drops; /* number of drops */ 312178479Sjb uint64_t dtdda_total; /* total drops */ 313178479Sjb const char *dtdda_msg; /* preconstructed message */ 314178479Sjb} dtrace_dropdata_t; 315178479Sjb 316178479Sjbtypedef int dtrace_handle_drop_f(const dtrace_dropdata_t *, void *); 317178479Sjbextern int dtrace_handle_drop(dtrace_hdl_t *, dtrace_handle_drop_f *, void *); 318178479Sjb 319178479Sjbtypedef void dtrace_handle_proc_f(struct ps_prochandle *, const char *, void *); 320178479Sjbextern int dtrace_handle_proc(dtrace_hdl_t *, dtrace_handle_proc_f *, void *); 321178479Sjb 322178479Sjb#define DTRACE_BUFDATA_AGGKEY 0x0001 /* aggregation key */ 323178479Sjb#define DTRACE_BUFDATA_AGGVAL 0x0002 /* aggregation value */ 324178479Sjb#define DTRACE_BUFDATA_AGGFORMAT 0x0004 /* aggregation format data */ 325178479Sjb#define DTRACE_BUFDATA_AGGLAST 0x0008 /* last for this key/val */ 326178479Sjb 327178479Sjbtypedef struct dtrace_bufdata { 328178479Sjb dtrace_hdl_t *dtbda_handle; /* handle to DTrace library */ 329178479Sjb const char *dtbda_buffered; /* buffered output */ 330178479Sjb dtrace_probedata_t *dtbda_probe; /* probe data */ 331178479Sjb const dtrace_recdesc_t *dtbda_recdesc; /* record description */ 332178479Sjb const dtrace_aggdata_t *dtbda_aggdata; /* aggregation data, if agg. */ 333178479Sjb uint32_t dtbda_flags; /* flags; see above */ 334178479Sjb} dtrace_bufdata_t; 335178479Sjb 336178479Sjbtypedef int dtrace_handle_buffered_f(const dtrace_bufdata_t *, void *); 337178479Sjbextern int dtrace_handle_buffered(dtrace_hdl_t *, 338178479Sjb dtrace_handle_buffered_f *, void *); 339178479Sjb 340178479Sjbtypedef struct dtrace_setoptdata { 341178479Sjb dtrace_hdl_t *dtsda_handle; /* handle to DTrace library */ 342178479Sjb const dtrace_probedata_t *dtsda_probe; /* probe data */ 343178479Sjb const char *dtsda_option; /* option that was set */ 344178479Sjb dtrace_optval_t dtsda_oldval; /* old value */ 345178479Sjb dtrace_optval_t dtsda_newval; /* new value */ 346178479Sjb} dtrace_setoptdata_t; 347178479Sjb 348178479Sjbtypedef int dtrace_handle_setopt_f(const dtrace_setoptdata_t *, void *); 349178479Sjbextern int dtrace_handle_setopt(dtrace_hdl_t *, 350178479Sjb dtrace_handle_setopt_f *, void *); 351178479Sjb 352178479Sjb/* 353178479Sjb * DTrace Aggregate Interface 354178479Sjb */ 355178479Sjb 356178479Sjb#define DTRACE_A_PERCPU 0x0001 357178479Sjb#define DTRACE_A_KEEPDELTA 0x0002 358178479Sjb#define DTRACE_A_ANONYMOUS 0x0004 359178479Sjb 360178479Sjb#define DTRACE_AGGWALK_ERROR -1 /* error while processing */ 361178479Sjb#define DTRACE_AGGWALK_NEXT 0 /* proceed to next element */ 362178479Sjb#define DTRACE_AGGWALK_ABORT 1 /* abort aggregation walk */ 363178479Sjb#define DTRACE_AGGWALK_CLEAR 2 /* clear this element */ 364178479Sjb#define DTRACE_AGGWALK_NORMALIZE 3 /* normalize this element */ 365178479Sjb#define DTRACE_AGGWALK_DENORMALIZE 4 /* denormalize this element */ 366178479Sjb#define DTRACE_AGGWALK_REMOVE 5 /* remove this element */ 367178479Sjb 368178479Sjbstruct dtrace_aggdata { 369178479Sjb dtrace_hdl_t *dtada_handle; /* handle to DTrace library */ 370178479Sjb dtrace_aggdesc_t *dtada_desc; /* aggregation description */ 371178479Sjb dtrace_eprobedesc_t *dtada_edesc; /* enabled probe description */ 372178479Sjb dtrace_probedesc_t *dtada_pdesc; /* probe description */ 373178479Sjb caddr_t dtada_data; /* pointer to raw data */ 374178479Sjb uint64_t dtada_normal; /* the normal -- 1 for denorm */ 375178479Sjb size_t dtada_size; /* total size of the data */ 376178479Sjb caddr_t dtada_delta; /* delta data, if available */ 377178479Sjb caddr_t *dtada_percpu; /* per CPU data, if avail */ 378178479Sjb caddr_t *dtada_percpu_delta; /* per CPU delta, if avail */ 379178479Sjb}; 380178479Sjb 381178479Sjbtypedef int dtrace_aggregate_f(const dtrace_aggdata_t *, void *); 382178479Sjbtypedef int dtrace_aggregate_walk_f(dtrace_hdl_t *, 383178479Sjb dtrace_aggregate_f *, void *); 384178479Sjbtypedef int dtrace_aggregate_walk_joined_f(const dtrace_aggdata_t **, 385178479Sjb const int, void *); 386178479Sjb 387178479Sjbextern void dtrace_aggregate_clear(dtrace_hdl_t *); 388178479Sjbextern int dtrace_aggregate_snap(dtrace_hdl_t *); 389178479Sjbextern int dtrace_aggregate_print(dtrace_hdl_t *, FILE *, 390178479Sjb dtrace_aggregate_walk_f *); 391178479Sjb 392178479Sjbextern int dtrace_aggregate_walk(dtrace_hdl_t *, dtrace_aggregate_f *, void *); 393178479Sjb 394178479Sjbextern int dtrace_aggregate_walk_joined(dtrace_hdl_t *, 395178479Sjb dtrace_aggvarid_t *, int, dtrace_aggregate_walk_joined_f *, void *); 396178479Sjb 397178479Sjbextern int dtrace_aggregate_walk_sorted(dtrace_hdl_t *, 398178479Sjb dtrace_aggregate_f *, void *); 399178479Sjb 400178479Sjbextern int dtrace_aggregate_walk_keysorted(dtrace_hdl_t *, 401178479Sjb dtrace_aggregate_f *, void *); 402178479Sjb 403178479Sjbextern int dtrace_aggregate_walk_valsorted(dtrace_hdl_t *, 404178479Sjb dtrace_aggregate_f *, void *); 405178479Sjb 406178479Sjbextern int dtrace_aggregate_walk_keyvarsorted(dtrace_hdl_t *, 407178479Sjb dtrace_aggregate_f *, void *); 408178479Sjb 409178479Sjbextern int dtrace_aggregate_walk_valvarsorted(dtrace_hdl_t *, 410178479Sjb dtrace_aggregate_f *, void *); 411178479Sjb 412178479Sjbextern int dtrace_aggregate_walk_keyrevsorted(dtrace_hdl_t *, 413178479Sjb dtrace_aggregate_f *, void *); 414178479Sjb 415178479Sjbextern int dtrace_aggregate_walk_valrevsorted(dtrace_hdl_t *, 416178479Sjb dtrace_aggregate_f *, void *); 417178479Sjb 418178479Sjbextern int dtrace_aggregate_walk_keyvarrevsorted(dtrace_hdl_t *, 419178479Sjb dtrace_aggregate_f *, void *); 420178479Sjb 421178479Sjbextern int dtrace_aggregate_walk_valvarrevsorted(dtrace_hdl_t *, 422178479Sjb dtrace_aggregate_f *, void *); 423178479Sjb 424178479Sjb#define DTRACE_AGD_PRINTED 0x1 /* aggregation printed in program */ 425178479Sjb 426178479Sjb/* 427178479Sjb * DTrace Process Control Interface 428178479Sjb * 429178479Sjb * Library clients who wish to have libdtrace create or grab processes for 430178479Sjb * monitoring of their symbol table changes may use these interfaces to 431178479Sjb * request that libdtrace obtain control of the process using libproc. 432178479Sjb */ 433178479Sjb 434178479Sjbextern struct ps_prochandle *dtrace_proc_create(dtrace_hdl_t *, 435184696Srodrigc const char *, char *const *, proc_child_func *, void *); 436178479Sjb 437178479Sjbextern struct ps_prochandle *dtrace_proc_grab(dtrace_hdl_t *, pid_t, int); 438178479Sjbextern void dtrace_proc_release(dtrace_hdl_t *, struct ps_prochandle *); 439178479Sjbextern void dtrace_proc_continue(dtrace_hdl_t *, struct ps_prochandle *); 440178479Sjb 441178479Sjb/* 442178479Sjb * DTrace Object, Symbol, and Type Interfaces 443178479Sjb * 444178479Sjb * Library clients can use libdtrace to perform symbol and C type information 445178479Sjb * lookups by symbol name, symbol address, or C type name, or to lookup meta- 446178479Sjb * information cached for each of the program objects in use by DTrace. The 447178479Sjb * resulting struct contain pointers to arbitrary-length strings, including 448178479Sjb * object, symbol, and type names, that are persistent until the next call to 449178479Sjb * dtrace_update(). Once dtrace_update() is called, any cached values must 450178479Sjb * be flushed and not used subsequently by the client program. 451178479Sjb */ 452178479Sjb 453178479Sjb#define DTRACE_OBJ_EXEC ((const char *)0L) /* primary executable file */ 454178479Sjb#define DTRACE_OBJ_RTLD ((const char *)1L) /* run-time link-editor */ 455178479Sjb#define DTRACE_OBJ_CDEFS ((const char *)2L) /* C include definitions */ 456178479Sjb#define DTRACE_OBJ_DDEFS ((const char *)3L) /* D program definitions */ 457178479Sjb#define DTRACE_OBJ_EVERY ((const char *)-1L) /* all known objects */ 458178479Sjb#define DTRACE_OBJ_KMODS ((const char *)-2L) /* all kernel objects */ 459178479Sjb#define DTRACE_OBJ_UMODS ((const char *)-3L) /* all user objects */ 460178479Sjb 461178479Sjbtypedef struct dtrace_objinfo { 462178479Sjb const char *dto_name; /* object file scope name */ 463178479Sjb const char *dto_file; /* object file path (if any) */ 464178479Sjb int dto_id; /* object file id (if any) */ 465178479Sjb uint_t dto_flags; /* object flags (see below) */ 466178479Sjb GElf_Addr dto_text_va; /* address of text section */ 467178479Sjb GElf_Xword dto_text_size; /* size of text section */ 468178479Sjb GElf_Addr dto_data_va; /* address of data section */ 469178479Sjb GElf_Xword dto_data_size; /* size of data section */ 470178479Sjb GElf_Addr dto_bss_va; /* address of BSS */ 471178479Sjb GElf_Xword dto_bss_size; /* size of BSS */ 472178479Sjb} dtrace_objinfo_t; 473178479Sjb 474178479Sjb#define DTRACE_OBJ_F_KERNEL 0x1 /* object is a kernel module */ 475178479Sjb#define DTRACE_OBJ_F_PRIMARY 0x2 /* object is a primary module */ 476178479Sjb 477178479Sjbtypedef int dtrace_obj_f(dtrace_hdl_t *, const dtrace_objinfo_t *, void *); 478178479Sjb 479178479Sjbextern int dtrace_object_iter(dtrace_hdl_t *, dtrace_obj_f *, void *); 480178479Sjbextern int dtrace_object_info(dtrace_hdl_t *, const char *, dtrace_objinfo_t *); 481178479Sjb 482178479Sjbtypedef struct dtrace_syminfo { 483178479Sjb const char *dts_object; /* object name */ 484178479Sjb const char *dts_name; /* symbol name */ 485178479Sjb ulong_t dts_id; /* symbol id */ 486178479Sjb} dtrace_syminfo_t; 487178479Sjb 488178479Sjbextern int dtrace_lookup_by_name(dtrace_hdl_t *, const char *, const char *, 489178479Sjb GElf_Sym *, dtrace_syminfo_t *); 490178479Sjb 491178479Sjbextern int dtrace_lookup_by_addr(dtrace_hdl_t *, GElf_Addr addr, 492178479Sjb GElf_Sym *, dtrace_syminfo_t *); 493178479Sjb 494178479Sjbtypedef struct dtrace_typeinfo { 495178479Sjb const char *dtt_object; /* object containing type */ 496178479Sjb ctf_file_t *dtt_ctfp; /* CTF container handle */ 497178479Sjb ctf_id_t dtt_type; /* CTF type identifier */ 498178479Sjb} dtrace_typeinfo_t; 499178479Sjb 500178479Sjbextern int dtrace_lookup_by_type(dtrace_hdl_t *, const char *, const char *, 501178479Sjb dtrace_typeinfo_t *); 502178479Sjb 503178479Sjbextern int dtrace_symbol_type(dtrace_hdl_t *, const GElf_Sym *, 504178479Sjb const dtrace_syminfo_t *, dtrace_typeinfo_t *); 505178479Sjb 506178479Sjbextern int dtrace_type_strcompile(dtrace_hdl_t *, 507178479Sjb const char *, dtrace_typeinfo_t *); 508178479Sjb 509178479Sjbextern int dtrace_type_fcompile(dtrace_hdl_t *, 510178479Sjb FILE *, dtrace_typeinfo_t *); 511178479Sjb 512178479Sjb/* 513178479Sjb * DTrace Probe Interface 514178479Sjb * 515178479Sjb * Library clients can use these functions to iterate over the set of available 516178479Sjb * probe definitions and inquire as to their attributes. The probe iteration 517178479Sjb * interfaces report probes that are declared as well as those from dtrace(7D). 518178479Sjb */ 519178479Sjbtypedef struct dtrace_probeinfo { 520178479Sjb dtrace_attribute_t dtp_attr; /* name attributes */ 521178479Sjb dtrace_attribute_t dtp_arga; /* arg attributes */ 522178479Sjb const dtrace_typeinfo_t *dtp_argv; /* arg types */ 523178479Sjb int dtp_argc; /* arg count */ 524178479Sjb} dtrace_probeinfo_t; 525178479Sjb 526178479Sjbtypedef int dtrace_probe_f(dtrace_hdl_t *, const dtrace_probedesc_t *, void *); 527178479Sjb 528178479Sjbextern int dtrace_probe_iter(dtrace_hdl_t *, 529178479Sjb const dtrace_probedesc_t *pdp, dtrace_probe_f *, void *); 530178479Sjb 531178479Sjbextern int dtrace_probe_info(dtrace_hdl_t *, 532178479Sjb const dtrace_probedesc_t *, dtrace_probeinfo_t *); 533178479Sjb 534178479Sjb/* 535178479Sjb * DTrace Vector Interface 536178479Sjb * 537178479Sjb * The DTrace library normally speaks directly to dtrace(7D). However, 538178479Sjb * this communication may be vectored elsewhere. Consumers who wish to 539178479Sjb * perform a vectored open must fill in the vector, and use the dtrace_vopen() 540178479Sjb * entry point to obtain a library handle. 541178479Sjb */ 542178479Sjbstruct dtrace_vector { 543178550Sjb#if defined(sun) 544178479Sjb int (*dtv_ioctl)(void *, int, void *); 545178550Sjb#else 546178550Sjb int (*dtv_ioctl)(void *, u_long, void *); 547178550Sjb#endif 548178479Sjb int (*dtv_lookup_by_addr)(void *, GElf_Addr, GElf_Sym *, 549178479Sjb dtrace_syminfo_t *); 550178479Sjb int (*dtv_status)(void *, processorid_t); 551178479Sjb long (*dtv_sysconf)(void *, int); 552178479Sjb}; 553178479Sjb 554178479Sjb/* 555178479Sjb * DTrace Utility Functions 556178479Sjb * 557178479Sjb * Library clients can use these functions to convert addresses strings, to 558178479Sjb * convert between string and integer probe descriptions and the 559178479Sjb * dtrace_probedesc_t representation, and to perform similar conversions on 560178479Sjb * stability attributes. 561178479Sjb */ 562178479Sjbextern int dtrace_addr2str(dtrace_hdl_t *, uint64_t, char *, int); 563178479Sjbextern int dtrace_uaddr2str(dtrace_hdl_t *, pid_t, uint64_t, char *, int); 564178479Sjb 565178479Sjbextern int dtrace_xstr2desc(dtrace_hdl_t *, dtrace_probespec_t, 566178479Sjb const char *, int, char *const [], dtrace_probedesc_t *); 567178479Sjb 568178479Sjbextern int dtrace_str2desc(dtrace_hdl_t *, dtrace_probespec_t, 569178479Sjb const char *, dtrace_probedesc_t *); 570178479Sjb 571178479Sjbextern int dtrace_id2desc(dtrace_hdl_t *, dtrace_id_t, dtrace_probedesc_t *); 572178479Sjb 573178479Sjb#define DTRACE_DESC2STR_MAX 1024 /* min buf size for dtrace_desc2str() */ 574178479Sjb 575178479Sjbextern char *dtrace_desc2str(const dtrace_probedesc_t *, char *, size_t); 576178479Sjb 577178479Sjb#define DTRACE_ATTR2STR_MAX 64 /* min buf size for dtrace_attr2str() */ 578178479Sjb 579178479Sjbextern char *dtrace_attr2str(dtrace_attribute_t, char *, size_t); 580178479Sjbextern int dtrace_str2attr(const char *, dtrace_attribute_t *); 581178479Sjb 582178479Sjbextern const char *dtrace_stability_name(dtrace_stability_t); 583178479Sjbextern const char *dtrace_class_name(dtrace_class_t); 584178479Sjb 585178479Sjbextern int dtrace_provider_modules(dtrace_hdl_t *, const char **, int); 586178479Sjb 587178479Sjbextern const char *const _dtrace_version; 588178479Sjbextern int _dtrace_debug; 589178479Sjb 590178479Sjb#ifdef __cplusplus 591178479Sjb} 592178479Sjb#endif 593178479Sjb 594178550Sjb#if !defined(sun) 595178550Sjb#define _SC_CPUID_MAX _SC_NPROCESSORS_CONF 596178550Sjb#define _SC_NPROCESSORS_MAX _SC_NPROCESSORS_CONF 597178550Sjb#endif 598178550Sjb 599178479Sjb#endif /* _DTRACE_H */ 600