Home | History | Annotate | Line # | Download | only in sys
      1 /*	$NetBSD: sdt.h,v 1.24 2024/06/29 13:03:02 riastradh Exp $	*/
      2 
      3 /*-
      4  * Copyright 2006-2008 John Birrell <jb (at) 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