xref: /netbsd-src/sys/sys/sdt.h (revision b51f985d73ff6f97b5d62ffeda3a82ca3691c511)
1 /*	$NetBSD: sdt.h,v 1.24 2024/06/29 13:03:02 riastradh Exp $	*/
2 
3 /*-
4  * Copyright 2006-2008 John Birrell <jb@FreeBSD.org>
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25  * SUCH DAMAGE.
26  *
27  * $FreeBSD: head/sys/sys/sdt.h 270990 2014-09-02 23:43:06Z markj $
28  *
29  * Statically Defined Tracing (SDT) definitions.
30  *
31  */
32 
33 #ifndef _SYS_SDT_H
34 #define	_SYS_SDT_H
35 
36 #ifndef _KERNEL
37 
38 #define	_DTRACE_VERSION	1
39 
40 #define SDT_PROVIDER_DEFINE(prov)
41 #define SDT_PROVIDER_DECLARE(prov)
42 
43 #define	DTRACE_PROBE(prov, name) do {				\
44 	extern void __dtrace_##prov##___##name(void);		\
45 	__dtrace_##prov##___##name();				\
46 } while (0)
47 
48 #define	DTRACE_PROBE1(prov, name, arg1) do {			\
49 	extern void __dtrace_##prov##___##name(unsigned long);	\
50 	__dtrace_##prov##___##name((unsigned long)(arg1));	\
51 } while (0)
52 
53 #define	DTRACE_PROBE2(prov, name, arg1, arg2) do {		\
54 	extern void __dtrace_##prov##___##name(unsigned long,	\
55 	    unsigned long);					\
56 	__dtrace_##prov##___##name((unsigned long)(arg1),	\
57 	    (unsigned long)(arg2));				\
58 } while (0)
59 
60 #define	DTRACE_PROBE3(prov, name, arg1, arg2, arg3) do {	\
61 	extern void __dtrace_##prov##___##name(unsigned long,	\
62 	    unsigned long, unsigned long);			\
63 	__dtrace_##prov##___##name((unsigned long)(arg1),	\
64 	    (unsigned long)(arg2), (unsigned long)(arg3));	\
65 } while (0)
66 
67 #define	DTRACE_PROBE4(prov, name, arg1, arg2, arg3, arg4) do {	\
68 	extern void __dtrace_##prov##___##name(unsigned long,	\
69 	    unsigned long, unsigned long, unsigned long);	\
70 	__dtrace_##prov##___##name((unsigned long)(arg1),	\
71 	    (unsigned long)(arg2), (unsigned long)(arg3),	\
72 	    (unsigned long)(arg4));				\
73 } while (0)
74 
75 #define	DTRACE_PROBE5(prov, name, arg1, arg2, arg3, arg4, arg5) do {	\
76 	extern void __dtrace_##prov##___##name(unsigned long,		\
77 	    unsigned long, unsigned long, unsigned long, unsigned long);\
78 	__dtrace_##prov##___##name((unsigned long)(arg1),		\
79 	    (unsigned long)(arg2), (unsigned long)(arg3),		\
80 	    (unsigned long)(arg4), (unsigned long)(arg5));		\
81 } while (0)
82 
83 #else /* _KERNEL */
84 
85 #include <sys/types.h>
86 #include <sys/cdefs.h>
87 #include <sys/queue.h>
88 
89 #ifdef _KERNEL_OPT
90 #include "opt_dtrace.h"
91 #endif
92 
93 #ifndef KDTRACE_HOOKS
94 
95 #define SDT_PROVIDER_DEFINE(prov)
96 #define SDT_PROVIDER_DECLARE(prov)
97 #define SDT_PROBE_DEFINE(prov, mod, func, name)
98 #define SDT_PROBE_DECLARE(prov, mod, func, name)
99 #define SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4)	do    \
100 {									      \
101 	__MACROUSE((uintptr_t)(arg0));					      \
102 	__MACROUSE((uintptr_t)(arg1));					      \
103 	__MACROUSE((uintptr_t)(arg2));					      \
104 	__MACROUSE((uintptr_t)(arg3));					      \
105 	__MACROUSE((uintptr_t)(arg4));					      \
106 } while (0)
107 #define SDT_PROBE_ARGTYPE(prov, mod, func, name, num, type, xtype)
108 
109 #define	SDT_PROBE_DEFINE0(prov, mod, func, name)
110 #define	SDT_PROBE_DEFINE1(prov, mod, func, name, arg0)
111 #define	SDT_PROBE_DEFINE2(prov, mod, func, name, arg0, arg1)
112 #define	SDT_PROBE_DEFINE3(prov, mod, func, name, arg0, arg1, arg2)
113 #define	SDT_PROBE_DEFINE4(prov, mod, func, name, arg0, arg1, arg2, arg3)
114 #define	SDT_PROBE_DEFINE5(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4)
115 #define	SDT_PROBE_DEFINE6(prov, mod, func, name, arg0, arg1, arg2,      \
116     arg3, arg4, arg5)
117 #define	SDT_PROBE_DEFINE7(prov, mod, func, name, arg0, arg1, arg2,      \
118     arg3, arg4, arg5, arg6)
119 
120 #define	SDT_PROBE0(prov, mod, func, name)				      \
121 	__nothing
122 #define	SDT_PROBE1(prov, mod, func, name, arg0)				      \
123 	__MACROUSE((uintptr_t)(arg0))
124 #define	SDT_PROBE2(prov, mod, func, name, arg0, arg1)	do		      \
125 {									      \
126 	__MACROUSE((uintptr_t)(arg0)); __MACROUSE((uintptr_t)(arg1));	      \
127 } while (0)
128 #define	SDT_PROBE3(prov, mod, func, name, arg0, arg1, arg2)	do	      \
129 {									      \
130 	__MACROUSE((uintptr_t)(arg0)); __MACROUSE((uintptr_t)(arg1));	      \
131 	__MACROUSE((uintptr_t)(arg2));					      \
132 } while (0)
133 #define	SDT_PROBE4(prov, mod, func, name, arg0, arg1, arg2, arg3)	do    \
134 {									      \
135 	__MACROUSE((uintptr_t)(arg0)); __MACROUSE((uintptr_t)(arg1));	      \
136 	__MACROUSE((uintptr_t)(arg2)); __MACROUSE((uintptr_t)(arg3));	      \
137 } while (0)
138 #define	SDT_PROBE5(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4)	do    \
139 {									      \
140 	__MACROUSE((uintptr_t)(arg0)); __MACROUSE((uintptr_t)(arg1));	      \
141 	__MACROUSE((uintptr_t)(arg2)); __MACROUSE((uintptr_t)(arg3));	      \
142 	__MACROUSE((uintptr_t)(arg4));					      \
143 } while (0)
144 #define	SDT_PROBE6(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4,	      \
145     arg5)	do							      \
146 {									      \
147 	__MACROUSE((uintptr_t)(arg0)); __MACROUSE((uintptr_t)(arg1));	      \
148 	__MACROUSE((uintptr_t)(arg2)); __MACROUSE((uintptr_t)(arg3));	      \
149 	__MACROUSE((uintptr_t)(arg4)); __MACROUSE((uintptr_t)(arg5));	      \
150 } while (0)
151 #define	SDT_PROBE7(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4,	      \
152     arg5, arg6)	do							      \
153 {									      \
154 	__MACROUSE((uintptr_t)(arg0)); __MACROUSE((uintptr_t)(arg1));	      \
155 	__MACROUSE((uintptr_t)(arg2)); __MACROUSE((uintptr_t)(arg3));	      \
156 	__MACROUSE((uintptr_t)(arg4)); __MACROUSE((uintptr_t)(arg5));	      \
157 	__MACROUSE((uintptr_t)(arg6));					      \
158 } while (0)
159 
160 #define	SDT_PROBE_DEFINE0_XLATE(prov, mod, func, name)
161 #define	SDT_PROBE_DEFINE1_XLATE(prov, mod, func, name, arg0, xarg0)
162 #define	SDT_PROBE_DEFINE2_XLATE(prov, mod, func, name, arg0, xarg0,     \
163     arg1, xarg1)
164 #define	SDT_PROBE_DEFINE3_XLATE(prov, mod, func, name, arg0, xarg0,     \
165     arg1, xarg1, arg2, xarg2)
166 #define SDT_PROBE_DEFINE4_XLATE(prov, mod, func, name, arg0, xarg0,     \
167     arg1, xarg1, arg2, xarg2, arg3, xarg3)
168 #define	SDT_PROBE_DEFINE5_XLATE(prov, mod, func, name, arg0, xarg0,     \
169     arg1, xarg1, arg2, xarg2, arg3, xarg3, arg4, xarg4)
170 #define	SDT_PROBE_DEFINE6_XLATE(prov, mod, func, name, arg0, xarg0,     \
171     arg1,  xarg1, arg2, xarg2, arg3, xarg3, arg4, xarg4, arg5, xarg5)
172 #define	SDT_PROBE_DEFINE7_XLATE(prov, mod, func, name, arg0, xarg0,	      \
173     arg1, xarg1, arg2, xarg2, arg3, xarg3, arg4, xarg4, arg5, xarg5, arg6,    \
174     xarg6)
175 
176 #define	DTRACE_PROBE(name)						      \
177 	__nothing
178 #define	DTRACE_PROBE1(name, type0, arg0)				      \
179 	__MACROUSE((uintptr_t)(arg0))
180 #define	DTRACE_PROBE2(name, type0, arg0, type1, arg1)	do		      \
181 {									      \
182 	__MACROUSE((uintptr_t)(arg0)); __MACROUSE((uintptr_t)(arg1));	      \
183 } while (0)
184 #define	DTRACE_PROBE3(name, type0, arg0, type1, arg1, type2, arg2)	do    \
185 {									      \
186 	__MACROUSE((uintptr_t)(arg0)); __MACROUSE((uintptr_t)(arg1));	      \
187 	__MACROUSE((uintptr_t)(arg2));					      \
188 } while (0)
189 #define	DTRACE_PROBE4(name, type0, arg0, type1, arg1, type2, arg2, type3,     \
190     arg3)	do							      \
191 {									      \
192 	__MACROUSE((uintptr_t)(arg0)); __MACROUSE((uintptr_t)(arg1));	      \
193 	__MACROUSE((uintptr_t)(arg2)); __MACROUSE((uintptr_t)(arg3));	      \
194 } while (0)
195 #define	DTRACE_PROBE5(name, type0, arg0, type1, arg1, type2, arg2, type3,     \
196     arg3, type4, arg4)	do						      \
197 {									      \
198 	__MACROUSE((uintptr_t)(arg0)); __MACROUSE((uintptr_t)(arg1));	      \
199 	__MACROUSE((uintptr_t)(arg2)); __MACROUSE((uintptr_t)(arg3));	      \
200 	__MACROUSE((uintptr_t)(arg4));					      \
201 } while (0)
202 
203 #else
204 
205 #define SDT_PROVIDER_DEFINE(prov)					      \
206 	struct sdt_provider sdt_provider_##prov[1] = {			      \
207 		{ #prov, { NULL, NULL }, 0, 0 }				      \
208 	};								      \
209 	__link_set_add_data(sdt_providers_set, sdt_provider_##prov);
210 
211 #define SDT_PROVIDER_DECLARE(prov)					      \
212 	extern struct sdt_provider sdt_provider_##prov[1]
213 
214 #define SDT_PROBE_DEFINE(prov, mod, func, name)				      \
215 	struct sdt_probe sdt_##prov##_##mod##_##func##_##name[1] = {	      \
216 		{							      \
217 			sizeof(struct sdt_probe), sdt_provider_##prov,	      \
218 			{ NULL, NULL }, { NULL, NULL },			      \
219 			#mod, #func, #name, 0, 0,			      \
220 			NULL,						      \
221 		}							      \
222 	};								      \
223 	__link_set_add_data(sdt_probes_set,				      \
224 	    sdt_##prov##_##mod##_##func##_##name);
225 
226 #define SDT_PROBE_DECLARE(prov, mod, func, name)			      \
227 	extern struct sdt_probe sdt_##prov##_##mod##_##func##_##name[1]
228 
229 #define SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4)	      \
230 	(__predict_false(sdt_##prov##_##mod##_##func##_##name->id)	      \
231 	    ? (*sdt_probe_func)(sdt_##prov##_##mod##_##func##_##name->id,     \
232 		(uintptr_t)(arg0), (uintptr_t)(arg1), (uintptr_t)(arg2),      \
233 		(uintptr_t)(arg3), (uintptr_t)(arg4))			      \
234 	    : 0)
235 
236 #define SDT_PROBE_ARGTYPE(prov, mod, func, name, num, type, xtype)	      \
237 	static struct sdt_argtype sdta_##prov##_##mod##_##func##_##name##num[1]\
238 	= {								      \
239 		{							      \
240 			num, type, xtype, { NULL, NULL },		      \
241 			sdt_##prov##_##mod##_##func##_##name,		      \
242 		}							      \
243 	};								      \
244 	__link_set_add_data(sdt_argtypes_set,				      \
245 		sdta_##prov##_##mod##_##func##_##name##num);
246 
247 #define	SDT_PROBE_DEFINE0(prov, mod, func, name)			\
248 	SDT_PROBE_DEFINE(prov, mod, func, name)
249 
250 #define	SDT_PROBE_DEFINE1(prov, mod, func, name, arg0)			\
251 	SDT_PROBE_DEFINE(prov, mod, func, name);			\
252 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL)
253 
254 #define	SDT_PROBE_DEFINE2(prov, mod, func, name, arg0, arg1)		\
255 	SDT_PROBE_DEFINE(prov, mod, func, name);			\
256 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL);	\
257 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL)
258 
259 #define	SDT_PROBE_DEFINE3(prov, mod, func, name, arg0, arg1, arg2)\
260 	SDT_PROBE_DEFINE(prov, mod, func, name);			\
261 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL);	\
262 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL);	\
263 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, NULL)
264 
265 #define	SDT_PROBE_DEFINE4(prov, mod, func, name, arg0, arg1, arg2, arg3) \
266 	SDT_PROBE_DEFINE(prov, mod, func, name);			\
267 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL);	\
268 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL);	\
269 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, NULL);	\
270 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, NULL)
271 
272 #define	SDT_PROBE_DEFINE5(prov, mod, func, name, arg0, arg1, arg2, arg3,\
273     arg4)								\
274 	SDT_PROBE_DEFINE(prov, mod, func, name);			\
275 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL);	\
276 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL);	\
277 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, NULL);	\
278 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, NULL);	\
279 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, NULL)
280 
281 #define	SDT_PROBE_DEFINE6(prov, mod, func, name, arg0, arg1, arg2, arg3,\
282     arg4, arg5) \
283 	SDT_PROBE_DEFINE(prov, mod, func, name);			\
284 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL);	\
285 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL);	\
286 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, NULL);	\
287 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, NULL);	\
288 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, NULL);	\
289 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 5, arg5, NULL)
290 
291 #define	SDT_PROBE_DEFINE7(prov, mod, func, name, arg0, arg1, arg2, arg3,\
292     arg4, arg5, arg6) \
293 	SDT_PROBE_DEFINE(prov, mod, func, name);			\
294 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL);	\
295 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL);	\
296 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, NULL);	\
297 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, NULL);	\
298 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, NULL);	\
299 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 5, arg5, NULL);	\
300 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 6, arg6, NULL)
301 
302 #define	SDT_PROBE_DEFINE0_XLATE(prov, mod, func, name)		\
303 	SDT_PROBE_DEFINE(prov, mod, func, name)
304 
305 #define	SDT_PROBE_DEFINE1_XLATE(prov, mod, func, name, arg0, xarg0) \
306 	SDT_PROBE_DEFINE(prov, mod, func, name);			\
307 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0)
308 
309 #define	SDT_PROBE_DEFINE2_XLATE(prov, mod, func, name, arg0, xarg0, \
310     arg1,  xarg1)							\
311 	SDT_PROBE_DEFINE(prov, mod, func, name);			\
312 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0);	\
313 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1)
314 
315 #define	SDT_PROBE_DEFINE3_XLATE(prov, mod, func, name, arg0, xarg0, \
316     arg1, xarg1, arg2, xarg2)						\
317 	SDT_PROBE_DEFINE(prov, mod, func, name);			\
318 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0);	\
319 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1);	\
320 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, xarg2)
321 
322 #define	SDT_PROBE_DEFINE4_XLATE(prov, mod, func, name, arg0, xarg0, \
323     arg1, xarg1, arg2, xarg2, arg3, xarg3)				\
324 	SDT_PROBE_DEFINE(prov, mod, func, name);			\
325 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0);	\
326 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1);	\
327 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, xarg2);	\
328 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, xarg3)
329 
330 #define	SDT_PROBE_DEFINE5_XLATE(prov, mod, func, name, arg0, xarg0, \
331     arg1, xarg1, arg2, xarg2, arg3, xarg3, arg4, xarg4)			\
332 	SDT_PROBE_DEFINE(prov, mod, func, name);			\
333 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0);	\
334 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1);	\
335 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, xarg2);	\
336 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, xarg3);	\
337 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, xarg4)
338 
339 #define	SDT_PROBE_DEFINE6_XLATE(prov, mod, func, name, arg0, xarg0, \
340     arg1, xarg1, arg2, xarg2, arg3, xarg3, arg4, xarg4, arg5, xarg5)	\
341 	SDT_PROBE_DEFINE(prov, mod, func, name);			\
342 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0);	\
343 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1);	\
344 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, xarg2);	\
345 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, xarg3);	\
346 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, xarg4);	\
347 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 5, arg5, xarg5)
348 
349 #define	SDT_PROBE_DEFINE7_XLATE(prov, mod, func, name, arg0, xarg0, \
350     arg1, xarg1, arg2, xarg2, arg3, xarg3, arg4, xarg4, arg5, xarg5, arg6, \
351     xarg6)								\
352 	SDT_PROBE_DEFINE(prov, mod, func, name);			\
353 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0);	\
354 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1);	\
355 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, xarg2);	\
356 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, xarg3);	\
357 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, xarg4);	\
358 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 5, arg5, xarg5);	\
359 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 6, arg6, xarg6)
360 
361 #define	SDT_PROBE0(prov, mod, func, name)				\
362 	SDT_PROBE(prov, mod, func, name, 0, 0, 0, 0, 0)
363 #define	SDT_PROBE1(prov, mod, func, name, arg0)				\
364 	SDT_PROBE(prov, mod, func, name, arg0, 0, 0, 0, 0)
365 #define	SDT_PROBE2(prov, mod, func, name, arg0, arg1)			\
366 	SDT_PROBE(prov, mod, func, name, arg0, arg1, 0, 0, 0)
367 #define	SDT_PROBE3(prov, mod, func, name, arg0, arg1, arg2)		\
368 	SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2,  0, 0)
369 #define	SDT_PROBE4(prov, mod, func, name, arg0, arg1, arg2, arg3)	\
370 	SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, 0)
371 #define	SDT_PROBE5(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4) \
372 	SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4)
373 /* XXX: void * function casts */
374 #define	SDT_PROBE6(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4, arg5) \
375 	(__predict_false(sdt_##prov##_##mod##_##func##_##name->id)	      \
376 	    ? __FPTRCAST(void (*)(uint32_t, uintptr_t, uintptr_t,	      \
377 		    uintptr_t, uintptr_t, uintptr_t, uintptr_t),	      \
378 		sdt_probe_func)(					      \
379 			sdt_##prov##_##mod##_##func##_##name->id,	      \
380 			(uintptr_t)(arg0), (uintptr_t)(arg1),		      \
381 			(uintptr_t)(arg2), (uintptr_t)(arg3),		      \
382 			(uintptr_t)(arg4), (uintptr_t)(arg5))		      \
383 	    : 0)
384 #define	SDT_PROBE7(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4, arg5, \
385     arg6)								      \
386 	(__predict_false(sdt_##prov##_##mod##_##func##_##name->id)	      \
387 	    ? __FPTRCAST(void (*)(uint32_t, uintptr_t, uintptr_t,	      \
388 		    uintptr_t, uintptr_t, uintptr_t, uintptr_t,		      \
389 		    uintptr_t),						      \
390 		sdt_probe_func)(					      \
391 			sdt_##prov##_##mod##_##func##_##name->id,	      \
392 			(uintptr_t)(arg0), (uintptr_t)(arg1),		      \
393 			(uintptr_t)(arg2), (uintptr_t)(arg3),		      \
394 			(uintptr_t)(arg4), (uintptr_t)(arg5),		      \
395 			(uintptr_t)(arg6))				      \
396 	    : 0)
397 
398 #define	DTRACE_PROBE_IMPL_START(name, arg0, arg1, arg2, arg3, arg4)	do    \
399 {									      \
400 	static SDT_PROBE_DEFINE(sdt, , , name);				      \
401 	SDT_PROBE(sdt, , , name, arg0, arg1, arg2, arg3, arg4)
402 #define DTRACE_PROBE_IMPL_END						      \
403 } while (0)
404 
405 #define DTRACE_PROBE(name)						\
406 	DTRACE_PROBE_IMPL_START(name, 0, 0, 0, 0, 0);			\
407 	DTRACE_PROBE_IMPL_END
408 
409 #define DTRACE_PROBE1(name, type0, arg0)				\
410 	DTRACE_PROBE_IMPL_START(name, arg0, 0, 0, 0, 0); 		\
411 	SDT_PROBE_ARGTYPE(sdt, , , name, 0, #type0, NULL);		\
412 	DTRACE_PROBE_IMPL_END
413 
414 #define DTRACE_PROBE2(name, type0, arg0, type1, arg1)			\
415 	DTRACE_PROBE_IMPL_START(name, arg0, arg1, 0, 0, 0); 		\
416 	SDT_PROBE_ARGTYPE(sdt, , , name, 0, #type0, NULL);		\
417 	SDT_PROBE_ARGTYPE(sdt, , , name, 1, #type1, NULL);		\
418 	DTRACE_PROBE_IMPL_END
419 
420 #define DTRACE_PROBE3(name, type0, arg0, type1, arg1, type2, arg2)	\
421 	DTRACE_PROBE_IMPL_START(name, arg0, arg1, arg2, 0, 0);	 	\
422 	SDT_PROBE_ARGTYPE(sdt, , , name, 0, #type0, NULL);		\
423 	SDT_PROBE_ARGTYPE(sdt, , , name, 1, #type1, NULL);		\
424 	SDT_PROBE_ARGTYPE(sdt, , , name, 2, #type2, NULL);		\
425 	DTRACE_PROBE_IMPL_END
426 
427 #define DTRACE_PROBE4(name, type0, arg0, type1, arg1, type2, arg2, type3,     \
428     arg3)								      \
429 	DTRACE_PROBE_IMPL_START(name, arg0, arg1, arg2, arg3, 0);	      \
430 	SDT_PROBE_ARGTYPE(sdt, , , name, 0, #type0, NULL);		      \
431 	SDT_PROBE_ARGTYPE(sdt, , , name, 1, #type1, NULL);		      \
432 	SDT_PROBE_ARGTYPE(sdt, , , name, 2, #type2, NULL);		      \
433 	SDT_PROBE_ARGTYPE(sdt, , , name, 3, #type3, NULL);		      \
434 	DTRACE_PROBE_IMPL_END
435 
436 #define DTRACE_PROBE5(name, type0, arg0, type1, arg1, type2, arg2, type3,     \
437     arg3, type4, arg4)							      \
438 	DTRACE_PROBE_IMPL_START(name, arg0, arg1, arg2, arg3, arg4);	      \
439 	SDT_PROBE_ARGTYPE(sdt, , , name, 0, #type0, NULL);		      \
440 	SDT_PROBE_ARGTYPE(sdt, , , name, 1, #type1, NULL);		      \
441 	SDT_PROBE_ARGTYPE(sdt, , , name, 2, #type2, NULL);		      \
442 	SDT_PROBE_ARGTYPE(sdt, , , name, 3, #type3, NULL);		      \
443 	SDT_PROBE_ARGTYPE(sdt, , , name, 4, #type4, NULL);		      \
444 	DTRACE_PROBE_IMPL_END
445 
446 #endif /* KDTRACE_HOOKS */
447 
448 /*
449  * This type definition must match that of dtrace_probe. It is defined this
450  * way to avoid having to rely on CDDL code.
451  */
452 typedef	void (*sdt_probe_func_t)(uint32_t, uintptr_t arg0, uintptr_t arg1,
453     uintptr_t arg2, uintptr_t arg3, uintptr_t arg4);
454 
455 /*
456  * The 'sdt' provider will set it to dtrace_probe when it loads.
457  */
458 extern sdt_probe_func_t	sdt_probe_func;
459 
460 struct sdt_probe;
461 struct sdt_provider;
462 struct linker_file;
463 
464 struct sdt_argtype {
465 	int		ndx;		/* Argument index. */
466 	const char	*type;		/* Argument type string. */
467 	const char	*xtype;		/* Translated argument type. */
468 	TAILQ_ENTRY(sdt_argtype)
469 			argtype_entry;	/* Argument type list entry. */
470 	struct sdt_probe *probe;	/* Ptr to the probe structure. */
471 };
472 
473 struct sdt_probe {
474 	int		version;	/* Set to sizeof(struct sdt_probe). */
475 	struct sdt_provider *prov;	/* Ptr to the provider structure. */
476 	TAILQ_ENTRY(sdt_probe)
477 			probe_entry;	/* SDT probe list entry. */
478 	TAILQ_HEAD(argtype_list_head, sdt_argtype) argtype_list;
479 	const char	*mod;
480 	const char	*func;
481 	const char	*name;
482 	id_t		id;		/* DTrace probe ID. */
483 	int		n_args;		/* Number of arguments. */
484 	struct linker_file *sdtp_lf;	/* Module in which we're defined. */
485 };
486 
487 struct sdt_provider {
488 	const char *name;		/* Provider name. */
489 	TAILQ_ENTRY(sdt_provider)
490 			prov_entry;	/* SDT provider list entry. */
491 	uintptr_t	id;		/* DTrace provider ID. */
492 	int		sdt_refs;	/* Number of module references. */
493 };
494 
495 void sdt_probe_stub(uint32_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t,
496     uintptr_t);
497 
498 SDT_PROVIDER_DECLARE(sdt);
499 
500 void sdt_init(void *);
501 void sdt_exit(void);
502 
503 #ifdef KDTRACE_HOOKS
504 SDT_PROBE_DECLARE(sdt, , , set__error);
505 #define	SET_ERROR(err)	(SDT_PROBE1(sdt, , , set__error,  (err)), (err))
506 #else
507 #define	SET_ERROR(err)	(err)
508 #endif	/* KDTRACE_HOOKS */
509 
510 #endif /* _KERNEL */
511 
512 #endif /* _SYS_SDT_H */
513