xref: /netbsd/sys/sys/sdt.h (revision 98d65095)
1 /*	$NetBSD: sdt.h,v 1.22 2023/04/30 08:46:33 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)	do    \
230 {									      \
231 	if (__predict_false(sdt_##prov##_##mod##_##func##_##name->id))	      \
232 		(*sdt_probe_func)(sdt_##prov##_##mod##_##func##_##name->id,   \
233 		    (uintptr_t)(arg0), (uintptr_t)(arg1), (uintptr_t)(arg2),  \
234 		    (uintptr_t)(arg3), (uintptr_t)(arg4));		      \
235 } while (0)
236 
237 #define SDT_PROBE_ARGTYPE(prov, mod, func, name, num, type, xtype)	      \
238 	static struct sdt_argtype sdta_##prov##_##mod##_##func##_##name##num[1]\
239 	= {								      \
240 		{							      \
241 			num, type, xtype, { NULL, NULL },		      \
242 			sdt_##prov##_##mod##_##func##_##name,		      \
243 		}							      \
244 	};								      \
245 	__link_set_add_data(sdt_argtypes_set,				      \
246 		sdta_##prov##_##mod##_##func##_##name##num);
247 
248 #define	SDT_PROBE_DEFINE0(prov, mod, func, name)			\
249 	SDT_PROBE_DEFINE(prov, mod, func, name)
250 
251 #define	SDT_PROBE_DEFINE1(prov, mod, func, name, arg0)			\
252 	SDT_PROBE_DEFINE(prov, mod, func, name);			\
253 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL)
254 
255 #define	SDT_PROBE_DEFINE2(prov, mod, func, name, arg0, arg1)		\
256 	SDT_PROBE_DEFINE(prov, mod, func, name);			\
257 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL);	\
258 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL)
259 
260 #define	SDT_PROBE_DEFINE3(prov, mod, func, name, arg0, arg1, arg2)\
261 	SDT_PROBE_DEFINE(prov, mod, func, name);			\
262 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL);	\
263 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL);	\
264 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, NULL)
265 
266 #define	SDT_PROBE_DEFINE4(prov, mod, func, name, arg0, arg1, arg2, arg3) \
267 	SDT_PROBE_DEFINE(prov, mod, func, name);			\
268 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL);	\
269 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL);	\
270 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, NULL);	\
271 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, NULL)
272 
273 #define	SDT_PROBE_DEFINE5(prov, mod, func, name, arg0, arg1, arg2, arg3,\
274     arg4)								\
275 	SDT_PROBE_DEFINE(prov, mod, func, name);			\
276 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL);	\
277 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL);	\
278 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, NULL);	\
279 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, NULL);	\
280 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, NULL)
281 
282 #define	SDT_PROBE_DEFINE6(prov, mod, func, name, arg0, arg1, arg2, arg3,\
283     arg4, arg5) \
284 	SDT_PROBE_DEFINE(prov, mod, func, name);			\
285 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL);	\
286 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL);	\
287 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, NULL);	\
288 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, NULL);	\
289 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, NULL);	\
290 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 5, arg5, NULL)
291 
292 #define	SDT_PROBE_DEFINE7(prov, mod, func, name, arg0, arg1, arg2, arg3,\
293     arg4, arg5, arg6) \
294 	SDT_PROBE_DEFINE(prov, mod, func, name);			\
295 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL);	\
296 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL);	\
297 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, NULL);	\
298 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, NULL);	\
299 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, NULL);	\
300 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 5, arg5, NULL);	\
301 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 6, arg6, NULL)
302 
303 #define	SDT_PROBE_DEFINE0_XLATE(prov, mod, func, name)		\
304 	SDT_PROBE_DEFINE(prov, mod, func, name)
305 
306 #define	SDT_PROBE_DEFINE1_XLATE(prov, mod, func, name, arg0, xarg0) \
307 	SDT_PROBE_DEFINE(prov, mod, func, name);			\
308 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0)
309 
310 #define	SDT_PROBE_DEFINE2_XLATE(prov, mod, func, name, arg0, xarg0, \
311     arg1,  xarg1)							\
312 	SDT_PROBE_DEFINE(prov, mod, func, name);			\
313 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0);	\
314 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1)
315 
316 #define	SDT_PROBE_DEFINE3_XLATE(prov, mod, func, name, arg0, xarg0, \
317     arg1, xarg1, arg2, xarg2)						\
318 	SDT_PROBE_DEFINE(prov, mod, func, name);			\
319 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0);	\
320 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1);	\
321 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, xarg2)
322 
323 #define	SDT_PROBE_DEFINE4_XLATE(prov, mod, func, name, arg0, xarg0, \
324     arg1, xarg1, arg2, xarg2, arg3, xarg3)				\
325 	SDT_PROBE_DEFINE(prov, mod, func, name);			\
326 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0);	\
327 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1);	\
328 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, xarg2);	\
329 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, xarg3)
330 
331 #define	SDT_PROBE_DEFINE5_XLATE(prov, mod, func, name, arg0, xarg0, \
332     arg1, xarg1, arg2, xarg2, arg3, xarg3, arg4, xarg4)			\
333 	SDT_PROBE_DEFINE(prov, mod, func, name);			\
334 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0);	\
335 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1);	\
336 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, xarg2);	\
337 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, xarg3);	\
338 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, xarg4)
339 
340 #define	SDT_PROBE_DEFINE6_XLATE(prov, mod, func, name, arg0, xarg0, \
341     arg1, xarg1, arg2, xarg2, arg3, xarg3, arg4, xarg4, arg5, xarg5)	\
342 	SDT_PROBE_DEFINE(prov, mod, func, name);			\
343 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0);	\
344 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1);	\
345 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, xarg2);	\
346 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, xarg3);	\
347 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, xarg4);	\
348 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 5, arg5, xarg5)
349 
350 #define	SDT_PROBE_DEFINE7_XLATE(prov, mod, func, name, arg0, xarg0, \
351     arg1, xarg1, arg2, xarg2, arg3, xarg3, arg4, xarg4, arg5, xarg5, arg6, \
352     xarg6)								\
353 	SDT_PROBE_DEFINE(prov, mod, func, name);			\
354 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0);	\
355 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1);	\
356 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, xarg2);	\
357 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, xarg3);	\
358 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, xarg4);	\
359 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 5, arg5, xarg5);	\
360 	SDT_PROBE_ARGTYPE(prov, mod, func, name, 6, arg6, xarg6)
361 
362 #define	SDT_PROBE0(prov, mod, func, name)				\
363 	SDT_PROBE(prov, mod, func, name, 0, 0, 0, 0, 0)
364 #define	SDT_PROBE1(prov, mod, func, name, arg0)				\
365 	SDT_PROBE(prov, mod, func, name, arg0, 0, 0, 0, 0)
366 #define	SDT_PROBE2(prov, mod, func, name, arg0, arg1)			\
367 	SDT_PROBE(prov, mod, func, name, arg0, arg1, 0, 0, 0)
368 #define	SDT_PROBE3(prov, mod, func, name, arg0, arg1, arg2)		\
369 	SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2,  0, 0)
370 #define	SDT_PROBE4(prov, mod, func, name, arg0, arg1, arg2, arg3)	\
371 	SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, 0)
372 #define	SDT_PROBE5(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4) \
373 	SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4)
374 /* XXX: void * function casts */
375 #define	SDT_PROBE6(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4,	      \
376     arg5)	do							      \
377 {									      \
378 	if (__predict_false(sdt_##prov##_##mod##_##func##_##name->id))	      \
379 		__FPTRCAST(void (*)(uint32_t, uintptr_t, uintptr_t,	      \
380 			uintptr_t, uintptr_t, uintptr_t, uintptr_t),	      \
381 		    sdt_probe_func)(					      \
382 			sdt_##prov##_##mod##_##func##_##name->id,	      \
383 			(uintptr_t)(arg0), (uintptr_t)(arg1),		      \
384 			(uintptr_t)(arg2), (uintptr_t)(arg3),		      \
385 			(uintptr_t)(arg4), (uintptr_t)(arg5));		      \
386 } while (0)
387 #define	SDT_PROBE7(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4, arg5, \
388     arg6)	do							      \
389 {									      \
390 	if (__predict_false(sdt_##prov##_##mod##_##func##_##name->id))	      \
391 		__FPTRCAST(void (*)(uint32_t, uintptr_t, uintptr_t,	      \
392 			uintptr_t, uintptr_t, uintptr_t, uintptr_t,	      \
393 			uintptr_t), sdt_probe_func)(			      \
394 			sdt_##prov##_##mod##_##func##_##name->id,	      \
395 			(uintptr_t)(arg0), (uintptr_t)(arg1),		      \
396 			(uintptr_t)(arg2), (uintptr_t)(arg3),		      \
397 			(uintptr_t)(arg4), (uintptr_t)(arg5),		      \
398 			(uintptr_t)(arg6));				      \
399 } while (0)
400 
401 #define	DTRACE_PROBE_IMPL_START(name, arg0, arg1, arg2, arg3, arg4)	do    \
402 {									      \
403 	static SDT_PROBE_DEFINE(sdt, , , name);				      \
404 	SDT_PROBE(sdt, , , name, arg0, arg1, arg2, arg3, arg4)
405 #define DTRACE_PROBE_IMPL_END						      \
406 } while (0)
407 
408 #define DTRACE_PROBE(name)						\
409 	DTRACE_PROBE_IMPL_START(name, 0, 0, 0, 0, 0);			\
410 	DTRACE_PROBE_IMPL_END
411 
412 #define DTRACE_PROBE1(name, type0, arg0)				\
413 	DTRACE_PROBE_IMPL_START(name, arg0, 0, 0, 0, 0); 		\
414 	SDT_PROBE_ARGTYPE(sdt, , , name, 0, #type0, NULL);		\
415 	DTRACE_PROBE_IMPL_END
416 
417 #define DTRACE_PROBE2(name, type0, arg0, type1, arg1)			\
418 	DTRACE_PROBE_IMPL_START(name, arg0, arg1, 0, 0, 0); 		\
419 	SDT_PROBE_ARGTYPE(sdt, , , name, 0, #type0, NULL);		\
420 	SDT_PROBE_ARGTYPE(sdt, , , name, 1, #type1, NULL);		\
421 	DTRACE_PROBE_IMPL_END
422 
423 #define DTRACE_PROBE3(name, type0, arg0, type1, arg1, type2, arg2)	\
424 	DTRACE_PROBE_IMPL_START(name, arg0, arg1, arg2, 0, 0);	 	\
425 	SDT_PROBE_ARGTYPE(sdt, , , name, 0, #type0, NULL);		\
426 	SDT_PROBE_ARGTYPE(sdt, , , name, 1, #type1, NULL);		\
427 	SDT_PROBE_ARGTYPE(sdt, , , name, 2, #type2, NULL);		\
428 	DTRACE_PROBE_IMPL_END
429 
430 #define DTRACE_PROBE4(name, type0, arg0, type1, arg1, type2, arg2, type3,     \
431     arg3)								      \
432 	DTRACE_PROBE_IMPL_START(name, arg0, arg1, arg2, arg3, 0);	      \
433 	SDT_PROBE_ARGTYPE(sdt, , , name, 0, #type0, NULL);		      \
434 	SDT_PROBE_ARGTYPE(sdt, , , name, 1, #type1, NULL);		      \
435 	SDT_PROBE_ARGTYPE(sdt, , , name, 2, #type2, NULL);		      \
436 	SDT_PROBE_ARGTYPE(sdt, , , name, 3, #type3, NULL);		      \
437 	DTRACE_PROBE_IMPL_END
438 
439 #define DTRACE_PROBE5(name, type0, arg0, type1, arg1, type2, arg2, type3,     \
440     arg3, type4, arg4)							      \
441 	DTRACE_PROBE_IMPL_START(name, arg0, arg1, arg2, arg3, arg4);	      \
442 	SDT_PROBE_ARGTYPE(sdt, , , name, 0, #type0, NULL);		      \
443 	SDT_PROBE_ARGTYPE(sdt, , , name, 1, #type1, NULL);		      \
444 	SDT_PROBE_ARGTYPE(sdt, , , name, 2, #type2, NULL);		      \
445 	SDT_PROBE_ARGTYPE(sdt, , , name, 3, #type3, NULL);		      \
446 	SDT_PROBE_ARGTYPE(sdt, , , name, 4, #type4, NULL);		      \
447 	DTRACE_PROBE_IMPL_END
448 
449 #endif /* KDTRACE_HOOKS */
450 
451 /*
452  * This type definition must match that of dtrace_probe. It is defined this
453  * way to avoid having to rely on CDDL code.
454  */
455 typedef	void (*sdt_probe_func_t)(uint32_t, uintptr_t arg0, uintptr_t arg1,
456     uintptr_t arg2, uintptr_t arg3, uintptr_t arg4);
457 
458 /*
459  * The 'sdt' provider will set it to dtrace_probe when it loads.
460  */
461 extern sdt_probe_func_t	sdt_probe_func;
462 
463 struct sdt_probe;
464 struct sdt_provider;
465 struct linker_file;
466 
467 struct sdt_argtype {
468 	int		ndx;		/* Argument index. */
469 	const char	*type;		/* Argument type string. */
470 	const char	*xtype;		/* Translated argument type. */
471 	TAILQ_ENTRY(sdt_argtype)
472 			argtype_entry;	/* Argument type list entry. */
473 	struct sdt_probe *probe;	/* Ptr to the probe structure. */
474 };
475 
476 struct sdt_probe {
477 	int		version;	/* Set to sizeof(struct sdt_probe). */
478 	struct sdt_provider *prov;	/* Ptr to the provider structure. */
479 	TAILQ_ENTRY(sdt_probe)
480 			probe_entry;	/* SDT probe list entry. */
481 	TAILQ_HEAD(argtype_list_head, sdt_argtype) argtype_list;
482 	const char	*mod;
483 	const char	*func;
484 	const char	*name;
485 	id_t		id;		/* DTrace probe ID. */
486 	int		n_args;		/* Number of arguments. */
487 	struct linker_file *sdtp_lf;	/* Module in which we're defined. */
488 };
489 
490 struct sdt_provider {
491 	const char *name;		/* Provider name. */
492 	TAILQ_ENTRY(sdt_provider)
493 			prov_entry;	/* SDT provider list entry. */
494 	uintptr_t	id;		/* DTrace provider ID. */
495 	int		sdt_refs;	/* Number of module references. */
496 };
497 
498 void sdt_probe_stub(uint32_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t,
499     uintptr_t);
500 
501 SDT_PROVIDER_DECLARE(sdt);
502 
503 void sdt_init(void *);
504 void sdt_exit(void);
505 
506 
507 #endif /* _KERNEL */
508 
509 #endif /* _SYS_SDT_H */
510