1179063Sjb/*- 2179063Sjb * Copyright 2006-2008 John Birrell <jb@FreeBSD.org> 3179063Sjb * 4179063Sjb * Redistribution and use in source and binary forms, with or without 5179063Sjb * modification, are permitted provided that the following conditions 6179063Sjb * are met: 7179063Sjb * 1. Redistributions of source code must retain the above copyright 8179063Sjb * notice, this list of conditions and the following disclaimer. 9179063Sjb * 2. Redistributions in binary form must reproduce the above copyright 10179063Sjb * notice, this list of conditions and the following disclaimer in the 11179063Sjb * documentation and/or other materials provided with the distribution. 12179063Sjb * 13179063Sjb * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 14179063Sjb * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15179063Sjb * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16179063Sjb * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 17179063Sjb * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18179063Sjb * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19179063Sjb * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20179063Sjb * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21179063Sjb * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22179063Sjb * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23179063Sjb * SUCH DAMAGE. 24179063Sjb * 25179063Sjb * $FreeBSD: releng/10.3/sys/sys/sdt.h 289795 2015-10-23 07:37:44Z avg $ 26179063Sjb * 27179063Sjb * Statically Defined Tracing (SDT) definitions. 28179063Sjb * 29179063Sjb */ 30179063Sjb 31179063Sjb#ifndef _SYS_SDT_H 32179063Sjb#define _SYS_SDT_H 33179063Sjb 34179063Sjb#ifndef _KERNEL 35179063Sjb 36211616Srpaulo#define _DTRACE_VERSION 1 37179063Sjb 38211616Srpaulo#define DTRACE_PROBE(prov, name) { \ 39211616Srpaulo extern void __dtrace_##prov##___##name(void); \ 40211616Srpaulo __dtrace_##prov##___##name(); \ 41211616Srpaulo} 42179063Sjb 43211616Srpaulo#define DTRACE_PROBE1(prov, name, arg1) { \ 44211616Srpaulo extern void __dtrace_##prov##___##name(unsigned long); \ 45211616Srpaulo __dtrace_##prov##___##name((unsigned long)arg1); \ 46211616Srpaulo} 47211616Srpaulo 48211616Srpaulo#define DTRACE_PROBE2(prov, name, arg1, arg2) { \ 49211616Srpaulo extern void __dtrace_##prov##___##name(unsigned long, \ 50211616Srpaulo unsigned long); \ 51211616Srpaulo __dtrace_##prov##___##name((unsigned long)arg1, \ 52211616Srpaulo (unsigned long)arg2); \ 53211616Srpaulo} 54211616Srpaulo 55211616Srpaulo#define DTRACE_PROBE3(prov, name, arg1, arg2, arg3) { \ 56211616Srpaulo extern void __dtrace_##prov##___##name(unsigned long, \ 57211616Srpaulo unsigned long, unsigned long); \ 58211616Srpaulo __dtrace_##prov##___##name((unsigned long)arg1, \ 59211616Srpaulo (unsigned long)arg2, (unsigned long)arg3); \ 60211616Srpaulo} 61211616Srpaulo 62211616Srpaulo#define DTRACE_PROBE4(prov, name, arg1, arg2, arg3, arg4) { \ 63211616Srpaulo extern void __dtrace_##prov##___##name(unsigned long, \ 64211616Srpaulo unsigned long, unsigned long, unsigned long); \ 65211616Srpaulo __dtrace_##prov##___##name((unsigned long)arg1, \ 66211616Srpaulo (unsigned long)arg2, (unsigned long)arg3, \ 67211616Srpaulo (unsigned long)arg4); \ 68211616Srpaulo} 69211616Srpaulo 70211616Srpaulo#define DTRACE_PROBE5(prov, name, arg1, arg2, arg3, arg4, arg5) { \ 71211616Srpaulo extern void __dtrace_##prov##___##name(unsigned long, \ 72211616Srpaulo unsigned long, unsigned long, unsigned long, unsigned long);\ 73211616Srpaulo __dtrace_##prov##___##name((unsigned long)arg1, \ 74211616Srpaulo (unsigned long)arg2, (unsigned long)arg3, \ 75211616Srpaulo (unsigned long)arg4, (unsigned long)arg5); \ 76211616Srpaulo} 77211616Srpaulo 78211616Srpaulo#else /* _KERNEL */ 79211616Srpaulo 80254268Smarkj#include <sys/cdefs.h> 81254268Smarkj#include <sys/linker_set.h> 82254268Smarkj 83179063Sjb#ifndef KDTRACE_HOOKS 84179063Sjb 85179063Sjb#define SDT_PROVIDER_DEFINE(prov) 86179063Sjb#define SDT_PROVIDER_DECLARE(prov) 87260817Savg#define SDT_PROBE_DEFINE(prov, mod, func, name) 88179063Sjb#define SDT_PROBE_DECLARE(prov, mod, func, name) 89179063Sjb#define SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4) 90254468Smarkj#define SDT_PROBE_ARGTYPE(prov, mod, func, name, num, type, xtype) 91179063Sjb 92260817Savg#define SDT_PROBE_DEFINE0(prov, mod, func, name) 93260817Savg#define SDT_PROBE_DEFINE1(prov, mod, func, name, arg0) 94260817Savg#define SDT_PROBE_DEFINE2(prov, mod, func, name, arg0, arg1) 95260817Savg#define SDT_PROBE_DEFINE3(prov, mod, func, name, arg0, arg1, arg2) 96260817Savg#define SDT_PROBE_DEFINE4(prov, mod, func, name, arg0, arg1, arg2, arg3) 97260817Savg#define SDT_PROBE_DEFINE5(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4) 98260817Savg#define SDT_PROBE_DEFINE6(prov, mod, func, name, arg0, arg1, arg2, \ 99251166Smarkj arg3, arg4, arg5) 100260817Savg#define SDT_PROBE_DEFINE7(prov, mod, func, name, arg0, arg1, arg2, \ 101251166Smarkj arg3, arg4, arg5, arg6) 102189311Srwatson 103235459Srstone#define SDT_PROBE0(prov, mod, func, name) 104199883Sbz#define SDT_PROBE1(prov, mod, func, name, arg0) 105199883Sbz#define SDT_PROBE2(prov, mod, func, name, arg0, arg1) 106199883Sbz#define SDT_PROBE3(prov, mod, func, name, arg0, arg1, arg2) 107199883Sbz#define SDT_PROBE4(prov, mod, func, name, arg0, arg1, arg2, arg3) 108199883Sbz#define SDT_PROBE5(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4) 109251166Smarkj#define SDT_PROBE6(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4, arg5) 110251166Smarkj#define SDT_PROBE7(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4, arg5, \ 111251166Smarkj arg6) 112199883Sbz 113260817Savg#define SDT_PROBE_DEFINE0_XLATE(prov, mod, func, name) 114260817Savg#define SDT_PROBE_DEFINE1_XLATE(prov, mod, func, name, arg0, xarg0) 115260817Savg#define SDT_PROBE_DEFINE2_XLATE(prov, mod, func, name, arg0, xarg0, \ 116254468Smarkj arg1, xarg1) 117260817Savg#define SDT_PROBE_DEFINE3_XLATE(prov, mod, func, name, arg0, xarg0, \ 118254468Smarkj arg1, xarg1, arg2, xarg2) 119260817Savg#define SDT_PROBE_DEFINE4_XLATE(prov, mod, func, name, arg0, xarg0, \ 120254468Smarkj arg1, xarg1, arg2, xarg2, arg3, xarg3) 121260817Savg#define SDT_PROBE_DEFINE5_XLATE(prov, mod, func, name, arg0, xarg0, \ 122254468Smarkj arg1, xarg1, arg2, xarg2, arg3, xarg3, arg4, xarg4) 123260817Savg#define SDT_PROBE_DEFINE6_XLATE(prov, mod, func, name, arg0, xarg0, \ 124254468Smarkj arg1, xarg1, arg2, xarg2, arg3, xarg3, arg4, xarg4, arg5, xarg5) 125260817Savg#define SDT_PROBE_DEFINE7_XLATE(prov, mod, func, name, arg0, xarg0, \ 126254468Smarkj arg1, xarg1, arg2, xarg2, arg3, xarg3, arg4, xarg4, arg5, xarg5, arg6, \ 127254468Smarkj xarg6) 128254468Smarkj 129262058Savg#define DTRACE_PROBE(name) 130262058Savg#define DTRACE_PROBE1(name, type0, arg0) 131262058Savg#define DTRACE_PROBE2(name, type0, arg0, type1, arg1) 132262058Savg#define DTRACE_PROBE3(name, type0, arg0, type1, arg1, type2, arg2) 133262058Savg#define DTRACE_PROBE4(name, type0, arg0, type1, arg1, type2, arg2, type3, arg3) 134262058Savg#define DTRACE_PROBE5(name, type0, arg0, type1, arg1, type2, arg2, type3, arg3,\ 135262058Savg type4, arg4) 136262058Savg 137179063Sjb#else 138179063Sjb 139254268SmarkjSET_DECLARE(sdt_providers_set, struct sdt_provider); 140254268SmarkjSET_DECLARE(sdt_probes_set, struct sdt_probe); 141254268SmarkjSET_DECLARE(sdt_argtypes_set, struct sdt_argtype); 142179063Sjb 143179063Sjb#define SDT_PROVIDER_DEFINE(prov) \ 144179063Sjb struct sdt_provider sdt_provider_##prov[1] = { \ 145262040Savg { #prov, { NULL, NULL }, 0, 0 } \ 146179063Sjb }; \ 147254268Smarkj DATA_SET(sdt_providers_set, sdt_provider_##prov); 148179063Sjb 149179063Sjb#define SDT_PROVIDER_DECLARE(prov) \ 150179063Sjb extern struct sdt_provider sdt_provider_##prov[1] 151179063Sjb 152260817Savg#define SDT_PROBE_DEFINE(prov, mod, func, name) \ 153179063Sjb struct sdt_probe sdt_##prov##_##mod##_##func##_##name[1] = { \ 154254268Smarkj { sizeof(struct sdt_probe), sdt_provider_##prov, \ 155260817Savg { NULL, NULL }, { NULL, NULL }, #mod, #func, #name, 0, 0, \ 156254268Smarkj NULL } \ 157179063Sjb }; \ 158254268Smarkj DATA_SET(sdt_probes_set, sdt_##prov##_##mod##_##func##_##name); 159179063Sjb 160179063Sjb#define SDT_PROBE_DECLARE(prov, mod, func, name) \ 161179063Sjb extern struct sdt_probe sdt_##prov##_##mod##_##func##_##name[1] 162179063Sjb 163250816Spjd#define SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4) do { \ 164179063Sjb if (sdt_##prov##_##mod##_##func##_##name->id) \ 165179063Sjb (*sdt_probe_func)(sdt_##prov##_##mod##_##func##_##name->id, \ 166179063Sjb (uintptr_t) arg0, (uintptr_t) arg1, (uintptr_t) arg2, \ 167250816Spjd (uintptr_t) arg3, (uintptr_t) arg4); \ 168250816Spjd} while (0) 169179063Sjb 170254468Smarkj#define SDT_PROBE_ARGTYPE(prov, mod, func, name, num, type, xtype) \ 171255776Smarkj static struct sdt_argtype sdta_##prov##_##mod##_##func##_##name##num[1] \ 172254468Smarkj = { { num, type, xtype, { NULL, NULL }, \ 173179063Sjb sdt_##prov##_##mod##_##func##_##name } \ 174179063Sjb }; \ 175255776Smarkj DATA_SET(sdt_argtypes_set, sdta_##prov##_##mod##_##func##_##name##num); 176179063Sjb 177260817Savg#define SDT_PROBE_DEFINE0(prov, mod, func, name) \ 178260817Savg SDT_PROBE_DEFINE(prov, mod, func, name) 179252894Smarkj 180260817Savg#define SDT_PROBE_DEFINE1(prov, mod, func, name, arg0) \ 181260817Savg SDT_PROBE_DEFINE(prov, mod, func, name); \ 182254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL) 183189311Srwatson 184260817Savg#define SDT_PROBE_DEFINE2(prov, mod, func, name, arg0, arg1) \ 185260817Savg SDT_PROBE_DEFINE(prov, mod, func, name); \ 186254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL); \ 187254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL) 188189311Srwatson 189260817Savg#define SDT_PROBE_DEFINE3(prov, mod, func, name, arg0, arg1, arg2)\ 190260817Savg SDT_PROBE_DEFINE(prov, mod, func, name); \ 191254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL); \ 192254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL); \ 193254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, NULL) 194189311Srwatson 195260817Savg#define SDT_PROBE_DEFINE4(prov, mod, func, name, arg0, arg1, arg2, arg3) \ 196260817Savg SDT_PROBE_DEFINE(prov, mod, func, name); \ 197254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL); \ 198254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL); \ 199254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, NULL); \ 200254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, NULL) 201189311Srwatson 202260817Savg#define SDT_PROBE_DEFINE5(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4) \ 203260817Savg SDT_PROBE_DEFINE(prov, mod, func, name); \ 204254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL); \ 205254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL); \ 206254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, NULL); \ 207254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, NULL); \ 208254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, NULL) 209189311Srwatson 210260817Savg#define SDT_PROBE_DEFINE6(prov, mod, func, name, arg0, arg1, arg2, arg3,\ 211251166Smarkj arg4, arg5) \ 212260817Savg SDT_PROBE_DEFINE(prov, mod, func, name); \ 213254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL); \ 214254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL); \ 215254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, NULL); \ 216254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, NULL); \ 217254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, NULL); \ 218254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 5, arg5, NULL) 219251166Smarkj 220260817Savg#define SDT_PROBE_DEFINE7(prov, mod, func, name, arg0, arg1, arg2, arg3,\ 221251166Smarkj arg4, arg5, arg6) \ 222260817Savg SDT_PROBE_DEFINE(prov, mod, func, name); \ 223254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, NULL); \ 224254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, NULL); \ 225254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, NULL); \ 226254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, NULL); \ 227254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, NULL); \ 228254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 5, arg5, NULL); \ 229254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 6, arg6, NULL) 230251166Smarkj 231260817Savg#define SDT_PROBE_DEFINE0_XLATE(prov, mod, func, name) \ 232260817Savg SDT_PROBE_DEFINE(prov, mod, func, name) 233254468Smarkj 234260817Savg#define SDT_PROBE_DEFINE1_XLATE(prov, mod, func, name, arg0, xarg0) \ 235260817Savg SDT_PROBE_DEFINE(prov, mod, func, name); \ 236254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0) 237254468Smarkj 238260817Savg#define SDT_PROBE_DEFINE2_XLATE(prov, mod, func, name, arg0, xarg0, \ 239254468Smarkj arg1, xarg1) \ 240260817Savg SDT_PROBE_DEFINE(prov, mod, func, name); \ 241254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0); \ 242254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1) 243254468Smarkj 244260817Savg#define SDT_PROBE_DEFINE3_XLATE(prov, mod, func, name, arg0, xarg0, \ 245254468Smarkj arg1, xarg1, arg2, xarg2) \ 246260817Savg SDT_PROBE_DEFINE(prov, mod, func, name); \ 247254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0); \ 248254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1); \ 249254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, xarg2) 250254468Smarkj 251260817Savg#define SDT_PROBE_DEFINE4_XLATE(prov, mod, func, name, arg0, xarg0, \ 252254468Smarkj arg1, xarg1, arg2, xarg2, arg3, xarg3) \ 253260817Savg SDT_PROBE_DEFINE(prov, mod, func, name); \ 254254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0); \ 255254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1); \ 256254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, xarg2); \ 257254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, xarg3) 258254468Smarkj 259260817Savg#define SDT_PROBE_DEFINE5_XLATE(prov, mod, func, name, arg0, xarg0, \ 260254468Smarkj arg1, xarg1, arg2, xarg2, arg3, xarg3, arg4, xarg4) \ 261260817Savg SDT_PROBE_DEFINE(prov, mod, func, name); \ 262254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0); \ 263254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1); \ 264254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, xarg2); \ 265254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, xarg3); \ 266254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, xarg4) 267254468Smarkj 268260817Savg#define SDT_PROBE_DEFINE6_XLATE(prov, mod, func, name, arg0, xarg0, \ 269254468Smarkj arg1, xarg1, arg2, xarg2, arg3, xarg3, arg4, xarg4, arg5, xarg5) \ 270260817Savg SDT_PROBE_DEFINE(prov, mod, func, name); \ 271254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0); \ 272254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1); \ 273254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, xarg2); \ 274254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, xarg3); \ 275254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, xarg4); \ 276254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 5, arg5, xarg5) 277254468Smarkj 278260817Savg#define SDT_PROBE_DEFINE7_XLATE(prov, mod, func, name, arg0, xarg0, \ 279254468Smarkj arg1, xarg1, arg2, xarg2, arg3, xarg3, arg4, xarg4, arg5, xarg5, arg6, \ 280254468Smarkj xarg6) \ 281260817Savg SDT_PROBE_DEFINE(prov, mod, func, name); \ 282254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 0, arg0, xarg0); \ 283254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 1, arg1, xarg1); \ 284254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 2, arg2, xarg2); \ 285254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3, xarg3); \ 286254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4, xarg4); \ 287254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 5, arg5, xarg5); \ 288254468Smarkj SDT_PROBE_ARGTYPE(prov, mod, func, name, 6, arg6, xarg6) 289254468Smarkj 290235459Srstone#define SDT_PROBE0(prov, mod, func, name) \ 291235459Srstone SDT_PROBE(prov, mod, func, name, 0, 0, 0, 0, 0) 292199883Sbz#define SDT_PROBE1(prov, mod, func, name, arg0) \ 293199883Sbz SDT_PROBE(prov, mod, func, name, arg0, 0, 0, 0, 0) 294199883Sbz#define SDT_PROBE2(prov, mod, func, name, arg0, arg1) \ 295199883Sbz SDT_PROBE(prov, mod, func, name, arg0, arg1, 0, 0, 0) 296199883Sbz#define SDT_PROBE3(prov, mod, func, name, arg0, arg1, arg2) \ 297199883Sbz SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, 0, 0) 298199883Sbz#define SDT_PROBE4(prov, mod, func, name, arg0, arg1, arg2, arg3) \ 299199883Sbz SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, 0) 300199883Sbz#define SDT_PROBE5(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4) \ 301199883Sbz SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4) 302251166Smarkj#define SDT_PROBE6(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4, arg5) \ 303251166Smarkj do { \ 304251166Smarkj if (sdt_##prov##_##mod##_##func##_##name->id) \ 305251166Smarkj (*(void (*)(uint32_t, uintptr_t, uintptr_t, uintptr_t, \ 306251166Smarkj uintptr_t, uintptr_t, uintptr_t))sdt_probe_func)( \ 307251166Smarkj sdt_##prov##_##mod##_##func##_##name->id, \ 308251166Smarkj (uintptr_t)arg0, (uintptr_t)arg1, (uintptr_t)arg2, \ 309251166Smarkj (uintptr_t)arg3, (uintptr_t)arg4, (uintptr_t)arg5);\ 310251166Smarkj } while (0) 311251166Smarkj#define SDT_PROBE7(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4, arg5, \ 312251166Smarkj arg6) \ 313251166Smarkj do { \ 314251166Smarkj if (sdt_##prov##_##mod##_##func##_##name->id) \ 315251166Smarkj (*(void (*)(uint32_t, uintptr_t, uintptr_t, uintptr_t, \ 316251166Smarkj uintptr_t, uintptr_t, uintptr_t, uintptr_t)) \ 317251166Smarkj sdt_probe_func)( \ 318251166Smarkj sdt_##prov##_##mod##_##func##_##name->id, \ 319251166Smarkj (uintptr_t)arg0, (uintptr_t)arg1, (uintptr_t)arg2, \ 320251166Smarkj (uintptr_t)arg3, (uintptr_t)arg4, (uintptr_t)arg5, \ 321251166Smarkj (uintptr_t)arg6); \ 322251166Smarkj } while (0) 323199883Sbz 324262058Savg#define DTRACE_PROBE_IMPL_START(name, arg0, arg1, arg2, arg3, arg4) do { \ 325262058Savg static SDT_PROBE_DEFINE(sdt, , , name); \ 326262058Savg SDT_PROBE(sdt, , , name, arg0, arg1, arg2, arg3, arg4); 327262058Savg#define DTRACE_PROBE_IMPL_END } while (0) 328262058Savg 329262058Savg#define DTRACE_PROBE(name) \ 330262058Savg DTRACE_PROBE_IMPL_START(name, 0, 0, 0, 0, 0) \ 331262058Savg DTRACE_PROBE_IMPL_END 332262058Savg 333262058Savg#define DTRACE_PROBE1(name, type0, arg0) \ 334262058Savg DTRACE_PROBE_IMPL_START(name, arg0, 0, 0, 0, 0) \ 335262058Savg SDT_PROBE_ARGTYPE(sdt, , , name, 0, #type0, NULL); \ 336262058Savg DTRACE_PROBE_IMPL_END 337262058Savg 338262058Savg#define DTRACE_PROBE2(name, type0, arg0, type1, arg1) \ 339262058Savg DTRACE_PROBE_IMPL_START(name, arg0, arg1, 0, 0, 0) \ 340262058Savg SDT_PROBE_ARGTYPE(sdt, , , name, 0, #type0, NULL); \ 341262058Savg SDT_PROBE_ARGTYPE(sdt, , , name, 1, #type1, NULL); \ 342262058Savg DTRACE_PROBE_IMPL_END 343262058Savg 344262058Savg#define DTRACE_PROBE3(name, type0, arg0, type1, arg1, type2, arg2) \ 345262058Savg DTRACE_PROBE_IMPL_START(name, arg0, arg1, arg2, 0, 0) \ 346262058Savg SDT_PROBE_ARGTYPE(sdt, , , name, 0, #type0, NULL); \ 347262058Savg SDT_PROBE_ARGTYPE(sdt, , , name, 1, #type1, NULL); \ 348262058Savg SDT_PROBE_ARGTYPE(sdt, , , name, 2, #type2, NULL); \ 349262058Savg DTRACE_PROBE_IMPL_END 350262058Savg 351262058Savg#define DTRACE_PROBE4(name, type0, arg0, type1, arg1, type2, arg2, type3, arg3) \ 352262058Savg DTRACE_PROBE_IMPL_START(name, arg0, arg1, arg2, arg3, 0) \ 353262058Savg SDT_PROBE_ARGTYPE(sdt, , , name, 0, #type0, NULL); \ 354262058Savg SDT_PROBE_ARGTYPE(sdt, , , name, 1, #type1, NULL); \ 355262058Savg SDT_PROBE_ARGTYPE(sdt, , , name, 2, #type2, NULL); \ 356262058Savg SDT_PROBE_ARGTYPE(sdt, , , name, 3, #type3, NULL); \ 357262058Savg DTRACE_PROBE_IMPL_END 358262058Savg 359262058Savg#define DTRACE_PROBE5(name, type0, arg0, type1, arg1, type2, arg2, type3, arg3, \ 360262058Savg type4, arg4) \ 361262058Savg DTRACE_PROBE_IMPL_START(name, arg0, arg1, arg2, arg3, arg4) \ 362262058Savg SDT_PROBE_ARGTYPE(sdt, , , name, 0, #type0, NULL); \ 363262058Savg SDT_PROBE_ARGTYPE(sdt, , , name, 1, #type1, NULL); \ 364262058Savg SDT_PROBE_ARGTYPE(sdt, , , name, 2, #type2, NULL); \ 365262058Savg SDT_PROBE_ARGTYPE(sdt, , , name, 3, #type3, NULL); \ 366262058Savg SDT_PROBE_ARGTYPE(sdt, , , name, 4, #type4, NULL); \ 367262058Savg DTRACE_PROBE_IMPL_END 368262058Savg 369254268Smarkj#endif /* KDTRACE_HOOKS */ 370179063Sjb 371254268Smarkj/* 372254268Smarkj * This type definition must match that of dtrace_probe. It is defined this 373254268Smarkj * way to avoid having to rely on CDDL code. 374254268Smarkj */ 375254268Smarkjtypedef void (*sdt_probe_func_t)(uint32_t, uintptr_t arg0, uintptr_t arg1, 376254268Smarkj uintptr_t arg2, uintptr_t arg3, uintptr_t arg4); 377179063Sjb 378254268Smarkj/* 379254268Smarkj * The 'sdt' provider will set it to dtrace_probe when it loads. 380254268Smarkj */ 381254268Smarkjextern sdt_probe_func_t sdt_probe_func; 382233552Srstone 383254268Smarkjstruct sdt_probe; 384254268Smarkjstruct sdt_provider; 385254268Smarkjstruct linker_file; 386179063Sjb 387254268Smarkjstruct sdt_argtype { 388254468Smarkj int ndx; /* Argument index. */ 389254468Smarkj const char *type; /* Argument type string. */ 390254468Smarkj const char *xtype; /* Translated argument type. */ 391254268Smarkj TAILQ_ENTRY(sdt_argtype) 392254268Smarkj argtype_entry; /* Argument type list entry. */ 393254468Smarkj struct sdt_probe *probe; /* Ptr to the probe structure. */ 394254268Smarkj}; 395254268Smarkj 396254268Smarkjstruct sdt_probe { 397254268Smarkj int version; /* Set to sizeof(struct sdt_probe). */ 398254268Smarkj struct sdt_provider *prov; /* Ptr to the provider structure. */ 399254268Smarkj TAILQ_ENTRY(sdt_probe) 400254268Smarkj probe_entry; /* SDT probe list entry. */ 401289795Savg TAILQ_HEAD(, sdt_argtype) argtype_list; 402254268Smarkj const char *mod; 403254268Smarkj const char *func; 404254268Smarkj const char *name; 405254268Smarkj id_t id; /* DTrace probe ID. */ 406254268Smarkj int n_args; /* Number of arguments. */ 407254268Smarkj struct linker_file *sdtp_lf; /* Module in which we're defined. */ 408254268Smarkj}; 409254268Smarkj 410254268Smarkjstruct sdt_provider { 411254268Smarkj char *name; /* Provider name. */ 412254268Smarkj TAILQ_ENTRY(sdt_provider) 413254268Smarkj prov_entry; /* SDT provider list entry. */ 414254268Smarkj uintptr_t id; /* DTrace provider ID. */ 415254268Smarkj int sdt_refs; /* Number of module references. */ 416254268Smarkj}; 417254268Smarkj 418254268Smarkjvoid sdt_probe_stub(uint32_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, 419254268Smarkj uintptr_t); 420254268Smarkj 421262058SavgSDT_PROVIDER_DECLARE(sdt); 422262058Savg 423179063Sjb#endif /* _KERNEL */ 424179063Sjb 425179063Sjb#endif /* _SYS_SDT_H */ 426