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.33.6.2 retrieving revision 1.34 diff -u -p -r1.33.6.2 -r1.34 --- src/sys/kern/kern_ktrace.c 2000/04/30 20:13:33 1.33.6.2 +++ src/sys/kern/kern_ktrace.c 1999/04/11 18:44:00 1.34 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_ktrace.c,v 1.33.6.2 2000/04/30 20:13:33 he Exp $ */ +/* $NetBSD: kern_ktrace.c,v 1.34 1999/04/11 18:44:00 kleink Exp $ */ /* * Copyright (c) 1989, 1993 @@ -53,14 +53,11 @@ #include #include -#include /* XXX for uvmexp, needed by PAGE_SIZE */ -#include /* XXX for uvmexp, needed by PAGE_SIZE */ - -void ktrinitheader __P((struct ktr_header *, struct proc *, int)); -int ktrops __P((struct proc *, struct proc *, int, int, void *)); -int ktrsetchildren __P((struct proc *, struct proc *, int, int, void *)); -int ktrwrite __P((struct proc *, void *, struct ktr_header *)); -int ktrcanset __P((struct proc *, struct proc *)); +struct ktr_header *ktrgetheader __P((int)); +int ktrops __P((struct proc *, struct proc *, int, int, void *)); +int ktrsetchildren __P((struct proc *, struct proc *, int, int, void *)); +void ktrwrite __P((struct proc *, void *, struct ktr_header *)); +int ktrcanset __P((struct proc *, struct proc *)); void ktrderef(p) @@ -97,18 +94,21 @@ ktradref(p) } } -void -ktrinitheader(kth, p, type) - struct ktr_header *kth; - struct proc *p; +struct ktr_header * +ktrgetheader(type) int type; { + struct ktr_header *kth; + struct proc *p = curproc; /* XXX */ - memset(kth, 0, sizeof(*kth)); + MALLOC(kth, struct ktr_header *, sizeof(struct ktr_header), + M_TEMP, M_WAITOK); kth->ktr_type = type; microtime(&kth->ktr_time); kth->ktr_pid = p->p_pid; memcpy(kth->ktr_comm, p->p_comm, MAXCOMLEN); + /* Note: ktr_len and ktr_buf are left to be filled in by the caller. */ + return (kth); } void @@ -118,25 +118,26 @@ ktrsyscall(v, code, argsize, args) size_t argsize; register_t args[]; { - struct ktr_header kth; - struct ktr_syscall *ktp; + struct ktr_header *kth; + struct ktr_syscall *ktp; struct proc *p = curproc; /* XXX */ register_t *argp; - size_t len = sizeof(struct ktr_syscall) + argsize; + int len = sizeof(struct ktr_syscall) + argsize; int i; p->p_traceflag |= KTRFAC_ACTIVE; - ktrinitheader(&kth, p, KTR_SYSCALL); - ktp = malloc(len, M_TEMP, M_WAITOK); + kth = ktrgetheader(KTR_SYSCALL); + MALLOC(ktp, struct ktr_syscall *, len, M_TEMP, M_WAITOK); ktp->ktr_code = code; ktp->ktr_argsize = argsize; argp = (register_t *)((char *)ktp + sizeof(struct ktr_syscall)); for (i = 0; i < (argsize / sizeof(*argp)); i++) *argp++ = args[i]; - kth.ktr_buf = (caddr_t)ktp; - kth.ktr_len = len; - (void) ktrwrite(p, v, &kth); - free(ktp, M_TEMP); + kth->ktr_buf = (caddr_t)ktp; + kth->ktr_len = len; + ktrwrite(p, v, kth); + FREE(ktp, M_TEMP); + FREE(kth, M_TEMP); p->p_traceflag &= ~KTRFAC_ACTIVE; } @@ -147,20 +148,22 @@ ktrsysret(v, code, error, retval) int error; register_t retval; { - struct ktr_header kth; + struct ktr_header *kth; struct ktr_sysret ktp; struct proc *p = curproc; /* XXX */ p->p_traceflag |= KTRFAC_ACTIVE; - ktrinitheader(&kth, p, KTR_SYSRET); + kth = ktrgetheader(KTR_SYSRET); ktp.ktr_code = code; + ktp.ktr_eosys = 0; /* XXX unused */ ktp.ktr_error = error; ktp.ktr_retval = retval; /* what about val2 ? */ - kth.ktr_buf = (caddr_t)&ktp; - kth.ktr_len = sizeof(struct ktr_sysret); + kth->ktr_buf = (caddr_t)&ktp; + kth->ktr_len = sizeof(struct ktr_sysret); - (void) ktrwrite(p, v, &kth); + ktrwrite(p, v, kth); + FREE(kth, M_TEMP); p->p_traceflag &= ~KTRFAC_ACTIVE; } @@ -169,15 +172,16 @@ ktrnamei(v, path) void *v; char *path; { - struct ktr_header kth; + struct ktr_header *kth; struct proc *p = curproc; /* XXX */ p->p_traceflag |= KTRFAC_ACTIVE; - ktrinitheader(&kth, p, KTR_NAMEI); - kth.ktr_len = strlen(path); - kth.ktr_buf = path; + kth = ktrgetheader(KTR_NAMEI); + kth->ktr_len = strlen(path); + kth->ktr_buf = path; - (void) ktrwrite(p, v, &kth); + ktrwrite(p, v, kth); + FREE(kth, M_TEMP); p->p_traceflag &= ~KTRFAC_ACTIVE; } @@ -187,14 +191,15 @@ ktremul(v, p, emul) struct proc *p; char *emul; { - struct ktr_header kth; + struct ktr_header *kth; p->p_traceflag |= KTRFAC_ACTIVE; - ktrinitheader(&kth, p, KTR_EMUL); - kth.ktr_len = strlen(emul); - kth.ktr_buf = emul; + kth = ktrgetheader(KTR_EMUL); + kth->ktr_len = strlen(emul); + kth->ktr_buf = emul; - (void) ktrwrite(p, v, &kth); + ktrwrite(p, v, kth); + FREE(kth, M_TEMP); p->p_traceflag &= ~KTRFAC_ACTIVE; } @@ -206,55 +211,37 @@ ktrgenio(v, fd, rw, iov, len, error) struct iovec *iov; int len, error; { - struct ktr_header kth; + struct ktr_header *kth; struct ktr_genio *ktp; caddr_t cp; int resid = len, cnt; struct proc *p = curproc; /* XXX */ - int buflen; - + if (error) return; - p->p_traceflag |= KTRFAC_ACTIVE; - - buflen = min(PAGE_SIZE, len + sizeof(struct ktr_genio)); - - ktrinitheader(&kth, p, KTR_GENIO); - ktp = malloc(buflen, M_TEMP, M_WAITOK); + kth = ktrgetheader(KTR_GENIO); + MALLOC(ktp, struct ktr_genio *, sizeof(struct ktr_genio) + len, + M_TEMP, M_WAITOK); ktp->ktr_fd = fd; ktp->ktr_rw = rw; - - kth.ktr_buf = (caddr_t)ktp; - cp = (caddr_t)((char *)ktp + sizeof(struct ktr_genio)); - buflen -= sizeof(struct ktr_genio); - while (resid > 0) { - if (schedflags & PSCHED_SHOULDYIELD) - preempt(NULL); - - cnt = min(iov->iov_len, buflen); - if (cnt > resid) + if ((cnt = iov->iov_len) > resid) cnt = resid; - if (copyin(iov->iov_base, cp, cnt)) - break; - - kth.ktr_len = cnt + sizeof(struct ktr_genio); - - if (ktrwrite(p, v, &kth) != 0) - break; - - iov->iov_base = (caddr_t)iov->iov_base + cnt; - iov->iov_len -= cnt; - - if (iov->iov_len == 0) - iov++; - + if (copyin(iov->iov_base, cp, (unsigned)cnt)) + goto done; + cp += cnt; resid -= cnt; + iov++; } + kth->ktr_buf = (caddr_t)ktp; + kth->ktr_len = sizeof(struct ktr_genio) + len; - free(ktp, M_TEMP); + ktrwrite(p, v, kth); +done: + FREE(kth, M_TEMP); + FREE(ktp, M_TEMP); p->p_traceflag &= ~KTRFAC_ACTIVE; } @@ -266,20 +253,21 @@ ktrpsig(v, sig, action, mask, code) sigset_t *mask; int code; { - struct ktr_header kth; + struct ktr_header *kth; struct ktr_psig kp; struct proc *p = curproc; /* XXX */ p->p_traceflag |= KTRFAC_ACTIVE; - ktrinitheader(&kth, p, KTR_PSIG); + kth = ktrgetheader(KTR_PSIG); kp.signo = (char)sig; kp.action = action; kp.mask = *mask; kp.code = code; - kth.ktr_buf = (caddr_t)&kp; - kth.ktr_len = sizeof(struct ktr_psig); + kth->ktr_buf = (caddr_t)&kp; + kth->ktr_len = sizeof(struct ktr_psig); - (void) ktrwrite(p, v, &kth); + ktrwrite(p, v, kth); + FREE(kth, M_TEMP); p->p_traceflag &= ~KTRFAC_ACTIVE; } @@ -288,18 +276,19 @@ ktrcsw(v, out, user) void *v; int out, user; { - struct ktr_header kth; - struct ktr_csw kc; + struct ktr_header *kth; + struct ktr_csw kc; struct proc *p = curproc; /* XXX */ p->p_traceflag |= KTRFAC_ACTIVE; - ktrinitheader(&kth, p, KTR_CSW); + kth = ktrgetheader(KTR_CSW); kc.out = out; kc.user = user; - kth.ktr_buf = (caddr_t)&kc; - kth.ktr_len = sizeof(struct ktr_csw); + kth->ktr_buf = (caddr_t)&kc; + kth->ktr_len = sizeof(struct ktr_csw); - (void) ktrwrite(p, v, &kth); + ktrwrite(p, v, kth); + FREE(kth, M_TEMP); p->p_traceflag &= ~KTRFAC_ACTIVE; } @@ -374,13 +363,11 @@ sys_fktrace(curp, v, retval) error = ESRCH; goto done; } - for (p = LIST_FIRST(&pg->pg_members); p != NULL; - p = LIST_NEXT(p, p_pglist)) { + for (p = pg->pg_members.lh_first; p != 0; p = p->p_pglist.le_next) if (descend) ret |= ktrsetchildren(curp, p, ops, facs, fp); else ret |= ktrops(curp, p, ops, facs, fp); - } } else { /* @@ -478,13 +465,11 @@ sys_ktrace(curp, v, retval) error = ESRCH; goto done; } - for (p = LIST_FIRST(&pg->pg_members); p != NULL; - p = LIST_NEXT(p, p_pglist)) { + for (p = pg->pg_members.lh_first; p != 0; p = p->p_pglist.le_next) if (descend) ret |= ktrsetchildren(curp, p, ops, facs, vp); else ret |= ktrops(curp, p, ops, facs, vp); - } } else { /* @@ -567,13 +552,13 @@ ktrsetchildren(curp, top, ops, facs, v) * otherwise do any siblings, and if done with this level, * follow back up the tree (but not past top). */ - if (LIST_FIRST(&p->p_children) != NULL) - p = LIST_FIRST(&p->p_children); + if (p->p_children.lh_first) + p = p->p_children.lh_first; else for (;;) { if (p == top) return (ret); - if (LIST_NEXT(p, p_sibling) != NULL) { - p = LIST_NEXT(p, p_sibling); + if (p->p_sibling.le_next) { + p = p->p_sibling.le_next; break; } p = p->p_pptr; @@ -582,7 +567,7 @@ ktrsetchildren(curp, top, ops, facs, v) /*NOTREACHED*/ } -int +void ktrwrite(p, v, kth) struct proc *p; void *v; @@ -593,7 +578,7 @@ ktrwrite(p, v, kth) int error; if (v == NULL) - return (0); + return; auio.uio_iov = &aiov[0]; auio.uio_offset = 0; auio.uio_segflg = UIO_SYSSPACE; @@ -622,22 +607,17 @@ ktrwrite(p, v, kth) error = VOP_WRITE(vp, &auio, IO_UNIT|IO_APPEND, p->p_ucred); VOP_UNLOCK(vp, 0); } - if (error == 0) - return (0); + if (!error) + return; /* - * If error encountered, give up tracing on this vnode. Don't report - * EPIPE as this can easily happen with fktrace()/ktruss. + * If error encountered, give up tracing on this vnode. */ - if (error != EPIPE) - log(LOG_NOTICE, - "ktrace write failed, errno %d, tracing stopped\n", - error); + log(LOG_NOTICE, "ktrace write failed, errno %d, tracing stopped\n", + error); for (p = allproc.lh_first; p != 0; p = p->p_list.le_next) { if (p->p_tracep == v) ktrderef(p); } - - return (error); } /*