usr/src/uts/common/sys/sdt.h
changeset 13980 d7059eb1884c
parent 12507 501806a754d2
equal deleted inserted replaced
13979:b01a4832cdf9 13980:d7059eb1884c
    18  *
    18  *
    19  * CDDL HEADER END
    19  * CDDL HEADER END
    20  */
    20  */
    21 /*
    21 /*
    22  * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
    22  * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
       
    23  * Copyright (c) 2013 by Delphix. All rights reserved.
    23  */
    24  */
    24 
    25 
    25 #ifndef _SYS_SDT_H
    26 #ifndef _SYS_SDT_H
    26 #define	_SYS_SDT_H
    27 #define	_SYS_SDT_H
       
    28 
       
    29 #include <sys/stdint.h>
    27 
    30 
    28 #ifdef	__cplusplus
    31 #ifdef	__cplusplus
    29 extern "C" {
    32 extern "C" {
    30 #endif
    33 #endif
    31 
    34 
    92 	extern void __dtrace_probe_##name(uintptr_t, uintptr_t, uintptr_t); \
    95 	extern void __dtrace_probe_##name(uintptr_t, uintptr_t, uintptr_t); \
    93 	__dtrace_probe_##name((uintptr_t)(arg1), (uintptr_t)(arg2),	\
    96 	__dtrace_probe_##name((uintptr_t)(arg1), (uintptr_t)(arg2),	\
    94 	    (uintptr_t)(arg3));						\
    97 	    (uintptr_t)(arg3));						\
    95 }
    98 }
    96 
    99 
    97 #define	DTRACE_PROBE4(name, type1, arg1, type2, arg2, 			\
   100 #define	DTRACE_PROBE4(name, type1, arg1, type2, arg2,			\
    98     type3, arg3, type4, arg4) {						\
   101     type3, arg3, type4, arg4) {						\
    99 	extern void __dtrace_probe_##name(uintptr_t, uintptr_t,		\
   102 	extern void __dtrace_probe_##name(uintptr_t, uintptr_t,		\
   100 	    uintptr_t, uintptr_t);					\
   103 	    uintptr_t, uintptr_t);					\
   101 	__dtrace_probe_##name((uintptr_t)(arg1), (uintptr_t)(arg2),	\
   104 	__dtrace_probe_##name((uintptr_t)(arg1), (uintptr_t)(arg2),	\
   102 	    (uintptr_t)(arg3), (uintptr_t)(arg4));			\
   105 	    (uintptr_t)(arg3), (uintptr_t)(arg4));			\
   103 }
   106 }
   104 
   107 
   105 #define	DTRACE_PROBE5(name, type1, arg1, type2, arg2, 			\
   108 #define	DTRACE_PROBE5(name, type1, arg1, type2, arg2,			\
   106     type3, arg3, type4, arg4, type5, arg5) {				\
   109     type3, arg3, type4, arg4, type5, arg5) {				\
   107 	extern void __dtrace_probe_##name(uintptr_t, uintptr_t,		\
   110 	extern void __dtrace_probe_##name(uintptr_t, uintptr_t,		\
   108 	    uintptr_t, uintptr_t, uintptr_t);				\
   111 	    uintptr_t, uintptr_t, uintptr_t);				\
   109 	__dtrace_probe_##name((uintptr_t)(arg1), (uintptr_t)(arg2),	\
   112 	__dtrace_probe_##name((uintptr_t)(arg1), (uintptr_t)(arg2),	\
   110 	    (uintptr_t)(arg3), (uintptr_t)(arg4), (uintptr_t)(arg5));	\
   113 	    (uintptr_t)(arg3), (uintptr_t)(arg4), (uintptr_t)(arg5));	\
   111 }
   114 }
   112 
   115 
   113 #define	DTRACE_PROBE6(name, type1, arg1, type2, arg2, 			\
   116 #define	DTRACE_PROBE6(name, type1, arg1, type2, arg2,			\
   114     type3, arg3, type4, arg4, type5, arg5, type6, arg6) {		\
   117     type3, arg3, type4, arg4, type5, arg5, type6, arg6) {		\
   115 	extern void __dtrace_probe_##name(uintptr_t, uintptr_t,		\
   118 	extern void __dtrace_probe_##name(uintptr_t, uintptr_t,		\
   116 	    uintptr_t, uintptr_t, uintptr_t, uintptr_t);		\
   119 	    uintptr_t, uintptr_t, uintptr_t, uintptr_t);		\
   117 	__dtrace_probe_##name((uintptr_t)(arg1), (uintptr_t)(arg2),	\
   120 	__dtrace_probe_##name((uintptr_t)(arg1), (uintptr_t)(arg2),	\
   118 	    (uintptr_t)(arg3), (uintptr_t)(arg4), (uintptr_t)(arg5),	\
   121 	    (uintptr_t)(arg3), (uintptr_t)(arg4), (uintptr_t)(arg5),	\
   148 	DTRACE_PROBE2(__sched_##name, type1, arg1, type2, arg2);
   151 	DTRACE_PROBE2(__sched_##name, type1, arg1, type2, arg2);
   149 
   152 
   150 #define	DTRACE_SCHED3(name, type1, arg1, type2, arg2, type3, arg3)	\
   153 #define	DTRACE_SCHED3(name, type1, arg1, type2, arg2, type3, arg3)	\
   151 	DTRACE_PROBE3(__sched_##name, type1, arg1, type2, arg2, type3, arg3);
   154 	DTRACE_PROBE3(__sched_##name, type1, arg1, type2, arg2, type3, arg3);
   152 
   155 
   153 #define	DTRACE_SCHED4(name, type1, arg1, type2, arg2, 			\
   156 #define	DTRACE_SCHED4(name, type1, arg1, type2, arg2,			\
   154     type3, arg3, type4, arg4)						\
   157     type3, arg3, type4, arg4)						\
   155 	DTRACE_PROBE4(__sched_##name, type1, arg1, type2, arg2, 	\
   158 	DTRACE_PROBE4(__sched_##name, type1, arg1, type2, arg2,		\
   156 	    type3, arg3, type4, arg4);
   159 	    type3, arg3, type4, arg4);
   157 
   160 
   158 #define	DTRACE_PROC(name)						\
   161 #define	DTRACE_PROC(name)						\
   159 	DTRACE_PROBE(__proc_##name);
   162 	DTRACE_PROBE(__proc_##name);
   160 
   163 
   165 	DTRACE_PROBE2(__proc_##name, type1, arg1, type2, arg2);
   168 	DTRACE_PROBE2(__proc_##name, type1, arg1, type2, arg2);
   166 
   169 
   167 #define	DTRACE_PROC3(name, type1, arg1, type2, arg2, type3, arg3)	\
   170 #define	DTRACE_PROC3(name, type1, arg1, type2, arg2, type3, arg3)	\
   168 	DTRACE_PROBE3(__proc_##name, type1, arg1, type2, arg2, type3, arg3);
   171 	DTRACE_PROBE3(__proc_##name, type1, arg1, type2, arg2, type3, arg3);
   169 
   172 
   170 #define	DTRACE_PROC4(name, type1, arg1, type2, arg2, 			\
   173 #define	DTRACE_PROC4(name, type1, arg1, type2, arg2,			\
   171     type3, arg3, type4, arg4)						\
   174     type3, arg3, type4, arg4)						\
   172 	DTRACE_PROBE4(__proc_##name, type1, arg1, type2, arg2, 		\
   175 	DTRACE_PROBE4(__proc_##name, type1, arg1, type2, arg2,		\
   173 	    type3, arg3, type4, arg4);
   176 	    type3, arg3, type4, arg4);
   174 
   177 
   175 #define	DTRACE_IO(name)							\
   178 #define	DTRACE_IO(name)							\
   176 	DTRACE_PROBE(__io_##name);
   179 	DTRACE_PROBE(__io_##name);
   177 
   180 
   182 	DTRACE_PROBE2(__io_##name, type1, arg1, type2, arg2);
   185 	DTRACE_PROBE2(__io_##name, type1, arg1, type2, arg2);
   183 
   186 
   184 #define	DTRACE_IO3(name, type1, arg1, type2, arg2, type3, arg3)	\
   187 #define	DTRACE_IO3(name, type1, arg1, type2, arg2, type3, arg3)	\
   185 	DTRACE_PROBE3(__io_##name, type1, arg1, type2, arg2, type3, arg3);
   188 	DTRACE_PROBE3(__io_##name, type1, arg1, type2, arg2, type3, arg3);
   186 
   189 
   187 #define	DTRACE_IO4(name, type1, arg1, type2, arg2, 			\
   190 #define	DTRACE_IO4(name, type1, arg1, type2, arg2,			\
   188     type3, arg3, type4, arg4)						\
   191     type3, arg3, type4, arg4)						\
   189 	DTRACE_PROBE4(__io_##name, type1, arg1, type2, arg2, 		\
   192 	DTRACE_PROBE4(__io_##name, type1, arg1, type2, arg2,		\
   190 	    type3, arg3, type4, arg4);
   193 	    type3, arg3, type4, arg4);
   191 
   194 
   192 #define	DTRACE_ISCSI_2(name, type1, arg1, type2, arg2)			\
   195 #define	DTRACE_ISCSI_2(name, type1, arg1, type2, arg2)			\
   193 	DTRACE_PROBE2(__iscsi_##name, type1, arg1, type2, arg2);
   196 	DTRACE_PROBE2(__iscsi_##name, type1, arg1, type2, arg2);
   194 
   197 
   221     type7, arg7, type8, arg8)						\
   224     type7, arg7, type8, arg8)						\
   222 	DTRACE_PROBE8(__iscsi_##name, type1, arg1, type2, arg2,		\
   225 	DTRACE_PROBE8(__iscsi_##name, type1, arg1, type2, arg2,		\
   223 	    type3, arg3, type4, arg4, type5, arg5, type6, arg6,		\
   226 	    type3, arg3, type4, arg4, type5, arg5, type6, arg6,		\
   224 	    type7, arg7, type8, arg8);
   227 	    type7, arg7, type8, arg8);
   225 
   228 
   226 #define	DTRACE_NFSV3_3(name, type1, arg1, type2, arg2, 			\
   229 #define	DTRACE_NFSV3_3(name, type1, arg1, type2, arg2,			\
   227     type3, arg3)							\
   230     type3, arg3)							\
   228 	DTRACE_PROBE3(__nfsv3_##name, type1, arg1, type2, arg2,		\
   231 	DTRACE_PROBE3(__nfsv3_##name, type1, arg1, type2, arg2,		\
   229 	    type3, arg3);
   232 	    type3, arg3);
   230 #define	DTRACE_NFSV3_4(name, type1, arg1, type2, arg2, 			\
   233 #define	DTRACE_NFSV3_4(name, type1, arg1, type2, arg2,			\
   231     type3, arg3, type4, arg4)						\
   234     type3, arg3, type4, arg4)						\
   232 	DTRACE_PROBE4(__nfsv3_##name, type1, arg1, type2, arg2,		\
   235 	DTRACE_PROBE4(__nfsv3_##name, type1, arg1, type2, arg2,		\
   233 	    type3, arg3, type4, arg4);
   236 	    type3, arg3, type4, arg4);
   234 
   237 
   235 #define	DTRACE_NFSV4_1(name, type1, arg1) \
   238 #define	DTRACE_NFSV4_1(name, type1, arg1) \
   257 	DTRACE_PROBE2(__ip_##name, type1, arg1, type2, arg2);
   260 	DTRACE_PROBE2(__ip_##name, type1, arg1, type2, arg2);
   258 
   261 
   259 #define	DTRACE_IP3(name, type1, arg1, type2, arg2, type3, arg3)	\
   262 #define	DTRACE_IP3(name, type1, arg1, type2, arg2, type3, arg3)	\
   260 	DTRACE_PROBE3(__ip_##name, type1, arg1, type2, arg2, type3, arg3);
   263 	DTRACE_PROBE3(__ip_##name, type1, arg1, type2, arg2, type3, arg3);
   261 
   264 
   262 #define	DTRACE_IP4(name, type1, arg1, type2, arg2, 			\
   265 #define	DTRACE_IP4(name, type1, arg1, type2, arg2,			\
   263     type3, arg3, type4, arg4)						\
   266     type3, arg3, type4, arg4)						\
   264 	DTRACE_PROBE4(__ip_##name, type1, arg1, type2, arg2, 		\
   267 	DTRACE_PROBE4(__ip_##name, type1, arg1, type2, arg2,		\
   265 	    type3, arg3, type4, arg4);
   268 	    type3, arg3, type4, arg4);
   266 
   269 
   267 #define	DTRACE_IP5(name, type1, arg1, type2, arg2, 			\
   270 #define	DTRACE_IP5(name, type1, arg1, type2, arg2,			\
   268     type3, arg3, type4, arg4, type5, arg5)				\
   271     type3, arg3, type4, arg4, type5, arg5)				\
   269 	DTRACE_PROBE5(__ip_##name, type1, arg1, type2, arg2, 		\
   272 	DTRACE_PROBE5(__ip_##name, type1, arg1, type2, arg2,		\
   270 	    type3, arg3, type4, arg4, type5, arg5);
   273 	    type3, arg3, type4, arg4, type5, arg5);
   271 
   274 
   272 #define	DTRACE_IP6(name, type1, arg1, type2, arg2, 			\
   275 #define	DTRACE_IP6(name, type1, arg1, type2, arg2,			\
   273     type3, arg3, type4, arg4, type5, arg5, type6, arg6)			\
   276     type3, arg3, type4, arg4, type5, arg5, type6, arg6)			\
   274 	DTRACE_PROBE6(__ip_##name, type1, arg1, type2, arg2, 		\
   277 	DTRACE_PROBE6(__ip_##name, type1, arg1, type2, arg2,		\
   275 	    type3, arg3, type4, arg4, type5, arg5, type6, arg6);
   278 	    type3, arg3, type4, arg4, type5, arg5, type6, arg6);
   276 
   279 
   277 #define	DTRACE_IP7(name, type1, arg1, type2, arg2, type3, arg3,		\
   280 #define	DTRACE_IP7(name, type1, arg1, type2, arg2, type3, arg3,		\
   278     type4, arg4, type5, arg5, type6, arg6, type7, arg7)			\
   281     type4, arg4, type5, arg5, type6, arg6, type7, arg7)			\
   279 	DTRACE_PROBE7(__ip_##name, type1, arg1, type2, arg2, 		\
   282 	DTRACE_PROBE7(__ip_##name, type1, arg1, type2, arg2,		\
   280 	    type3, arg3, type4, arg4, type5, arg5, type6, arg6,		\
   283 	    type3, arg3, type4, arg4, type5, arg5, type6, arg6,		\
   281 	    type7, arg7);
   284 	    type7, arg7);
   282 
   285 
   283 #define	DTRACE_TCP(name)						\
   286 #define	DTRACE_TCP(name)						\
   284 	DTRACE_PROBE(__tcp_##name);
   287 	DTRACE_PROBE(__tcp_##name);
   345 #define	DTRACE_XPV3(name, type1, arg1, type2, arg2, type3, arg3)	\
   348 #define	DTRACE_XPV3(name, type1, arg1, type2, arg2, type3, arg3)	\
   346 	DTRACE_PROBE3(__xpv_##name, type1, arg1, type2, arg2, type3, arg3);
   349 	DTRACE_PROBE3(__xpv_##name, type1, arg1, type2, arg2, type3, arg3);
   347 
   350 
   348 #define	DTRACE_XPV4(name, type1, arg1, type2, arg2, type3, arg3,	\
   351 #define	DTRACE_XPV4(name, type1, arg1, type2, arg2, type3, arg3,	\
   349 	    type4, arg4)						\
   352 	    type4, arg4)						\
   350 	DTRACE_PROBE4(__xpv_##name, type1, arg1, type2, arg2, 		\
   353 	DTRACE_PROBE4(__xpv_##name, type1, arg1, type2, arg2,		\
   351 	    type3, arg3, type4, arg4);
   354 	    type3, arg3, type4, arg4);
   352 
   355 
   353 #define	DTRACE_FC_1(name, type1, arg1) \
   356 #define	DTRACE_FC_1(name, type1, arg1) \
   354 	DTRACE_PROBE1(__fc_##name, type1, arg1);
   357 	DTRACE_PROBE1(__fc_##name, type1, arg1);
   355 
   358 
   361 
   364 
   362 #define	DTRACE_FC_4(name, type1, arg1, type2, arg2, type3, arg3, type4, arg4) \
   365 #define	DTRACE_FC_4(name, type1, arg1, type2, arg2, type3, arg3, type4, arg4) \
   363 	DTRACE_PROBE4(__fc_##name, type1, arg1, type2, arg2, type3, arg3, \
   366 	DTRACE_PROBE4(__fc_##name, type1, arg1, type2, arg2, type3, arg3, \
   364 	    type4, arg4);
   367 	    type4, arg4);
   365 
   368 
   366 #define	DTRACE_FC_5(name, type1, arg1, type2, arg2, type3, arg3, 	\
   369 #define	DTRACE_FC_5(name, type1, arg1, type2, arg2, type3, arg3,	\
   367 	    type4, arg4, type5, arg5)					\
   370 	    type4, arg4, type5, arg5)					\
   368 	DTRACE_PROBE5(__fc_##name, type1, arg1, type2, arg2, type3, arg3, \
   371 	DTRACE_PROBE5(__fc_##name, type1, arg1, type2, arg2, type3, arg3, \
   369 	    type4, arg4, type5, arg5);
   372 	    type4, arg4, type5, arg5);
   370 
   373 
   371 #define	DTRACE_SRP_1(name, type1, arg1)					\
   374 #define	DTRACE_SRP_1(name, type1, arg1)					\
   377 #define	DTRACE_SRP_3(name, type1, arg1, type2, arg2, type3, arg3)	\
   380 #define	DTRACE_SRP_3(name, type1, arg1, type2, arg2, type3, arg3)	\
   378 	DTRACE_PROBE3(__srp_##name, type1, arg1, type2, arg2, type3, arg3);
   381 	DTRACE_PROBE3(__srp_##name, type1, arg1, type2, arg2, type3, arg3);
   379 
   382 
   380 #define	DTRACE_SRP_4(name, type1, arg1, type2, arg2, type3, arg3,	\
   383 #define	DTRACE_SRP_4(name, type1, arg1, type2, arg2, type3, arg3,	\
   381 	    type4, arg4)						\
   384 	    type4, arg4)						\
   382 	DTRACE_PROBE4(__srp_##name, type1, arg1, type2, arg2, 		\
   385 	DTRACE_PROBE4(__srp_##name, type1, arg1, type2, arg2,		\
   383 	    type3, arg3, type4, arg4);
   386 	    type3, arg3, type4, arg4);
   384 
   387 
   385 #define	DTRACE_SRP_5(name, type1, arg1, type2, arg2, type3, arg3,	\
   388 #define	DTRACE_SRP_5(name, type1, arg1, type2, arg2, type3, arg3,	\
   386 	    type4, arg4, type5, arg5)					\
   389 	    type4, arg4, type5, arg5)					\
   387 	DTRACE_PROBE5(__srp_##name, type1, arg1, type2, arg2, 		\
   390 	DTRACE_PROBE5(__srp_##name, type1, arg1, type2, arg2,		\
   388 	    type3, arg3, type4, arg4, type5, arg5);
   391 	    type3, arg3, type4, arg4, type5, arg5);
   389 
   392 
   390 #define	DTRACE_SRP_6(name, type1, arg1, type2, arg2, type3, arg3,	\
   393 #define	DTRACE_SRP_6(name, type1, arg1, type2, arg2, type3, arg3,	\
   391 	    type4, arg4, type5, arg5, type6, arg6)			\
   394 	    type4, arg4, type5, arg5, type6, arg6)			\
   392 	DTRACE_PROBE6(__srp_##name, type1, arg1, type2, arg2, 		\
   395 	DTRACE_PROBE6(__srp_##name, type1, arg1, type2, arg2,		\
   393 	    type3, arg3, type4, arg4, type5, arg5, type6, arg6);
   396 	    type3, arg3, type4, arg4, type5, arg5, type6, arg6);
   394 
   397 
   395 #define	DTRACE_SRP_7(name, type1, arg1, type2, arg2, type3, arg3,	\
   398 #define	DTRACE_SRP_7(name, type1, arg1, type2, arg2, type3, arg3,	\
   396 	    type4, arg4, type5, arg5, type6, arg6, type7, arg7)		\
   399 	    type4, arg4, type5, arg5, type6, arg6, type7, arg7)		\
   397 	DTRACE_PROBE7(__srp_##name, type1, arg1, type2, arg2, 		\
   400 	DTRACE_PROBE7(__srp_##name, type1, arg1, type2, arg2,		\
   398 	    type3, arg3, type4, arg4, type5, arg5, type6, arg6, type7, arg7);
   401 	    type3, arg3, type4, arg4, type5, arg5, type6, arg6, type7, arg7);
   399 
   402 
   400 #define	DTRACE_SRP_8(name, type1, arg1, type2, arg2, type3, arg3,	\
   403 #define	DTRACE_SRP_8(name, type1, arg1, type2, arg2, type3, arg3,	\
   401 	    type4, arg4, type5, arg5, type6, arg6, type7, arg7, type8, arg8) \
   404 	    type4, arg4, type5, arg5, type6, arg6, type7, arg7, type8, arg8) \
   402 	DTRACE_PROBE8(__srp_##name, type1, arg1, type2, arg2, 		\
   405 	DTRACE_PROBE8(__srp_##name, type1, arg1, type2, arg2,		\
   403 	    type3, arg3, type4, arg4, type5, arg5, type6, arg6,		\
   406 	    type3, arg3, type4, arg4, type5, arg5, type6, arg6,		\
   404 	    type7, arg7, type8, arg8);
   407 	    type7, arg7, type8, arg8);
       
   408 
       
   409 /*
       
   410  * the set-error SDT probe is extra static, in that we declare its fake
       
   411  * function literally, rather than with the DTRACE_PROBE1() macro.  This is
       
   412  * necessary so that SET_ERROR() can evaluate to a value, which wouldn't
       
   413  * be possible if it required multiple statements (to declare the function
       
   414  * and then call it).
       
   415  *
       
   416  * SET_ERROR() uses the comma operator so that it can be used without much
       
   417  * additional code.  For example, "return (EINVAL);" becomes
       
   418  * "return (SET_ERROR(EINVAL));".  Note that the argument will be evaluated
       
   419  * twice, so it should not have side effects (e.g. something like:
       
   420  * "return (SET_ERROR(log_error(EINVAL, info)));" would log the error twice).
       
   421  */
       
   422 extern void __dtrace_probe_set__error(uintptr_t);
       
   423 #define	SET_ERROR(err) (__dtrace_probe_set__error(err), err)
   405 
   424 
   406 #endif /* _KERNEL */
   425 #endif /* _KERNEL */
   407 
   426 
   408 extern const char *sdt_prefix;
   427 extern const char *sdt_prefix;
   409 
   428