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 (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 /*
22 * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
23 * Copyright (c) 2013 by Delphix. All rights reserved.
24 * Copyright 2018 Nexenta Systems, Inc. All rights reserved.
25 */
26
27 #ifndef _SYS_SDT_H
28 #define _SYS_SDT_H
29
30 #include <sys/stdint.h>
31
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35
36 #ifndef _KERNEL
37
38 #define DTRACE_PROBE(provider, name) { \
39 extern void __dtrace_##provider##___##name(void); \
40 __dtrace_##provider##___##name(); \
41 }
42
43 #define DTRACE_PROBE1(provider, name, arg1) { \
44 extern void __dtrace_##provider##___##name(unsigned long); \
45 __dtrace_##provider##___##name((unsigned long)arg1); \
46 }
47
48 #define DTRACE_PROBE2(provider, name, arg1, arg2) { \
49 extern void __dtrace_##provider##___##name(unsigned long, \
50 unsigned long); \
51 __dtrace_##provider##___##name((unsigned long)arg1, \
52 (unsigned long)arg2); \
53 }
54
55 #define DTRACE_PROBE3(provider, name, arg1, arg2, arg3) { \
56 extern void __dtrace_##provider##___##name(unsigned long, \
57 unsigned long, unsigned long); \
58 __dtrace_##provider##___##name((unsigned long)arg1, \
59 (unsigned long)arg2, (unsigned long)arg3); \
60 }
61
62 #define DTRACE_PROBE4(provider, name, arg1, arg2, arg3, arg4) { \
63 extern void __dtrace_##provider##___##name(unsigned long, \
64 unsigned long, unsigned long, unsigned long); \
65 __dtrace_##provider##___##name((unsigned long)arg1, \
66 (unsigned long)arg2, (unsigned long)arg3, \
67 (unsigned long)arg4); \
68 }
69
70 #define DTRACE_PROBE5(provider, name, arg1, arg2, arg3, arg4, arg5) { \
71 extern void __dtrace_##provider##___##name(unsigned long, \
72 unsigned long, unsigned long, unsigned long, unsigned long);\
73 __dtrace_##provider##___##name((unsigned long)arg1, \
74 (unsigned long)arg2, (unsigned long)arg3, \
75 (unsigned long)arg4, (unsigned long)arg5); \
76 }
77
78 #else /* _KERNEL */
79
80 #define DTRACE_PROBE(name) { \
81 extern void __dtrace_probe_##name(void); \
82 __dtrace_probe_##name(); \
83 }
84
85 #define DTRACE_PROBE1(name, type1, arg1) { \
86 extern void __dtrace_probe_##name(uintptr_t); \
87 __dtrace_probe_##name((uintptr_t)(arg1)); \
88 }
89
90 #define DTRACE_PROBE2(name, type1, arg1, type2, arg2) { \
91 extern void __dtrace_probe_##name(uintptr_t, uintptr_t); \
92 __dtrace_probe_##name((uintptr_t)(arg1), (uintptr_t)(arg2)); \
93 }
94
95 #define DTRACE_PROBE3(name, type1, arg1, type2, arg2, type3, arg3) { \
96 extern void __dtrace_probe_##name(uintptr_t, uintptr_t, uintptr_t); \
97 __dtrace_probe_##name((uintptr_t)(arg1), (uintptr_t)(arg2), \
98 (uintptr_t)(arg3)); \
99 }
100
101 #define DTRACE_PROBE4(name, type1, arg1, type2, arg2, \
102 type3, arg3, type4, arg4) { \
103 extern void __dtrace_probe_##name(uintptr_t, uintptr_t, \
104 uintptr_t, uintptr_t); \
105 __dtrace_probe_##name((uintptr_t)(arg1), (uintptr_t)(arg2), \
106 (uintptr_t)(arg3), (uintptr_t)(arg4)); \
107 }
108
109 #define DTRACE_PROBE5(name, type1, arg1, type2, arg2, \
110 type3, arg3, type4, arg4, type5, arg5) { \
111 extern void __dtrace_probe_##name(uintptr_t, uintptr_t, \
112 uintptr_t, uintptr_t, uintptr_t); \
113 __dtrace_probe_##name((uintptr_t)(arg1), (uintptr_t)(arg2), \
114 (uintptr_t)(arg3), (uintptr_t)(arg4), (uintptr_t)(arg5)); \
115 }
116
117 #define DTRACE_PROBE6(name, type1, arg1, type2, arg2, \
118 type3, arg3, type4, arg4, type5, arg5, type6, arg6) { \
119 extern void __dtrace_probe_##name(uintptr_t, uintptr_t, \
120 uintptr_t, uintptr_t, uintptr_t, uintptr_t); \
121 __dtrace_probe_##name((uintptr_t)(arg1), (uintptr_t)(arg2), \
122 (uintptr_t)(arg3), (uintptr_t)(arg4), (uintptr_t)(arg5), \
123 (uintptr_t)(arg6)); \
124 }
125
126 #define DTRACE_PROBE7(name, type1, arg1, type2, arg2, type3, arg3, \
127 type4, arg4, type5, arg5, type6, arg6, type7, arg7) { \
128 extern void __dtrace_probe_##name(uintptr_t, uintptr_t, \
129 uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t); \
130 __dtrace_probe_##name((uintptr_t)(arg1), (uintptr_t)(arg2), \
131 (uintptr_t)(arg3), (uintptr_t)(arg4), (uintptr_t)(arg5), \
132 (uintptr_t)(arg6), (uintptr_t)(arg7)); \
133 }
134
135 #define DTRACE_PROBE8(name, type1, arg1, type2, arg2, type3, arg3, \
136 type4, arg4, type5, arg5, type6, arg6, type7, arg7, type8, arg8) { \
137 extern void __dtrace_probe_##name(uintptr_t, uintptr_t, \
138 uintptr_t, uintptr_t, uintptr_t, uintptr_t, \
139 uintptr_t, uintptr_t); \
140 __dtrace_probe_##name((uintptr_t)(arg1), (uintptr_t)(arg2), \
141 (uintptr_t)(arg3), (uintptr_t)(arg4), (uintptr_t)(arg5), \
142 (uintptr_t)(arg6), (uintptr_t)(arg7), (uintptr_t)(arg8)); \
143 }
144
145 #define DTRACE_SCHED(name) \
146 DTRACE_PROBE(__sched_##name);
147
148 #define DTRACE_SCHED1(name, type1, arg1) \
149 DTRACE_PROBE1(__sched_##name, type1, arg1);
150
151 #define DTRACE_SCHED2(name, type1, arg1, type2, arg2) \
152 DTRACE_PROBE2(__sched_##name, type1, arg1, type2, arg2);
153
154 #define DTRACE_SCHED3(name, type1, arg1, type2, arg2, type3, arg3) \
155 DTRACE_PROBE3(__sched_##name, type1, arg1, type2, arg2, type3, arg3);
156
157 #define DTRACE_SCHED4(name, type1, arg1, type2, arg2, \
158 type3, arg3, type4, arg4) \
159 DTRACE_PROBE4(__sched_##name, type1, arg1, type2, arg2, \
160 type3, arg3, type4, arg4);
161
162 #define DTRACE_PROC(name) \
163 DTRACE_PROBE(__proc_##name);
164
165 #define DTRACE_PROC1(name, type1, arg1) \
166 DTRACE_PROBE1(__proc_##name, type1, arg1);
167
168 #define DTRACE_PROC2(name, type1, arg1, type2, arg2) \
169 DTRACE_PROBE2(__proc_##name, type1, arg1, type2, arg2);
170
171 #define DTRACE_PROC3(name, type1, arg1, type2, arg2, type3, arg3) \
172 DTRACE_PROBE3(__proc_##name, type1, arg1, type2, arg2, type3, arg3);
173
174 #define DTRACE_PROC4(name, type1, arg1, type2, arg2, \
175 type3, arg3, type4, arg4) \
176 DTRACE_PROBE4(__proc_##name, type1, arg1, type2, arg2, \
177 type3, arg3, type4, arg4);
178
179 #define DTRACE_IO(name) \
180 DTRACE_PROBE(__io_##name);
181
182 #define DTRACE_IO1(name, type1, arg1) \
183 DTRACE_PROBE1(__io_##name, type1, arg1);
184
185 #define DTRACE_IO2(name, type1, arg1, type2, arg2) \
186 DTRACE_PROBE2(__io_##name, type1, arg1, type2, arg2);
187
188 #define DTRACE_IO3(name, type1, arg1, type2, arg2, type3, arg3) \
189 DTRACE_PROBE3(__io_##name, type1, arg1, type2, arg2, type3, arg3);
190
191 #define DTRACE_IO4(name, type1, arg1, type2, arg2, \
192 type3, arg3, type4, arg4) \
193 DTRACE_PROBE4(__io_##name, type1, arg1, type2, arg2, \
194 type3, arg3, type4, arg4);
195
196 #define DTRACE_ISCSI_2(name, type1, arg1, type2, arg2) \
197 DTRACE_PROBE2(__iscsi_##name, type1, arg1, type2, arg2);
198
199 #define DTRACE_ISCSI_3(name, type1, arg1, type2, arg2, type3, arg3) \
200 DTRACE_PROBE3(__iscsi_##name, type1, arg1, type2, arg2, type3, arg3);
201
202 #define DTRACE_ISCSI_4(name, type1, arg1, type2, arg2, \
203 type3, arg3, type4, arg4) \
204 DTRACE_PROBE4(__iscsi_##name, type1, arg1, type2, arg2, \
205 type3, arg3, type4, arg4);
206
207 #define DTRACE_ISCSI_5(name, type1, arg1, type2, arg2, \
208 type3, arg3, type4, arg4, type5, arg5) \
209 DTRACE_PROBE5(__iscsi_##name, type1, arg1, type2, arg2, \
210 type3, arg3, type4, arg4, type5, arg5);
211
212 #define DTRACE_ISCSI_6(name, type1, arg1, type2, arg2, \
213 type3, arg3, type4, arg4, type5, arg5, type6, arg6) \
214 DTRACE_PROBE6(__iscsi_##name, type1, arg1, type2, arg2, \
215 type3, arg3, type4, arg4, type5, arg5, type6, arg6);
216
217 #define DTRACE_ISCSI_7(name, type1, arg1, type2, arg2, \
218 type3, arg3, type4, arg4, type5, arg5, type6, arg6, type7, arg7) \
219 DTRACE_PROBE7(__iscsi_##name, type1, arg1, type2, arg2, \
220 type3, arg3, type4, arg4, type5, arg5, type6, arg6, \
221 type7, arg7);
222
223 #define DTRACE_ISCSI_8(name, type1, arg1, type2, arg2, \
224 type3, arg3, type4, arg4, type5, arg5, type6, arg6, \
225 type7, arg7, type8, arg8) \
226 DTRACE_PROBE8(__iscsi_##name, type1, arg1, type2, arg2, \
227 type3, arg3, type4, arg4, type5, arg5, type6, arg6, \
228 type7, arg7, type8, arg8);
229
230 #define DTRACE_NFSV3_3(name, type1, arg1, type2, arg2, \
231 type3, arg3) \
232 DTRACE_PROBE3(__nfsv3_##name, type1, arg1, type2, arg2, \
233 type3, arg3);
234
235 #define DTRACE_NFSV3_4(name, type1, arg1, type2, arg2, \
236 type3, arg3, type4, arg4) \
237 DTRACE_PROBE4(__nfsv3_##name, type1, arg1, type2, arg2, \
238 type3, arg3, type4, arg4);
239
240 #define DTRACE_NFSV3_5(name, type1, arg1, type2, arg2, \
241 type3, arg3, type4, arg4, type5, arg5) \
242 DTRACE_PROBE5(__nfsv3_##name, type1, arg1, type2, arg2, \
243 type3, arg3, type4, arg4, type5, arg5);
244
245 #define DTRACE_NFSV4_1(name, type1, arg1) \
246 DTRACE_PROBE1(__nfsv4_##name, type1, arg1);
247
248 #define DTRACE_NFSV4_2(name, type1, arg1, type2, arg2) \
249 DTRACE_PROBE2(__nfsv4_##name, type1, arg1, type2, arg2);
250
251 #define DTRACE_NFSV4_3(name, type1, arg1, type2, arg2, type3, arg3) \
252 DTRACE_PROBE3(__nfsv4_##name, type1, arg1, type2, arg2, type3, arg3);
253
254 /*
255 * The SMB probes are done a little differently from the other probes
256 * in this file for the benefit of the libfksmbsrv USDT provider.
257 * See: lib/smbsrv/libfksmbsrv/common/sys/sdt.h
258 */
259 #define DTRACE_SMB_START(name, type1, arg1) \
260 DTRACE_PROBE1(__smb_##name##__start, type1, arg1);
261 #define DTRACE_SMB_DONE(name, type1, arg1) \
262 DTRACE_PROBE1(__smb_##name##__done, type1, arg1);
263
264 #define DTRACE_SMB2_START(name, type1, arg1) \
265 DTRACE_PROBE1(__smb2_##name##__start, type1, arg1);
266 #define DTRACE_SMB2_DONE(name, type1, arg1) \
267 DTRACE_PROBE1(__smb2_##name##__done, type1, arg1);
268
269 #define DTRACE_IP(name) \
270 DTRACE_PROBE(__ip_##name);
271
272 #define DTRACE_IP1(name, type1, arg1) \
273 DTRACE_PROBE1(__ip_##name, type1, arg1);
274
275 #define DTRACE_IP2(name, type1, arg1, type2, arg2) \
276 DTRACE_PROBE2(__ip_##name, type1, arg1, type2, arg2);
277
278 #define DTRACE_IP3(name, type1, arg1, type2, arg2, type3, arg3) \
279 DTRACE_PROBE3(__ip_##name, type1, arg1, type2, arg2, type3, arg3);
280
281 #define DTRACE_IP4(name, type1, arg1, type2, arg2, \
282 type3, arg3, type4, arg4) \
283 DTRACE_PROBE4(__ip_##name, type1, arg1, type2, arg2, \
284 type3, arg3, type4, arg4);
285
286 #define DTRACE_IP5(name, type1, arg1, type2, arg2, \
287 type3, arg3, type4, arg4, type5, arg5) \
288 DTRACE_PROBE5(__ip_##name, type1, arg1, type2, arg2, \
289 type3, arg3, type4, arg4, type5, arg5);
290
291 #define DTRACE_IP6(name, type1, arg1, type2, arg2, \
292 type3, arg3, type4, arg4, type5, arg5, type6, arg6) \
293 DTRACE_PROBE6(__ip_##name, type1, arg1, type2, arg2, \
294 type3, arg3, type4, arg4, type5, arg5, type6, arg6);
295
296 #define DTRACE_IP7(name, type1, arg1, type2, arg2, type3, arg3, \
297 type4, arg4, type5, arg5, type6, arg6, type7, arg7) \
298 DTRACE_PROBE7(__ip_##name, type1, arg1, type2, arg2, \
299 type3, arg3, type4, arg4, type5, arg5, type6, arg6, \
300 type7, arg7);
301
302 #define DTRACE_TCP(name) \
303 DTRACE_PROBE(__tcp_##name);
304
305 #define DTRACE_TCP1(name, type1, arg1) \
306 DTRACE_PROBE1(__tcp_##name, type1, arg1);
307
308 #define DTRACE_TCP2(name, type1, arg1, type2, arg2) \
309 DTRACE_PROBE2(__tcp_##name, type1, arg1, type2, arg2);
310
311 #define DTRACE_TCP3(name, type1, arg1, type2, arg2, type3, arg3) \
312 DTRACE_PROBE3(__tcp_##name, type1, arg1, type2, arg2, type3, arg3);
313
314 #define DTRACE_TCP4(name, type1, arg1, type2, arg2, \
315 type3, arg3, type4, arg4) \
316 DTRACE_PROBE4(__tcp_##name, type1, arg1, type2, arg2, \
317 type3, arg3, type4, arg4);
318
319 #define DTRACE_TCP5(name, type1, arg1, type2, arg2, \
320 type3, arg3, type4, arg4, type5, arg5) \
321 DTRACE_PROBE5(__tcp_##name, type1, arg1, type2, arg2, \
322 type3, arg3, type4, arg4, type5, arg5);
323
324 #define DTRACE_TCP6(name, type1, arg1, type2, arg2, \
325 type3, arg3, type4, arg4, type5, arg5, type6, arg6) \
326 DTRACE_PROBE6(__tcp_##name, type1, arg1, type2, arg2, \
327 type3, arg3, type4, arg4, type5, arg5, type6, arg6);
328
329 #define DTRACE_UDP(name) \
330 DTRACE_PROBE(__udp_##name);
331
332 #define DTRACE_UDP1(name, type1, arg1) \
333 DTRACE_PROBE1(__udp_##name, type1, arg1);
334
335 #define DTRACE_UDP2(name, type1, arg1, type2, arg2) \
336 DTRACE_PROBE2(__udp_##name, type1, arg1, type2, arg2);
337
338 #define DTRACE_UDP3(name, type1, arg1, type2, arg2, type3, arg3) \
339 DTRACE_PROBE3(__udp_##name, type1, arg1, type2, arg2, type3, arg3);
340
341 #define DTRACE_UDP4(name, type1, arg1, type2, arg2, \
342 type3, arg3, type4, arg4) \
343 DTRACE_PROBE4(__udp_##name, type1, arg1, type2, arg2, \
344 type3, arg3, type4, arg4);
345
346 #define DTRACE_UDP5(name, type1, arg1, type2, arg2, \
347 type3, arg3, type4, arg4, type5, arg5) \
348 DTRACE_PROBE5(__udp_##name, type1, arg1, type2, arg2, \
349 type3, arg3, type4, arg4, type5, arg5);
350
351
352 #define DTRACE_SYSEVENT2(name, type1, arg1, type2, arg2) \
353 DTRACE_PROBE2(__sysevent_##name, type1, arg1, type2, arg2);
354
355 #define DTRACE_XPV(name) \
356 DTRACE_PROBE(__xpv_##name);
357
358 #define DTRACE_XPV1(name, type1, arg1) \
359 DTRACE_PROBE1(__xpv_##name, type1, arg1);
360
361 #define DTRACE_XPV2(name, type1, arg1, type2, arg2) \
362 DTRACE_PROBE2(__xpv_##name, type1, arg1, type2, arg2);
363
364 #define DTRACE_XPV3(name, type1, arg1, type2, arg2, type3, arg3) \
365 DTRACE_PROBE3(__xpv_##name, type1, arg1, type2, arg2, type3, arg3);
366
367 #define DTRACE_XPV4(name, type1, arg1, type2, arg2, type3, arg3, \
368 type4, arg4) \
369 DTRACE_PROBE4(__xpv_##name, type1, arg1, type2, arg2, \
370 type3, arg3, type4, arg4);
371
372 #define DTRACE_FC_1(name, type1, arg1) \
373 DTRACE_PROBE1(__fc_##name, type1, arg1);
374
375 #define DTRACE_FC_2(name, type1, arg1, type2, arg2) \
376 DTRACE_PROBE2(__fc_##name, type1, arg1, type2, arg2);
377
378 #define DTRACE_FC_3(name, type1, arg1, type2, arg2, type3, arg3) \
379 DTRACE_PROBE3(__fc_##name, type1, arg1, type2, arg2, type3, arg3);
380
381 #define DTRACE_FC_4(name, type1, arg1, type2, arg2, type3, arg3, type4, arg4) \
382 DTRACE_PROBE4(__fc_##name, type1, arg1, type2, arg2, type3, arg3, \
383 type4, arg4);
384
385 #define DTRACE_FC_5(name, type1, arg1, type2, arg2, type3, arg3, \
386 type4, arg4, type5, arg5) \
387 DTRACE_PROBE5(__fc_##name, type1, arg1, type2, arg2, type3, arg3, \
388 type4, arg4, type5, arg5);
389
390 #define DTRACE_SRP_1(name, type1, arg1) \
391 DTRACE_PROBE1(__srp_##name, type1, arg1);
392
393 #define DTRACE_SRP_2(name, type1, arg1, type2, arg2) \
394 DTRACE_PROBE2(__srp_##name, type1, arg1, type2, arg2);
395
396 #define DTRACE_SRP_3(name, type1, arg1, type2, arg2, type3, arg3) \
397 DTRACE_PROBE3(__srp_##name, type1, arg1, type2, arg2, type3, arg3);
398
399 #define DTRACE_SRP_4(name, type1, arg1, type2, arg2, type3, arg3, \
400 type4, arg4) \
401 DTRACE_PROBE4(__srp_##name, type1, arg1, type2, arg2, \
402 type3, arg3, type4, arg4);
403
404 #define DTRACE_SRP_5(name, type1, arg1, type2, arg2, type3, arg3, \
405 type4, arg4, type5, arg5) \
406 DTRACE_PROBE5(__srp_##name, type1, arg1, type2, arg2, \
407 type3, arg3, type4, arg4, type5, arg5);
408
409 #define DTRACE_SRP_6(name, type1, arg1, type2, arg2, type3, arg3, \
410 type4, arg4, type5, arg5, type6, arg6) \
411 DTRACE_PROBE6(__srp_##name, type1, arg1, type2, arg2, \
412 type3, arg3, type4, arg4, type5, arg5, type6, arg6);
413
414 #define DTRACE_SRP_7(name, type1, arg1, type2, arg2, type3, arg3, \
415 type4, arg4, type5, arg5, type6, arg6, type7, arg7) \
416 DTRACE_PROBE7(__srp_##name, type1, arg1, type2, arg2, \
417 type3, arg3, type4, arg4, type5, arg5, type6, arg6, type7, arg7);
418
419 #define DTRACE_SRP_8(name, type1, arg1, type2, arg2, type3, arg3, \
420 type4, arg4, type5, arg5, type6, arg6, type7, arg7, type8, arg8) \
421 DTRACE_PROBE8(__srp_##name, type1, arg1, type2, arg2, \
422 type3, arg3, type4, arg4, type5, arg5, type6, arg6, \
423 type7, arg7, type8, arg8);
424
425 /*
426 * The set-error SDT probe is extra static, in that we declare its fake
427 * function literally, rather than with the DTRACE_PROBE1() macro. This is
428 * necessary so that SET_ERROR() can evaluate to a value, which wouldn't
429 * be possible if it required multiple statements (to declare the function
430 * and then call it).
431 *
432 * SET_ERROR() uses the comma operator so that it can be used without much
433 * additional code. For example, "return (EINVAL);" becomes
434 * "return (SET_ERROR(EINVAL));". Note that the argument will be evaluated
435 * twice, so it should not have side effects (e.g. something like:
436 * "return (SET_ERROR(log_error(EINVAL, info)));" would log the error twice).
437 */
438 extern void __dtrace_probe_set__error(uintptr_t);
439 #define SET_ERROR(err) (__dtrace_probe_set__error(err), err)
440
441 #endif /* _KERNEL */
442
443 extern const char *sdt_prefix;
444
445 typedef struct sdt_probedesc {
446 char *sdpd_name; /* name of this probe */
447 unsigned long sdpd_offset; /* offset of call in text */
448 struct sdt_probedesc *sdpd_next; /* next static probe */
449 } sdt_probedesc_t;
450
451 #ifdef __cplusplus
452 }
453 #endif
454
455 #endif /* _SYS_SDT_H */