1 | /*
|
---|
2 | * CDDL HEADER START
|
---|
3 | *
|
---|
4 | * The contents of this file are subject to the terms of the
|
---|
5 | * Common Development and Distribution License (the "License").
|
---|
6 | * You may not use this file except in compliance with the License.
|
---|
7 | *
|
---|
8 | * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
---|
9 | * or http://www.opensolaris.org/os/licensing.
|
---|
10 | * See the License for the specific language governing permissions
|
---|
11 | * and limitations under the License.
|
---|
12 | *
|
---|
13 | * When distributing Covered Code, include this CDDL HEADER in each
|
---|
14 | * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
---|
15 | * If applicable, add the following below this CDDL HEADER, with the
|
---|
16 | * fields enclosed by brackets "[]" replaced with your own identifying
|
---|
17 | * information: Portions Copyright [yyyy] [name of copyright owner]
|
---|
18 | *
|
---|
19 | * CDDL HEADER END
|
---|
20 | */
|
---|
21 |
|
---|
22 | /*
|
---|
23 | * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
|
---|
24 | * Use is subject to license terms.
|
---|
25 | */
|
---|
26 |
|
---|
27 | #ifndef _SYS_DTRACE_H
|
---|
28 | #define _SYS_DTRACE_H
|
---|
29 |
|
---|
30 | #ifdef __cplusplus
|
---|
31 | extern "C" {
|
---|
32 | #endif
|
---|
33 |
|
---|
34 | /*
|
---|
35 | * DTrace Dynamic Tracing Software: Kernel Interfaces
|
---|
36 | *
|
---|
37 | * Note: The contents of this file are private to the implementation of the
|
---|
38 | * Solaris system and DTrace subsystem and are subject to change at any time
|
---|
39 | * without notice. Applications and drivers using these interfaces will fail
|
---|
40 | * to run on future releases. These interfaces should not be used for any
|
---|
41 | * purpose except those expressly outlined in dtrace(7D) and libdtrace(3LIB).
|
---|
42 | * Please refer to the "Solaris Dynamic Tracing Guide" for more information.
|
---|
43 | */
|
---|
44 |
|
---|
45 | #ifndef _ASM
|
---|
46 |
|
---|
47 | #ifndef VBOX
|
---|
48 | #include <sys/types.h>
|
---|
49 | #include <sys/modctl.h>
|
---|
50 | #include <sys/processor.h>
|
---|
51 | #include <sys/systm.h>
|
---|
52 | #include <sys/ctf_api.h>
|
---|
53 | #include <sys/cyclic.h>
|
---|
54 | #include <sys/int_limits.h>
|
---|
55 | #else
|
---|
56 | # include <VBoxDTraceTypes.h>
|
---|
57 | #endif
|
---|
58 |
|
---|
59 | /*
|
---|
60 | * DTrace Universal Constants and Typedefs
|
---|
61 | */
|
---|
62 | #define DTRACE_CPUALL -1 /* all CPUs */
|
---|
63 | #define DTRACE_IDNONE 0 /* invalid probe identifier */
|
---|
64 | #define DTRACE_EPIDNONE 0 /* invalid enabled probe identifier */
|
---|
65 | #define DTRACE_AGGIDNONE 0 /* invalid aggregation identifier */
|
---|
66 | #define DTRACE_AGGVARIDNONE 0 /* invalid aggregation variable ID */
|
---|
67 | #define DTRACE_CACHEIDNONE 0 /* invalid predicate cache */
|
---|
68 | #define DTRACE_PROVNONE 0 /* invalid provider identifier */
|
---|
69 | #define DTRACE_METAPROVNONE 0 /* invalid meta-provider identifier */
|
---|
70 | #define DTRACE_ARGNONE -1 /* invalid argument index */
|
---|
71 |
|
---|
72 | #define DTRACE_PROVNAMELEN 64
|
---|
73 | #define DTRACE_MODNAMELEN 64
|
---|
74 | #define DTRACE_FUNCNAMELEN 128
|
---|
75 | #define DTRACE_NAMELEN 64
|
---|
76 | #define DTRACE_FULLNAMELEN (DTRACE_PROVNAMELEN + DTRACE_MODNAMELEN + \
|
---|
77 | DTRACE_FUNCNAMELEN + DTRACE_NAMELEN + 4)
|
---|
78 | #define DTRACE_ARGTYPELEN 128
|
---|
79 |
|
---|
80 | typedef uint32_t dtrace_id_t; /* probe identifier */
|
---|
81 | typedef uint32_t dtrace_epid_t; /* enabled probe identifier */
|
---|
82 | typedef uint32_t dtrace_aggid_t; /* aggregation identifier */
|
---|
83 | typedef int64_t dtrace_aggvarid_t; /* aggregation variable identifier */
|
---|
84 | typedef uint16_t dtrace_actkind_t; /* action kind */
|
---|
85 | typedef int64_t dtrace_optval_t; /* option value */
|
---|
86 | typedef uint32_t dtrace_cacheid_t; /* predicate cache identifier */
|
---|
87 |
|
---|
88 | typedef enum dtrace_probespec {
|
---|
89 | DTRACE_PROBESPEC_NONE = -1,
|
---|
90 | DTRACE_PROBESPEC_PROVIDER = 0,
|
---|
91 | DTRACE_PROBESPEC_MOD,
|
---|
92 | DTRACE_PROBESPEC_FUNC,
|
---|
93 | DTRACE_PROBESPEC_NAME
|
---|
94 | } dtrace_probespec_t;
|
---|
95 |
|
---|
96 | /*
|
---|
97 | * DTrace Intermediate Format (DIF)
|
---|
98 | *
|
---|
99 | * The following definitions describe the DTrace Intermediate Format (DIF), a
|
---|
100 | * a RISC-like instruction set and program encoding used to represent
|
---|
101 | * predicates and actions that can be bound to DTrace probes. The constants
|
---|
102 | * below defining the number of available registers are suggested minimums; the
|
---|
103 | * compiler should use DTRACEIOC_CONF to dynamically obtain the number of
|
---|
104 | * registers provided by the current DTrace implementation.
|
---|
105 | */
|
---|
106 | #define DIF_VERSION_1 1 /* DIF version 1: Solaris 10 Beta */
|
---|
107 | #define DIF_VERSION_2 2 /* DIF version 2: Solaris 10 FCS */
|
---|
108 | #define DIF_VERSION DIF_VERSION_2 /* latest DIF instruction set version */
|
---|
109 | #define DIF_DIR_NREGS 8 /* number of DIF integer registers */
|
---|
110 | #define DIF_DTR_NREGS 8 /* number of DIF tuple registers */
|
---|
111 |
|
---|
112 | #define DIF_OP_OR 1 /* or r1, r2, rd */
|
---|
113 | #define DIF_OP_XOR 2 /* xor r1, r2, rd */
|
---|
114 | #define DIF_OP_AND 3 /* and r1, r2, rd */
|
---|
115 | #define DIF_OP_SLL 4 /* sll r1, r2, rd */
|
---|
116 | #define DIF_OP_SRL 5 /* srl r1, r2, rd */
|
---|
117 | #define DIF_OP_SUB 6 /* sub r1, r2, rd */
|
---|
118 | #define DIF_OP_ADD 7 /* add r1, r2, rd */
|
---|
119 | #define DIF_OP_MUL 8 /* mul r1, r2, rd */
|
---|
120 | #define DIF_OP_SDIV 9 /* sdiv r1, r2, rd */
|
---|
121 | #define DIF_OP_UDIV 10 /* udiv r1, r2, rd */
|
---|
122 | #define DIF_OP_SREM 11 /* srem r1, r2, rd */
|
---|
123 | #define DIF_OP_UREM 12 /* urem r1, r2, rd */
|
---|
124 | #define DIF_OP_NOT 13 /* not r1, rd */
|
---|
125 | #define DIF_OP_MOV 14 /* mov r1, rd */
|
---|
126 | #define DIF_OP_CMP 15 /* cmp r1, r2 */
|
---|
127 | #define DIF_OP_TST 16 /* tst r1 */
|
---|
128 | #define DIF_OP_BA 17 /* ba label */
|
---|
129 | #define DIF_OP_BE 18 /* be label */
|
---|
130 | #define DIF_OP_BNE 19 /* bne label */
|
---|
131 | #define DIF_OP_BG 20 /* bg label */
|
---|
132 | #define DIF_OP_BGU 21 /* bgu label */
|
---|
133 | #define DIF_OP_BGE 22 /* bge label */
|
---|
134 | #define DIF_OP_BGEU 23 /* bgeu label */
|
---|
135 | #define DIF_OP_BL 24 /* bl label */
|
---|
136 | #define DIF_OP_BLU 25 /* blu label */
|
---|
137 | #define DIF_OP_BLE 26 /* ble label */
|
---|
138 | #define DIF_OP_BLEU 27 /* bleu label */
|
---|
139 | #define DIF_OP_LDSB 28 /* ldsb [r1], rd */
|
---|
140 | #define DIF_OP_LDSH 29 /* ldsh [r1], rd */
|
---|
141 | #define DIF_OP_LDSW 30 /* ldsw [r1], rd */
|
---|
142 | #define DIF_OP_LDUB 31 /* ldub [r1], rd */
|
---|
143 | #define DIF_OP_LDUH 32 /* lduh [r1], rd */
|
---|
144 | #define DIF_OP_LDUW 33 /* lduw [r1], rd */
|
---|
145 | #define DIF_OP_LDX 34 /* ldx [r1], rd */
|
---|
146 | #define DIF_OP_RET 35 /* ret rd */
|
---|
147 | #define DIF_OP_NOP 36 /* nop */
|
---|
148 | #define DIF_OP_SETX 37 /* setx intindex, rd */
|
---|
149 | #define DIF_OP_SETS 38 /* sets strindex, rd */
|
---|
150 | #define DIF_OP_SCMP 39 /* scmp r1, r2 */
|
---|
151 | #define DIF_OP_LDGA 40 /* ldga var, ri, rd */
|
---|
152 | #define DIF_OP_LDGS 41 /* ldgs var, rd */
|
---|
153 | #define DIF_OP_STGS 42 /* stgs var, rs */
|
---|
154 | #define DIF_OP_LDTA 43 /* ldta var, ri, rd */
|
---|
155 | #define DIF_OP_LDTS 44 /* ldts var, rd */
|
---|
156 | #define DIF_OP_STTS 45 /* stts var, rs */
|
---|
157 | #define DIF_OP_SRA 46 /* sra r1, r2, rd */
|
---|
158 | #define DIF_OP_CALL 47 /* call subr, rd */
|
---|
159 | #define DIF_OP_PUSHTR 48 /* pushtr type, rs, rr */
|
---|
160 | #define DIF_OP_PUSHTV 49 /* pushtv type, rs, rv */
|
---|
161 | #define DIF_OP_POPTS 50 /* popts */
|
---|
162 | #define DIF_OP_FLUSHTS 51 /* flushts */
|
---|
163 | #define DIF_OP_LDGAA 52 /* ldgaa var, rd */
|
---|
164 | #define DIF_OP_LDTAA 53 /* ldtaa var, rd */
|
---|
165 | #define DIF_OP_STGAA 54 /* stgaa var, rs */
|
---|
166 | #define DIF_OP_STTAA 55 /* sttaa var, rs */
|
---|
167 | #define DIF_OP_LDLS 56 /* ldls var, rd */
|
---|
168 | #define DIF_OP_STLS 57 /* stls var, rs */
|
---|
169 | #define DIF_OP_ALLOCS 58 /* allocs r1, rd */
|
---|
170 | #define DIF_OP_COPYS 59 /* copys r1, r2, rd */
|
---|
171 | #define DIF_OP_STB 60 /* stb r1, [rd] */
|
---|
172 | #define DIF_OP_STH 61 /* sth r1, [rd] */
|
---|
173 | #define DIF_OP_STW 62 /* stw r1, [rd] */
|
---|
174 | #define DIF_OP_STX 63 /* stx r1, [rd] */
|
---|
175 | #define DIF_OP_ULDSB 64 /* uldsb [r1], rd */
|
---|
176 | #define DIF_OP_ULDSH 65 /* uldsh [r1], rd */
|
---|
177 | #define DIF_OP_ULDSW 66 /* uldsw [r1], rd */
|
---|
178 | #define DIF_OP_ULDUB 67 /* uldub [r1], rd */
|
---|
179 | #define DIF_OP_ULDUH 68 /* ulduh [r1], rd */
|
---|
180 | #define DIF_OP_ULDUW 69 /* ulduw [r1], rd */
|
---|
181 | #define DIF_OP_ULDX 70 /* uldx [r1], rd */
|
---|
182 | #define DIF_OP_RLDSB 71 /* rldsb [r1], rd */
|
---|
183 | #define DIF_OP_RLDSH 72 /* rldsh [r1], rd */
|
---|
184 | #define DIF_OP_RLDSW 73 /* rldsw [r1], rd */
|
---|
185 | #define DIF_OP_RLDUB 74 /* rldub [r1], rd */
|
---|
186 | #define DIF_OP_RLDUH 75 /* rlduh [r1], rd */
|
---|
187 | #define DIF_OP_RLDUW 76 /* rlduw [r1], rd */
|
---|
188 | #define DIF_OP_RLDX 77 /* rldx [r1], rd */
|
---|
189 | #define DIF_OP_XLATE 78 /* xlate xlrindex, rd */
|
---|
190 | #define DIF_OP_XLARG 79 /* xlarg xlrindex, rd */
|
---|
191 |
|
---|
192 | #define DIF_INTOFF_MAX 0xffff /* highest integer table offset */
|
---|
193 | #define DIF_STROFF_MAX 0xffff /* highest string table offset */
|
---|
194 | #define DIF_REGISTER_MAX 0xff /* highest register number */
|
---|
195 | #define DIF_VARIABLE_MAX 0xffff /* highest variable identifier */
|
---|
196 | #define DIF_SUBROUTINE_MAX 0xffff /* highest subroutine code */
|
---|
197 |
|
---|
198 | #define DIF_VAR_ARRAY_MIN 0x0000 /* lowest numbered array variable */
|
---|
199 | #define DIF_VAR_ARRAY_UBASE 0x0080 /* lowest user-defined array */
|
---|
200 | #define DIF_VAR_ARRAY_MAX 0x00ff /* highest numbered array variable */
|
---|
201 |
|
---|
202 | #define DIF_VAR_OTHER_MIN 0x0100 /* lowest numbered scalar or assc */
|
---|
203 | #define DIF_VAR_OTHER_UBASE 0x0500 /* lowest user-defined scalar or assc */
|
---|
204 | #define DIF_VAR_OTHER_MAX 0xffff /* highest numbered scalar or assc */
|
---|
205 |
|
---|
206 | #define DIF_VAR_ARGS 0x0000 /* arguments array */
|
---|
207 | #define DIF_VAR_REGS 0x0001 /* registers array */
|
---|
208 | #define DIF_VAR_UREGS 0x0002 /* user registers array */
|
---|
209 | #define DIF_VAR_CURTHREAD 0x0100 /* thread pointer */
|
---|
210 | #define DIF_VAR_TIMESTAMP 0x0101 /* timestamp */
|
---|
211 | #define DIF_VAR_VTIMESTAMP 0x0102 /* virtual timestamp */
|
---|
212 | #define DIF_VAR_IPL 0x0103 /* interrupt priority level */
|
---|
213 | #define DIF_VAR_EPID 0x0104 /* enabled probe ID */
|
---|
214 | #define DIF_VAR_ID 0x0105 /* probe ID */
|
---|
215 | #define DIF_VAR_ARG0 0x0106 /* first argument */
|
---|
216 | #define DIF_VAR_ARG1 0x0107 /* second argument */
|
---|
217 | #define DIF_VAR_ARG2 0x0108 /* third argument */
|
---|
218 | #define DIF_VAR_ARG3 0x0109 /* fourth argument */
|
---|
219 | #define DIF_VAR_ARG4 0x010a /* fifth argument */
|
---|
220 | #define DIF_VAR_ARG5 0x010b /* sixth argument */
|
---|
221 | #define DIF_VAR_ARG6 0x010c /* seventh argument */
|
---|
222 | #define DIF_VAR_ARG7 0x010d /* eighth argument */
|
---|
223 | #define DIF_VAR_ARG8 0x010e /* ninth argument */
|
---|
224 | #define DIF_VAR_ARG9 0x010f /* tenth argument */
|
---|
225 | #define DIF_VAR_STACKDEPTH 0x0110 /* stack depth */
|
---|
226 | #define DIF_VAR_CALLER 0x0111 /* caller */
|
---|
227 | #define DIF_VAR_PROBEPROV 0x0112 /* probe provider */
|
---|
228 | #define DIF_VAR_PROBEMOD 0x0113 /* probe module */
|
---|
229 | #define DIF_VAR_PROBEFUNC 0x0114 /* probe function */
|
---|
230 | #define DIF_VAR_PROBENAME 0x0115 /* probe name */
|
---|
231 | #define DIF_VAR_PID 0x0116 /* process ID */
|
---|
232 | #define DIF_VAR_TID 0x0117 /* (per-process) thread ID */
|
---|
233 | #define DIF_VAR_EXECNAME 0x0118 /* name of executable */
|
---|
234 | #define DIF_VAR_ZONENAME 0x0119 /* zone name associated with process */
|
---|
235 | #define DIF_VAR_WALLTIMESTAMP 0x011a /* wall-clock timestamp */
|
---|
236 | #define DIF_VAR_USTACKDEPTH 0x011b /* user-land stack depth */
|
---|
237 | #define DIF_VAR_UCALLER 0x011c /* user-level caller */
|
---|
238 | #define DIF_VAR_PPID 0x011d /* parent process ID */
|
---|
239 | #define DIF_VAR_UID 0x011e /* process user ID */
|
---|
240 | #define DIF_VAR_GID 0x011f /* process group ID */
|
---|
241 | #define DIF_VAR_ERRNO 0x0120 /* thread errno */
|
---|
242 |
|
---|
243 | #define DIF_SUBR_RAND 0
|
---|
244 | #define DIF_SUBR_MUTEX_OWNED 1
|
---|
245 | #define DIF_SUBR_MUTEX_OWNER 2
|
---|
246 | #define DIF_SUBR_MUTEX_TYPE_ADAPTIVE 3
|
---|
247 | #define DIF_SUBR_MUTEX_TYPE_SPIN 4
|
---|
248 | #define DIF_SUBR_RW_READ_HELD 5
|
---|
249 | #define DIF_SUBR_RW_WRITE_HELD 6
|
---|
250 | #define DIF_SUBR_RW_ISWRITER 7
|
---|
251 | #define DIF_SUBR_COPYIN 8
|
---|
252 | #define DIF_SUBR_COPYINSTR 9
|
---|
253 | #define DIF_SUBR_SPECULATION 10
|
---|
254 | #define DIF_SUBR_PROGENYOF 11
|
---|
255 | #define DIF_SUBR_STRLEN 12
|
---|
256 | #define DIF_SUBR_COPYOUT 13
|
---|
257 | #define DIF_SUBR_COPYOUTSTR 14
|
---|
258 | #define DIF_SUBR_ALLOCA 15
|
---|
259 | #define DIF_SUBR_BCOPY 16
|
---|
260 | #define DIF_SUBR_COPYINTO 17
|
---|
261 | #define DIF_SUBR_MSGDSIZE 18
|
---|
262 | #define DIF_SUBR_MSGSIZE 19
|
---|
263 | #define DIF_SUBR_GETMAJOR 20
|
---|
264 | #define DIF_SUBR_GETMINOR 21
|
---|
265 | #define DIF_SUBR_DDI_PATHNAME 22
|
---|
266 | #define DIF_SUBR_STRJOIN 23
|
---|
267 | #define DIF_SUBR_LLTOSTR 24
|
---|
268 | #define DIF_SUBR_BASENAME 25
|
---|
269 | #define DIF_SUBR_DIRNAME 26
|
---|
270 | #define DIF_SUBR_CLEANPATH 27
|
---|
271 | #define DIF_SUBR_STRCHR 28
|
---|
272 | #define DIF_SUBR_STRRCHR 29
|
---|
273 | #define DIF_SUBR_STRSTR 30
|
---|
274 | #define DIF_SUBR_STRTOK 31
|
---|
275 | #define DIF_SUBR_SUBSTR 32
|
---|
276 | #define DIF_SUBR_INDEX 33
|
---|
277 | #define DIF_SUBR_RINDEX 34
|
---|
278 | #define DIF_SUBR_HTONS 35
|
---|
279 | #define DIF_SUBR_HTONL 36
|
---|
280 | #define DIF_SUBR_HTONLL 37
|
---|
281 | #define DIF_SUBR_NTOHS 38
|
---|
282 | #define DIF_SUBR_NTOHL 39
|
---|
283 | #define DIF_SUBR_NTOHLL 40
|
---|
284 | #define DIF_SUBR_INET_NTOP 41
|
---|
285 | #define DIF_SUBR_INET_NTOA 42
|
---|
286 | #define DIF_SUBR_INET_NTOA6 43
|
---|
287 |
|
---|
288 | #define DIF_SUBR_MAX 43 /* max subroutine value */
|
---|
289 |
|
---|
290 | typedef uint32_t dif_instr_t;
|
---|
291 |
|
---|
292 | #define DIF_INSTR_OP(i) (((i) >> 24) & 0xff)
|
---|
293 | #define DIF_INSTR_R1(i) (((i) >> 16) & 0xff)
|
---|
294 | #define DIF_INSTR_R2(i) (((i) >> 8) & 0xff)
|
---|
295 | #define DIF_INSTR_RD(i) ((i) & 0xff)
|
---|
296 | #define DIF_INSTR_RS(i) ((i) & 0xff)
|
---|
297 | #define DIF_INSTR_LABEL(i) ((i) & 0xffffff)
|
---|
298 | #define DIF_INSTR_VAR(i) (((i) >> 8) & 0xffff)
|
---|
299 | #define DIF_INSTR_INTEGER(i) (((i) >> 8) & 0xffff)
|
---|
300 | #define DIF_INSTR_STRING(i) (((i) >> 8) & 0xffff)
|
---|
301 | #define DIF_INSTR_SUBR(i) (((i) >> 8) & 0xffff)
|
---|
302 | #define DIF_INSTR_TYPE(i) (((i) >> 16) & 0xff)
|
---|
303 | #define DIF_INSTR_XLREF(i) (((i) >> 8) & 0xffff)
|
---|
304 |
|
---|
305 | #define DIF_INSTR_FMT(op, r1, r2, d) \
|
---|
306 | (((op) << 24) | ((r1) << 16) | ((r2) << 8) | (d))
|
---|
307 |
|
---|
308 | #define DIF_INSTR_NOT(r1, d) (DIF_INSTR_FMT(DIF_OP_NOT, r1, 0, d))
|
---|
309 | #define DIF_INSTR_MOV(r1, d) (DIF_INSTR_FMT(DIF_OP_MOV, r1, 0, d))
|
---|
310 | #define DIF_INSTR_CMP(op, r1, r2) (DIF_INSTR_FMT(op, r1, r2, 0))
|
---|
311 | #define DIF_INSTR_TST(r1) (DIF_INSTR_FMT(DIF_OP_TST, r1, 0, 0))
|
---|
312 | #define DIF_INSTR_BRANCH(op, label) (((op) << 24) | (label))
|
---|
313 | #define DIF_INSTR_LOAD(op, r1, d) (DIF_INSTR_FMT(op, r1, 0, d))
|
---|
314 | #define DIF_INSTR_STORE(op, r1, d) (DIF_INSTR_FMT(op, r1, 0, d))
|
---|
315 | #define DIF_INSTR_SETX(i, d) ((DIF_OP_SETX << 24) | ((i) << 8) | (d))
|
---|
316 | #define DIF_INSTR_SETS(s, d) ((DIF_OP_SETS << 24) | ((s) << 8) | (d))
|
---|
317 | #define DIF_INSTR_RET(d) (DIF_INSTR_FMT(DIF_OP_RET, 0, 0, d))
|
---|
318 | #define DIF_INSTR_NOP (DIF_OP_NOP << 24)
|
---|
319 | #define DIF_INSTR_LDA(op, v, r, d) (DIF_INSTR_FMT(op, v, r, d))
|
---|
320 | #define DIF_INSTR_LDV(op, v, d) (((op) << 24) | ((v) << 8) | (d))
|
---|
321 | #define DIF_INSTR_STV(op, v, rs) (((op) << 24) | ((v) << 8) | (rs))
|
---|
322 | #define DIF_INSTR_CALL(s, d) ((DIF_OP_CALL << 24) | ((s) << 8) | (d))
|
---|
323 | #define DIF_INSTR_PUSHTS(op, t, r2, rs) (DIF_INSTR_FMT(op, t, r2, rs))
|
---|
324 | #define DIF_INSTR_POPTS (DIF_OP_POPTS << 24)
|
---|
325 | #define DIF_INSTR_FLUSHTS (DIF_OP_FLUSHTS << 24)
|
---|
326 | #define DIF_INSTR_ALLOCS(r1, d) (DIF_INSTR_FMT(DIF_OP_ALLOCS, r1, 0, d))
|
---|
327 | #define DIF_INSTR_COPYS(r1, r2, d) (DIF_INSTR_FMT(DIF_OP_COPYS, r1, r2, d))
|
---|
328 | #define DIF_INSTR_XLATE(op, r, d) (((op) << 24) | ((r) << 8) | (d))
|
---|
329 |
|
---|
330 | #define DIF_REG_R0 0 /* %r0 is always set to zero */
|
---|
331 |
|
---|
332 | /*
|
---|
333 | * A DTrace Intermediate Format Type (DIF Type) is used to represent the types
|
---|
334 | * of variables, function and associative array arguments, and the return type
|
---|
335 | * for each DIF object (shown below). It contains a description of the type,
|
---|
336 | * its size in bytes, and a module identifier.
|
---|
337 | */
|
---|
338 | typedef struct dtrace_diftype {
|
---|
339 | uint8_t dtdt_kind; /* type kind (see below) */
|
---|
340 | uint8_t dtdt_ckind; /* type kind in CTF */
|
---|
341 | uint8_t dtdt_flags; /* type flags (see below) */
|
---|
342 | uint8_t dtdt_pad; /* reserved for future use */
|
---|
343 | uint32_t dtdt_size; /* type size in bytes (unless string) */
|
---|
344 | } dtrace_diftype_t;
|
---|
345 |
|
---|
346 | #define DIF_TYPE_CTF 0 /* type is a CTF type */
|
---|
347 | #define DIF_TYPE_STRING 1 /* type is a D string */
|
---|
348 |
|
---|
349 | #define DIF_TF_BYREF 0x1 /* type is passed by reference */
|
---|
350 |
|
---|
351 | /*
|
---|
352 | * A DTrace Intermediate Format variable record is used to describe each of the
|
---|
353 | * variables referenced by a given DIF object. It contains an integer variable
|
---|
354 | * identifier along with variable scope and properties, as shown below. The
|
---|
355 | * size of this structure must be sizeof (int) aligned.
|
---|
356 | */
|
---|
357 | typedef struct dtrace_difv {
|
---|
358 | uint32_t dtdv_name; /* variable name index in dtdo_strtab */
|
---|
359 | uint32_t dtdv_id; /* variable reference identifier */
|
---|
360 | uint8_t dtdv_kind; /* variable kind (see below) */
|
---|
361 | uint8_t dtdv_scope; /* variable scope (see below) */
|
---|
362 | uint16_t dtdv_flags; /* variable flags (see below) */
|
---|
363 | dtrace_diftype_t dtdv_type; /* variable type (see above) */
|
---|
364 | } dtrace_difv_t;
|
---|
365 |
|
---|
366 | #define DIFV_KIND_ARRAY 0 /* variable is an array of quantities */
|
---|
367 | #define DIFV_KIND_SCALAR 1 /* variable is a scalar quantity */
|
---|
368 |
|
---|
369 | #define DIFV_SCOPE_GLOBAL 0 /* variable has global scope */
|
---|
370 | #define DIFV_SCOPE_THREAD 1 /* variable has thread scope */
|
---|
371 | #define DIFV_SCOPE_LOCAL 2 /* variable has local scope */
|
---|
372 |
|
---|
373 | #define DIFV_F_REF 0x1 /* variable is referenced by DIFO */
|
---|
374 | #define DIFV_F_MOD 0x2 /* variable is written by DIFO */
|
---|
375 |
|
---|
376 | /*
|
---|
377 | * DTrace Actions
|
---|
378 | *
|
---|
379 | * The upper byte determines the class of the action; the low bytes determines
|
---|
380 | * the specific action within that class. The classes of actions are as
|
---|
381 | * follows:
|
---|
382 | *
|
---|
383 | * [ no class ] <= May record process- or kernel-related data
|
---|
384 | * DTRACEACT_PROC <= Only records process-related data
|
---|
385 | * DTRACEACT_PROC_DESTRUCTIVE <= Potentially destructive to processes
|
---|
386 | * DTRACEACT_KERNEL <= Only records kernel-related data
|
---|
387 | * DTRACEACT_KERNEL_DESTRUCTIVE <= Potentially destructive to the kernel
|
---|
388 | * DTRACEACT_SPECULATIVE <= Speculation-related action
|
---|
389 | * DTRACEACT_AGGREGATION <= Aggregating action
|
---|
390 | */
|
---|
391 | #define DTRACEACT_NONE 0 /* no action */
|
---|
392 | #define DTRACEACT_DIFEXPR 1 /* action is DIF expression */
|
---|
393 | #define DTRACEACT_EXIT 2 /* exit() action */
|
---|
394 | #define DTRACEACT_PRINTF 3 /* printf() action */
|
---|
395 | #define DTRACEACT_PRINTA 4 /* printa() action */
|
---|
396 | #define DTRACEACT_LIBACT 5 /* library-controlled action */
|
---|
397 |
|
---|
398 | #define DTRACEACT_PROC 0x0100
|
---|
399 | #define DTRACEACT_USTACK (DTRACEACT_PROC + 1)
|
---|
400 | #define DTRACEACT_JSTACK (DTRACEACT_PROC + 2)
|
---|
401 | #define DTRACEACT_USYM (DTRACEACT_PROC + 3)
|
---|
402 | #define DTRACEACT_UMOD (DTRACEACT_PROC + 4)
|
---|
403 | #define DTRACEACT_UADDR (DTRACEACT_PROC + 5)
|
---|
404 |
|
---|
405 | #define DTRACEACT_PROC_DESTRUCTIVE 0x0200
|
---|
406 | #define DTRACEACT_STOP (DTRACEACT_PROC_DESTRUCTIVE + 1)
|
---|
407 | #define DTRACEACT_RAISE (DTRACEACT_PROC_DESTRUCTIVE + 2)
|
---|
408 | #define DTRACEACT_SYSTEM (DTRACEACT_PROC_DESTRUCTIVE + 3)
|
---|
409 | #define DTRACEACT_FREOPEN (DTRACEACT_PROC_DESTRUCTIVE + 4)
|
---|
410 |
|
---|
411 | #define DTRACEACT_PROC_CONTROL 0x0300
|
---|
412 |
|
---|
413 | #define DTRACEACT_KERNEL 0x0400
|
---|
414 | #define DTRACEACT_STACK (DTRACEACT_KERNEL + 1)
|
---|
415 | #define DTRACEACT_SYM (DTRACEACT_KERNEL + 2)
|
---|
416 | #define DTRACEACT_MOD (DTRACEACT_KERNEL + 3)
|
---|
417 |
|
---|
418 | #define DTRACEACT_KERNEL_DESTRUCTIVE 0x0500
|
---|
419 | #define DTRACEACT_BREAKPOINT (DTRACEACT_KERNEL_DESTRUCTIVE + 1)
|
---|
420 | #define DTRACEACT_PANIC (DTRACEACT_KERNEL_DESTRUCTIVE + 2)
|
---|
421 | #define DTRACEACT_CHILL (DTRACEACT_KERNEL_DESTRUCTIVE + 3)
|
---|
422 |
|
---|
423 | #define DTRACEACT_SPECULATIVE 0x0600
|
---|
424 | #define DTRACEACT_SPECULATE (DTRACEACT_SPECULATIVE + 1)
|
---|
425 | #define DTRACEACT_COMMIT (DTRACEACT_SPECULATIVE + 2)
|
---|
426 | #define DTRACEACT_DISCARD (DTRACEACT_SPECULATIVE + 3)
|
---|
427 |
|
---|
428 | #define DTRACEACT_CLASS(x) ((x) & 0xff00)
|
---|
429 |
|
---|
430 | #define DTRACEACT_ISDESTRUCTIVE(x) \
|
---|
431 | (DTRACEACT_CLASS(x) == DTRACEACT_PROC_DESTRUCTIVE || \
|
---|
432 | DTRACEACT_CLASS(x) == DTRACEACT_KERNEL_DESTRUCTIVE)
|
---|
433 |
|
---|
434 | #define DTRACEACT_ISSPECULATIVE(x) \
|
---|
435 | (DTRACEACT_CLASS(x) == DTRACEACT_SPECULATIVE)
|
---|
436 |
|
---|
437 | #define DTRACEACT_ISPRINTFLIKE(x) \
|
---|
438 | ((x) == DTRACEACT_PRINTF || (x) == DTRACEACT_PRINTA || \
|
---|
439 | (x) == DTRACEACT_SYSTEM || (x) == DTRACEACT_FREOPEN)
|
---|
440 |
|
---|
441 | /*
|
---|
442 | * DTrace Aggregating Actions
|
---|
443 | *
|
---|
444 | * These are functions f(x) for which the following is true:
|
---|
445 | *
|
---|
446 | * f(f(x_0) U f(x_1) U ... U f(x_n)) = f(x_0 U x_1 U ... U x_n)
|
---|
447 | *
|
---|
448 | * where x_n is a set of arbitrary data. Aggregating actions are in their own
|
---|
449 | * DTrace action class, DTTRACEACT_AGGREGATION. The macros provided here allow
|
---|
450 | * for easier processing of the aggregation argument and data payload for a few
|
---|
451 | * aggregating actions (notably: quantize(), lquantize(), and ustack()).
|
---|
452 | */
|
---|
453 | #define DTRACEACT_AGGREGATION 0x0700
|
---|
454 | #define DTRACEAGG_COUNT (DTRACEACT_AGGREGATION + 1)
|
---|
455 | #define DTRACEAGG_MIN (DTRACEACT_AGGREGATION + 2)
|
---|
456 | #define DTRACEAGG_MAX (DTRACEACT_AGGREGATION + 3)
|
---|
457 | #define DTRACEAGG_AVG (DTRACEACT_AGGREGATION + 4)
|
---|
458 | #define DTRACEAGG_SUM (DTRACEACT_AGGREGATION + 5)
|
---|
459 | #define DTRACEAGG_STDDEV (DTRACEACT_AGGREGATION + 6)
|
---|
460 | #define DTRACEAGG_QUANTIZE (DTRACEACT_AGGREGATION + 7)
|
---|
461 | #define DTRACEAGG_LQUANTIZE (DTRACEACT_AGGREGATION + 8)
|
---|
462 |
|
---|
463 | #define DTRACEACT_ISAGG(x) \
|
---|
464 | (DTRACEACT_CLASS(x) == DTRACEACT_AGGREGATION)
|
---|
465 |
|
---|
466 | #define DTRACE_QUANTIZE_NBUCKETS \
|
---|
467 | (((sizeof (uint64_t) * NBBY) - 1) * 2 + 1)
|
---|
468 |
|
---|
469 | #define DTRACE_QUANTIZE_ZEROBUCKET ((sizeof (uint64_t) * NBBY) - 1)
|
---|
470 |
|
---|
471 | #define DTRACE_QUANTIZE_BUCKETVAL(buck) \
|
---|
472 | (int64_t)((buck) < DTRACE_QUANTIZE_ZEROBUCKET ? \
|
---|
473 | -(1LL << (DTRACE_QUANTIZE_ZEROBUCKET - 1 - (buck))) : \
|
---|
474 | (buck) == DTRACE_QUANTIZE_ZEROBUCKET ? 0 : \
|
---|
475 | 1LL << ((buck) - DTRACE_QUANTIZE_ZEROBUCKET - 1))
|
---|
476 |
|
---|
477 | #define DTRACE_LQUANTIZE_STEPSHIFT 48
|
---|
478 | #define DTRACE_LQUANTIZE_STEPMASK ((uint64_t)UINT16_MAX << 48)
|
---|
479 | #define DTRACE_LQUANTIZE_LEVELSHIFT 32
|
---|
480 | #define DTRACE_LQUANTIZE_LEVELMASK ((uint64_t)UINT16_MAX << 32)
|
---|
481 | #define DTRACE_LQUANTIZE_BASESHIFT 0
|
---|
482 | #define DTRACE_LQUANTIZE_BASEMASK UINT32_MAX
|
---|
483 |
|
---|
484 | #define DTRACE_LQUANTIZE_STEP(x) \
|
---|
485 | (uint16_t)(((x) & DTRACE_LQUANTIZE_STEPMASK) >> \
|
---|
486 | DTRACE_LQUANTIZE_STEPSHIFT)
|
---|
487 |
|
---|
488 | #define DTRACE_LQUANTIZE_LEVELS(x) \
|
---|
489 | (uint16_t)(((x) & DTRACE_LQUANTIZE_LEVELMASK) >> \
|
---|
490 | DTRACE_LQUANTIZE_LEVELSHIFT)
|
---|
491 |
|
---|
492 | #define DTRACE_LQUANTIZE_BASE(x) \
|
---|
493 | (int32_t)(((x) & DTRACE_LQUANTIZE_BASEMASK) >> \
|
---|
494 | DTRACE_LQUANTIZE_BASESHIFT)
|
---|
495 |
|
---|
496 | #define DTRACE_USTACK_NFRAMES(x) (uint32_t)((x) & UINT32_MAX)
|
---|
497 | #define DTRACE_USTACK_STRSIZE(x) (uint32_t)((x) >> 32)
|
---|
498 | #define DTRACE_USTACK_ARG(x, y) \
|
---|
499 | ((((uint64_t)(y)) << 32) | ((x) & UINT32_MAX))
|
---|
500 |
|
---|
501 | #ifndef _LP64
|
---|
502 | #ifndef _LITTLE_ENDIAN
|
---|
503 | #define DTRACE_PTR(type, name) uint32_t name##pad; type *name
|
---|
504 | #else
|
---|
505 | #define DTRACE_PTR(type, name) type *name; uint32_t name##pad
|
---|
506 | #endif
|
---|
507 | #else
|
---|
508 | #define DTRACE_PTR(type, name) type *name
|
---|
509 | #endif
|
---|
510 |
|
---|
511 | /*
|
---|
512 | * DTrace Object Format (DOF)
|
---|
513 | *
|
---|
514 | * DTrace programs can be persistently encoded in the DOF format so that they
|
---|
515 | * may be embedded in other programs (for example, in an ELF file) or in the
|
---|
516 | * dtrace driver configuration file for use in anonymous tracing. The DOF
|
---|
517 | * format is versioned and extensible so that it can be revised and so that
|
---|
518 | * internal data structures can be modified or extended compatibly. All DOF
|
---|
519 | * structures use fixed-size types, so the 32-bit and 64-bit representations
|
---|
520 | * are identical and consumers can use either data model transparently.
|
---|
521 | *
|
---|
522 | * The file layout is structured as follows:
|
---|
523 | *
|
---|
524 | * +---------------+-------------------+----- ... ----+---- ... ------+
|
---|
525 | * | dof_hdr_t | dof_sec_t[ ... ] | loadable | non-loadable |
|
---|
526 | * | (file header) | (section headers) | section data | section data |
|
---|
527 | * +---------------+-------------------+----- ... ----+---- ... ------+
|
---|
528 | * |<------------ dof_hdr.dofh_loadsz --------------->| |
|
---|
529 | * |<------------ dof_hdr.dofh_filesz ------------------------------->|
|
---|
530 | *
|
---|
531 | * The file header stores meta-data including a magic number, data model for
|
---|
532 | * the instrumentation, data encoding, and properties of the DIF code within.
|
---|
533 | * The header describes its own size and the size of the section headers. By
|
---|
534 | * convention, an array of section headers follows the file header, and then
|
---|
535 | * the data for all loadable sections and unloadable sections. This permits
|
---|
536 | * consumer code to easily download the headers and all loadable data into the
|
---|
537 | * DTrace driver in one contiguous chunk, omitting other extraneous sections.
|
---|
538 | *
|
---|
539 | * The section headers describe the size, offset, alignment, and section type
|
---|
540 | * for each section. Sections are described using a set of #defines that tell
|
---|
541 | * the consumer what kind of data is expected. Sections can contain links to
|
---|
542 | * other sections by storing a dof_secidx_t, an index into the section header
|
---|
543 | * array, inside of the section data structures. The section header includes
|
---|
544 | * an entry size so that sections with data arrays can grow their structures.
|
---|
545 | *
|
---|
546 | * The DOF data itself can contain many snippets of DIF (i.e. >1 DIFOs), which
|
---|
547 | * are represented themselves as a collection of related DOF sections. This
|
---|
548 | * permits us to change the set of sections associated with a DIFO over time,
|
---|
549 | * and also permits us to encode DIFOs that contain different sets of sections.
|
---|
550 | * When a DOF section wants to refer to a DIFO, it stores the dof_secidx_t of a
|
---|
551 | * section of type DOF_SECT_DIFOHDR. This section's data is then an array of
|
---|
552 | * dof_secidx_t's which in turn denote the sections associated with this DIFO.
|
---|
553 | *
|
---|
554 | * This loose coupling of the file structure (header and sections) to the
|
---|
555 | * structure of the DTrace program itself (ECB descriptions, action
|
---|
556 | * descriptions, and DIFOs) permits activities such as relocation processing
|
---|
557 | * to occur in a single pass without having to understand D program structure.
|
---|
558 | *
|
---|
559 | * Finally, strings are always stored in ELF-style string tables along with a
|
---|
560 | * string table section index and string table offset. Therefore strings in
|
---|
561 | * DOF are always arbitrary-length and not bound to the current implementation.
|
---|
562 | */
|
---|
563 |
|
---|
564 | #define DOF_ID_SIZE 16 /* total size of dofh_ident[] in bytes */
|
---|
565 |
|
---|
566 | typedef struct dof_hdr {
|
---|
567 | uint8_t dofh_ident[DOF_ID_SIZE]; /* identification bytes (see below) */
|
---|
568 | uint32_t dofh_flags; /* file attribute flags (if any) */
|
---|
569 | uint32_t dofh_hdrsize; /* size of file header in bytes */
|
---|
570 | uint32_t dofh_secsize; /* size of section header in bytes */
|
---|
571 | uint32_t dofh_secnum; /* number of section headers */
|
---|
572 | uint64_t dofh_secoff; /* file offset of section headers */
|
---|
573 | uint64_t dofh_loadsz; /* file size of loadable portion */
|
---|
574 | uint64_t dofh_filesz; /* file size of entire DOF file */
|
---|
575 | uint64_t dofh_pad; /* reserved for future use */
|
---|
576 | } dof_hdr_t;
|
---|
577 |
|
---|
578 | #define DOF_ID_MAG0 0 /* first byte of magic number */
|
---|
579 | #define DOF_ID_MAG1 1 /* second byte of magic number */
|
---|
580 | #define DOF_ID_MAG2 2 /* third byte of magic number */
|
---|
581 | #define DOF_ID_MAG3 3 /* fourth byte of magic number */
|
---|
582 | #define DOF_ID_MODEL 4 /* DOF data model (see below) */
|
---|
583 | #define DOF_ID_ENCODING 5 /* DOF data encoding (see below) */
|
---|
584 | #define DOF_ID_VERSION 6 /* DOF file format major version (see below) */
|
---|
585 | #define DOF_ID_DIFVERS 7 /* DIF instruction set version */
|
---|
586 | #define DOF_ID_DIFIREG 8 /* DIF integer registers used by compiler */
|
---|
587 | #define DOF_ID_DIFTREG 9 /* DIF tuple registers used by compiler */
|
---|
588 | #define DOF_ID_PAD 10 /* start of padding bytes (all zeroes) */
|
---|
589 |
|
---|
590 | #define DOF_MAG_MAG0 0x7F /* DOF_ID_MAG[0-3] */
|
---|
591 | #define DOF_MAG_MAG1 'D'
|
---|
592 | #define DOF_MAG_MAG2 'O'
|
---|
593 | #define DOF_MAG_MAG3 'F'
|
---|
594 |
|
---|
595 | #define DOF_MAG_STRING "\177DOF"
|
---|
596 | #define DOF_MAG_STRLEN 4
|
---|
597 |
|
---|
598 | #define DOF_MODEL_NONE 0 /* DOF_ID_MODEL */
|
---|
599 | #define DOF_MODEL_ILP32 1
|
---|
600 | #define DOF_MODEL_LP64 2
|
---|
601 |
|
---|
602 | #ifdef _LP64
|
---|
603 | #define DOF_MODEL_NATIVE DOF_MODEL_LP64
|
---|
604 | #else
|
---|
605 | #define DOF_MODEL_NATIVE DOF_MODEL_ILP32
|
---|
606 | #endif
|
---|
607 |
|
---|
608 | #define DOF_ENCODE_NONE 0 /* DOF_ID_ENCODING */
|
---|
609 | #define DOF_ENCODE_LSB 1
|
---|
610 | #define DOF_ENCODE_MSB 2
|
---|
611 |
|
---|
612 | #ifdef _BIG_ENDIAN
|
---|
613 | #define DOF_ENCODE_NATIVE DOF_ENCODE_MSB
|
---|
614 | #else
|
---|
615 | #define DOF_ENCODE_NATIVE DOF_ENCODE_LSB
|
---|
616 | #endif
|
---|
617 |
|
---|
618 | #define DOF_VERSION_1 1 /* DOF version 1: Solaris 10 FCS */
|
---|
619 | #define DOF_VERSION_2 2 /* DOF version 2: Solaris Express 6/06 */
|
---|
620 | #define DOF_VERSION DOF_VERSION_2 /* Latest DOF version */
|
---|
621 |
|
---|
622 | #define DOF_FL_VALID 0 /* mask of all valid dofh_flags bits */
|
---|
623 |
|
---|
624 | typedef uint32_t dof_secidx_t; /* section header table index type */
|
---|
625 | typedef uint32_t dof_stridx_t; /* string table index type */
|
---|
626 |
|
---|
627 | #define DOF_SECIDX_NONE (-1U) /* null value for section indices */
|
---|
628 | #define DOF_STRIDX_NONE (-1U) /* null value for string indices */
|
---|
629 |
|
---|
630 | typedef struct dof_sec {
|
---|
631 | uint32_t dofs_type; /* section type (see below) */
|
---|
632 | uint32_t dofs_align; /* section data memory alignment */
|
---|
633 | uint32_t dofs_flags; /* section flags (if any) */
|
---|
634 | uint32_t dofs_entsize; /* size of section entry (if table) */
|
---|
635 | uint64_t dofs_offset; /* offset of section data within file */
|
---|
636 | uint64_t dofs_size; /* size of section data in bytes */
|
---|
637 | } dof_sec_t;
|
---|
638 |
|
---|
639 | #define DOF_SECT_NONE 0 /* null section */
|
---|
640 | #define DOF_SECT_COMMENTS 1 /* compiler comments */
|
---|
641 | #define DOF_SECT_SOURCE 2 /* D program source code */
|
---|
642 | #define DOF_SECT_ECBDESC 3 /* dof_ecbdesc_t */
|
---|
643 | #define DOF_SECT_PROBEDESC 4 /* dof_probedesc_t */
|
---|
644 | #define DOF_SECT_ACTDESC 5 /* dof_actdesc_t array */
|
---|
645 | #define DOF_SECT_DIFOHDR 6 /* dof_difohdr_t (variable length) */
|
---|
646 | #define DOF_SECT_DIF 7 /* uint32_t array of byte code */
|
---|
647 | #define DOF_SECT_STRTAB 8 /* string table */
|
---|
648 | #define DOF_SECT_VARTAB 9 /* dtrace_difv_t array */
|
---|
649 | #define DOF_SECT_RELTAB 10 /* dof_relodesc_t array */
|
---|
650 | #define DOF_SECT_TYPTAB 11 /* dtrace_diftype_t array */
|
---|
651 | #define DOF_SECT_URELHDR 12 /* dof_relohdr_t (user relocations) */
|
---|
652 | #define DOF_SECT_KRELHDR 13 /* dof_relohdr_t (kernel relocations) */
|
---|
653 | #define DOF_SECT_OPTDESC 14 /* dof_optdesc_t array */
|
---|
654 | #define DOF_SECT_PROVIDER 15 /* dof_provider_t */
|
---|
655 | #define DOF_SECT_PROBES 16 /* dof_probe_t array */
|
---|
656 | #define DOF_SECT_PRARGS 17 /* uint8_t array (probe arg mappings) */
|
---|
657 | #define DOF_SECT_PROFFS 18 /* uint32_t array (probe arg offsets) */
|
---|
658 | #define DOF_SECT_INTTAB 19 /* uint64_t array */
|
---|
659 | #define DOF_SECT_UTSNAME 20 /* struct utsname */
|
---|
660 | #define DOF_SECT_XLTAB 21 /* dof_xlref_t array */
|
---|
661 | #define DOF_SECT_XLMEMBERS 22 /* dof_xlmember_t array */
|
---|
662 | #define DOF_SECT_XLIMPORT 23 /* dof_xlator_t */
|
---|
663 | #define DOF_SECT_XLEXPORT 24 /* dof_xlator_t */
|
---|
664 | #define DOF_SECT_PREXPORT 25 /* dof_secidx_t array (exported objs) */
|
---|
665 | #define DOF_SECT_PRENOFFS 26 /* uint32_t array (enabled offsets) */
|
---|
666 |
|
---|
667 | #define DOF_SECF_LOAD 1 /* section should be loaded */
|
---|
668 |
|
---|
669 | #define DOF_SEC_ISLOADABLE(x) \
|
---|
670 | (((x) == DOF_SECT_ECBDESC) || ((x) == DOF_SECT_PROBEDESC) || \
|
---|
671 | ((x) == DOF_SECT_ACTDESC) || ((x) == DOF_SECT_DIFOHDR) || \
|
---|
672 | ((x) == DOF_SECT_DIF) || ((x) == DOF_SECT_STRTAB) || \
|
---|
673 | ((x) == DOF_SECT_VARTAB) || ((x) == DOF_SECT_RELTAB) || \
|
---|
674 | ((x) == DOF_SECT_TYPTAB) || ((x) == DOF_SECT_URELHDR) || \
|
---|
675 | ((x) == DOF_SECT_KRELHDR) || ((x) == DOF_SECT_OPTDESC) || \
|
---|
676 | ((x) == DOF_SECT_PROVIDER) || ((x) == DOF_SECT_PROBES) || \
|
---|
677 | ((x) == DOF_SECT_PRARGS) || ((x) == DOF_SECT_PROFFS) || \
|
---|
678 | ((x) == DOF_SECT_INTTAB) || ((x) == DOF_SECT_XLTAB) || \
|
---|
679 | ((x) == DOF_SECT_XLMEMBERS) || ((x) == DOF_SECT_XLIMPORT) || \
|
---|
680 | ((x) == DOF_SECT_XLIMPORT) || ((x) == DOF_SECT_XLEXPORT) || \
|
---|
681 | ((x) == DOF_SECT_PREXPORT) || ((x) == DOF_SECT_PRENOFFS))
|
---|
682 |
|
---|
683 | typedef struct dof_ecbdesc {
|
---|
684 | dof_secidx_t dofe_probes; /* link to DOF_SECT_PROBEDESC */
|
---|
685 | dof_secidx_t dofe_pred; /* link to DOF_SECT_DIFOHDR */
|
---|
686 | dof_secidx_t dofe_actions; /* link to DOF_SECT_ACTDESC */
|
---|
687 | uint32_t dofe_pad; /* reserved for future use */
|
---|
688 | uint64_t dofe_uarg; /* user-supplied library argument */
|
---|
689 | } dof_ecbdesc_t;
|
---|
690 |
|
---|
691 | typedef struct dof_probedesc {
|
---|
692 | dof_secidx_t dofp_strtab; /* link to DOF_SECT_STRTAB section */
|
---|
693 | dof_stridx_t dofp_provider; /* provider string */
|
---|
694 | dof_stridx_t dofp_mod; /* module string */
|
---|
695 | dof_stridx_t dofp_func; /* function string */
|
---|
696 | dof_stridx_t dofp_name; /* name string */
|
---|
697 | uint32_t dofp_id; /* probe identifier (or zero) */
|
---|
698 | } dof_probedesc_t;
|
---|
699 |
|
---|
700 | typedef struct dof_actdesc {
|
---|
701 | dof_secidx_t dofa_difo; /* link to DOF_SECT_DIFOHDR */
|
---|
702 | dof_secidx_t dofa_strtab; /* link to DOF_SECT_STRTAB section */
|
---|
703 | uint32_t dofa_kind; /* action kind (DTRACEACT_* constant) */
|
---|
704 | uint32_t dofa_ntuple; /* number of subsequent tuple actions */
|
---|
705 | uint64_t dofa_arg; /* kind-specific argument */
|
---|
706 | uint64_t dofa_uarg; /* user-supplied argument */
|
---|
707 | } dof_actdesc_t;
|
---|
708 |
|
---|
709 | typedef struct dof_difohdr {
|
---|
710 | dtrace_diftype_t dofd_rtype; /* return type for this fragment */
|
---|
711 | dof_secidx_t dofd_links[1]; /* variable length array of indices */
|
---|
712 | } dof_difohdr_t;
|
---|
713 |
|
---|
714 | typedef struct dof_relohdr {
|
---|
715 | dof_secidx_t dofr_strtab; /* link to DOF_SECT_STRTAB for names */
|
---|
716 | dof_secidx_t dofr_relsec; /* link to DOF_SECT_RELTAB for relos */
|
---|
717 | dof_secidx_t dofr_tgtsec; /* link to section we are relocating */
|
---|
718 | } dof_relohdr_t;
|
---|
719 |
|
---|
720 | typedef struct dof_relodesc {
|
---|
721 | dof_stridx_t dofr_name; /* string name of relocation symbol */
|
---|
722 | uint32_t dofr_type; /* relo type (DOF_RELO_* constant) */
|
---|
723 | uint64_t dofr_offset; /* byte offset for relocation */
|
---|
724 | uint64_t dofr_data; /* additional type-specific data */
|
---|
725 | } dof_relodesc_t;
|
---|
726 |
|
---|
727 | #define DOF_RELO_NONE 0 /* empty relocation entry */
|
---|
728 | #define DOF_RELO_SETX 1 /* relocate setx value */
|
---|
729 |
|
---|
730 | typedef struct dof_optdesc {
|
---|
731 | uint32_t dofo_option; /* option identifier */
|
---|
732 | dof_secidx_t dofo_strtab; /* string table, if string option */
|
---|
733 | uint64_t dofo_value; /* option value or string index */
|
---|
734 | } dof_optdesc_t;
|
---|
735 |
|
---|
736 | typedef uint32_t dof_attr_t; /* encoded stability attributes */
|
---|
737 |
|
---|
738 | #define DOF_ATTR(n, d, c) (((n) << 24) | ((d) << 16) | ((c) << 8))
|
---|
739 | #define DOF_ATTR_NAME(a) (((a) >> 24) & 0xff)
|
---|
740 | #define DOF_ATTR_DATA(a) (((a) >> 16) & 0xff)
|
---|
741 | #define DOF_ATTR_CLASS(a) (((a) >> 8) & 0xff)
|
---|
742 |
|
---|
743 | typedef struct dof_provider {
|
---|
744 | dof_secidx_t dofpv_strtab; /* link to DOF_SECT_STRTAB section */
|
---|
745 | dof_secidx_t dofpv_probes; /* link to DOF_SECT_PROBES section */
|
---|
746 | dof_secidx_t dofpv_prargs; /* link to DOF_SECT_PRARGS section */
|
---|
747 | dof_secidx_t dofpv_proffs; /* link to DOF_SECT_PROFFS section */
|
---|
748 | dof_stridx_t dofpv_name; /* provider name string */
|
---|
749 | dof_attr_t dofpv_provattr; /* provider attributes */
|
---|
750 | dof_attr_t dofpv_modattr; /* module attributes */
|
---|
751 | dof_attr_t dofpv_funcattr; /* function attributes */
|
---|
752 | dof_attr_t dofpv_nameattr; /* name attributes */
|
---|
753 | dof_attr_t dofpv_argsattr; /* args attributes */
|
---|
754 | dof_secidx_t dofpv_prenoffs; /* link to DOF_SECT_PRENOFFS section */
|
---|
755 | } dof_provider_t;
|
---|
756 |
|
---|
757 | typedef struct dof_probe {
|
---|
758 | uint64_t dofpr_addr; /* probe base address or offset */
|
---|
759 | dof_stridx_t dofpr_func; /* probe function string */
|
---|
760 | dof_stridx_t dofpr_name; /* probe name string */
|
---|
761 | dof_stridx_t dofpr_nargv; /* native argument type strings */
|
---|
762 | dof_stridx_t dofpr_xargv; /* translated argument type strings */
|
---|
763 | uint32_t dofpr_argidx; /* index of first argument mapping */
|
---|
764 | uint32_t dofpr_offidx; /* index of first offset entry */
|
---|
765 | uint8_t dofpr_nargc; /* native argument count */
|
---|
766 | uint8_t dofpr_xargc; /* translated argument count */
|
---|
767 | uint16_t dofpr_noffs; /* number of offset entries for probe */
|
---|
768 | uint32_t dofpr_enoffidx; /* index of first is-enabled offset */
|
---|
769 | uint16_t dofpr_nenoffs; /* number of is-enabled offsets */
|
---|
770 | uint16_t dofpr_pad1; /* reserved for future use */
|
---|
771 | uint32_t dofpr_pad2; /* reserved for future use */
|
---|
772 | } dof_probe_t;
|
---|
773 |
|
---|
774 | typedef struct dof_xlator {
|
---|
775 | dof_secidx_t dofxl_members; /* link to DOF_SECT_XLMEMBERS section */
|
---|
776 | dof_secidx_t dofxl_strtab; /* link to DOF_SECT_STRTAB section */
|
---|
777 | dof_stridx_t dofxl_argv; /* input parameter type strings */
|
---|
778 | uint32_t dofxl_argc; /* input parameter list length */
|
---|
779 | dof_stridx_t dofxl_type; /* output type string name */
|
---|
780 | dof_attr_t dofxl_attr; /* output stability attributes */
|
---|
781 | } dof_xlator_t;
|
---|
782 |
|
---|
783 | typedef struct dof_xlmember {
|
---|
784 | dof_secidx_t dofxm_difo; /* member link to DOF_SECT_DIFOHDR */
|
---|
785 | dof_stridx_t dofxm_name; /* member name */
|
---|
786 | dtrace_diftype_t dofxm_type; /* member type */
|
---|
787 | } dof_xlmember_t;
|
---|
788 |
|
---|
789 | typedef struct dof_xlref {
|
---|
790 | dof_secidx_t dofxr_xlator; /* link to DOF_SECT_XLATORS section */
|
---|
791 | uint32_t dofxr_member; /* index of referenced dof_xlmember */
|
---|
792 | uint32_t dofxr_argn; /* index of argument for DIF_OP_XLARG */
|
---|
793 | } dof_xlref_t;
|
---|
794 |
|
---|
795 | /*
|
---|
796 | * DTrace Intermediate Format Object (DIFO)
|
---|
797 | *
|
---|
798 | * A DIFO is used to store the compiled DIF for a D expression, its return
|
---|
799 | * type, and its string and variable tables. The string table is a single
|
---|
800 | * buffer of character data into which sets instructions and variable
|
---|
801 | * references can reference strings using a byte offset. The variable table
|
---|
802 | * is an array of dtrace_difv_t structures that describe the name and type of
|
---|
803 | * each variable and the id used in the DIF code. This structure is described
|
---|
804 | * above in the DIF section of this header file. The DIFO is used at both
|
---|
805 | * user-level (in the library) and in the kernel, but the structure is never
|
---|
806 | * passed between the two: the DOF structures form the only interface. As a
|
---|
807 | * result, the definition can change depending on the presence of _KERNEL.
|
---|
808 | */
|
---|
809 | typedef struct dtrace_difo {
|
---|
810 | dif_instr_t *dtdo_buf; /* instruction buffer */
|
---|
811 | uint64_t *dtdo_inttab; /* integer table (optional) */
|
---|
812 | char *dtdo_strtab; /* string table (optional) */
|
---|
813 | dtrace_difv_t *dtdo_vartab; /* variable table (optional) */
|
---|
814 | uint_t dtdo_len; /* length of instruction buffer */
|
---|
815 | uint_t dtdo_intlen; /* length of integer table */
|
---|
816 | uint_t dtdo_strlen; /* length of string table */
|
---|
817 | uint_t dtdo_varlen; /* length of variable table */
|
---|
818 | dtrace_diftype_t dtdo_rtype; /* return type */
|
---|
819 | uint_t dtdo_refcnt; /* owner reference count */
|
---|
820 | uint_t dtdo_destructive; /* invokes destructive subroutines */
|
---|
821 | #if !defined(_KERNEL) || defined(IN_RING3)
|
---|
822 | dof_relodesc_t *dtdo_kreltab; /* kernel relocations */
|
---|
823 | dof_relodesc_t *dtdo_ureltab; /* user relocations */
|
---|
824 | struct dt_node **dtdo_xlmtab; /* translator references */
|
---|
825 | uint_t dtdo_krelen; /* length of krelo table */
|
---|
826 | uint_t dtdo_urelen; /* length of urelo table */
|
---|
827 | uint_t dtdo_xlmlen; /* length of translator table */
|
---|
828 | #endif
|
---|
829 | } dtrace_difo_t;
|
---|
830 |
|
---|
831 | /*
|
---|
832 | * DTrace Enabling Description Structures
|
---|
833 | *
|
---|
834 | * When DTrace is tracking the description of a DTrace enabling entity (probe,
|
---|
835 | * predicate, action, ECB, record, etc.), it does so in a description
|
---|
836 | * structure. These structures all end in "desc", and are used at both
|
---|
837 | * user-level and in the kernel -- but (with the exception of
|
---|
838 | * dtrace_probedesc_t) they are never passed between them. Typically,
|
---|
839 | * user-level will use the description structures when assembling an enabling.
|
---|
840 | * It will then distill those description structures into a DOF object (see
|
---|
841 | * above), and send it into the kernel. The kernel will again use the
|
---|
842 | * description structures to create a description of the enabling as it reads
|
---|
843 | * the DOF. When the description is complete, the enabling will be actually
|
---|
844 | * created -- turning it into the structures that represent the enabling
|
---|
845 | * instead of merely describing it. Not surprisingly, the description
|
---|
846 | * structures bear a strong resemblance to the DOF structures that act as their
|
---|
847 | * conduit.
|
---|
848 | */
|
---|
849 | struct dtrace_predicate;
|
---|
850 |
|
---|
851 | typedef struct dtrace_probedesc {
|
---|
852 | dtrace_id_t dtpd_id; /* probe identifier */
|
---|
853 | char dtpd_provider[DTRACE_PROVNAMELEN]; /* probe provider name */
|
---|
854 | char dtpd_mod[DTRACE_MODNAMELEN]; /* probe module name */
|
---|
855 | char dtpd_func[DTRACE_FUNCNAMELEN]; /* probe function name */
|
---|
856 | char dtpd_name[DTRACE_NAMELEN]; /* probe name */
|
---|
857 | } dtrace_probedesc_t;
|
---|
858 |
|
---|
859 | typedef struct dtrace_repldesc {
|
---|
860 | dtrace_probedesc_t dtrpd_match; /* probe descr. to match */
|
---|
861 | dtrace_probedesc_t dtrpd_create; /* probe descr. to create */
|
---|
862 | } dtrace_repldesc_t;
|
---|
863 |
|
---|
864 | typedef struct dtrace_preddesc {
|
---|
865 | dtrace_difo_t *dtpdd_difo; /* pointer to DIF object */
|
---|
866 | struct dtrace_predicate *dtpdd_predicate; /* pointer to predicate */
|
---|
867 | } dtrace_preddesc_t;
|
---|
868 |
|
---|
869 | typedef struct dtrace_actdesc {
|
---|
870 | dtrace_difo_t *dtad_difo; /* pointer to DIF object */
|
---|
871 | struct dtrace_actdesc *dtad_next; /* next action */
|
---|
872 | dtrace_actkind_t dtad_kind; /* kind of action */
|
---|
873 | uint32_t dtad_ntuple; /* number in tuple */
|
---|
874 | uint64_t dtad_arg; /* action argument */
|
---|
875 | uint64_t dtad_uarg; /* user argument */
|
---|
876 | int dtad_refcnt; /* reference count */
|
---|
877 | } dtrace_actdesc_t;
|
---|
878 |
|
---|
879 | typedef struct dtrace_ecbdesc {
|
---|
880 | dtrace_actdesc_t *dted_action; /* action description(s) */
|
---|
881 | dtrace_preddesc_t dted_pred; /* predicate description */
|
---|
882 | dtrace_probedesc_t dted_probe; /* probe description */
|
---|
883 | uint64_t dted_uarg; /* library argument */
|
---|
884 | int dted_refcnt; /* reference count */
|
---|
885 | } dtrace_ecbdesc_t;
|
---|
886 |
|
---|
887 | /*
|
---|
888 | * DTrace Metadata Description Structures
|
---|
889 | *
|
---|
890 | * DTrace separates the trace data stream from the metadata stream. The only
|
---|
891 | * metadata tokens placed in the data stream are enabled probe identifiers
|
---|
892 | * (EPIDs) or (in the case of aggregations) aggregation identifiers. In order
|
---|
893 | * to determine the structure of the data, DTrace consumers pass the token to
|
---|
894 | * the kernel, and receive in return a corresponding description of the enabled
|
---|
895 | * probe (via the dtrace_eprobedesc structure) or the aggregation (via the
|
---|
896 | * dtrace_aggdesc structure). Both of these structures are expressed in terms
|
---|
897 | * of record descriptions (via the dtrace_recdesc structure) that describe the
|
---|
898 | * exact structure of the data. Some record descriptions may also contain a
|
---|
899 | * format identifier; this additional bit of metadata can be retrieved from the
|
---|
900 | * kernel, for which a format description is returned via the dtrace_fmtdesc
|
---|
901 | * structure. Note that all four of these structures must be bitness-neutral
|
---|
902 | * to allow for a 32-bit DTrace consumer on a 64-bit kernel.
|
---|
903 | */
|
---|
904 | typedef struct dtrace_recdesc {
|
---|
905 | dtrace_actkind_t dtrd_action; /* kind of action */
|
---|
906 | uint32_t dtrd_size; /* size of record */
|
---|
907 | uint32_t dtrd_offset; /* offset in ECB's data */
|
---|
908 | uint16_t dtrd_alignment; /* required alignment */
|
---|
909 | uint16_t dtrd_format; /* format, if any */
|
---|
910 | uint64_t dtrd_arg; /* action argument */
|
---|
911 | uint64_t dtrd_uarg; /* user argument */
|
---|
912 | } dtrace_recdesc_t;
|
---|
913 |
|
---|
914 | typedef struct dtrace_eprobedesc {
|
---|
915 | dtrace_epid_t dtepd_epid; /* enabled probe ID */
|
---|
916 | dtrace_id_t dtepd_probeid; /* probe ID */
|
---|
917 | uint64_t dtepd_uarg; /* library argument */
|
---|
918 | uint32_t dtepd_size; /* total size */
|
---|
919 | int dtepd_nrecs; /* number of records */
|
---|
920 | dtrace_recdesc_t dtepd_rec[1]; /* records themselves */
|
---|
921 | } dtrace_eprobedesc_t;
|
---|
922 |
|
---|
923 | typedef struct dtrace_aggdesc {
|
---|
924 | DTRACE_PTR(char, dtagd_name); /* not filled in by kernel */
|
---|
925 | dtrace_aggvarid_t dtagd_varid; /* not filled in by kernel */
|
---|
926 | int dtagd_flags; /* not filled in by kernel */
|
---|
927 | dtrace_aggid_t dtagd_id; /* aggregation ID */
|
---|
928 | dtrace_epid_t dtagd_epid; /* enabled probe ID */
|
---|
929 | uint32_t dtagd_size; /* size in bytes */
|
---|
930 | int dtagd_nrecs; /* number of records */
|
---|
931 | uint32_t dtagd_pad; /* explicit padding */
|
---|
932 | dtrace_recdesc_t dtagd_rec[1]; /* record descriptions */
|
---|
933 | } dtrace_aggdesc_t;
|
---|
934 |
|
---|
935 | typedef struct dtrace_fmtdesc {
|
---|
936 | DTRACE_PTR(char, dtfd_string); /* format string */
|
---|
937 | int dtfd_length; /* length of format string */
|
---|
938 | uint16_t dtfd_format; /* format identifier */
|
---|
939 | } dtrace_fmtdesc_t;
|
---|
940 |
|
---|
941 | #define DTRACE_SIZEOF_EPROBEDESC(desc) \
|
---|
942 | (sizeof (dtrace_eprobedesc_t) + ((desc)->dtepd_nrecs ? \
|
---|
943 | (((desc)->dtepd_nrecs - 1) * sizeof (dtrace_recdesc_t)) : 0))
|
---|
944 |
|
---|
945 | #define DTRACE_SIZEOF_AGGDESC(desc) \
|
---|
946 | (sizeof (dtrace_aggdesc_t) + ((desc)->dtagd_nrecs ? \
|
---|
947 | (((desc)->dtagd_nrecs - 1) * sizeof (dtrace_recdesc_t)) : 0))
|
---|
948 |
|
---|
949 | /*
|
---|
950 | * DTrace Option Interface
|
---|
951 | *
|
---|
952 | * Run-time DTrace options are set and retrieved via DOF_SECT_OPTDESC sections
|
---|
953 | * in a DOF image. The dof_optdesc structure contains an option identifier and
|
---|
954 | * an option value. The valid option identifiers are found below; the mapping
|
---|
955 | * between option identifiers and option identifying strings is maintained at
|
---|
956 | * user-level. Note that the value of DTRACEOPT_UNSET is such that all of the
|
---|
957 | * following are potentially valid option values: all positive integers, zero
|
---|
958 | * and negative one. Some options (notably "bufpolicy" and "bufresize") take
|
---|
959 | * predefined tokens as their values; these are defined with
|
---|
960 | * DTRACEOPT_{option}_{token}.
|
---|
961 | */
|
---|
962 | #define DTRACEOPT_BUFSIZE 0 /* buffer size */
|
---|
963 | #define DTRACEOPT_BUFPOLICY 1 /* buffer policy */
|
---|
964 | #define DTRACEOPT_DYNVARSIZE 2 /* dynamic variable size */
|
---|
965 | #define DTRACEOPT_AGGSIZE 3 /* aggregation size */
|
---|
966 | #define DTRACEOPT_SPECSIZE 4 /* speculation size */
|
---|
967 | #define DTRACEOPT_NSPEC 5 /* number of speculations */
|
---|
968 | #define DTRACEOPT_STRSIZE 6 /* string size */
|
---|
969 | #define DTRACEOPT_CLEANRATE 7 /* dynvar cleaning rate */
|
---|
970 | #define DTRACEOPT_CPU 8 /* CPU to trace */
|
---|
971 | #define DTRACEOPT_BUFRESIZE 9 /* buffer resizing policy */
|
---|
972 | #define DTRACEOPT_GRABANON 10 /* grab anonymous state, if any */
|
---|
973 | #define DTRACEOPT_FLOWINDENT 11 /* indent function entry/return */
|
---|
974 | #define DTRACEOPT_QUIET 12 /* only output explicitly traced data */
|
---|
975 | #define DTRACEOPT_STACKFRAMES 13 /* number of stack frames */
|
---|
976 | #define DTRACEOPT_USTACKFRAMES 14 /* number of user stack frames */
|
---|
977 | #define DTRACEOPT_AGGRATE 15 /* aggregation snapshot rate */
|
---|
978 | #define DTRACEOPT_SWITCHRATE 16 /* buffer switching rate */
|
---|
979 | #define DTRACEOPT_STATUSRATE 17 /* status rate */
|
---|
980 | #define DTRACEOPT_DESTRUCTIVE 18 /* destructive actions allowed */
|
---|
981 | #define DTRACEOPT_STACKINDENT 19 /* output indent for stack traces */
|
---|
982 | #define DTRACEOPT_RAWBYTES 20 /* always print bytes in raw form */
|
---|
983 | #define DTRACEOPT_JSTACKFRAMES 21 /* number of jstack() frames */
|
---|
984 | #define DTRACEOPT_JSTACKSTRSIZE 22 /* size of jstack() string table */
|
---|
985 | #define DTRACEOPT_AGGSORTKEY 23 /* sort aggregations by key */
|
---|
986 | #define DTRACEOPT_AGGSORTREV 24 /* reverse-sort aggregations */
|
---|
987 | #define DTRACEOPT_AGGSORTPOS 25 /* agg. position to sort on */
|
---|
988 | #define DTRACEOPT_AGGSORTKEYPOS 26 /* agg. key position to sort on */
|
---|
989 | #define DTRACEOPT_MAX 27 /* number of options */
|
---|
990 |
|
---|
991 | #define DTRACEOPT_UNSET (dtrace_optval_t)-2 /* unset option */
|
---|
992 |
|
---|
993 | #define DTRACEOPT_BUFPOLICY_RING 0 /* ring buffer */
|
---|
994 | #define DTRACEOPT_BUFPOLICY_FILL 1 /* fill buffer, then stop */
|
---|
995 | #define DTRACEOPT_BUFPOLICY_SWITCH 2 /* switch buffers */
|
---|
996 |
|
---|
997 | #define DTRACEOPT_BUFRESIZE_AUTO 0 /* automatic resizing */
|
---|
998 | #define DTRACEOPT_BUFRESIZE_MANUAL 1 /* manual resizing */
|
---|
999 |
|
---|
1000 | /*
|
---|
1001 | * DTrace Buffer Interface
|
---|
1002 | *
|
---|
1003 | * In order to get a snapshot of the principal or aggregation buffer,
|
---|
1004 | * user-level passes a buffer description to the kernel with the dtrace_bufdesc
|
---|
1005 | * structure. This describes which CPU user-level is interested in, and
|
---|
1006 | * where user-level wishes the kernel to snapshot the buffer to (the
|
---|
1007 | * dtbd_data field). The kernel uses the same structure to pass back some
|
---|
1008 | * information regarding the buffer: the size of data actually copied out, the
|
---|
1009 | * number of drops, the number of errors, and the offset of the oldest record.
|
---|
1010 | * If the buffer policy is a "switch" policy, taking a snapshot of the
|
---|
1011 | * principal buffer has the additional effect of switching the active and
|
---|
1012 | * inactive buffers. Taking a snapshot of the aggregation buffer _always_ has
|
---|
1013 | * the additional effect of switching the active and inactive buffers.
|
---|
1014 | */
|
---|
1015 | typedef struct dtrace_bufdesc {
|
---|
1016 | uint64_t dtbd_size; /* size of buffer */
|
---|
1017 | uint32_t dtbd_cpu; /* CPU or DTRACE_CPUALL */
|
---|
1018 | uint32_t dtbd_errors; /* number of errors */
|
---|
1019 | uint64_t dtbd_drops; /* number of drops */
|
---|
1020 | DTRACE_PTR(char, dtbd_data); /* data */
|
---|
1021 | uint64_t dtbd_oldest; /* offset of oldest record */
|
---|
1022 | } dtrace_bufdesc_t;
|
---|
1023 |
|
---|
1024 | /*
|
---|
1025 | * DTrace Status
|
---|
1026 | *
|
---|
1027 | * The status of DTrace is relayed via the dtrace_status structure. This
|
---|
1028 | * structure contains members to count drops other than the capacity drops
|
---|
1029 | * available via the buffer interface (see above). This consists of dynamic
|
---|
1030 | * drops (including capacity dynamic drops, rinsing drops and dirty drops), and
|
---|
1031 | * speculative drops (including capacity speculative drops, drops due to busy
|
---|
1032 | * speculative buffers and drops due to unavailable speculative buffers).
|
---|
1033 | * Additionally, the status structure contains a field to indicate the number
|
---|
1034 | * of "fill"-policy buffers have been filled and a boolean field to indicate
|
---|
1035 | * that exit() has been called. If the dtst_exiting field is non-zero, no
|
---|
1036 | * further data will be generated until tracing is stopped (at which time any
|
---|
1037 | * enablings of the END action will be processed); if user-level sees that
|
---|
1038 | * this field is non-zero, tracing should be stopped as soon as possible.
|
---|
1039 | */
|
---|
1040 | typedef struct dtrace_status {
|
---|
1041 | uint64_t dtst_dyndrops; /* dynamic drops */
|
---|
1042 | uint64_t dtst_dyndrops_rinsing; /* dyn drops due to rinsing */
|
---|
1043 | uint64_t dtst_dyndrops_dirty; /* dyn drops due to dirty */
|
---|
1044 | uint64_t dtst_specdrops; /* speculative drops */
|
---|
1045 | uint64_t dtst_specdrops_busy; /* spec drops due to busy */
|
---|
1046 | uint64_t dtst_specdrops_unavail; /* spec drops due to unavail */
|
---|
1047 | uint64_t dtst_errors; /* total errors */
|
---|
1048 | uint64_t dtst_filled; /* number of filled bufs */
|
---|
1049 | uint64_t dtst_stkstroverflows; /* stack string tab overflows */
|
---|
1050 | uint64_t dtst_dblerrors; /* errors in ERROR probes */
|
---|
1051 | char dtst_killed; /* non-zero if killed */
|
---|
1052 | char dtst_exiting; /* non-zero if exit() called */
|
---|
1053 | char dtst_pad[6]; /* pad out to 64-bit align */
|
---|
1054 | } dtrace_status_t;
|
---|
1055 |
|
---|
1056 | /*
|
---|
1057 | * DTrace Configuration
|
---|
1058 | *
|
---|
1059 | * User-level may need to understand some elements of the kernel DTrace
|
---|
1060 | * configuration in order to generate correct DIF. This information is
|
---|
1061 | * conveyed via the dtrace_conf structure.
|
---|
1062 | */
|
---|
1063 | typedef struct dtrace_conf {
|
---|
1064 | uint_t dtc_difversion; /* supported DIF version */
|
---|
1065 | uint_t dtc_difintregs; /* # of DIF integer registers */
|
---|
1066 | uint_t dtc_diftupregs; /* # of DIF tuple registers */
|
---|
1067 | uint_t dtc_ctfmodel; /* CTF data model */
|
---|
1068 | uint_t dtc_pad[8]; /* reserved for future use */
|
---|
1069 | } dtrace_conf_t;
|
---|
1070 |
|
---|
1071 | /*
|
---|
1072 | * DTrace Faults
|
---|
1073 | *
|
---|
1074 | * The constants below DTRACEFLT_LIBRARY indicate probe processing faults;
|
---|
1075 | * constants at or above DTRACEFLT_LIBRARY indicate faults in probe
|
---|
1076 | * postprocessing at user-level. Probe processing faults induce an ERROR
|
---|
1077 | * probe and are replicated in unistd.d to allow users' ERROR probes to decode
|
---|
1078 | * the error condition using thse symbolic labels.
|
---|
1079 | */
|
---|
1080 | #define DTRACEFLT_UNKNOWN 0 /* Unknown fault */
|
---|
1081 | #define DTRACEFLT_BADADDR 1 /* Bad address */
|
---|
1082 | #define DTRACEFLT_BADALIGN 2 /* Bad alignment */
|
---|
1083 | #define DTRACEFLT_ILLOP 3 /* Illegal operation */
|
---|
1084 | #define DTRACEFLT_DIVZERO 4 /* Divide-by-zero */
|
---|
1085 | #define DTRACEFLT_NOSCRATCH 5 /* Out of scratch space */
|
---|
1086 | #define DTRACEFLT_KPRIV 6 /* Illegal kernel access */
|
---|
1087 | #define DTRACEFLT_UPRIV 7 /* Illegal user access */
|
---|
1088 | #define DTRACEFLT_TUPOFLOW 8 /* Tuple stack overflow */
|
---|
1089 | #define DTRACEFLT_BADSTACK 9 /* Bad stack */
|
---|
1090 |
|
---|
1091 | #define DTRACEFLT_LIBRARY 1000 /* Library-level fault */
|
---|
1092 |
|
---|
1093 | /*
|
---|
1094 | * DTrace Argument Types
|
---|
1095 | *
|
---|
1096 | * Because it would waste both space and time, argument types do not reside
|
---|
1097 | * with the probe. In order to determine argument types for args[X]
|
---|
1098 | * variables, the D compiler queries for argument types on a probe-by-probe
|
---|
1099 | * basis. (This optimizes for the common case that arguments are either not
|
---|
1100 | * used or used in an untyped fashion.) Typed arguments are specified with a
|
---|
1101 | * string of the type name in the dtragd_native member of the argument
|
---|
1102 | * description structure. Typed arguments may be further translated to types
|
---|
1103 | * of greater stability; the provider indicates such a translated argument by
|
---|
1104 | * filling in the dtargd_xlate member with the string of the translated type.
|
---|
1105 | * Finally, the provider may indicate which argument value a given argument
|
---|
1106 | * maps to by setting the dtargd_mapping member -- allowing a single argument
|
---|
1107 | * to map to multiple args[X] variables.
|
---|
1108 | */
|
---|
1109 | typedef struct dtrace_argdesc {
|
---|
1110 | dtrace_id_t dtargd_id; /* probe identifier */
|
---|
1111 | int dtargd_ndx; /* arg number (-1 iff none) */
|
---|
1112 | int dtargd_mapping; /* value mapping */
|
---|
1113 | char dtargd_native[DTRACE_ARGTYPELEN]; /* native type name */
|
---|
1114 | char dtargd_xlate[DTRACE_ARGTYPELEN]; /* translated type name */
|
---|
1115 | } dtrace_argdesc_t;
|
---|
1116 |
|
---|
1117 | /*
|
---|
1118 | * DTrace Stability Attributes
|
---|
1119 | *
|
---|
1120 | * Each DTrace provider advertises the name and data stability of each of its
|
---|
1121 | * probe description components, as well as its architectural dependencies.
|
---|
1122 | * The D compiler can query the provider attributes (dtrace_pattr_t below) in
|
---|
1123 | * order to compute the properties of an input program and report them.
|
---|
1124 | */
|
---|
1125 | typedef uint8_t dtrace_stability_t; /* stability code (see attributes(5)) */
|
---|
1126 | typedef uint8_t dtrace_class_t; /* architectural dependency class */
|
---|
1127 |
|
---|
1128 | #define DTRACE_STABILITY_INTERNAL 0 /* private to DTrace itself */
|
---|
1129 | #define DTRACE_STABILITY_PRIVATE 1 /* private to Sun (see docs) */
|
---|
1130 | #define DTRACE_STABILITY_OBSOLETE 2 /* scheduled for removal */
|
---|
1131 | #define DTRACE_STABILITY_EXTERNAL 3 /* not controlled by Sun */
|
---|
1132 | #define DTRACE_STABILITY_UNSTABLE 4 /* new or rapidly changing */
|
---|
1133 | #define DTRACE_STABILITY_EVOLVING 5 /* less rapidly changing */
|
---|
1134 | #define DTRACE_STABILITY_STABLE 6 /* mature interface from Sun */
|
---|
1135 | #define DTRACE_STABILITY_STANDARD 7 /* industry standard */
|
---|
1136 | #define DTRACE_STABILITY_MAX 7 /* maximum valid stability */
|
---|
1137 |
|
---|
1138 | #define DTRACE_CLASS_UNKNOWN 0 /* unknown architectural dependency */
|
---|
1139 | #define DTRACE_CLASS_CPU 1 /* CPU-module-specific */
|
---|
1140 | #define DTRACE_CLASS_PLATFORM 2 /* platform-specific (uname -i) */
|
---|
1141 | #define DTRACE_CLASS_GROUP 3 /* hardware-group-specific (uname -m) */
|
---|
1142 | #define DTRACE_CLASS_ISA 4 /* ISA-specific (uname -p) */
|
---|
1143 | #define DTRACE_CLASS_COMMON 5 /* common to all systems */
|
---|
1144 | #define DTRACE_CLASS_MAX 5 /* maximum valid class */
|
---|
1145 |
|
---|
1146 | #define DTRACE_PRIV_NONE 0x0000
|
---|
1147 | #define DTRACE_PRIV_KERNEL 0x0001
|
---|
1148 | #define DTRACE_PRIV_USER 0x0002
|
---|
1149 | #define DTRACE_PRIV_PROC 0x0004
|
---|
1150 | #define DTRACE_PRIV_OWNER 0x0008
|
---|
1151 | #define DTRACE_PRIV_ZONEOWNER 0x0010
|
---|
1152 |
|
---|
1153 | #define DTRACE_PRIV_ALL \
|
---|
1154 | (DTRACE_PRIV_KERNEL | DTRACE_PRIV_USER | \
|
---|
1155 | DTRACE_PRIV_PROC | DTRACE_PRIV_OWNER | DTRACE_PRIV_ZONEOWNER)
|
---|
1156 |
|
---|
1157 | typedef struct dtrace_ppriv {
|
---|
1158 | uint32_t dtpp_flags; /* privilege flags */
|
---|
1159 | uid_t dtpp_uid; /* user ID */
|
---|
1160 | zoneid_t dtpp_zoneid; /* zone ID */
|
---|
1161 | } dtrace_ppriv_t;
|
---|
1162 |
|
---|
1163 | typedef struct dtrace_attribute {
|
---|
1164 | dtrace_stability_t dtat_name; /* entity name stability */
|
---|
1165 | dtrace_stability_t dtat_data; /* entity data stability */
|
---|
1166 | dtrace_class_t dtat_class; /* entity data dependency */
|
---|
1167 | } dtrace_attribute_t;
|
---|
1168 |
|
---|
1169 | typedef struct dtrace_pattr {
|
---|
1170 | dtrace_attribute_t dtpa_provider; /* provider attributes */
|
---|
1171 | dtrace_attribute_t dtpa_mod; /* module attributes */
|
---|
1172 | dtrace_attribute_t dtpa_func; /* function attributes */
|
---|
1173 | dtrace_attribute_t dtpa_name; /* name attributes */
|
---|
1174 | dtrace_attribute_t dtpa_args; /* args[] attributes */
|
---|
1175 | } dtrace_pattr_t;
|
---|
1176 |
|
---|
1177 | typedef struct dtrace_providerdesc {
|
---|
1178 | char dtvd_name[DTRACE_PROVNAMELEN]; /* provider name */
|
---|
1179 | dtrace_pattr_t dtvd_attr; /* stability attributes */
|
---|
1180 | dtrace_ppriv_t dtvd_priv; /* privileges required */
|
---|
1181 | } dtrace_providerdesc_t;
|
---|
1182 |
|
---|
1183 | /*
|
---|
1184 | * DTrace Pseudodevice Interface
|
---|
1185 | *
|
---|
1186 | * DTrace is controlled through ioctl(2)'s to the in-kernel dtrace:dtrace
|
---|
1187 | * pseudodevice driver. These ioctls comprise the user-kernel interface to
|
---|
1188 | * DTrace.
|
---|
1189 | */
|
---|
1190 | #define DTRACEIOC (('d' << 24) | ('t' << 16) | ('r' << 8))
|
---|
1191 | #define DTRACEIOC_PROVIDER (DTRACEIOC | 1) /* provider query */
|
---|
1192 | #define DTRACEIOC_PROBES (DTRACEIOC | 2) /* probe query */
|
---|
1193 | #define DTRACEIOC_BUFSNAP (DTRACEIOC | 4) /* snapshot buffer */
|
---|
1194 | #define DTRACEIOC_PROBEMATCH (DTRACEIOC | 5) /* match probes */
|
---|
1195 | #define DTRACEIOC_ENABLE (DTRACEIOC | 6) /* enable probes */
|
---|
1196 | #define DTRACEIOC_AGGSNAP (DTRACEIOC | 7) /* snapshot agg. */
|
---|
1197 | #define DTRACEIOC_EPROBE (DTRACEIOC | 8) /* get eprobe desc. */
|
---|
1198 | #define DTRACEIOC_PROBEARG (DTRACEIOC | 9) /* get probe arg */
|
---|
1199 | #define DTRACEIOC_CONF (DTRACEIOC | 10) /* get config. */
|
---|
1200 | #define DTRACEIOC_STATUS (DTRACEIOC | 11) /* get status */
|
---|
1201 | #define DTRACEIOC_GO (DTRACEIOC | 12) /* start tracing */
|
---|
1202 | #define DTRACEIOC_STOP (DTRACEIOC | 13) /* stop tracing */
|
---|
1203 | #define DTRACEIOC_AGGDESC (DTRACEIOC | 15) /* get agg. desc. */
|
---|
1204 | #define DTRACEIOC_FORMAT (DTRACEIOC | 16) /* get format str */
|
---|
1205 | #define DTRACEIOC_DOFGET (DTRACEIOC | 17) /* get DOF */
|
---|
1206 | #define DTRACEIOC_REPLICATE (DTRACEIOC | 18) /* replicate enab */
|
---|
1207 |
|
---|
1208 | /*
|
---|
1209 | * DTrace Helpers
|
---|
1210 | *
|
---|
1211 | * In general, DTrace establishes probes in processes and takes actions on
|
---|
1212 | * processes without knowing their specific user-level structures. Instead of
|
---|
1213 | * existing in the framework, process-specific knowledge is contained by the
|
---|
1214 | * enabling D program -- which can apply process-specific knowledge by making
|
---|
1215 | * appropriate use of DTrace primitives like copyin() and copyinstr() to
|
---|
1216 | * operate on user-level data. However, there may exist some specific probes
|
---|
1217 | * of particular semantic relevance that the application developer may wish to
|
---|
1218 | * explicitly export. For example, an application may wish to export a probe
|
---|
1219 | * at the point that it begins and ends certain well-defined transactions. In
|
---|
1220 | * addition to providing probes, programs may wish to offer assistance for
|
---|
1221 | * certain actions. For example, in highly dynamic environments (e.g., Java),
|
---|
1222 | * it may be difficult to obtain a stack trace in terms of meaningful symbol
|
---|
1223 | * names (the translation from instruction addresses to corresponding symbol
|
---|
1224 | * names may only be possible in situ); these environments may wish to define
|
---|
1225 | * a series of actions to be applied in situ to obtain a meaningful stack
|
---|
1226 | * trace.
|
---|
1227 | *
|
---|
1228 | * These two mechanisms -- user-level statically defined tracing and assisting
|
---|
1229 | * DTrace actions -- are provided via DTrace _helpers_. Helpers are specified
|
---|
1230 | * via DOF, but unlike enabling DOF, helper DOF may contain definitions of
|
---|
1231 | * providers, probes and their arguments. If a helper wishes to provide
|
---|
1232 | * action assistance, probe descriptions and corresponding DIF actions may be
|
---|
1233 | * specified in the helper DOF. For such helper actions, however, the probe
|
---|
1234 | * description describes the specific helper: all DTrace helpers have the
|
---|
1235 | * provider name "dtrace" and the module name "helper", and the name of the
|
---|
1236 | * helper is contained in the function name (for example, the ustack() helper
|
---|
1237 | * is named "ustack"). Any helper-specific name may be contained in the name
|
---|
1238 | * (for example, if a helper were to have a constructor, it might be named
|
---|
1239 | * "dtrace:helper:<helper>:init"). Helper actions are only called when the
|
---|
1240 | * action that they are helping is taken. Helper actions may only return DIF
|
---|
1241 | * expressions, and may only call the following subroutines:
|
---|
1242 | *
|
---|
1243 | * alloca() <= Allocates memory out of the consumer's scratch space
|
---|
1244 | * bcopy() <= Copies memory to scratch space
|
---|
1245 | * copyin() <= Copies memory from user-level into consumer's scratch
|
---|
1246 | * copyinto() <= Copies memory into a specific location in scratch
|
---|
1247 | * copyinstr() <= Copies a string into a specific location in scratch
|
---|
1248 | *
|
---|
1249 | * Helper actions may only access the following built-in variables:
|
---|
1250 | *
|
---|
1251 | * curthread <= Current kthread_t pointer
|
---|
1252 | * tid <= Current thread identifier
|
---|
1253 | * pid <= Current process identifier
|
---|
1254 | * ppid <= Parent process identifier
|
---|
1255 | * uid <= Current user ID
|
---|
1256 | * gid <= Current group ID
|
---|
1257 | * execname <= Current executable name
|
---|
1258 | * zonename <= Current zone name
|
---|
1259 | *
|
---|
1260 | * Helper actions may not manipulate or allocate dynamic variables, but they
|
---|
1261 | * may have clause-local and statically-allocated global variables. The
|
---|
1262 | * helper action variable state is specific to the helper action -- variables
|
---|
1263 | * used by the helper action may not be accessed outside of the helper
|
---|
1264 | * action, and the helper action may not access variables that like outside
|
---|
1265 | * of it. Helper actions may not load from kernel memory at-large; they are
|
---|
1266 | * restricting to loading current user state (via copyin() and variants) and
|
---|
1267 | * scratch space. As with probe enablings, helper actions are executed in
|
---|
1268 | * program order. The result of the helper action is the result of the last
|
---|
1269 | * executing helper expression.
|
---|
1270 | *
|
---|
1271 | * Helpers -- composed of either providers/probes or probes/actions (or both)
|
---|
1272 | * -- are added by opening the "helper" minor node, and issuing an ioctl(2)
|
---|
1273 | * (DTRACEHIOC_ADDDOF) that specifies the dof_helper_t structure. This
|
---|
1274 | * encapsulates the name and base address of the user-level library or
|
---|
1275 | * executable publishing the helpers and probes as well as the DOF that
|
---|
1276 | * contains the definitions of those helpers and probes.
|
---|
1277 | *
|
---|
1278 | * The DTRACEHIOC_ADD and DTRACEHIOC_REMOVE are left in place for legacy
|
---|
1279 | * helpers and should no longer be used. No other ioctls are valid on the
|
---|
1280 | * helper minor node.
|
---|
1281 | */
|
---|
1282 | #define DTRACEHIOC (('d' << 24) | ('t' << 16) | ('h' << 8))
|
---|
1283 | #define DTRACEHIOC_ADD (DTRACEHIOC | 1) /* add helper */
|
---|
1284 | #define DTRACEHIOC_REMOVE (DTRACEHIOC | 2) /* remove helper */
|
---|
1285 | #define DTRACEHIOC_ADDDOF (DTRACEHIOC | 3) /* add helper DOF */
|
---|
1286 |
|
---|
1287 | typedef struct dof_helper {
|
---|
1288 | char dofhp_mod[DTRACE_MODNAMELEN]; /* executable or library name */
|
---|
1289 | uint64_t dofhp_addr; /* base address of object */
|
---|
1290 | uint64_t dofhp_dof; /* address of helper DOF */
|
---|
1291 | } dof_helper_t;
|
---|
1292 |
|
---|
1293 | #define DTRACEMNR_DTRACE "dtrace" /* node for DTrace ops */
|
---|
1294 | #define DTRACEMNR_HELPER "helper" /* node for helpers */
|
---|
1295 | #define DTRACEMNRN_DTRACE 0 /* minor for DTrace ops */
|
---|
1296 | #define DTRACEMNRN_HELPER 1 /* minor for helpers */
|
---|
1297 | #define DTRACEMNRN_CLONE 2 /* first clone minor */
|
---|
1298 |
|
---|
1299 | #if defined(_KERNEL) || defined(IN_RING0)
|
---|
1300 |
|
---|
1301 | /*
|
---|
1302 | * DTrace Provider API
|
---|
1303 | *
|
---|
1304 | * The following functions are implemented by the DTrace framework and are
|
---|
1305 | * used to implement separate in-kernel DTrace providers. Common functions
|
---|
1306 | * are provided in uts/common/os/dtrace.c. ISA-dependent subroutines are
|
---|
1307 | * defined in uts/<isa>/dtrace/dtrace_asm.s or uts/<isa>/dtrace/dtrace_isa.c.
|
---|
1308 | *
|
---|
1309 | * The provider API has two halves: the API that the providers consume from
|
---|
1310 | * DTrace, and the API that providers make available to DTrace.
|
---|
1311 | *
|
---|
1312 | * 1 Framework-to-Provider API
|
---|
1313 | *
|
---|
1314 | * 1.1 Overview
|
---|
1315 | *
|
---|
1316 | * The Framework-to-Provider API is represented by the dtrace_pops structure
|
---|
1317 | * that the provider passes to the framework when registering itself. This
|
---|
1318 | * structure consists of the following members:
|
---|
1319 | *
|
---|
1320 | * dtps_provide() <-- Provide all probes, all modules
|
---|
1321 | * dtps_provide_module() <-- Provide all probes in specified module
|
---|
1322 | * dtps_enable() <-- Enable specified probe
|
---|
1323 | * dtps_disable() <-- Disable specified probe
|
---|
1324 | * dtps_suspend() <-- Suspend specified probe
|
---|
1325 | * dtps_resume() <-- Resume specified probe
|
---|
1326 | * dtps_getargdesc() <-- Get the argument description for args[X]
|
---|
1327 | * dtps_getargval() <-- Get the value for an argX or args[X] variable
|
---|
1328 | * dtps_usermode() <-- Find out if the probe was fired in user mode
|
---|
1329 | * dtps_destroy() <-- Destroy all state associated with this probe
|
---|
1330 | *
|
---|
1331 | * 1.2 void dtps_provide(void *arg, const dtrace_probedesc_t *spec)
|
---|
1332 | *
|
---|
1333 | * 1.2.1 Overview
|
---|
1334 | *
|
---|
1335 | * Called to indicate that the provider should provide all probes. If the
|
---|
1336 | * specified description is non-NULL, dtps_provide() is being called because
|
---|
1337 | * no probe matched a specified probe -- if the provider has the ability to
|
---|
1338 | * create custom probes, it may wish to create a probe that matches the
|
---|
1339 | * specified description.
|
---|
1340 | *
|
---|
1341 | * 1.2.2 Arguments and notes
|
---|
1342 | *
|
---|
1343 | * The first argument is the cookie as passed to dtrace_register(). The
|
---|
1344 | * second argument is a pointer to a probe description that the provider may
|
---|
1345 | * wish to consider when creating custom probes. The provider is expected to
|
---|
1346 | * call back into the DTrace framework via dtrace_probe_create() to create
|
---|
1347 | * any necessary probes. dtps_provide() may be called even if the provider
|
---|
1348 | * has made available all probes; the provider should check the return value
|
---|
1349 | * of dtrace_probe_create() to handle this case. Note that the provider need
|
---|
1350 | * not implement both dtps_provide() and dtps_provide_module(); see
|
---|
1351 | * "Arguments and Notes" for dtrace_register(), below.
|
---|
1352 | *
|
---|
1353 | * 1.2.3 Return value
|
---|
1354 | *
|
---|
1355 | * None.
|
---|
1356 | *
|
---|
1357 | * 1.2.4 Caller's context
|
---|
1358 | *
|
---|
1359 | * dtps_provide() is typically called from open() or ioctl() context, but may
|
---|
1360 | * be called from other contexts as well. The DTrace framework is locked in
|
---|
1361 | * such a way that providers may not register or unregister. This means that
|
---|
1362 | * the provider may not call any DTrace API that affects its registration with
|
---|
1363 | * the framework, including dtrace_register(), dtrace_unregister(),
|
---|
1364 | * dtrace_invalidate(), and dtrace_condense(). However, the context is such
|
---|
1365 | * that the provider may (and indeed, is expected to) call probe-related
|
---|
1366 | * DTrace routines, including dtrace_probe_create(), dtrace_probe_lookup(),
|
---|
1367 | * and dtrace_probe_arg().
|
---|
1368 | *
|
---|
1369 | * 1.3 void dtps_provide_module(void *arg, struct modctl *mp)
|
---|
1370 | *
|
---|
1371 | * 1.3.1 Overview
|
---|
1372 | *
|
---|
1373 | * Called to indicate that the provider should provide all probes in the
|
---|
1374 | * specified module.
|
---|
1375 | *
|
---|
1376 | * 1.3.2 Arguments and notes
|
---|
1377 | *
|
---|
1378 | * The first argument is the cookie as passed to dtrace_register(). The
|
---|
1379 | * second argument is a pointer to a modctl structure that indicates the
|
---|
1380 | * module for which probes should be created.
|
---|
1381 | *
|
---|
1382 | * 1.3.3 Return value
|
---|
1383 | *
|
---|
1384 | * None.
|
---|
1385 | *
|
---|
1386 | * 1.3.4 Caller's context
|
---|
1387 | *
|
---|
1388 | * dtps_provide_module() may be called from open() or ioctl() context, but
|
---|
1389 | * may also be called from a module loading context. mod_lock is held, and
|
---|
1390 | * the DTrace framework is locked in such a way that providers may not
|
---|
1391 | * register or unregister. This means that the provider may not call any
|
---|
1392 | * DTrace API that affects its registration with the framework, including
|
---|
1393 | * dtrace_register(), dtrace_unregister(), dtrace_invalidate(), and
|
---|
1394 | * dtrace_condense(). However, the context is such that the provider may (and
|
---|
1395 | * indeed, is expected to) call probe-related DTrace routines, including
|
---|
1396 | * dtrace_probe_create(), dtrace_probe_lookup(), and dtrace_probe_arg(). Note
|
---|
1397 | * that the provider need not implement both dtps_provide() and
|
---|
1398 | * dtps_provide_module(); see "Arguments and Notes" for dtrace_register(),
|
---|
1399 | * below.
|
---|
1400 | *
|
---|
1401 | * 1.4 int dtps_enable(void *arg, dtrace_id_t id, void *parg)
|
---|
1402 | *
|
---|
1403 | * 1.4.1 Overview
|
---|
1404 | *
|
---|
1405 | * Called to enable the specified probe.
|
---|
1406 | *
|
---|
1407 | * 1.4.2 Arguments and notes
|
---|
1408 | *
|
---|
1409 | * The first argument is the cookie as passed to dtrace_register(). The
|
---|
1410 | * second argument is the identifier of the probe to be enabled. The third
|
---|
1411 | * argument is the probe argument as passed to dtrace_probe_create().
|
---|
1412 | * dtps_enable() will be called when a probe transitions from not being
|
---|
1413 | * enabled at all to having one or more ECB. The number of ECBs associated
|
---|
1414 | * with the probe may change without subsequent calls into the provider.
|
---|
1415 | * When the number of ECBs drops to zero, the provider will be explicitly
|
---|
1416 | * told to disable the probe via dtps_disable(). dtrace_probe() should never
|
---|
1417 | * be called for a probe identifier that hasn't been explicitly enabled via
|
---|
1418 | * dtps_enable().
|
---|
1419 | *
|
---|
1420 | * 1.4.3 Return value
|
---|
1421 | *
|
---|
1422 | * On success, dtps_enable() should return 0. On failure, -1 should be
|
---|
1423 | * returned.
|
---|
1424 | *
|
---|
1425 | * 1.4.4 Caller's context
|
---|
1426 | *
|
---|
1427 | * The DTrace framework is locked in such a way that it may not be called
|
---|
1428 | * back into at all. cpu_lock is held. mod_lock is not held and may not
|
---|
1429 | * be acquired.
|
---|
1430 | *
|
---|
1431 | * 1.5 void dtps_disable(void *arg, dtrace_id_t id, void *parg)
|
---|
1432 | *
|
---|
1433 | * 1.5.1 Overview
|
---|
1434 | *
|
---|
1435 | * Called to disable the specified probe.
|
---|
1436 | *
|
---|
1437 | * 1.5.2 Arguments and notes
|
---|
1438 | *
|
---|
1439 | * The first argument is the cookie as passed to dtrace_register(). The
|
---|
1440 | * second argument is the identifier of the probe to be disabled. The third
|
---|
1441 | * argument is the probe argument as passed to dtrace_probe_create().
|
---|
1442 | * dtps_disable() will be called when a probe transitions from being enabled
|
---|
1443 | * to having zero ECBs. dtrace_probe() should never be called for a probe
|
---|
1444 | * identifier that has been explicitly enabled via dtps_disable().
|
---|
1445 | *
|
---|
1446 | * 1.5.3 Return value
|
---|
1447 | *
|
---|
1448 | * None.
|
---|
1449 | *
|
---|
1450 | * 1.5.4 Caller's context
|
---|
1451 | *
|
---|
1452 | * The DTrace framework is locked in such a way that it may not be called
|
---|
1453 | * back into at all. cpu_lock is held. mod_lock is not held and may not
|
---|
1454 | * be acquired.
|
---|
1455 | *
|
---|
1456 | * 1.6 void dtps_suspend(void *arg, dtrace_id_t id, void *parg)
|
---|
1457 | *
|
---|
1458 | * 1.6.1 Overview
|
---|
1459 | *
|
---|
1460 | * Called to suspend the specified enabled probe. This entry point is for
|
---|
1461 | * providers that may need to suspend some or all of their probes when CPUs
|
---|
1462 | * are being powered on or when the boot monitor is being entered for a
|
---|
1463 | * prolonged period of time.
|
---|
1464 | *
|
---|
1465 | * 1.6.2 Arguments and notes
|
---|
1466 | *
|
---|
1467 | * The first argument is the cookie as passed to dtrace_register(). The
|
---|
1468 | * second argument is the identifier of the probe to be suspended. The
|
---|
1469 | * third argument is the probe argument as passed to dtrace_probe_create().
|
---|
1470 | * dtps_suspend will only be called on an enabled probe. Providers that
|
---|
1471 | * provide a dtps_suspend entry point will want to take roughly the action
|
---|
1472 | * that it takes for dtps_disable.
|
---|
1473 | *
|
---|
1474 | * 1.6.3 Return value
|
---|
1475 | *
|
---|
1476 | * None.
|
---|
1477 | *
|
---|
1478 | * 1.6.4 Caller's context
|
---|
1479 | *
|
---|
1480 | * Interrupts are disabled. The DTrace framework is in a state such that the
|
---|
1481 | * specified probe cannot be disabled or destroyed for the duration of
|
---|
1482 | * dtps_suspend(). As interrupts are disabled, the provider is afforded
|
---|
1483 | * little latitude; the provider is expected to do no more than a store to
|
---|
1484 | * memory.
|
---|
1485 | *
|
---|
1486 | * 1.7 void dtps_resume(void *arg, dtrace_id_t id, void *parg)
|
---|
1487 | *
|
---|
1488 | * 1.7.1 Overview
|
---|
1489 | *
|
---|
1490 | * Called to resume the specified enabled probe. This entry point is for
|
---|
1491 | * providers that may need to resume some or all of their probes after the
|
---|
1492 | * completion of an event that induced a call to dtps_suspend().
|
---|
1493 | *
|
---|
1494 | * 1.7.2 Arguments and notes
|
---|
1495 | *
|
---|
1496 | * The first argument is the cookie as passed to dtrace_register(). The
|
---|
1497 | * second argument is the identifier of the probe to be resumed. The
|
---|
1498 | * third argument is the probe argument as passed to dtrace_probe_create().
|
---|
1499 | * dtps_resume will only be called on an enabled probe. Providers that
|
---|
1500 | * provide a dtps_resume entry point will want to take roughly the action
|
---|
1501 | * that it takes for dtps_enable.
|
---|
1502 | *
|
---|
1503 | * 1.7.3 Return value
|
---|
1504 | *
|
---|
1505 | * None.
|
---|
1506 | *
|
---|
1507 | * 1.7.4 Caller's context
|
---|
1508 | *
|
---|
1509 | * Interrupts are disabled. The DTrace framework is in a state such that the
|
---|
1510 | * specified probe cannot be disabled or destroyed for the duration of
|
---|
1511 | * dtps_resume(). As interrupts are disabled, the provider is afforded
|
---|
1512 | * little latitude; the provider is expected to do no more than a store to
|
---|
1513 | * memory.
|
---|
1514 | *
|
---|
1515 | * 1.8 void dtps_getargdesc(void *arg, dtrace_id_t id, void *parg,
|
---|
1516 | * dtrace_argdesc_t *desc)
|
---|
1517 | *
|
---|
1518 | * 1.8.1 Overview
|
---|
1519 | *
|
---|
1520 | * Called to retrieve the argument description for an args[X] variable.
|
---|
1521 | *
|
---|
1522 | * 1.8.2 Arguments and notes
|
---|
1523 | *
|
---|
1524 | * The first argument is the cookie as passed to dtrace_register(). The
|
---|
1525 | * second argument is the identifier of the current probe. The third
|
---|
1526 | * argument is the probe argument as passed to dtrace_probe_create(). The
|
---|
1527 | * fourth argument is a pointer to the argument description. This
|
---|
1528 | * description is both an input and output parameter: it contains the
|
---|
1529 | * index of the desired argument in the dtargd_ndx field, and expects
|
---|
1530 | * the other fields to be filled in upon return. If there is no argument
|
---|
1531 | * corresponding to the specified index, the dtargd_ndx field should be set
|
---|
1532 | * to DTRACE_ARGNONE.
|
---|
1533 | *
|
---|
1534 | * 1.8.3 Return value
|
---|
1535 | *
|
---|
1536 | * None. The dtargd_ndx, dtargd_native, dtargd_xlate and dtargd_mapping
|
---|
1537 | * members of the dtrace_argdesc_t structure are all output values.
|
---|
1538 | *
|
---|
1539 | * 1.8.4 Caller's context
|
---|
1540 | *
|
---|
1541 | * dtps_getargdesc() is called from ioctl() context. mod_lock is held, and
|
---|
1542 | * the DTrace framework is locked in such a way that providers may not
|
---|
1543 | * register or unregister. This means that the provider may not call any
|
---|
1544 | * DTrace API that affects its registration with the framework, including
|
---|
1545 | * dtrace_register(), dtrace_unregister(), dtrace_invalidate(), and
|
---|
1546 | * dtrace_condense().
|
---|
1547 | *
|
---|
1548 | * 1.9 uint64_t dtps_getargval(void *arg, dtrace_id_t id, void *parg,
|
---|
1549 | * int argno, int aframes)
|
---|
1550 | *
|
---|
1551 | * 1.9.1 Overview
|
---|
1552 | *
|
---|
1553 | * Called to retrieve a value for an argX or args[X] variable.
|
---|
1554 | *
|
---|
1555 | * 1.9.2 Arguments and notes
|
---|
1556 | *
|
---|
1557 | * The first argument is the cookie as passed to dtrace_register(). The
|
---|
1558 | * second argument is the identifier of the current probe. The third
|
---|
1559 | * argument is the probe argument as passed to dtrace_probe_create(). The
|
---|
1560 | * fourth argument is the number of the argument (the X in the example in
|
---|
1561 | * 1.9.1). The fifth argument is the number of stack frames that were used
|
---|
1562 | * to get from the actual place in the code that fired the probe to
|
---|
1563 | * dtrace_probe() itself, the so-called artificial frames. This argument may
|
---|
1564 | * be used to descend an appropriate number of frames to find the correct
|
---|
1565 | * values. If this entry point is left NULL, the dtrace_getarg() built-in
|
---|
1566 | * function is used.
|
---|
1567 | *
|
---|
1568 | * 1.9.3 Return value
|
---|
1569 | *
|
---|
1570 | * The value of the argument.
|
---|
1571 | *
|
---|
1572 | * 1.9.4 Caller's context
|
---|
1573 | *
|
---|
1574 | * This is called from within dtrace_probe() meaning that interrupts
|
---|
1575 | * are disabled. No locks should be taken within this entry point.
|
---|
1576 | *
|
---|
1577 | * 1.10 int dtps_usermode(void *arg, dtrace_id_t id, void *parg)
|
---|
1578 | *
|
---|
1579 | * 1.10.1 Overview
|
---|
1580 | *
|
---|
1581 | * Called to determine if the probe was fired in a user context.
|
---|
1582 | *
|
---|
1583 | * 1.10.2 Arguments and notes
|
---|
1584 | *
|
---|
1585 | * The first argument is the cookie as passed to dtrace_register(). The
|
---|
1586 | * second argument is the identifier of the current probe. The third
|
---|
1587 | * argument is the probe argument as passed to dtrace_probe_create(). This
|
---|
1588 | * entry point must not be left NULL for providers whose probes allow for
|
---|
1589 | * mixed mode tracing, that is to say those probes that can fire during
|
---|
1590 | * kernel- _or_ user-mode execution
|
---|
1591 | *
|
---|
1592 | * 1.10.3 Return value
|
---|
1593 | *
|
---|
1594 | * A boolean value.
|
---|
1595 | *
|
---|
1596 | * 1.10.4 Caller's context
|
---|
1597 | *
|
---|
1598 | * This is called from within dtrace_probe() meaning that interrupts
|
---|
1599 | * are disabled. No locks should be taken within this entry point.
|
---|
1600 | *
|
---|
1601 | * 1.11 void dtps_destroy(void *arg, dtrace_id_t id, void *parg)
|
---|
1602 | *
|
---|
1603 | * 1.11.1 Overview
|
---|
1604 | *
|
---|
1605 | * Called to destroy the specified probe.
|
---|
1606 | *
|
---|
1607 | * 1.11.2 Arguments and notes
|
---|
1608 | *
|
---|
1609 | * The first argument is the cookie as passed to dtrace_register(). The
|
---|
1610 | * second argument is the identifier of the probe to be destroyed. The third
|
---|
1611 | * argument is the probe argument as passed to dtrace_probe_create(). The
|
---|
1612 | * provider should free all state associated with the probe. The framework
|
---|
1613 | * guarantees that dtps_destroy() is only called for probes that have either
|
---|
1614 | * been disabled via dtps_disable() or were never enabled via dtps_enable().
|
---|
1615 | * Once dtps_disable() has been called for a probe, no further call will be
|
---|
1616 | * made specifying the probe.
|
---|
1617 | *
|
---|
1618 | * 1.11.3 Return value
|
---|
1619 | *
|
---|
1620 | * None.
|
---|
1621 | *
|
---|
1622 | * 1.11.4 Caller's context
|
---|
1623 | *
|
---|
1624 | * The DTrace framework is locked in such a way that it may not be called
|
---|
1625 | * back into at all. mod_lock is held. cpu_lock is not held, and may not be
|
---|
1626 | * acquired.
|
---|
1627 | *
|
---|
1628 | *
|
---|
1629 | * 2 Provider-to-Framework API
|
---|
1630 | *
|
---|
1631 | * 2.1 Overview
|
---|
1632 | *
|
---|
1633 | * The Provider-to-Framework API provides the mechanism for the provider to
|
---|
1634 | * register itself with the DTrace framework, to create probes, to lookup
|
---|
1635 | * probes and (most importantly) to fire probes. The Provider-to-Framework
|
---|
1636 | * consists of:
|
---|
1637 | *
|
---|
1638 | * dtrace_register() <-- Register a provider with the DTrace framework
|
---|
1639 | * dtrace_unregister() <-- Remove a provider's DTrace registration
|
---|
1640 | * dtrace_invalidate() <-- Invalidate the specified provider
|
---|
1641 | * dtrace_condense() <-- Remove a provider's unenabled probes
|
---|
1642 | * dtrace_attached() <-- Indicates whether or not DTrace has attached
|
---|
1643 | * dtrace_probe_create() <-- Create a DTrace probe
|
---|
1644 | * dtrace_probe_lookup() <-- Lookup a DTrace probe based on its name
|
---|
1645 | * dtrace_probe_arg() <-- Return the probe argument for a specific probe
|
---|
1646 | * dtrace_probe() <-- Fire the specified probe
|
---|
1647 | *
|
---|
1648 | * 2.2 int dtrace_register(const char *name, const dtrace_pattr_t *pap,
|
---|
1649 | * uint32_t priv, cred_t *cr, const dtrace_pops_t *pops, void *arg,
|
---|
1650 | * dtrace_provider_id_t *idp)
|
---|
1651 | *
|
---|
1652 | * 2.2.1 Overview
|
---|
1653 | *
|
---|
1654 | * dtrace_register() registers the calling provider with the DTrace
|
---|
1655 | * framework. It should generally be called by DTrace providers in their
|
---|
1656 | * attach(9E) entry point.
|
---|
1657 | *
|
---|
1658 | * 2.2.2 Arguments and Notes
|
---|
1659 | *
|
---|
1660 | * The first argument is the name of the provider. The second argument is a
|
---|
1661 | * pointer to the stability attributes for the provider. The third argument
|
---|
1662 | * is the privilege flags for the provider, and must be some combination of:
|
---|
1663 | *
|
---|
1664 | * DTRACE_PRIV_NONE <= All users may enable probes from this provider
|
---|
1665 | *
|
---|
1666 | * DTRACE_PRIV_PROC <= Any user with privilege of PRIV_DTRACE_PROC may
|
---|
1667 | * enable probes from this provider
|
---|
1668 | *
|
---|
1669 | * DTRACE_PRIV_USER <= Any user with privilege of PRIV_DTRACE_USER may
|
---|
1670 | * enable probes from this provider
|
---|
1671 | *
|
---|
1672 | * DTRACE_PRIV_KERNEL <= Any user with privilege of PRIV_DTRACE_KERNEL
|
---|
1673 | * may enable probes from this provider
|
---|
1674 | *
|
---|
1675 | * DTRACE_PRIV_OWNER <= This flag places an additional constraint on
|
---|
1676 | * the privilege requirements above. These probes
|
---|
1677 | * require either (a) a user ID matching the user
|
---|
1678 | * ID of the cred passed in the fourth argument
|
---|
1679 | * or (b) the PRIV_PROC_OWNER privilege.
|
---|
1680 | *
|
---|
1681 | * DTRACE_PRIV_ZONEOWNER<= This flag places an additional constraint on
|
---|
1682 | * the privilege requirements above. These probes
|
---|
1683 | * require either (a) a zone ID matching the zone
|
---|
1684 | * ID of the cred passed in the fourth argument
|
---|
1685 | * or (b) the PRIV_PROC_ZONE privilege.
|
---|
1686 | *
|
---|
1687 | * Note that these flags designate the _visibility_ of the probes, not
|
---|
1688 | * the conditions under which they may or may not fire.
|
---|
1689 | *
|
---|
1690 | * The fourth argument is the credential that is associated with the
|
---|
1691 | * provider. This argument should be NULL if the privilege flags don't
|
---|
1692 | * include DTRACE_PRIV_OWNER or DTRACE_PRIV_ZONEOWNER. If non-NULL, the
|
---|
1693 | * framework stashes the uid and zoneid represented by this credential
|
---|
1694 | * for use at probe-time, in implicit predicates. These limit visibility
|
---|
1695 | * of the probes to users and/or zones which have sufficient privilege to
|
---|
1696 | * access them.
|
---|
1697 | *
|
---|
1698 | * The fifth argument is a DTrace provider operations vector, which provides
|
---|
1699 | * the implementation for the Framework-to-Provider API. (See Section 1,
|
---|
1700 | * above.) This must be non-NULL, and each member must be non-NULL. The
|
---|
1701 | * exceptions to this are (1) the dtps_provide() and dtps_provide_module()
|
---|
1702 | * members (if the provider so desires, _one_ of these members may be left
|
---|
1703 | * NULL -- denoting that the provider only implements the other) and (2)
|
---|
1704 | * the dtps_suspend() and dtps_resume() members, which must either both be
|
---|
1705 | * NULL or both be non-NULL.
|
---|
1706 | *
|
---|
1707 | * The sixth argument is a cookie to be specified as the first argument for
|
---|
1708 | * each function in the Framework-to-Provider API. This argument may have
|
---|
1709 | * any value.
|
---|
1710 | *
|
---|
1711 | * The final argument is a pointer to dtrace_provider_id_t. If
|
---|
1712 | * dtrace_register() successfully completes, the provider identifier will be
|
---|
1713 | * stored in the memory pointed to be this argument. This argument must be
|
---|
1714 | * non-NULL.
|
---|
1715 | *
|
---|
1716 | * 2.2.3 Return value
|
---|
1717 | *
|
---|
1718 | * On success, dtrace_register() returns 0 and stores the new provider's
|
---|
1719 | * identifier into the memory pointed to by the idp argument. On failure,
|
---|
1720 | * dtrace_register() returns an errno:
|
---|
1721 | *
|
---|
1722 | * EINVAL The arguments passed to dtrace_register() were somehow invalid.
|
---|
1723 | * This may because a parameter that must be non-NULL was NULL,
|
---|
1724 | * because the name was invalid (either empty or an illegal
|
---|
1725 | * provider name) or because the attributes were invalid.
|
---|
1726 | *
|
---|
1727 | * No other failure code is returned.
|
---|
1728 | *
|
---|
1729 | * 2.2.4 Caller's context
|
---|
1730 | *
|
---|
1731 | * dtrace_register() may induce calls to dtrace_provide(); the provider must
|
---|
1732 | * hold no locks across dtrace_register() that may also be acquired by
|
---|
1733 | * dtrace_provide(). cpu_lock and mod_lock must not be held.
|
---|
1734 | *
|
---|
1735 | * 2.3 int dtrace_unregister(dtrace_provider_t id)
|
---|
1736 | *
|
---|
1737 | * 2.3.1 Overview
|
---|
1738 | *
|
---|
1739 | * Unregisters the specified provider from the DTrace framework. It should
|
---|
1740 | * generally be called by DTrace providers in their detach(9E) entry point.
|
---|
1741 | *
|
---|
1742 | * 2.3.2 Arguments and Notes
|
---|
1743 | *
|
---|
1744 | * The only argument is the provider identifier, as returned from a
|
---|
1745 | * successful call to dtrace_register(). As a result of calling
|
---|
1746 | * dtrace_unregister(), the DTrace framework will call back into the provider
|
---|
1747 | * via the dtps_destroy() entry point. Once dtrace_unregister() successfully
|
---|
1748 | * completes, however, the DTrace framework will no longer make calls through
|
---|
1749 | * the Framework-to-Provider API.
|
---|
1750 | *
|
---|
1751 | * 2.3.3 Return value
|
---|
1752 | *
|
---|
1753 | * On success, dtrace_unregister returns 0. On failure, dtrace_unregister()
|
---|
1754 | * returns an errno:
|
---|
1755 | *
|
---|
1756 | * EBUSY There are currently processes that have the DTrace pseudodevice
|
---|
1757 | * open, or there exists an anonymous enabling that hasn't yet
|
---|
1758 | * been claimed.
|
---|
1759 | *
|
---|
1760 | * No other failure code is returned.
|
---|
1761 | *
|
---|
1762 | * 2.3.4 Caller's context
|
---|
1763 | *
|
---|
1764 | * Because a call to dtrace_unregister() may induce calls through the
|
---|
1765 | * Framework-to-Provider API, the caller may not hold any lock across
|
---|
1766 | * dtrace_register() that is also acquired in any of the Framework-to-
|
---|
1767 | * Provider API functions. Additionally, mod_lock may not be held.
|
---|
1768 | *
|
---|
1769 | * 2.4 void dtrace_invalidate(dtrace_provider_id_t id)
|
---|
1770 | *
|
---|
1771 | * 2.4.1 Overview
|
---|
1772 | *
|
---|
1773 | * Invalidates the specified provider. All subsequent probe lookups for the
|
---|
1774 | * specified provider will fail, but its probes will not be removed.
|
---|
1775 | *
|
---|
1776 | * 2.4.2 Arguments and note
|
---|
1777 | *
|
---|
1778 | * The only argument is the provider identifier, as returned from a
|
---|
1779 | * successful call to dtrace_register(). In general, a provider's probes
|
---|
1780 | * always remain valid; dtrace_invalidate() is a mechanism for invalidating
|
---|
1781 | * an entire provider, regardless of whether or not probes are enabled or
|
---|
1782 | * not. Note that dtrace_invalidate() will _not_ prevent already enabled
|
---|
1783 | * probes from firing -- it will merely prevent any new enablings of the
|
---|
1784 | * provider's probes.
|
---|
1785 | *
|
---|
1786 | * 2.5 int dtrace_condense(dtrace_provider_id_t id)
|
---|
1787 | *
|
---|
1788 | * 2.5.1 Overview
|
---|
1789 | *
|
---|
1790 | * Removes all the unenabled probes for the given provider. This function is
|
---|
1791 | * not unlike dtrace_unregister(), except that it doesn't remove the
|
---|
1792 | * provider just as many of its associated probes as it can.
|
---|
1793 | *
|
---|
1794 | * 2.5.2 Arguments and Notes
|
---|
1795 | *
|
---|
1796 | * As with dtrace_unregister(), the sole argument is the provider identifier
|
---|
1797 | * as returned from a successful call to dtrace_register(). As a result of
|
---|
1798 | * calling dtrace_condense(), the DTrace framework will call back into the
|
---|
1799 | * given provider's dtps_destroy() entry point for each of the provider's
|
---|
1800 | * unenabled probes.
|
---|
1801 | *
|
---|
1802 | * 2.5.3 Return value
|
---|
1803 | *
|
---|
1804 | * Currently, dtrace_condense() always returns 0. However, consumers of this
|
---|
1805 | * function should check the return value as appropriate; its behavior may
|
---|
1806 | * change in the future.
|
---|
1807 | *
|
---|
1808 | * 2.5.4 Caller's context
|
---|
1809 | *
|
---|
1810 | * As with dtrace_unregister(), the caller may not hold any lock across
|
---|
1811 | * dtrace_condense() that is also acquired in the provider's entry points.
|
---|
1812 | * Also, mod_lock may not be held.
|
---|
1813 | *
|
---|
1814 | * 2.6 int dtrace_attached()
|
---|
1815 | *
|
---|
1816 | * 2.6.1 Overview
|
---|
1817 | *
|
---|
1818 | * Indicates whether or not DTrace has attached.
|
---|
1819 | *
|
---|
1820 | * 2.6.2 Arguments and Notes
|
---|
1821 | *
|
---|
1822 | * For most providers, DTrace makes initial contact beyond registration.
|
---|
1823 | * That is, once a provider has registered with DTrace, it waits to hear
|
---|
1824 | * from DTrace to create probes. However, some providers may wish to
|
---|
1825 | * proactively create probes without first being told by DTrace to do so.
|
---|
1826 | * If providers wish to do this, they must first call dtrace_attached() to
|
---|
1827 | * determine if DTrace itself has attached. If dtrace_attached() returns 0,
|
---|
1828 | * the provider must not make any other Provider-to-Framework API call.
|
---|
1829 | *
|
---|
1830 | * 2.6.3 Return value
|
---|
1831 | *
|
---|
1832 | * dtrace_attached() returns 1 if DTrace has attached, 0 otherwise.
|
---|
1833 | *
|
---|
1834 | * 2.7 int dtrace_probe_create(dtrace_provider_t id, const char *mod,
|
---|
1835 | * const char *func, const char *name, int aframes, void *arg)
|
---|
1836 | *
|
---|
1837 | * 2.7.1 Overview
|
---|
1838 | *
|
---|
1839 | * Creates a probe with specified module name, function name, and name.
|
---|
1840 | *
|
---|
1841 | * 2.7.2 Arguments and Notes
|
---|
1842 | *
|
---|
1843 | * The first argument is the provider identifier, as returned from a
|
---|
1844 | * successful call to dtrace_register(). The second, third, and fourth
|
---|
1845 | * arguments are the module name, function name, and probe name,
|
---|
1846 | * respectively. Of these, module name and function name may both be NULL
|
---|
1847 | * (in which case the probe is considered to be unanchored), or they may both
|
---|
1848 | * be non-NULL. The name must be non-NULL, and must point to a non-empty
|
---|
1849 | * string.
|
---|
1850 | *
|
---|
1851 | * The fifth argument is the number of artificial stack frames that will be
|
---|
1852 | * found on the stack when dtrace_probe() is called for the new probe. These
|
---|
1853 | * artificial frames will be automatically be pruned should the stack() or
|
---|
1854 | * stackdepth() functions be called as part of one of the probe's ECBs. If
|
---|
1855 | * the parameter doesn't add an artificial frame, this parameter should be
|
---|
1856 | * zero.
|
---|
1857 | *
|
---|
1858 | * The final argument is a probe argument that will be passed back to the
|
---|
1859 | * provider when a probe-specific operation is called. (e.g., via
|
---|
1860 | * dtps_enable(), dtps_disable(), etc.)
|
---|
1861 | *
|
---|
1862 | * Note that it is up to the provider to be sure that the probe that it
|
---|
1863 | * creates does not already exist -- if the provider is unsure of the probe's
|
---|
1864 | * existence, it should assure its absence with dtrace_probe_lookup() before
|
---|
1865 | * calling dtrace_probe_create().
|
---|
1866 | *
|
---|
1867 | * 2.7.3 Return value
|
---|
1868 | *
|
---|
1869 | * dtrace_probe_create() always succeeds, and always returns the identifier
|
---|
1870 | * of the newly-created probe.
|
---|
1871 | *
|
---|
1872 | * 2.7.4 Caller's context
|
---|
1873 | *
|
---|
1874 | * While dtrace_probe_create() is generally expected to be called from
|
---|
1875 | * dtps_provide() and/or dtps_provide_module(), it may be called from other
|
---|
1876 | * non-DTrace contexts. Neither cpu_lock nor mod_lock may be held.
|
---|
1877 | *
|
---|
1878 | * 2.8 dtrace_id_t dtrace_probe_lookup(dtrace_provider_t id, const char *mod,
|
---|
1879 | * const char *func, const char *name)
|
---|
1880 | *
|
---|
1881 | * 2.8.1 Overview
|
---|
1882 | *
|
---|
1883 | * Looks up a probe based on provdider and one or more of module name,
|
---|
1884 | * function name and probe name.
|
---|
1885 | *
|
---|
1886 | * 2.8.2 Arguments and Notes
|
---|
1887 | *
|
---|
1888 | * The first argument is the provider identifier, as returned from a
|
---|
1889 | * successful call to dtrace_register(). The second, third, and fourth
|
---|
1890 | * arguments are the module name, function name, and probe name,
|
---|
1891 | * respectively. Any of these may be NULL; dtrace_probe_lookup() will return
|
---|
1892 | * the identifier of the first probe that is provided by the specified
|
---|
1893 | * provider and matches all of the non-NULL matching criteria.
|
---|
1894 | * dtrace_probe_lookup() is generally used by a provider to be check the
|
---|
1895 | * existence of a probe before creating it with dtrace_probe_create().
|
---|
1896 | *
|
---|
1897 | * 2.8.3 Return value
|
---|
1898 | *
|
---|
1899 | * If the probe exists, returns its identifier. If the probe does not exist,
|
---|
1900 | * return DTRACE_IDNONE.
|
---|
1901 | *
|
---|
1902 | * 2.8.4 Caller's context
|
---|
1903 | *
|
---|
1904 | * While dtrace_probe_lookup() is generally expected to be called from
|
---|
1905 | * dtps_provide() and/or dtps_provide_module(), it may also be called from
|
---|
1906 | * other non-DTrace contexts. Neither cpu_lock nor mod_lock may be held.
|
---|
1907 | *
|
---|
1908 | * 2.9 void *dtrace_probe_arg(dtrace_provider_t id, dtrace_id_t probe)
|
---|
1909 | *
|
---|
1910 | * 2.9.1 Overview
|
---|
1911 | *
|
---|
1912 | * Returns the probe argument associated with the specified probe.
|
---|
1913 | *
|
---|
1914 | * 2.9.2 Arguments and Notes
|
---|
1915 | *
|
---|
1916 | * The first argument is the provider identifier, as returned from a
|
---|
1917 | * successful call to dtrace_register(). The second argument is a probe
|
---|
1918 | * identifier, as returned from dtrace_probe_lookup() or
|
---|
1919 | * dtrace_probe_create(). This is useful if a probe has multiple
|
---|
1920 | * provider-specific components to it: the provider can create the probe
|
---|
1921 | * once with provider-specific state, and then add to the state by looking
|
---|
1922 | * up the probe based on probe identifier.
|
---|
1923 | *
|
---|
1924 | * 2.9.3 Return value
|
---|
1925 | *
|
---|
1926 | * Returns the argument associated with the specified probe. If the
|
---|
1927 | * specified probe does not exist, or if the specified probe is not provided
|
---|
1928 | * by the specified provider, NULL is returned.
|
---|
1929 | *
|
---|
1930 | * 2.9.4 Caller's context
|
---|
1931 | *
|
---|
1932 | * While dtrace_probe_arg() is generally expected to be called from
|
---|
1933 | * dtps_provide() and/or dtps_provide_module(), it may also be called from
|
---|
1934 | * other non-DTrace contexts. Neither cpu_lock nor mod_lock may be held.
|
---|
1935 | *
|
---|
1936 | * 2.10 void dtrace_probe(dtrace_id_t probe, uintptr_t arg0, uintptr_t arg1,
|
---|
1937 | * uintptr_t arg2, uintptr_t arg3, uintptr_t arg4)
|
---|
1938 | *
|
---|
1939 | * 2.10.1 Overview
|
---|
1940 | *
|
---|
1941 | * The epicenter of DTrace: fires the specified probes with the specified
|
---|
1942 | * arguments.
|
---|
1943 | *
|
---|
1944 | * 2.10.2 Arguments and Notes
|
---|
1945 | *
|
---|
1946 | * The first argument is a probe identifier as returned by
|
---|
1947 | * dtrace_probe_create() or dtrace_probe_lookup(). The second through sixth
|
---|
1948 | * arguments are the values to which the D variables "arg0" through "arg4"
|
---|
1949 | * will be mapped.
|
---|
1950 | *
|
---|
1951 | * dtrace_probe() should be called whenever the specified probe has fired --
|
---|
1952 | * however the provider defines it.
|
---|
1953 | *
|
---|
1954 | * 2.10.3 Return value
|
---|
1955 | *
|
---|
1956 | * None.
|
---|
1957 | *
|
---|
1958 | * 2.10.4 Caller's context
|
---|
1959 | *
|
---|
1960 | * dtrace_probe() may be called in virtually any context: kernel, user,
|
---|
1961 | * interrupt, high-level interrupt, with arbitrary adaptive locks held, with
|
---|
1962 | * dispatcher locks held, with interrupts disabled, etc. The only latitude
|
---|
1963 | * that must be afforded to DTrace is the ability to make calls within
|
---|
1964 | * itself (and to its in-kernel subroutines) and the ability to access
|
---|
1965 | * arbitrary (but mapped) memory. On some platforms, this constrains
|
---|
1966 | * context. For example, on UltraSPARC, dtrace_probe() cannot be called
|
---|
1967 | * from any context in which TL is greater than zero. dtrace_probe() may
|
---|
1968 | * also not be called from any routine which may be called by dtrace_probe()
|
---|
1969 | * -- which includes functions in the DTrace framework and some in-kernel
|
---|
1970 | * DTrace subroutines. All such functions "dtrace_"; providers that
|
---|
1971 | * instrument the kernel arbitrarily should be sure to not instrument these
|
---|
1972 | * routines.
|
---|
1973 | */
|
---|
1974 | typedef struct dtrace_pops {
|
---|
1975 | void (*dtps_provide)(void *arg, const dtrace_probedesc_t *spec);
|
---|
1976 | void (*dtps_provide_module)(void *arg, struct modctl *mp);
|
---|
1977 | int (*dtps_enable)(void *arg, dtrace_id_t id, void *parg);
|
---|
1978 | void (*dtps_disable)(void *arg, dtrace_id_t id, void *parg);
|
---|
1979 | void (*dtps_suspend)(void *arg, dtrace_id_t id, void *parg);
|
---|
1980 | void (*dtps_resume)(void *arg, dtrace_id_t id, void *parg);
|
---|
1981 | void (*dtps_getargdesc)(void *arg, dtrace_id_t id, void *parg,
|
---|
1982 | dtrace_argdesc_t *desc);
|
---|
1983 | uint64_t (*dtps_getargval)(void *arg, dtrace_id_t id, void *parg,
|
---|
1984 | int argno, int aframes);
|
---|
1985 | int (*dtps_usermode)(void *arg, dtrace_id_t id, void *parg);
|
---|
1986 | void (*dtps_destroy)(void *arg, dtrace_id_t id, void *parg);
|
---|
1987 | } dtrace_pops_t;
|
---|
1988 |
|
---|
1989 | typedef uintptr_t dtrace_provider_id_t;
|
---|
1990 |
|
---|
1991 | extern int dtrace_register(const char *, const dtrace_pattr_t *, uint32_t,
|
---|
1992 | cred_t *, const dtrace_pops_t *, void *, dtrace_provider_id_t *);
|
---|
1993 | extern int dtrace_unregister(dtrace_provider_id_t);
|
---|
1994 | extern int dtrace_condense(dtrace_provider_id_t);
|
---|
1995 | extern void dtrace_invalidate(dtrace_provider_id_t);
|
---|
1996 | extern dtrace_id_t dtrace_probe_lookup(dtrace_provider_id_t, const char *,
|
---|
1997 | const char *, const char *);
|
---|
1998 | extern dtrace_id_t dtrace_probe_create(dtrace_provider_id_t, const char *,
|
---|
1999 | const char *, const char *, int, void *);
|
---|
2000 | extern void *dtrace_probe_arg(dtrace_provider_id_t, dtrace_id_t);
|
---|
2001 | extern void dtrace_probe(dtrace_id_t, uintptr_t arg0, uintptr_t arg1,
|
---|
2002 | uintptr_t arg2, uintptr_t arg3, uintptr_t arg4);
|
---|
2003 |
|
---|
2004 | /*
|
---|
2005 | * DTrace Meta Provider API
|
---|
2006 | *
|
---|
2007 | * The following functions are implemented by the DTrace framework and are
|
---|
2008 | * used to implement meta providers. Meta providers plug into the DTrace
|
---|
2009 | * framework and are used to instantiate new providers on the fly. At
|
---|
2010 | * present, there is only one type of meta provider and only one meta
|
---|
2011 | * provider may be registered with the DTrace framework at a time. The
|
---|
2012 | * sole meta provider type provides user-land static tracing facilities
|
---|
2013 | * by taking meta probe descriptions and adding a corresponding provider
|
---|
2014 | * into the DTrace framework.
|
---|
2015 | *
|
---|
2016 | * 1 Framework-to-Provider
|
---|
2017 | *
|
---|
2018 | * 1.1 Overview
|
---|
2019 | *
|
---|
2020 | * The Framework-to-Provider API is represented by the dtrace_mops structure
|
---|
2021 | * that the meta provider passes to the framework when registering itself as
|
---|
2022 | * a meta provider. This structure consists of the following members:
|
---|
2023 | *
|
---|
2024 | * dtms_create_probe() <-- Add a new probe to a created provider
|
---|
2025 | * dtms_provide_pid() <-- Create a new provider for a given process
|
---|
2026 | * dtms_remove_pid() <-- Remove a previously created provider
|
---|
2027 | *
|
---|
2028 | * 1.2 void dtms_create_probe(void *arg, void *parg,
|
---|
2029 | * dtrace_helper_probedesc_t *probedesc);
|
---|
2030 | *
|
---|
2031 | * 1.2.1 Overview
|
---|
2032 | *
|
---|
2033 | * Called by the DTrace framework to create a new probe in a provider
|
---|
2034 | * created by this meta provider.
|
---|
2035 | *
|
---|
2036 | * 1.2.2 Arguments and notes
|
---|
2037 | *
|
---|
2038 | * The first argument is the cookie as passed to dtrace_meta_register().
|
---|
2039 | * The second argument is the provider cookie for the associated provider;
|
---|
2040 | * this is obtained from the return value of dtms_provide_pid(). The third
|
---|
2041 | * argument is the helper probe description.
|
---|
2042 | *
|
---|
2043 | * 1.2.3 Return value
|
---|
2044 | *
|
---|
2045 | * None
|
---|
2046 | *
|
---|
2047 | * 1.2.4 Caller's context
|
---|
2048 | *
|
---|
2049 | * dtms_create_probe() is called from either ioctl() or module load context.
|
---|
2050 | * The DTrace framework is locked in such a way that meta providers may not
|
---|
2051 | * register or unregister. This means that the meta provider cannot call
|
---|
2052 | * dtrace_meta_register() or dtrace_meta_unregister(). However, the context is
|
---|
2053 | * such that the provider may (and is expected to) call provider-related
|
---|
2054 | * DTrace provider APIs including dtrace_probe_create().
|
---|
2055 | *
|
---|
2056 | * 1.3 void *dtms_provide_pid(void *arg, dtrace_meta_provider_t *mprov,
|
---|
2057 | * pid_t pid)
|
---|
2058 | *
|
---|
2059 | * 1.3.1 Overview
|
---|
2060 | *
|
---|
2061 | * Called by the DTrace framework to instantiate a new provider given the
|
---|
2062 | * description of the provider and probes in the mprov argument. The
|
---|
2063 | * meta provider should call dtrace_register() to insert the new provider
|
---|
2064 | * into the DTrace framework.
|
---|
2065 | *
|
---|
2066 | * 1.3.2 Arguments and notes
|
---|
2067 | *
|
---|
2068 | * The first argument is the cookie as passed to dtrace_meta_register().
|
---|
2069 | * The second argument is a pointer to a structure describing the new
|
---|
2070 | * helper provider. The third argument is the process identifier for
|
---|
2071 | * process associated with this new provider. Note that the name of the
|
---|
2072 | * provider as passed to dtrace_register() should be the contatenation of
|
---|
2073 | * the dtmpb_provname member of the mprov argument and the processs
|
---|
2074 | * identifier as a string.
|
---|
2075 | *
|
---|
2076 | * 1.3.3 Return value
|
---|
2077 | *
|
---|
2078 | * The cookie for the provider that the meta provider creates. This is
|
---|
2079 | * the same value that it passed to dtrace_register().
|
---|
2080 | *
|
---|
2081 | * 1.3.4 Caller's context
|
---|
2082 | *
|
---|
2083 | * dtms_provide_pid() is called from either ioctl() or module load context.
|
---|
2084 | * The DTrace framework is locked in such a way that meta providers may not
|
---|
2085 | * register or unregister. This means that the meta provider cannot call
|
---|
2086 | * dtrace_meta_register() or dtrace_meta_unregister(). However, the context
|
---|
2087 | * is such that the provider may -- and is expected to -- call
|
---|
2088 | * provider-related DTrace provider APIs including dtrace_register().
|
---|
2089 | *
|
---|
2090 | * 1.4 void dtms_remove_pid(void *arg, dtrace_meta_provider_t *mprov,
|
---|
2091 | * pid_t pid)
|
---|
2092 | *
|
---|
2093 | * 1.4.1 Overview
|
---|
2094 | *
|
---|
2095 | * Called by the DTrace framework to remove a provider that had previously
|
---|
2096 | * been instantiated via the dtms_provide_pid() entry point. The meta
|
---|
2097 | * provider need not remove the provider immediately, but this entry
|
---|
2098 | * point indicates that the provider should be removed as soon as possible
|
---|
2099 | * using the dtrace_unregister() API.
|
---|
2100 | *
|
---|
2101 | * 1.4.2 Arguments and notes
|
---|
2102 | *
|
---|
2103 | * The first argument is the cookie as passed to dtrace_meta_register().
|
---|
2104 | * The second argument is a pointer to a structure describing the helper
|
---|
2105 | * provider. The third argument is the process identifier for process
|
---|
2106 | * associated with this new provider.
|
---|
2107 | *
|
---|
2108 | * 1.4.3 Return value
|
---|
2109 | *
|
---|
2110 | * None
|
---|
2111 | *
|
---|
2112 | * 1.4.4 Caller's context
|
---|
2113 | *
|
---|
2114 | * dtms_remove_pid() is called from either ioctl() or exit() context.
|
---|
2115 | * The DTrace framework is locked in such a way that meta providers may not
|
---|
2116 | * register or unregister. This means that the meta provider cannot call
|
---|
2117 | * dtrace_meta_register() or dtrace_meta_unregister(). However, the context
|
---|
2118 | * is such that the provider may -- and is expected to -- call
|
---|
2119 | * provider-related DTrace provider APIs including dtrace_unregister().
|
---|
2120 | */
|
---|
2121 | typedef struct dtrace_helper_probedesc {
|
---|
2122 | char *dthpb_mod; /* probe module */
|
---|
2123 | char *dthpb_func; /* probe function */
|
---|
2124 | char *dthpb_name; /* probe name */
|
---|
2125 | uint64_t dthpb_base; /* base address */
|
---|
2126 | uint32_t *dthpb_offs; /* offsets array */
|
---|
2127 | uint32_t *dthpb_enoffs; /* is-enabled offsets array */
|
---|
2128 | uint32_t dthpb_noffs; /* offsets count */
|
---|
2129 | uint32_t dthpb_nenoffs; /* is-enabled offsets count */
|
---|
2130 | uint8_t *dthpb_args; /* argument mapping array */
|
---|
2131 | uint8_t dthpb_xargc; /* translated argument count */
|
---|
2132 | uint8_t dthpb_nargc; /* native argument count */
|
---|
2133 | char *dthpb_xtypes; /* translated types strings */
|
---|
2134 | char *dthpb_ntypes; /* native types strings */
|
---|
2135 | } dtrace_helper_probedesc_t;
|
---|
2136 |
|
---|
2137 | typedef struct dtrace_helper_provdesc {
|
---|
2138 | char *dthpv_provname; /* provider name */
|
---|
2139 | dtrace_pattr_t dthpv_pattr; /* stability attributes */
|
---|
2140 | } dtrace_helper_provdesc_t;
|
---|
2141 |
|
---|
2142 | typedef struct dtrace_mops {
|
---|
2143 | void (*dtms_create_probe)(void *, void *, dtrace_helper_probedesc_t *);
|
---|
2144 | void *(*dtms_provide_pid)(void *, dtrace_helper_provdesc_t *, pid_t);
|
---|
2145 | void (*dtms_remove_pid)(void *, dtrace_helper_provdesc_t *, pid_t);
|
---|
2146 | } dtrace_mops_t;
|
---|
2147 |
|
---|
2148 | typedef uintptr_t dtrace_meta_provider_id_t;
|
---|
2149 |
|
---|
2150 | extern int dtrace_meta_register(const char *, const dtrace_mops_t *, void *,
|
---|
2151 | dtrace_meta_provider_id_t *);
|
---|
2152 | extern int dtrace_meta_unregister(dtrace_meta_provider_id_t);
|
---|
2153 |
|
---|
2154 | /*
|
---|
2155 | * DTrace Kernel Hooks
|
---|
2156 | *
|
---|
2157 | * The following functions are implemented by the base kernel and form a set of
|
---|
2158 | * hooks used by the DTrace framework. DTrace hooks are implemented in either
|
---|
2159 | * uts/common/os/dtrace_subr.c, an ISA-specific assembly file, or in a
|
---|
2160 | * uts/<platform>/os/dtrace_subr.c corresponding to each hardware platform.
|
---|
2161 | */
|
---|
2162 |
|
---|
2163 | typedef enum dtrace_vtime_state {
|
---|
2164 | DTRACE_VTIME_INACTIVE = 0, /* No DTrace, no TNF */
|
---|
2165 | DTRACE_VTIME_ACTIVE, /* DTrace virtual time, no TNF */
|
---|
2166 | DTRACE_VTIME_INACTIVE_TNF, /* No DTrace, TNF active */
|
---|
2167 | DTRACE_VTIME_ACTIVE_TNF /* DTrace virtual time _and_ TNF */
|
---|
2168 | } dtrace_vtime_state_t;
|
---|
2169 |
|
---|
2170 | extern dtrace_vtime_state_t dtrace_vtime_active;
|
---|
2171 | extern void dtrace_vtime_switch(kthread_t *next);
|
---|
2172 | extern void dtrace_vtime_enable_tnf(void);
|
---|
2173 | extern void dtrace_vtime_disable_tnf(void);
|
---|
2174 | extern void dtrace_vtime_enable(void);
|
---|
2175 | extern void dtrace_vtime_disable(void);
|
---|
2176 |
|
---|
2177 | struct regs;
|
---|
2178 |
|
---|
2179 | extern int (*dtrace_pid_probe_ptr)(struct regs *);
|
---|
2180 | extern int (*dtrace_return_probe_ptr)(struct regs *);
|
---|
2181 | extern void (*dtrace_fasttrap_fork_ptr)(proc_t *, proc_t *);
|
---|
2182 | extern void (*dtrace_fasttrap_exec_ptr)(proc_t *);
|
---|
2183 | extern void (*dtrace_fasttrap_exit_ptr)(proc_t *);
|
---|
2184 | extern void dtrace_fasttrap_fork(proc_t *, proc_t *);
|
---|
2185 |
|
---|
2186 | typedef uintptr_t dtrace_icookie_t;
|
---|
2187 | typedef void (*dtrace_xcall_t)(void *);
|
---|
2188 |
|
---|
2189 | extern dtrace_icookie_t dtrace_interrupt_disable(void);
|
---|
2190 | extern void dtrace_interrupt_enable(dtrace_icookie_t);
|
---|
2191 |
|
---|
2192 | extern void dtrace_membar_producer(void);
|
---|
2193 | extern void dtrace_membar_consumer(void);
|
---|
2194 |
|
---|
2195 | extern void (*dtrace_cpu_init)(processorid_t);
|
---|
2196 | extern void (*dtrace_modload)(struct modctl *);
|
---|
2197 | extern void (*dtrace_modunload)(struct modctl *);
|
---|
2198 | extern void (*dtrace_helpers_cleanup)();
|
---|
2199 | extern void (*dtrace_helpers_fork)(proc_t *parent, proc_t *child);
|
---|
2200 | extern void (*dtrace_cpustart_init)();
|
---|
2201 | extern void (*dtrace_cpustart_fini)();
|
---|
2202 |
|
---|
2203 | extern void (*dtrace_debugger_init)();
|
---|
2204 | extern void (*dtrace_debugger_fini)();
|
---|
2205 | extern dtrace_cacheid_t dtrace_predcache_id;
|
---|
2206 |
|
---|
2207 | extern hrtime_t dtrace_gethrtime(void);
|
---|
2208 | extern void dtrace_sync(void);
|
---|
2209 | extern void dtrace_toxic_ranges(void (*)(uintptr_t, uintptr_t));
|
---|
2210 | extern void dtrace_xcall(processorid_t, dtrace_xcall_t, void *);
|
---|
2211 | #ifdef VBOX
|
---|
2212 | extern void dtrace_vpanic(const char *, va_list);
|
---|
2213 | #else
|
---|
2214 | extern void dtrace_vpanic(const char *, __va_list);
|
---|
2215 | #endif
|
---|
2216 | extern void dtrace_panic(const char *, ...);
|
---|
2217 |
|
---|
2218 | extern int dtrace_safe_defer_signal(void);
|
---|
2219 | extern void dtrace_safe_synchronous_signal(void);
|
---|
2220 |
|
---|
2221 | extern int dtrace_mach_aframes(void);
|
---|
2222 |
|
---|
2223 | #if defined(__i386) || defined(__amd64)
|
---|
2224 | extern int dtrace_instr_size(uchar_t *instr);
|
---|
2225 | extern int dtrace_instr_size_isa(uchar_t *, model_t, int *);
|
---|
2226 | extern void dtrace_invop_add(int (*)(uintptr_t, uintptr_t *, uintptr_t));
|
---|
2227 | extern void dtrace_invop_remove(int (*)(uintptr_t, uintptr_t *, uintptr_t));
|
---|
2228 | extern void dtrace_invop_callsite(void);
|
---|
2229 | #endif
|
---|
2230 |
|
---|
2231 | #ifdef __sparc
|
---|
2232 | extern int dtrace_blksuword32(uintptr_t, uint32_t *, int);
|
---|
2233 | extern void dtrace_getfsr(uint64_t *);
|
---|
2234 | #endif
|
---|
2235 |
|
---|
2236 | #ifndef VBOX
|
---|
2237 | # define VBDT_GET_CPUID() (CPU->cpu_id)
|
---|
2238 | #else
|
---|
2239 | # define VBDT_GET_CPUID() (RTMpCpuId())
|
---|
2240 | #endif
|
---|
2241 |
|
---|
2242 |
|
---|
2243 | #define DTRACE_CPUFLAG_ISSET(flag) \
|
---|
2244 | (cpu_core[VBDT_GET_CPUID()].cpuc_dtrace_flags & (flag))
|
---|
2245 |
|
---|
2246 | #define DTRACE_CPUFLAG_SET(flag) \
|
---|
2247 | (cpu_core[VBDT_GET_CPUID()].cpuc_dtrace_flags |= (flag))
|
---|
2248 |
|
---|
2249 | #define DTRACE_CPUFLAG_CLEAR(flag) \
|
---|
2250 | (cpu_core[VBDT_GET_CPUID()].cpuc_dtrace_flags &= ~(flag))
|
---|
2251 |
|
---|
2252 | #endif /* _KERNEL || IN_RING0 */
|
---|
2253 |
|
---|
2254 | #endif /* _ASM */
|
---|
2255 |
|
---|
2256 | #if defined(__i386) || defined(__amd64)
|
---|
2257 |
|
---|
2258 | #define DTRACE_INVOP_PUSHL_EBP 1
|
---|
2259 | #define DTRACE_INVOP_POPL_EBP 2
|
---|
2260 | #define DTRACE_INVOP_LEAVE 3
|
---|
2261 | #define DTRACE_INVOP_NOP 4
|
---|
2262 | #define DTRACE_INVOP_RET 5
|
---|
2263 |
|
---|
2264 | #endif
|
---|
2265 |
|
---|
2266 | #ifdef __cplusplus
|
---|
2267 | }
|
---|
2268 | #endif
|
---|
2269 |
|
---|
2270 | #endif /* _SYS_DTRACE_H */
|
---|