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, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27#ifndef _MACH_SDT_H
28#define	_MACH_SDT_H
29
30#include <mach/machine/sdt.h>
31
32
33#ifdef KERNEL
34
35#if CONFIG_DTRACE
36
37/*
38 * The following macros are used to create static probes. The argument types
39 * should be no greater than uintptr_t in size each. The behavior of larger
40 * types is undefined.
41 */
42
43#define DTRACE_PROBE(provider, name) {								\
44	DTRACE_CALL0ARGS(provider, name)							\
45}
46
47#define DTRACE_PROBE1(provider, name, arg0) {							\
48	uintptr_t __dtrace_args[ARG1_EXTENT] __attribute__ ((aligned (16)));			\
49	__dtrace_args[0] = (uintptr_t)arg0;								\
50	DTRACE_CALL1ARG(provider, name)								\
51}
52
53#define DTRACE_PROBE2(provider, name, arg0, arg1) {						\
54	uintptr_t __dtrace_args[ARGS2_EXTENT] __attribute__ ((aligned (16)));			\
55	__dtrace_args[0] = (uintptr_t)arg0;								\
56	__dtrace_args[1] = (uintptr_t)arg1;								\
57	DTRACE_CALL2ARGS(provider, name)							\
58}
59
60#define DTRACE_PROBE3(provider, name, arg0, arg1, arg2) {					\
61	uintptr_t __dtrace_args[ARGS3_EXTENT] __attribute__ ((aligned (16)));			\
62	__dtrace_args[0] = (uintptr_t)arg0;								\
63	__dtrace_args[1] = (uintptr_t)arg1;								\
64	__dtrace_args[2] = (uintptr_t)arg2;								\
65	DTRACE_CALL3ARGS(provider, name)							\
66}
67
68#define DTRACE_PROBE4(provider, name, arg0, arg1, arg2, arg3) {					\
69	uintptr_t __dtrace_args[ARGS4_EXTENT] __attribute__ ((aligned (16)));			\
70	__dtrace_args[0] = (uintptr_t)arg0;								\
71	__dtrace_args[1] = (uintptr_t)arg1;								\
72	__dtrace_args[2] = (uintptr_t)arg2;								\
73	__dtrace_args[3] = (uintptr_t)arg3;								\
74	DTRACE_CALL4ARGS(provider, name)							\
75}
76
77#define DTRACE_PROBE5(provider, name, arg0, arg1, arg2, arg3, arg4) {				\
78	uintptr_t __dtrace_args[ARGS5_EXTENT] __attribute__ ((aligned (16)));			\
79	__dtrace_args[0] = (uintptr_t)arg0;								\
80	__dtrace_args[1] = (uintptr_t)arg1;								\
81	__dtrace_args[2] = (uintptr_t)arg2;								\
82	__dtrace_args[3] = (uintptr_t)arg3;								\
83	__dtrace_args[4] = (uintptr_t)arg4;								\
84	DTRACE_CALL5ARGS(provider, name)							\
85}
86
87#define DTRACE_PROBE6(provider, name, arg0, arg1, arg2, arg3, arg4, arg5) {			\
88	uintptr_t __dtrace_args[ARGS6_EXTENT] __attribute__ ((aligned (16)));			\
89	__dtrace_args[0] = (uintptr_t)arg0;								\
90	__dtrace_args[1] = (uintptr_t)arg1;								\
91	__dtrace_args[2] = (uintptr_t)arg2;								\
92	__dtrace_args[3] = (uintptr_t)arg3;								\
93	__dtrace_args[4] = (uintptr_t)arg4;								\
94	__dtrace_args[5] = (uintptr_t)arg5;								\
95	DTRACE_CALL6ARGS(provider, name)							\
96}
97
98#define DTRACE_PROBE7(provider, name, arg0, arg1, arg2, arg3, arg4, arg5, arg6) {		\
99	uintptr_t __dtrace_args[ARGS7_EXTENT] __attribute__ ((aligned (16)));			\
100	__dtrace_args[0] = (uintptr_t)arg0;								\
101	__dtrace_args[1] = (uintptr_t)arg1;								\
102	__dtrace_args[2] = (uintptr_t)arg2;								\
103	__dtrace_args[3] = (uintptr_t)arg3;								\
104	__dtrace_args[4] = (uintptr_t)arg4;								\
105	__dtrace_args[5] = (uintptr_t)arg5;								\
106	__dtrace_args[6] = (uintptr_t)arg6;								\
107	DTRACE_CALL7ARGS(provider, name)							\
108}
109
110#define DTRACE_PROBE8(provider, name, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) {		\
111	uintptr_t __dtrace_args[ARGS8_EXTENT] __attribute__ ((aligned (16)));			\
112	__dtrace_args[0] = (uintptr_t)arg0;								\
113	__dtrace_args[1] = (uintptr_t)arg1;								\
114	__dtrace_args[2] = (uintptr_t)arg2;								\
115	__dtrace_args[3] = (uintptr_t)arg3;								\
116	__dtrace_args[4] = (uintptr_t)arg4;								\
117	__dtrace_args[5] = (uintptr_t)arg5;								\
118	__dtrace_args[6] = (uintptr_t)arg6;								\
119	__dtrace_args[7] = (uintptr_t)arg7;								\
120	DTRACE_CALL8ARGS(provider, name)							\
121}
122
123#define DTRACE_PROBE9(provider, name, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) {	\
124	uintptr_t __dtrace_args[ARGS9_EXTENT] __attribute__ ((aligned (16)));			\
125	__dtrace_args[0] = (uintptr_t)arg0;								\
126	__dtrace_args[1] = (uintptr_t)arg1;								\
127	__dtrace_args[2] = (uintptr_t)arg2;								\
128	__dtrace_args[3] = (uintptr_t)arg3;								\
129	__dtrace_args[4] = (uintptr_t)arg4;								\
130	__dtrace_args[5] = (uintptr_t)arg5;								\
131	__dtrace_args[6] = (uintptr_t)arg6;								\
132	__dtrace_args[7] = (uintptr_t)arg7;								\
133	__dtrace_args[8] = (uintptr_t)arg8;								\
134	DTRACE_CALL9ARGS(provider, name)							\
135}
136
137#define DTRACE_PROBE10(provider, name, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) {	\
138	uintptr_t __dtrace_args[ARGS10_EXTENT] __attribute__ ((aligned (16)));				\
139	__dtrace_args[0] = (uintptr_t)arg0;									\
140	__dtrace_args[1] = (uintptr_t)arg1;									\
141	__dtrace_args[2] = (uintptr_t)arg2;									\
142	__dtrace_args[3] = (uintptr_t)arg3;									\
143	__dtrace_args[4] = (uintptr_t)arg4;									\
144	__dtrace_args[5] = (uintptr_t)arg5;									\
145	__dtrace_args[6] = (uintptr_t)arg6;									\
146	__dtrace_args[7] = (uintptr_t)arg7;									\
147	__dtrace_args[8] = (uintptr_t)arg8;									\
148	__dtrace_args[9] = (uintptr_t)arg9;									\
149	DTRACE_CALL10ARGS(provider, name)								\
150}
151
152
153
154#define	DTRACE_SCHED(name)						\
155	DTRACE_PROBE(__sched_, name);
156
157#define	DTRACE_SCHED1(name, type1, arg1)				\
158	DTRACE_PROBE1(__sched_, name, arg1);
159
160#define	DTRACE_SCHED2(name, type1, arg1, type2, arg2)			\
161	DTRACE_PROBE2(__sched_, name, arg1, arg2);
162
163#define	DTRACE_SCHED3(name, type1, arg1, type2, arg2, type3, arg3)	\
164	DTRACE_PROBE3(__sched_, name, arg1, arg2, arg3);
165
166#define	DTRACE_SCHED4(name, type1, arg1, type2, arg2, 			\
167    type3, arg3, type4, arg4)						\
168	DTRACE_PROBE4(__sched_, name, arg1, arg2, arg3, arg4);
169
170#define	DTRACE_PROC(name)						\
171	DTRACE_PROBE(__proc_, name);
172
173#define	DTRACE_PROC1(name, type1, arg1)					\
174	DTRACE_PROBE1(__proc_, name, arg1);
175
176#define	DTRACE_PROC2(name, type1, arg1, type2, arg2)			\
177	DTRACE_PROBE2(__proc_, name, arg1, arg2);
178
179#define	DTRACE_PROC3(name, type1, arg1, type2, arg2, type3, arg3)	\
180	DTRACE_PROBE3(__proc_, name, arg1, arg2, arg3);
181
182#define	DTRACE_PROC4(name, type1, arg1, type2, arg2, 			\
183    type3, arg3, type4, arg4)						\
184	DTRACE_PROBE4(__proc_, name, arg1, arg2, arg3, arg4);
185
186#define	DTRACE_IO(name)							\
187	DTRACE_PROBE(__io_, name);
188
189#define	DTRACE_IO1(name, type1, arg1)					\
190	DTRACE_PROBE1(__io_, name, arg1);
191
192#define	DTRACE_IO2(name, type1, arg1, type2, arg2)			\
193	DTRACE_PROBE2(__io_, name, type1, arg1, type2, arg2);
194
195#define	DTRACE_IO3(name, type1, arg1, type2, arg2, type3, arg3)		\
196	DTRACE_PROBE3(__io_, name, arg1, arg2, arg3);
197
198#define	DTRACE_IO4(name, type1, arg1, type2, arg2, 			\
199    type3, arg3, type4, arg4)						\
200	DTRACE_PROBE4(__io_, name, arg1, arg2, arg3, arg4);
201
202#define	DTRACE_INT5(name, type1, arg1, type2, arg2, 			\
203    type3, arg3, type4, arg4, type5, arg5)						\
204	DTRACE_PROBE5(__sdt_, name, arg1, arg2, arg3, arg4, arg5);
205
206#define	DTRACE_TMR3(name, type1, arg1, type2, arg2, type3, arg3)		\
207	DTRACE_PROBE3(__sdt_, name, arg1, arg2, arg3);
208
209#define        DTRACE_TMR4(name, type1, arg1, arg2, arg3, arg4)                        \
210       DTRACE_PROBE4(__sdt_, name, arg1, arg2, arg3, arg4);
211
212#define        DTRACE_TMR5(name, type1, arg1, type2, arg2, type3, arg3, arg4, arg5)    \
213       DTRACE_PROBE5(__sdt_, name, arg1, arg2, arg3, arg4, arg5);
214
215#define        DTRACE_TMR6(name, type1, arg1, type2, arg2, type3, arg3, arg4, arg5, arg6) \
216       DTRACE_PROBE6(__sdt_, name, arg1, arg2, arg3, arg4, arg5, arg6);
217
218
219
220#define	DTRACE_VM(name)							\
221	DTRACE_PROBE(__vminfo_, name)
222
223#define	DTRACE_VM1(name, type1, arg1)					\
224	DTRACE_PROBE1(__vminfo_, name, arg1)
225
226#define	DTRACE_VM2(name, type1, arg1, type2, arg2)			\
227	DTRACE_PROBE2(__vminfo_, name, arg1, arg2)
228
229#define	DTRACE_VM3(name, type1, arg1, type2, arg2, type3, arg3)		\
230	DTRACE_PROBE3(__vminfo_, name, arg1, arg2, arg3)
231
232#define	DTRACE_VM4(name, type1, arg1, type2, arg2, 			\
233    type3, arg3, type4, arg4)						\
234	DTRACE_PROBE4(__vminfo_, name, arg1, arg2, arg3, arg4)
235
236#define DTRACE_IP(name)							\
237	DTRACE_PROBE(__ip_, name)
238
239#define DTRACE_IP1(name, type1, arg1)					\
240	DTRACE_PROBE1(__ip_, name, arg1)
241
242#define DTRACE_IP2(name, type1, arg1, type2, arg2)			\
243	DTRACE_PROBE2(__ip_, name, arg1, arg2)
244
245#define DTRACE_IP3(name, type1, arg1, type2, arg2, type3, arg3)		\
246	DTRACE_PROBE3(__ip_, name, arg1, arg2, arg3)
247
248#define DTRACE_IP4(name, type1, arg1, type2, arg2,			\
249    type3, arg3, type4, arg4)						\
250	DTRACE_PROBE4(__ip_, name, arg1, arg2, arg3, arg4)
251
252#define DTRACE_IP5(name, typ1, arg1, type2, arg2, type3, arg3,		\
253    type4, arg4, type5, arg5)						\
254	DTRACE_PROBE5(__ip_, name, arg1, arg2, arg3, arg4, arg5)
255
256#define DTRACE_IP6(name, type1, arg1, type2, arg2, type3, arg3,		\
257    type4,arg4, type5, arg5, type6, arg6)				\
258	DTRACE_PROBE6(__ip_, name, arg1, arg2, arg3, arg4, arg5, arg6)
259
260#define DTRACE_IP7(name, type1, arg1, type2, arg2, type3, arg3,		\
261    type4, arg4, type5, arg5, type6, arg6, type7, arg7)			\
262	DTRACE_PROBE7(__ip_, name, arg1, arg2, arg3, arg4, arg5, arg6, arg7)
263
264#define DTRACE_TCP(name)                                                 \
265        DTRACE_PROBE(__tcp_, name)
266
267#define DTRACE_TCP1(name, type1, arg1)                                   \
268        DTRACE_PROBE1(__tcp_, name, arg1)
269
270#define DTRACE_TCP2(name, type1, arg1, type2, arg2)                      \
271        DTRACE_PROBE2(__tcp_, name, arg1, arg2)
272
273#define DTRACE_TCP3(name, type1, arg1, type2, arg2, type3, arg3)         \
274        DTRACE_PROBE3(__tcp_, name, arg1, arg2, arg3)
275
276#define DTRACE_TCP4(name, type1, arg1, type2, arg2,                      \
277    type3, arg3, type4, arg4)                                           \
278        DTRACE_PROBE4(__tcp_, name, arg1, arg2, arg3, arg4)
279
280#define DTRACE_TCP5(name, typ1, arg1, type2, arg2, type3, arg3,          \
281    type4, arg4, type5, arg5)                                           \
282        DTRACE_PROBE5(__tcp_, name, arg1, arg2, arg3, arg4, arg5)
283
284#else /* CONFIG_DTRACE */
285
286#define	DTRACE_SCHED(name) do {} while (0)
287#define	DTRACE_SCHED1(name, type1, arg1) do {} while (0)
288#define	DTRACE_SCHED2(name, type1, arg1, type2, arg2) do {} while (0)
289#define	DTRACE_SCHED3(name, type1, arg1, type2, arg2, type3, arg3) do {} while (0)
290#define	DTRACE_SCHED4(name, type1, arg1, type2, arg2, type3, arg3, type4, arg4) do {} while (0)
291
292#define DTRACE_PROC(name) do {} while(0)
293#define DTRACE_PROC1(name, type1, arg1) do {} while(0)
294#define	DTRACE_PROC2(name, type1, arg1, type2, arg2) do {} while (0)
295#define	DTRACE_PROC3(name, type1, arg1, type2, arg2, type3, arg3) do {} while (0)
296#define	DTRACE_PROC4(name, type1, arg1, type2, arg2, type3, arg3, type4, arg4) do {} while(0)
297#define	DTRACE_IO(name) do {} while(0)
298#define	DTRACE_IO1(name, type1, arg1) do {} while(0)
299#define	DTRACE_IO2(name, type1, arg1, type2, arg2) do {} while(0)
300#define	DTRACE_IO3(name, type1, arg1, type2, arg2, type3, arg3) do {} while(0)
301#define	DTRACE_IO4(name, type1, arg1, type2, arg2, type3, arg3, type4, arg4) do {} while(0)
302#define	DTRACE_INT5(name, type1, arg1, type2, arg2, type3, arg3, type4, arg4, type5, arg5) do {} while(0)
303#define	DTRACE_TMR3(name, type1, arg1, type2, arg2, type3, arg3) do {} while(0)
304
305#define DTRACE_VM(name) do {} while(0)
306#define DTRACE_VM1(name, type1, arg1) do {} while(0)
307#define DTRACE_VM2(name, type1, arg1, type2, arg2) do {} while(0)
308#define DTRACE_VM3(name, type1, arg1, type2, arg2, type3, arg3) do {} while(0)
309#define DTRACE_VM4(name, type1, arg1, type2, arg2, type3, arg3, type4, arg4) do {} while(0)
310#define DTRACE_IP(name) do {} while(0)
311#define DTRACE_IP1(name, type1, arg1) do {} while(0)
312#define DTRACE_IP2(name, type1, arg1, type2, arg2) do {} while(0)
313#define DTRACE_IP3(name, type1, arg1, type2, arg2, type3, arg3) do {} while(0)
314#define DTRACE_IP4(name, type1, arg1, type2, arg2, type3, arg3, type4, arg4) do {} while(0)
315#define DTRACE_IP5(name, type1, arg1, type2, arg2, type3, arg3, type4, arg4, type5, arg5) do {} while(0)
316#define DTRACE_IP6(name, type1, arg1, type2, arg2, type3, arg3, type4, arg4, type5, arg5, type6, arg6) do {} while(0)
317#define DTRACE_IP7(name, type1, arg1, type2, arg2, type3, arg3, type4, arg4, type5, arg5, \
318	type6, arg6, type7, arg7) do {} while(0)
319
320#define DTRACE_TCP(name) do {} while(0)
321#define DTRACE_TCP1(name, type1, arg1) do {} while(0)
322#define DTRACE_TCP2(name, type1, arg1, type2, arg2) do {} while(0)
323#define DTRACE_TCP3(name, type1, arg1, type2, arg2, type3, arg3) do {} while(0)
324#define DTRACE_TCP4(name, type1, arg1, type2, arg2, type3, arg3, type4, arg4) do {} while(0)
325#define DTRACE_TCP5(name, type1, arg1, type2, arg2, type3, arg3, type4, arg4, type5, arg5) do {} while(0)
326
327#endif /* CONFIG_DTRACE */
328
329#endif /* KERNEL */
330
331
332
333#endif	/* _MACH_SDT_H */
334