1/* $NetBSD: sdt.h,v 1.24 2024/06/29 13:03:02 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) \
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 */
452typedef 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 */
458extern sdt_probe_func_t sdt_probe_func;
459
460struct sdt_probe;
461struct sdt_provider;
462struct linker_file;
463
464struct 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
473struct 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
487struct 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
495void sdt_probe_stub(uint32_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t,
496 uintptr_t);
497
498SDT_PROVIDER_DECLARE(sdt);
499
500void sdt_init(void *);
501void sdt_exit(void);
502
503#ifdef KDTRACE_HOOKS
504SDT_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 */