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