📄 dtrace.h
字号:
/* * Copyright 2005 Sun Microsystems, Inc. All rights reserved. * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only. * See the file usr/src/LICENSING.NOTICE in this distribution or * http://www.opensolaris.org/license/ for details. */#ifndef _SYS_DTRACE_H#define _SYS_DTRACE_H#pragma ident "@(#)dtrace.h 1.18 04/11/22 SMI"#ifdef __cplusplusextern "C" {#endif/* * DTrace Dynamic Tracing Software: Kernel Interfaces * * Note: The contents of this file are private to the implementation of the * Solaris system and DTrace subsystem and are subject to change at any time * without notice. Applications and drivers using these interfaces will fail * to run on future releases. These interfaces should not be used for any * purpose except those expressly outlined in dtrace(7D) and libdtrace(3LIB). * Please refer to the "Solaris Dynamic Tracing Guide" for more information. */#ifndef _ASM#include <sys/types.h>#include <sys/modctl.h>#include <sys/processor.h>#include <sys/systm.h>#include <sys/ctf_api.h>#include <sys/cyclic.h>#include <sys/int_limits.h>/* * DTrace Universal Constants and Typedefs */#define DTRACE_CPUALL -1 /* all CPUs */#define DTRACE_IDNONE 0 /* invalid probe identifier */#define DTRACE_EPIDNONE 0 /* invalid enabled probe identifier */#define DTRACE_AGGIDNONE 0 /* invalid aggregation identifier */#define DTRACE_CACHEIDNONE 0 /* invalid predicate cache */#define DTRACE_PROVNONE 0 /* invalid provider identifier */#define DTRACE_METAPROVNONE 0 /* invalid meta-provider identifier */#define DTRACE_ARGNONE -1 /* invalid argument index */#define DTRACE_PROVNAMELEN 64#define DTRACE_MODNAMELEN 64#define DTRACE_FUNCNAMELEN 128#define DTRACE_NAMELEN 64#define DTRACE_FULLNAMELEN (DTRACE_PROVNAMELEN + DTRACE_MODNAMELEN + \ DTRACE_FUNCNAMELEN + DTRACE_NAMELEN + 4)#define DTRACE_ARGTYPELEN 128typedef uint32_t dtrace_id_t; /* probe identifier */typedef uint32_t dtrace_epid_t; /* enabled probe identifier */typedef uint32_t dtrace_aggid_t; /* aggregation identifier */typedef uint16_t dtrace_actkind_t; /* action kind */typedef int64_t dtrace_optval_t; /* option value */typedef uint32_t dtrace_cacheid_t; /* predicate cache identifier */typedef enum dtrace_probespec { DTRACE_PROBESPEC_NONE = -1, DTRACE_PROBESPEC_PROVIDER = 0, DTRACE_PROBESPEC_MOD, DTRACE_PROBESPEC_FUNC, DTRACE_PROBESPEC_NAME} dtrace_probespec_t;/* * DTrace Intermediate Format (DIF) * * The following definitions describe the DTrace Intermediate Format (DIF), a * a RISC-like instruction set and program encoding used to represent * predicates and actions that can be bound to DTrace probes. The constants * below defining the number of available registers are suggested minimums; the * compiler should use DTRACEIOC_CONF to dynamically obtain the number of * registers provided by the current DTrace implementation. */#define DIF_VERSION_1 1 /* DIF version 1: Solaris 10 Beta */#define DIF_VERSION_2 2 /* DIF version 2: Solaris 10 FCS */#define DIF_VERSION DIF_VERSION_2 /* latest DIF instruction set version */#define DIF_DIR_NREGS 8 /* number of DIF integer registers */#define DIF_DTR_NREGS 8 /* number of DIF tuple registers */#define DIF_OP_OR 1 /* or r1, r2, rd */#define DIF_OP_XOR 2 /* xor r1, r2, rd */#define DIF_OP_AND 3 /* and r1, r2, rd */#define DIF_OP_SLL 4 /* sll r1, r2, rd */#define DIF_OP_SRL 5 /* srl r1, r2, rd */#define DIF_OP_SUB 6 /* sub r1, r2, rd */#define DIF_OP_ADD 7 /* add r1, r2, rd */#define DIF_OP_MUL 8 /* mul r1, r2, rd */#define DIF_OP_SDIV 9 /* sdiv r1, r2, rd */#define DIF_OP_UDIV 10 /* udiv r1, r2, rd */#define DIF_OP_SREM 11 /* srem r1, r2, rd */#define DIF_OP_UREM 12 /* urem r1, r2, rd */#define DIF_OP_NOT 13 /* not r1, rd */#define DIF_OP_MOV 14 /* mov r1, rd */#define DIF_OP_CMP 15 /* cmp r1, r2 */#define DIF_OP_TST 16 /* tst r1 */#define DIF_OP_BA 17 /* ba label */#define DIF_OP_BE 18 /* be label */#define DIF_OP_BNE 19 /* bne label */#define DIF_OP_BG 20 /* bg label */#define DIF_OP_BGU 21 /* bgu label */#define DIF_OP_BGE 22 /* bge label */#define DIF_OP_BGEU 23 /* bgeu label */#define DIF_OP_BL 24 /* bl label */#define DIF_OP_BLU 25 /* blu label */#define DIF_OP_BLE 26 /* ble label */#define DIF_OP_BLEU 27 /* bleu label */#define DIF_OP_LDSB 28 /* ldsb [r1], rd */#define DIF_OP_LDSH 29 /* ldsh [r1], rd */#define DIF_OP_LDSW 30 /* ldsw [r1], rd */#define DIF_OP_LDUB 31 /* ldub [r1], rd */#define DIF_OP_LDUH 32 /* lduh [r1], rd */#define DIF_OP_LDUW 33 /* lduw [r1], rd */#define DIF_OP_LDX 34 /* ldx [r1], rd */#define DIF_OP_RET 35 /* ret rd */#define DIF_OP_NOP 36 /* nop */#define DIF_OP_SETX 37 /* setx intindex, rd */#define DIF_OP_SETS 38 /* sets strindex, rd */#define DIF_OP_SCMP 39 /* scmp r1, r2 */#define DIF_OP_LDGA 40 /* ldga var, ri, rd */#define DIF_OP_LDGS 41 /* ldgs var, rd */#define DIF_OP_STGS 42 /* stgs var, rs */#define DIF_OP_LDTA 43 /* ldta var, ri, rd */#define DIF_OP_LDTS 44 /* ldts var, rd */#define DIF_OP_STTS 45 /* stts var, rs */#define DIF_OP_SRA 46 /* sra r1, r2, rd */#define DIF_OP_CALL 47 /* call subr, rd */#define DIF_OP_PUSHTR 48 /* pushtr type, rs, rr */#define DIF_OP_PUSHTV 49 /* pushtv type, rs, rv */#define DIF_OP_POPTS 50 /* popts */#define DIF_OP_FLUSHTS 51 /* flushts */#define DIF_OP_LDGAA 52 /* ldgaa var, rd */#define DIF_OP_LDTAA 53 /* ldtaa var, rd */#define DIF_OP_STGAA 54 /* stgaa var, rs */#define DIF_OP_STTAA 55 /* sttaa var, rs */#define DIF_OP_LDLS 56 /* ldls var, rd */#define DIF_OP_STLS 57 /* stls var, rs */#define DIF_OP_ALLOCS 58 /* allocs r1, rd */#define DIF_OP_COPYS 59 /* copys r1, r2, rd */#define DIF_OP_STB 60 /* stb r1, [rd] */#define DIF_OP_STH 61 /* sth r1, [rd] */#define DIF_OP_STW 62 /* stw r1, [rd] */#define DIF_OP_STX 63 /* stx r1, [rd] */#define DIF_OP_ULDSB 64 /* uldsb [r1], rd */#define DIF_OP_ULDSH 65 /* uldsh [r1], rd */#define DIF_OP_ULDSW 66 /* uldsw [r1], rd */#define DIF_OP_ULDUB 67 /* uldub [r1], rd */#define DIF_OP_ULDUH 68 /* ulduh [r1], rd */#define DIF_OP_ULDUW 69 /* ulduw [r1], rd */#define DIF_OP_ULDX 70 /* uldx [r1], rd */#define DIF_OP_RLDSB 71 /* rldsb [r1], rd */#define DIF_OP_RLDSH 72 /* rldsh [r1], rd */#define DIF_OP_RLDSW 73 /* rldsw [r1], rd */#define DIF_OP_RLDUB 74 /* rldub [r1], rd */#define DIF_OP_RLDUH 75 /* rlduh [r1], rd */#define DIF_OP_RLDUW 76 /* rlduw [r1], rd */#define DIF_OP_RLDX 77 /* rldx [r1], rd */#define DIF_INTOFF_MAX 0xffff /* highest integer table offset */#define DIF_STROFF_MAX 0xffff /* highest string table offset */#define DIF_REGISTER_MAX 0xff /* highest register number */#define DIF_VARIABLE_MAX 0xffff /* highest variable identifier */#define DIF_SUBROUTINE_MAX 0xffff /* highest subroutine code */#define DIF_VAR_ARRAY_MIN 0x0000 /* lowest numbered array variable */#define DIF_VAR_ARRAY_UBASE 0x0080 /* lowest user-defined array */#define DIF_VAR_ARRAY_MAX 0x00ff /* highest numbered array variable */#define DIF_VAR_OTHER_MIN 0x0100 /* lowest numbered scalar or assc */#define DIF_VAR_OTHER_UBASE 0x0500 /* lowest user-defined scalar or assc */#define DIF_VAR_OTHER_MAX 0xffff /* highest numbered scalar or assc */#define DIF_VAR_ARGS 0x0000 /* arguments array */#define DIF_VAR_REGS 0x0001 /* registers array */#define DIF_VAR_UREGS 0x0002 /* user registers array */#define DIF_VAR_CURTHREAD 0x0100 /* thread pointer */#define DIF_VAR_TIMESTAMP 0x0101 /* timestamp */#define DIF_VAR_VTIMESTAMP 0x0102 /* virtual timestamp */#define DIF_VAR_IPL 0x0103 /* interrupt priority level */#define DIF_VAR_EPID 0x0104 /* enabled probe ID */#define DIF_VAR_ID 0x0105 /* probe ID */#define DIF_VAR_ARG0 0x0106 /* first argument */#define DIF_VAR_ARG1 0x0107 /* second argument */#define DIF_VAR_ARG2 0x0108 /* third argument */#define DIF_VAR_ARG3 0x0109 /* fourth argument */#define DIF_VAR_ARG4 0x010a /* fifth argument */#define DIF_VAR_ARG5 0x010b /* sixth argument */#define DIF_VAR_ARG6 0x010c /* seventh argument */#define DIF_VAR_ARG7 0x010d /* eighth argument */#define DIF_VAR_ARG8 0x010e /* ninth argument */#define DIF_VAR_ARG9 0x010f /* tenth argument */#define DIF_VAR_STACKDEPTH 0x0110 /* stack depth */#define DIF_VAR_CALLER 0x0111 /* caller */#define DIF_VAR_PROBEPROV 0x0112 /* probe provider */#define DIF_VAR_PROBEMOD 0x0113 /* probe module */#define DIF_VAR_PROBEFUNC 0x0114 /* probe function */#define DIF_VAR_PROBENAME 0x0115 /* probe name */#define DIF_VAR_PID 0x0116 /* process ID */#define DIF_VAR_TID 0x0117 /* (per-process) thread ID */#define DIF_VAR_EXECNAME 0x0118 /* name of executable */#define DIF_VAR_ZONENAME 0x0119 /* zone name associated with process */#define DIF_VAR_WALLTIMESTAMP 0x011a /* wall-clock timestamp */#define DIF_SUBR_RAND 0#define DIF_SUBR_MUTEX_OWNED 1#define DIF_SUBR_MUTEX_OWNER 2#define DIF_SUBR_MUTEX_TYPE_ADAPTIVE 3#define DIF_SUBR_MUTEX_TYPE_SPIN 4#define DIF_SUBR_RW_READ_HELD 5#define DIF_SUBR_RW_WRITE_HELD 6#define DIF_SUBR_RW_ISWRITER 7#define DIF_SUBR_COPYIN 8#define DIF_SUBR_COPYINSTR 9#define DIF_SUBR_SPECULATION 10#define DIF_SUBR_PROGENYOF 11#define DIF_SUBR_STRLEN 12#define DIF_SUBR_COPYOUT 13#define DIF_SUBR_COPYOUTSTR 14#define DIF_SUBR_ALLOCA 15#define DIF_SUBR_BCOPY 16#define DIF_SUBR_COPYINTO 17#define DIF_SUBR_MSGDSIZE 18#define DIF_SUBR_MSGSIZE 19#define DIF_SUBR_GETMAJOR 20#define DIF_SUBR_GETMINOR 21#define DIF_SUBR_DDI_PATHNAME 22#define DIF_SUBR_STRJOIN 23#define DIF_SUBR_LLTOSTR 24#define DIF_SUBR_BASENAME 25#define DIF_SUBR_DIRNAME 26#define DIF_SUBR_CLEANPATH 27#define DIF_SUBR_MAX 27 /* max subroutine value */typedef uint32_t dif_instr_t;#define DIF_INSTR_OP(i) (((i) >> 24) & 0xff)#define DIF_INSTR_R1(i) (((i) >> 16) & 0xff)#define DIF_INSTR_R2(i) (((i) >> 8) & 0xff)#define DIF_INSTR_RD(i) ((i) & 0xff)#define DIF_INSTR_RS(i) ((i) & 0xff)#define DIF_INSTR_LABEL(i) ((i) & 0xffffff)#define DIF_INSTR_VAR(i) (((i) >> 8) & 0xffff)#define DIF_INSTR_INTEGER(i) (((i) >> 8) & 0xffff)#define DIF_INSTR_STRING(i) (((i) >> 8) & 0xffff)#define DIF_INSTR_SUBR(i) (((i) >> 8) & 0xffff)#define DIF_INSTR_TYPE(i) (((i) >> 16) & 0xff)#define DIF_INSTR_FMT(op, r1, r2, d) \ (((op) << 24) | ((r1) << 16) | ((r2) << 8) | (d))#define DIF_INSTR_NOT(r1, d) (DIF_INSTR_FMT(DIF_OP_NOT, r1, 0, d))#define DIF_INSTR_MOV(r1, d) (DIF_INSTR_FMT(DIF_OP_MOV, r1, 0, d))#define DIF_INSTR_CMP(op, r1, r2) (DIF_INSTR_FMT(op, r1, r2, 0))#define DIF_INSTR_TST(r1) (DIF_INSTR_FMT(DIF_OP_TST, r1, 0, 0))#define DIF_INSTR_BRANCH(op, label) (((op) << 24) | (label))#define DIF_INSTR_LOAD(op, r1, d) (DIF_INSTR_FMT(op, r1, 0, d))#define DIF_INSTR_STORE(op, r1, d) (DIF_INSTR_FMT(op, r1, 0, d))#define DIF_INSTR_SETX(i, d) ((DIF_OP_SETX << 24) | ((i) << 8) | (d))#define DIF_INSTR_SETS(s, d) ((DIF_OP_SETS << 24) | ((s) << 8) | (d))#define DIF_INSTR_RET(d) (DIF_INSTR_FMT(DIF_OP_RET, 0, 0, d))#define DIF_INSTR_NOP (DIF_OP_NOP << 24)#define DIF_INSTR_LDA(op, v, r, d) (DIF_INSTR_FMT(op, v, r, d))#define DIF_INSTR_LDV(op, v, d) (((op) << 24) | ((v) << 8) | (d))#define DIF_INSTR_STV(op, v, rs) (((op) << 24) | ((v) << 8) | (rs))#define DIF_INSTR_CALL(s, d) ((DIF_OP_CALL << 24) | ((s) << 8) | (d))#define DIF_INSTR_PUSHTS(op, t, r2, rs) (DIF_INSTR_FMT(op, t, r2, rs))#define DIF_INSTR_POPTS (DIF_OP_POPTS << 24)#define DIF_INSTR_FLUSHTS (DIF_OP_FLUSHTS << 24)#define DIF_INSTR_ALLOCS(r1, d) (DIF_INSTR_FMT(DIF_OP_ALLOCS, r1, 0, d))#define DIF_INSTR_COPYS(r1, r2, d) (DIF_INSTR_FMT(DIF_OP_COPYS, r1, r2, d))#define DIF_REG_R0 0 /* %r0 is always set to zero *//* * A DTrace Intermediate Format Type (DIF Type) is used to represent the types * of variables, function and associative array arguments, and the return type * for each DIF object (shown below). It contains a description of the type, * its size in bytes, and a module identifier. */typedef struct dtrace_diftype { uint8_t dtdt_kind; /* type kind (see below) */ uint8_t dtdt_ckind; /* type kind in CTF */ uint8_t dtdt_flags; /* type flags (see below) */ uint8_t dtdt_pad; /* reserved for future use */ uint32_t dtdt_size; /* type size in bytes (unless string) */} dtrace_diftype_t;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -