diff --git a/sys/cddl/dev/dtrace/dtrace_test.c b/sys/cddl/dev/dtrace/dtrace_test.c --- a/sys/cddl/dev/dtrace/dtrace_test.c +++ b/sys/cddl/dev/dtrace/dtrace_test.c @@ -68,7 +68,9 @@ else if (val == 0) return (0); +#if 0 SDT_PROBE7(test, , , sdttest, 1, 2, 3, 4, 5, 6, 7); +#endif return (error); } diff --git a/sys/kern/kern_sdt.c b/sys/kern/kern_sdt.c --- a/sys/kern/kern_sdt.c +++ b/sys/kern/kern_sdt.c @@ -52,3 +52,15 @@ printf("sdt_probe_stub: unexpectedly called\n"); kdb_backtrace(); } + +void +sdt_probe(uint32_t id, uintptr_t arg0, uintptr_t arg1, + uintptr_t arg2, uintptr_t arg3, uintptr_t arg4) +{ +} + +void +sdt_probe6(uint32_t id, uintptr_t arg0, uintptr_t arg1, + uintptr_t arg2, uintptr_t arg3, uintptr_t arg4, uintptr_t arg5) +{ +} diff --git a/sys/sys/sdt.h b/sys/sys/sdt.h --- a/sys/sys/sdt.h +++ b/sys/sys/sdt.h @@ -141,6 +141,11 @@ #else +void sdt_probe(uint32_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, + uintptr_t); +void sdt_probe6(uint32_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, + uintptr_t, uintptr_t); + #define __sdt_used SET_DECLARE(sdt_providers_set, struct sdt_provider); @@ -169,14 +174,26 @@ #define SDT_PROBES_ENABLED() __predict_false(sdt_probes_enabled) -#define SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4) do { \ - if (SDT_PROBES_ENABLED()) { \ - if (__predict_false(sdt_##prov##_##mod##_##func##_##name->id)) \ - (*sdt_probe_func)(sdt_##prov##_##mod##_##func##_##name->id, \ - (uintptr_t) arg0, (uintptr_t) arg1, (uintptr_t) arg2, \ - (uintptr_t) arg3, (uintptr_t) arg4); \ - } \ +#define __SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4, c) do {\ + asm goto( \ + "0: nop; nop; nop; nop; nop\n" \ + ".pushsection __sdt_probes\n" \ + ".quad 0b\n" \ + ".quad %l0\n" \ + ".popsection\n" \ + : : : : __sdt_probe ## c); \ + if (0) { \ +__sdt_probe ## c: \ + sdt_probe(sdt_##prov##_##mod##_##func##_##name->id, \ + (uintptr_t)arg0, (uintptr_t)arg1, (uintptr_t)arg2, \ + (uintptr_t)arg3, (uintptr_t)arg4); \ + } \ } while (0) +#define _SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4, c) \ + __SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4, c) +#define SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4) \ + _SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4, \ + __COUNTER__) #define SDT_PROBE_ARGTYPE(prov, mod, func, name, num, type, xtype) \ static struct sdt_argtype sdta_##prov##_##mod##_##func##_##name##num[1] \ @@ -310,15 +327,27 @@ SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, 0) #define SDT_PROBE5(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4) \ SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4) -#define SDT_PROBE6(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4, arg5) \ - do { \ - if (sdt_##prov##_##mod##_##func##_##name->id) \ - (*(void (*)(uint32_t, uintptr_t, uintptr_t, uintptr_t, \ - uintptr_t, uintptr_t, uintptr_t))sdt_probe_func)( \ - sdt_##prov##_##mod##_##func##_##name->id, \ - (uintptr_t)arg0, (uintptr_t)arg1, (uintptr_t)arg2, \ - (uintptr_t)arg3, (uintptr_t)arg4, (uintptr_t)arg5);\ - } while (0) +#define __SDT_PROBE6(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4, arg5, c) do { \ + asm goto( \ + "0: nop; nop; nop; nop; nop\n" \ + ".pushsection __sdt_probes\n" \ + ".quad 0b\n" \ + ".quad %l0\n" \ + ".popsection\n" \ + : : : : __sdt_probe ## c); \ + if (0) { \ +__sdt_probe ## c: \ + sdt_probe6(sdt_##prov##_##mod##_##func##_##name->id, \ + (uintptr_t)arg0, (uintptr_t)arg1, (uintptr_t)arg2, \ + (uintptr_t)arg3, (uintptr_t)arg4, (uintptr_t)arg5); \ + } \ +} while (0) +#define _SDT_PROBE6(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4, arg5, c) \ + __SDT_PROBE6(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4, arg5, c) +#define SDT_PROBE6(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4, arg5) \ + _SDT_PROBE6(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4, arg5, \ + __COUNTER__) +#if 0 #define SDT_PROBE7(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4, arg5, \ arg6) \ do { \ @@ -331,6 +360,7 @@ (uintptr_t)arg3, (uintptr_t)arg4, (uintptr_t)arg5, \ (uintptr_t)arg6); \ } while (0) +#endif #define DTRACE_PROBE_IMPL_START(name, arg0, arg1, arg2, arg3, arg4) do { \ static SDT_PROBE_DEFINE(sdt, , , name); \