Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/kern/kern_ktrace.c,v rcsdiff: /ftp/cvs/cvsroot/src/sys/kern/kern_ktrace.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.53 retrieving revision 1.53.2.6 diff -u -p -r1.53 -r1.53.2.6 --- src/sys/kern/kern_ktrace.c 2001/01/05 22:25:26 1.53 +++ src/sys/kern/kern_ktrace.c 2002/07/12 01:40:16 1.53.2.6 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_ktrace.c,v 1.53 2001/01/05 22:25:26 jdolecek Exp $ */ +/* $NetBSD: kern_ktrace.c,v 1.53.2.6 2002/07/12 01:40:16 nathanw Exp $ */ /* * Copyright (c) 1989, 1993 @@ -35,6 +35,9 @@ * @(#)kern_ktrace.c 8.5 (Berkeley) 5/14/95 */ +#include +__KERNEL_RCSID(0, "$NetBSD: kern_ktrace.c,v 1.53.2.6 2002/07/12 01:40:16 nathanw Exp $"); + #include "opt_ktrace.h" #include @@ -50,6 +53,7 @@ #include #include +#include #include #ifdef KTRACE @@ -111,14 +115,18 @@ ktrinitheader(struct ktr_header *kth, st } void -ktrsyscall(struct proc *p, register_t code, size_t argsize, register_t args[]) +ktrsyscall(struct proc *p, register_t code, register_t args[]) { struct ktr_header kth; struct ktr_syscall *ktp; register_t *argp; - size_t len = sizeof(struct ktr_syscall) + argsize; + int argsize; + size_t len; int i; + argsize = p->p_emul->e_sysent[code].sy_narg * sizeof (register_t); + len = sizeof(struct ktr_syscall) + argsize; + p->p_traceflag |= KTRFAC_ACTIVE; ktrinitheader(&kth, p, KTR_SYSCALL); ktp = malloc(len, M_TEMP, M_WAITOK); @@ -211,9 +219,12 @@ ktrgenio(struct proc *p, int fd, enum ui buflen -= sizeof(struct ktr_genio); while (resid > 0) { +#if 0 /* XXX NJWLWP */ KDASSERT(p->p_cpu != NULL); KDASSERT(p->p_cpu == curcpu()); - if (p->p_cpu->ci_schedstate.spc_flags & SPCF_SHOULDYIELD) +#endif + /* XXX NJWLWP */ + if (curcpu()->ci_schedstate.spc_flags & SPCF_SHOULDYIELD) preempt(NULL); cnt = min(iov->iov_len, buflen); @@ -407,7 +418,7 @@ done: */ /* ARGSUSED */ int -sys_fktrace(struct proc *curp, void *v, register_t *retval) +sys_fktrace(struct lwp *l, void *v, register_t *retval) { struct sys_fktrace_args /* { syscallarg(int) fd; @@ -415,12 +426,14 @@ sys_fktrace(struct proc *curp, void *v, syscallarg(int) facs; syscallarg(int) pid; } */ *uap = v; + struct proc *curp = l->l_proc; struct file *fp = NULL; struct filedesc *fdp = curp->p_fd; - if (((u_int)SCARG(uap, fd)) >= fdp->fd_nfiles || - (fp = fdp->fd_ofiles[SCARG(uap, fd)]) == NULL || - (fp->f_flag & FWRITE) == 0) + if ((fp = fd_getfile(fdp, SCARG(uap, fd))) == NULL) + return (EBADF); + + if ((fp->f_flag & FWRITE) == 0) return (EBADF); return ktrace_common(curp, SCARG(uap, ops), @@ -432,7 +445,7 @@ sys_fktrace(struct proc *curp, void *v, */ /* ARGSUSED */ int -sys_ktrace(struct proc *curp, void *v, register_t *retval) +sys_ktrace(struct lwp *l, void *v, register_t *retval) { struct sys_ktrace_args /* { syscallarg(const char *) fname; @@ -440,6 +453,7 @@ sys_ktrace(struct proc *curp, void *v, r syscallarg(int) facs; syscallarg(int) pid; } */ *uap = v; + struct proc *curp = l->l_proc; struct vnode *vp = NULL; struct file *fp = NULL; int fd; @@ -485,6 +499,7 @@ sys_ktrace(struct proc *curp, void *v, r fp->f_type = DTYPE_VNODE; fp->f_ops = &vnops; fp->f_data = (caddr_t)vp; + FILE_SET_MATURE(fp); vp = NULL; } error = ktrace_common(curp, SCARG(uap, ops), SCARG(uap, facs), @@ -658,8 +673,8 @@ ktrcanset(struct proc *callp, struct pro * Put user defined entry to ktrace records. */ int -sys_utrace(p, v, retval) - struct proc *p; +sys_utrace(l, v, retval) + struct lwp *l; void *v; register_t *retval; { @@ -669,7 +684,7 @@ sys_utrace(p, v, retval) syscallarg(void *) addr; syscallarg(size_t) len; } */ *uap = v; - + struct proc *p = l->l_proc; if (!KTRPOINT(p, KTR_USER)) return (0);