+utrace(curp, uap, retval)
+ struct proc *curp;
+ register struct utrace_args *uap;
+ register_t *retval;
+{
+#if KTRACE
+ struct ktr_header *kth;
+ struct proc *p = current_proc(); /* XXX */
+ register caddr_t cp;
+
+ if (!KTRPOINT(p, KTR_USER))
+ return (0);
+ if (uap->len > KTR_USER_MAXLEN)
+ return (EINVAL);
+ p->p_traceflag |= KTRFAC_ACTIVE;
+ kth = ktrgetheader(KTR_USER);
+ MALLOC(cp, caddr_t, uap->len, M_KTRACE, M_WAITOK);
+ if (!copyin(uap->addr, cp, uap->len)) {
+ kth->ktr_buf = cp;
+ kth->ktr_len = uap->len;
+ ktrwrite(p->p_tracep, kth, NULL, KERNEL_FUNNEL);
+ }
+ FREE(kth, M_KTRACE);
+ FREE(cp, M_KTRACE);
+ p->p_traceflag &= ~KTRFAC_ACTIVE;
+
+ return (0);
+#else
+ return (ENOSYS);
+#endif
+}
+
+#if KTRACE
+static int