On Tue, Jul 12, 2011, Otto Moerbeek wrote: > The diff below implements utrace(2), a syscall to introduce data into > a ktrace stream from a userland program.
> Index: sys/kern/kern_ktrace.c > =================================================================== > RCS file: /cvs/src/sys/kern/kern_ktrace.c,v > retrieving revision 1.54 > diff -u -p -r1.54 kern_ktrace.c > --- sys/kern/kern_ktrace.c 11 Jul 2011 15:40:47 -0000 1.54 > +++ sys/kern/kern_ktrace.c 12 Jul 2011 14:59:03 -0000 > +int > +ktruser(struct proc *p, const char *id, void *addr, size_t len, int ustr) > +{ > + struct ktr_header kth; > + struct ktr_user *ktp; > + int error; > + > + if (!KTRPOINT(p, KTR_USER)) > + return (0); > + if (len > KTR_USER_MAXLEN) > + return ENOSPC; > + > + p->p_traceflag |= KTRFAC_ACTIVE; > + ktrinitheader(&kth, p, KTR_USER); > + ktp = malloc(sizeof(*ktp) + len, M_TEMP, M_WAITOK); > + bzero(ktp->ktr_id, KTR_USER_MAXIDLEN); > + if (ustr) { > + error = copyinstr(id, ktp->ktr_id, KTR_USER_MAXIDLEN, NULL); > + if (error) > + goto out; > + } else > + strlcpy(ktp->ktr_id, id, KTR_USER_MAXIDLEN); There is only one caller, so we don't need the ustr argument. > +sys_utrace(struct proc *curp, void *v, register_t *retval) > +{ > + struct sys_utrace_args /* { > + syscallarg(const char *) label; > + syscallarg(void) addr; missing * here.