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 */ 452 typedef 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 */ 458 extern sdt_probe_func_t sdt_probe_func; 459 460 struct sdt_probe; 461 struct sdt_provider; 462 struct linker_file; 463 464 struct 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 473 struct 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 487 struct 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 495 void sdt_probe_stub(uint32_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, 496 uintptr_t); 497 498 SDT_PROVIDER_DECLARE(sdt); 499 500 void sdt_init(void *); 501 void sdt_exit(void); 502 503 #ifdef KDTRACE_HOOKS 504 SDT_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 */ 513