+
+static uint64_t
+systrace_getargval(void *arg, dtrace_id_t id, void *parg, int argno, int aframes)
+{
+#pragma unused(arg,id,parg,aframes) /* __APPLE__ */
+ uint64_t val = 0;
+ uint64_t *uargs = NULL;
+
+ uthread_t uthread = (uthread_t)get_bsdthread_info(current_thread());
+
+ if (uthread)
+ uargs = uthread->t_dtrace_syscall_args;
+ if (!uargs)
+ return(0);
+ if (argno < 0 || argno > SYSTRACE_NARGS)
+ return(0);
+
+ DTRACE_CPUFLAG_SET(CPU_DTRACE_NOFAULT);
+ val = uargs[argno];
+ DTRACE_CPUFLAG_CLEAR(CPU_DTRACE_NOFAULT);
+ return (val);
+}
+
+static void
+systrace_getargdesc(void *arg, dtrace_id_t id, void *parg,
+ dtrace_argdesc_t *desc)
+{
+#pragma unused(arg, id)
+ int sysnum = SYSTRACE_SYSNUM(parg);
+ uthread_t uthread = (uthread_t)get_bsdthread_info(current_thread());
+ uint64_t *uargs = NULL;
+
+ if (!uthread) {
+ desc->dtargd_ndx = DTRACE_ARGNONE;
+ return;
+ }
+
+ uargs = uthread->t_dtrace_syscall_args;
+
+ if (SYSTRACE_ISENTRY((uintptr_t)parg)) {
+ systrace_entry_setargdesc(sysnum, desc->dtargd_ndx,
+ desc->dtargd_native, sizeof(desc->dtargd_native));
+ }
+ else {
+ systrace_return_setargdesc(sysnum, desc->dtargd_ndx,
+ desc->dtargd_native, sizeof(desc->dtargd_native));
+ }
+
+ if (desc->dtargd_native[0] == '\0')
+ desc->dtargd_ndx = DTRACE_ARGNONE;
+}
+
+static uint64_t
+machtrace_getarg(void *arg, dtrace_id_t id, void *parg, int argno, int aframes)
+{
+#pragma unused(arg,id,parg,aframes) /* __APPLE__ */
+ uint64_t val = 0;
+ syscall_arg_t *stack = (syscall_arg_t *)NULL;
+
+ uthread_t uthread = (uthread_t)get_bsdthread_info(current_thread());
+
+ if (uthread)
+ stack = (syscall_arg_t *)uthread->t_dtrace_syscall_args;
+
+ if (!stack)
+ return(0);
+
+ DTRACE_CPUFLAG_SET(CPU_DTRACE_NOFAULT);
+ /* dtrace_probe arguments arg0 .. arg4 are 64bits wide */
+ val = (uint64_t)*(stack+argno);
+ DTRACE_CPUFLAG_CLEAR(CPU_DTRACE_NOFAULT);
+ return (val);
+}
+