1 /* $NetBSD: sdt.h,v 1.22 2023/04/30 08:46:33 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) do \ 230 { \ 231 if (__predict_false(sdt_##prov##_##mod##_##func##_##name->id)) \ 232 (*sdt_probe_func)(sdt_##prov##_##mod##_##func##_##name->id, \ 233 (uintptr_t)(arg0), (uintptr_t)(arg1), (uintptr_t)(arg2), \ 234 (uintptr_t)(arg3), (uintptr_t)(arg4)); \ 235 } while (0) 236 237 #define SDT_PROBE_ARGTYPE(prov, mod, func, name, num, type, xtype) \ 238 static struct sdt_argtype sdta_##prov##_##mod##_##func##_##name##num[1]\ 239 = { \ 240 { \ 241 num, type, xtype, { NULL, NULL }, \ 242 sdt_##prov##_##mod##_##func##_##name, \ 243 } \ 244 }; \ 245 __link_set_add_data(sdt_argtypes_set, \ 246 sdta_##prov##_##mod##_##func##_##name##num); 247 248 #define SDT_PROBE_DEFINE0(prov, mod, func, name) \ 249 SDT_PROBE_DEFINE(prov, mod, func, name) 250 251 #define SDT_PROBE_DEFINE1(prov, mod, func, name, arg0) \ 252 SDT_PROBE_DEFINE(prov, mod, func, name); \ 253 SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL) 254 255 #define SDT_PROBE_DEFINE2(prov, mod, func, name, arg0, arg1) \ 256 SDT_PROBE_DEFINE(prov, mod, func, name); \ 257 SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL); \ 258 SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL) 259 260 #define SDT_PROBE_DEFINE3(prov, mod, func, name, arg0, arg1, arg2)\ 261 SDT_PROBE_DEFINE(prov, mod, func, name); \ 262 SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL); \ 263 SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL); \ 264 SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, NULL) 265 266 #define SDT_PROBE_DEFINE4(prov, mod, func, name, arg0, arg1, arg2, arg3) \ 267 SDT_PROBE_DEFINE(prov, mod, func, name); \ 268 SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL); \ 269 SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL); \ 270 SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, NULL); \ 271 SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, NULL) 272 273 #define SDT_PROBE_DEFINE5(prov, mod, func, name, arg0, arg1, arg2, arg3,\ 274 arg4) \ 275 SDT_PROBE_DEFINE(prov, mod, func, name); \ 276 SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL); \ 277 SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL); \ 278 SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, NULL); \ 279 SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, NULL); \ 280 SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, NULL) 281 282 #define SDT_PROBE_DEFINE6(prov, mod, func, name, arg0, arg1, arg2, arg3,\ 283 arg4, arg5) \ 284 SDT_PROBE_DEFINE(prov, mod, func, name); \ 285 SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL); \ 286 SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL); \ 287 SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, NULL); \ 288 SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, NULL); \ 289 SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, NULL); \ 290 SDT_PROBE_ARGTYPE(prov, mod, func, name, 5, arg5, NULL) 291 292 #define SDT_PROBE_DEFINE7(prov, mod, func, name, arg0, arg1, arg2, arg3,\ 293 arg4, arg5, arg6) \ 294 SDT_PROBE_DEFINE(prov, mod, func, name); \ 295 SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL); \ 296 SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL); \ 297 SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, NULL); \ 298 SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, NULL); \ 299 SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, NULL); \ 300 SDT_PROBE_ARGTYPE(prov, mod, func, name, 5, arg5, NULL); \ 301 SDT_PROBE_ARGTYPE(prov, mod, func, name, 6, arg6, NULL) 302 303 #define SDT_PROBE_DEFINE0_XLATE(prov, mod, func, name) \ 304 SDT_PROBE_DEFINE(prov, mod, func, name) 305 306 #define SDT_PROBE_DEFINE1_XLATE(prov, mod, func, name, arg0, xarg0) \ 307 SDT_PROBE_DEFINE(prov, mod, func, name); \ 308 SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0) 309 310 #define SDT_PROBE_DEFINE2_XLATE(prov, mod, func, name, arg0, xarg0, \ 311 arg1, xarg1) \ 312 SDT_PROBE_DEFINE(prov, mod, func, name); \ 313 SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0); \ 314 SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1) 315 316 #define SDT_PROBE_DEFINE3_XLATE(prov, mod, func, name, arg0, xarg0, \ 317 arg1, xarg1, arg2, xarg2) \ 318 SDT_PROBE_DEFINE(prov, mod, func, name); \ 319 SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0); \ 320 SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1); \ 321 SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, xarg2) 322 323 #define SDT_PROBE_DEFINE4_XLATE(prov, mod, func, name, arg0, xarg0, \ 324 arg1, xarg1, arg2, xarg2, arg3, xarg3) \ 325 SDT_PROBE_DEFINE(prov, mod, func, name); \ 326 SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0); \ 327 SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1); \ 328 SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, xarg2); \ 329 SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, xarg3) 330 331 #define SDT_PROBE_DEFINE5_XLATE(prov, mod, func, name, arg0, xarg0, \ 332 arg1, xarg1, arg2, xarg2, arg3, xarg3, arg4, xarg4) \ 333 SDT_PROBE_DEFINE(prov, mod, func, name); \ 334 SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0); \ 335 SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1); \ 336 SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, xarg2); \ 337 SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, xarg3); \ 338 SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, xarg4) 339 340 #define SDT_PROBE_DEFINE6_XLATE(prov, mod, func, name, arg0, xarg0, \ 341 arg1, xarg1, arg2, xarg2, arg3, xarg3, arg4, xarg4, arg5, xarg5) \ 342 SDT_PROBE_DEFINE(prov, mod, func, name); \ 343 SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0); \ 344 SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1); \ 345 SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, xarg2); \ 346 SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, xarg3); \ 347 SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, xarg4); \ 348 SDT_PROBE_ARGTYPE(prov, mod, func, name, 5, arg5, xarg5) 349 350 #define SDT_PROBE_DEFINE7_XLATE(prov, mod, func, name, arg0, xarg0, \ 351 arg1, xarg1, arg2, xarg2, arg3, xarg3, arg4, xarg4, arg5, xarg5, arg6, \ 352 xarg6) \ 353 SDT_PROBE_DEFINE(prov, mod, func, name); \ 354 SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0); \ 355 SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1); \ 356 SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, xarg2); \ 357 SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, xarg3); \ 358 SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, xarg4); \ 359 SDT_PROBE_ARGTYPE(prov, mod, func, name, 5, arg5, xarg5); \ 360 SDT_PROBE_ARGTYPE(prov, mod, func, name, 6, arg6, xarg6) 361 362 #define SDT_PROBE0(prov, mod, func, name) \ 363 SDT_PROBE(prov, mod, func, name, 0, 0, 0, 0, 0) 364 #define SDT_PROBE1(prov, mod, func, name, arg0) \ 365 SDT_PROBE(prov, mod, func, name, arg0, 0, 0, 0, 0) 366 #define SDT_PROBE2(prov, mod, func, name, arg0, arg1) \ 367 SDT_PROBE(prov, mod, func, name, arg0, arg1, 0, 0, 0) 368 #define SDT_PROBE3(prov, mod, func, name, arg0, arg1, arg2) \ 369 SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, 0, 0) 370 #define SDT_PROBE4(prov, mod, func, name, arg0, arg1, arg2, arg3) \ 371 SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, 0) 372 #define SDT_PROBE5(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4) \ 373 SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4) 374 /* XXX: void * function casts */ 375 #define SDT_PROBE6(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4, \ 376 arg5) do \ 377 { \ 378 if (__predict_false(sdt_##prov##_##mod##_##func##_##name->id)) \ 379 __FPTRCAST(void (*)(uint32_t, uintptr_t, uintptr_t, \ 380 uintptr_t, uintptr_t, uintptr_t, uintptr_t), \ 381 sdt_probe_func)( \ 382 sdt_##prov##_##mod##_##func##_##name->id, \ 383 (uintptr_t)(arg0), (uintptr_t)(arg1), \ 384 (uintptr_t)(arg2), (uintptr_t)(arg3), \ 385 (uintptr_t)(arg4), (uintptr_t)(arg5)); \ 386 } while (0) 387 #define SDT_PROBE7(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4, arg5, \ 388 arg6) do \ 389 { \ 390 if (__predict_false(sdt_##prov##_##mod##_##func##_##name->id)) \ 391 __FPTRCAST(void (*)(uint32_t, uintptr_t, uintptr_t, \ 392 uintptr_t, uintptr_t, uintptr_t, uintptr_t, \ 393 uintptr_t), sdt_probe_func)( \ 394 sdt_##prov##_##mod##_##func##_##name->id, \ 395 (uintptr_t)(arg0), (uintptr_t)(arg1), \ 396 (uintptr_t)(arg2), (uintptr_t)(arg3), \ 397 (uintptr_t)(arg4), (uintptr_t)(arg5), \ 398 (uintptr_t)(arg6)); \ 399 } while (0) 400 401 #define DTRACE_PROBE_IMPL_START(name, arg0, arg1, arg2, arg3, arg4) do \ 402 { \ 403 static SDT_PROBE_DEFINE(sdt, , , name); \ 404 SDT_PROBE(sdt, , , name, arg0, arg1, arg2, arg3, arg4) 405 #define DTRACE_PROBE_IMPL_END \ 406 } while (0) 407 408 #define DTRACE_PROBE(name) \ 409 DTRACE_PROBE_IMPL_START(name, 0, 0, 0, 0, 0); \ 410 DTRACE_PROBE_IMPL_END 411 412 #define DTRACE_PROBE1(name, type0, arg0) \ 413 DTRACE_PROBE_IMPL_START(name, arg0, 0, 0, 0, 0); \ 414 SDT_PROBE_ARGTYPE(sdt, , , name, 0, #type0, NULL); \ 415 DTRACE_PROBE_IMPL_END 416 417 #define DTRACE_PROBE2(name, type0, arg0, type1, arg1) \ 418 DTRACE_PROBE_IMPL_START(name, arg0, arg1, 0, 0, 0); \ 419 SDT_PROBE_ARGTYPE(sdt, , , name, 0, #type0, NULL); \ 420 SDT_PROBE_ARGTYPE(sdt, , , name, 1, #type1, NULL); \ 421 DTRACE_PROBE_IMPL_END 422 423 #define DTRACE_PROBE3(name, type0, arg0, type1, arg1, type2, arg2) \ 424 DTRACE_PROBE_IMPL_START(name, arg0, arg1, arg2, 0, 0); \ 425 SDT_PROBE_ARGTYPE(sdt, , , name, 0, #type0, NULL); \ 426 SDT_PROBE_ARGTYPE(sdt, , , name, 1, #type1, NULL); \ 427 SDT_PROBE_ARGTYPE(sdt, , , name, 2, #type2, NULL); \ 428 DTRACE_PROBE_IMPL_END 429 430 #define DTRACE_PROBE4(name, type0, arg0, type1, arg1, type2, arg2, type3, \ 431 arg3) \ 432 DTRACE_PROBE_IMPL_START(name, arg0, arg1, arg2, arg3, 0); \ 433 SDT_PROBE_ARGTYPE(sdt, , , name, 0, #type0, NULL); \ 434 SDT_PROBE_ARGTYPE(sdt, , , name, 1, #type1, NULL); \ 435 SDT_PROBE_ARGTYPE(sdt, , , name, 2, #type2, NULL); \ 436 SDT_PROBE_ARGTYPE(sdt, , , name, 3, #type3, NULL); \ 437 DTRACE_PROBE_IMPL_END 438 439 #define DTRACE_PROBE5(name, type0, arg0, type1, arg1, type2, arg2, type3, \ 440 arg3, type4, arg4) \ 441 DTRACE_PROBE_IMPL_START(name, arg0, arg1, arg2, arg3, arg4); \ 442 SDT_PROBE_ARGTYPE(sdt, , , name, 0, #type0, NULL); \ 443 SDT_PROBE_ARGTYPE(sdt, , , name, 1, #type1, NULL); \ 444 SDT_PROBE_ARGTYPE(sdt, , , name, 2, #type2, NULL); \ 445 SDT_PROBE_ARGTYPE(sdt, , , name, 3, #type3, NULL); \ 446 SDT_PROBE_ARGTYPE(sdt, , , name, 4, #type4, NULL); \ 447 DTRACE_PROBE_IMPL_END 448 449 #endif /* KDTRACE_HOOKS */ 450 451 /* 452 * This type definition must match that of dtrace_probe. It is defined this 453 * way to avoid having to rely on CDDL code. 454 */ 455 typedef void (*sdt_probe_func_t)(uint32_t, uintptr_t arg0, uintptr_t arg1, 456 uintptr_t arg2, uintptr_t arg3, uintptr_t arg4); 457 458 /* 459 * The 'sdt' provider will set it to dtrace_probe when it loads. 460 */ 461 extern sdt_probe_func_t sdt_probe_func; 462 463 struct sdt_probe; 464 struct sdt_provider; 465 struct linker_file; 466 467 struct sdt_argtype { 468 int ndx; /* Argument index. */ 469 const char *type; /* Argument type string. */ 470 const char *xtype; /* Translated argument type. */ 471 TAILQ_ENTRY(sdt_argtype) 472 argtype_entry; /* Argument type list entry. */ 473 struct sdt_probe *probe; /* Ptr to the probe structure. */ 474 }; 475 476 struct sdt_probe { 477 int version; /* Set to sizeof(struct sdt_probe). */ 478 struct sdt_provider *prov; /* Ptr to the provider structure. */ 479 TAILQ_ENTRY(sdt_probe) 480 probe_entry; /* SDT probe list entry. */ 481 TAILQ_HEAD(argtype_list_head, sdt_argtype) argtype_list; 482 const char *mod; 483 const char *func; 484 const char *name; 485 id_t id; /* DTrace probe ID. */ 486 int n_args; /* Number of arguments. */ 487 struct linker_file *sdtp_lf; /* Module in which we're defined. */ 488 }; 489 490 struct sdt_provider { 491 const char *name; /* Provider name. */ 492 TAILQ_ENTRY(sdt_provider) 493 prov_entry; /* SDT provider list entry. */ 494 uintptr_t id; /* DTrace provider ID. */ 495 int sdt_refs; /* Number of module references. */ 496 }; 497 498 void sdt_probe_stub(uint32_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, 499 uintptr_t); 500 501 SDT_PROVIDER_DECLARE(sdt); 502 503 void sdt_init(void *); 504 void sdt_exit(void); 505 506 507 #endif /* _KERNEL */ 508 509 #endif /* _SYS_SDT_H */ 510