new calling convension for system calls
[unix-history] / usr / src / sys / kern / kern_ktrace.c
index d0dd627..5aaca9a 100644 (file)
@@ -14,7 +14,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)kern_ktrace.c       1.5 (Berkeley) %G%
+ *     @(#)kern_ktrace.c       7.5 (Berkeley) %G%
  */
 
 #ifdef KTRACE
  */
 
 #ifdef KTRACE
@@ -44,7 +44,7 @@ ktrgetheader(type)
        kth->ktr_type = type;
        microtime(&kth->ktr_time);
        kth->ktr_pid = u.u_procp->p_pid;
        kth->ktr_type = type;
        microtime(&kth->ktr_time);
        kth->ktr_pid = u.u_procp->p_pid;
-       bcopy(u.u_comm, kth->ktr_comm, MAXCOMLEN);
+       bcopy(u.u_procp->p_comm, kth->ktr_comm, MAXCOMLEN);
        return (kth);
 }
 
        return (kth);
 }
 
@@ -75,22 +75,18 @@ ktrsysret(vp, code)
        struct vnode *vp;
 {
        struct ktr_header *kth = ktrgetheader(KTR_SYSRET);
        struct vnode *vp;
 {
        struct ktr_header *kth = ktrgetheader(KTR_SYSRET);
-       struct ktr_sysret *ktp;
+       struct ktr_sysret ktp;
 
        if (kth == NULL)
                return;
 
        if (kth == NULL)
                return;
-       MALLOC(ktp, struct ktr_sysret *, sizeof(struct ktr_sysret),
-               M_TEMP , M_WAITOK);
-       ktp->ktr_code = code;
-       ktp->ktr_eosys = u.u_eosys;
-       ktp->ktr_error = u.u_error;
-       ktp->ktr_retval = u.u_r.r_val1;         /* what about val2 ? */
+       ktp.ktr_code = code;
+       ktp.ktr_error = u.u_error;
+       ktp.ktr_retval = u.u_r.r_val1;          /* what about val2 ? */
 
 
-       kth->ktr_buf = (caddr_t)ktp;
+       kth->ktr_buf = (caddr_t)&ktp;
        kth->ktr_len = sizeof(struct ktr_sysret);
 
        ktrwrite(vp, kth);
        kth->ktr_len = sizeof(struct ktr_sysret);
 
        ktrwrite(vp, kth);
-       FREE(ktp, M_TEMP);
        FREE(kth, M_TEMP);
 }
 
        FREE(kth, M_TEMP);
 }
 
@@ -129,7 +125,7 @@ ktrgenio(vp, fd, rw, iov, len)
        while (resid > 0) {
                if ((cnt = iov->iov_len) > resid)
                        cnt = resid;
        while (resid > 0) {
                if ((cnt = iov->iov_len) > resid)
                        cnt = resid;
-               if (copyin(iov->iov_base, cp, cnt))
+               if (copyin(iov->iov_base, cp, (unsigned)cnt))
                        goto done;
                cp += cnt;
                resid -= cnt;
                        goto done;
                cp += cnt;
                resid -= cnt;
@@ -144,6 +140,28 @@ done:
        FREE(ktp, M_TEMP);
 }
 
        FREE(ktp, M_TEMP);
 }
 
+ktrpsig(vp, sig, action, mask, code)
+       struct  vnode *vp;
+       sig_t   action;
+{
+       struct ktr_header *kth = ktrgetheader(KTR_PSIG);
+       struct ktr_psig kp;
+
+       if (kth == NULL)
+               return;
+       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);
+
+       ktrwrite(vp, kth);
+       FREE(kth, M_TEMP);
+}
+
+/* Interface and common routines */
+
 /*
  * ktrace system call
  */
 /*
  * ktrace system call
  */
@@ -158,8 +176,8 @@ ktrace()
        register struct vnode *vp = NULL;
        register struct nameidata *ndp = &u.u_nd;
        register struct proc *p;
        register struct vnode *vp = NULL;
        register struct nameidata *ndp = &u.u_nd;
        register struct proc *p;
+       register ops = KTROP(uap->ops);
        struct pgrp *pg;
        struct pgrp *pg;
-       register int ops = uap->ops&0x3;
        register int facs = uap->facs;
        register int ret = 0;
 
        register int facs = uap->facs;
        register int ret = 0;
 
@@ -190,7 +208,6 @@ ktrace()
        if (ops == KTROP_CLEARFILE) {
                for (p = allproc; p != NULL; p = p->p_nxt) {
                        if (p->p_tracep == vp) {
        if (ops == KTROP_CLEARFILE) {
                for (p = allproc; p != NULL; p = p->p_nxt) {
                        if (p->p_tracep == vp) {
-                               p->p_flag &= ~SKTR;
                                p->p_tracep = NULL;
                                p->p_traceflag = 0;
                                vrele(vp);
                                p->p_tracep = NULL;
                                p->p_traceflag = 0;
                                vrele(vp);
@@ -198,7 +215,6 @@ ktrace()
                }
                goto done;
        }
                }
                goto done;
        }
-
        /*
         * need something to (un)trace
         */
        /*
         * need something to (un)trace
         */
@@ -206,7 +222,9 @@ ktrace()
                u.u_error = EINVAL;
                goto done;
        }
                u.u_error = EINVAL;
                goto done;
        }
-
+       /* 
+        * doit
+        */
        if (uap->pid < 0) {
                pg = pgfind(-uap->pid);
                if (pg == NULL) {
        if (uap->pid < 0) {
                pg = pgfind(-uap->pid);
                if (pg == NULL) {
@@ -214,7 +232,7 @@ ktrace()
                        goto done;
                }
                for (p = pg->pg_mem; p != NULL; p = p->p_pgrpnxt)
                        goto done;
                }
                for (p = pg->pg_mem; p != NULL; p = p->p_pgrpnxt)
-                       if (uap->ops&KTROP_INHERITFLAG)
+                       if (uap->ops&KTRFLAG_DESCEND)
                                ret |= ktrsetchildren(p, ops, facs, vp);
                        else 
                                ret |= ktrops(p, ops, facs, vp);
                                ret |= ktrsetchildren(p, ops, facs, vp);
                        else 
                                ret |= ktrops(p, ops, facs, vp);
@@ -225,7 +243,7 @@ ktrace()
                        u.u_error = ESRCH;
                        goto done;
                }
                        u.u_error = ESRCH;
                        goto done;
                }
-               if (uap->ops&KTROP_INHERITFLAG)
+               if (ops&KTRFLAG_DESCEND)
                        ret |= ktrsetchildren(p, ops, facs, vp);
                else
                        ret |= ktrops(p, ops, facs, vp);
                        ret |= ktrsetchildren(p, ops, facs, vp);
                else
                        ret |= ktrops(p, ops, facs, vp);
@@ -245,7 +263,7 @@ ktrops(p, ops, facs, vp)
        if (u.u_uid && u.u_uid != p->p_uid)
                return 0;
        if (ops == KTROP_SET) {
        if (u.u_uid && u.u_uid != p->p_uid)
                return 0;
        if (ops == KTROP_SET) {
-               if (p->p_tracep != vp) {
+               if (p->p_tracep != vp) { 
                        /*
                         * if trace file already in use, relinquish
                         */
                        /*
                         * if trace file already in use, relinquish
                         */
@@ -257,12 +275,13 @@ ktrops(p, ops, facs, vp)
                p->p_traceflag |= facs;
        } else {        
                /* KTROP_CLEAR */
                p->p_traceflag |= facs;
        } else {        
                /* KTROP_CLEAR */
-               if ((p->p_traceflag &= ~facs) == 0) {
+               if (((p->p_traceflag &= ~facs) & ~KTRFAC_INHERIT) == 0) {
+                       /* no more tracing */
+                       p->p_traceflag = 0;
                        if (p->p_tracep != NULL) {
                                vrele(p->p_tracep);
                                p->p_tracep = NULL;
                        }
                        if (p->p_tracep != NULL) {
                                vrele(p->p_tracep);
                                p->p_tracep = NULL;
                        }
-                       p->p_flag &= ~SKTR;
                }
        }
 
                }
        }
 
@@ -274,13 +293,11 @@ ktrsetchildren(top, ops, facs, vp)
        struct vnode *vp;
 {
        register struct proc *p;
        struct vnode *vp;
 {
        register struct proc *p;
-       register int ndx;
        register int ret = 0;
 
        p = top;
        for (;;) {
        register int ret = 0;
 
        p = top;
        for (;;) {
-               if ((ret |= ktrops(p, ops, facs, vp)) && ops == KTROP_SET)
-                       p->p_flag |= SKTR;
+               ret |= ktrops(p, ops, facs, vp);
                /*
                 * If this process has children, descend to them next,
                 * otherwise do any siblings, and if done with this level,
                /*
                 * If this process has children, descend to them next,
                 * otherwise do any siblings, and if done with this level,
@@ -311,7 +328,8 @@ ktrwrite(vp, kth)
 {
        struct uio auio;
        struct iovec aiov[2];
 {
        struct uio auio;
        struct iovec aiov[2];
-       int offset, error;
+       struct proc *p;
+       int error;
 
        if (vp == NULL)
                return;
 
        if (vp == NULL)
                return;
@@ -329,6 +347,21 @@ ktrwrite(vp, kth)
                aiov[1].iov_len = kth->ktr_len;
                auio.uio_resid += kth->ktr_len;
        }
                aiov[1].iov_len = kth->ktr_len;
                auio.uio_resid += kth->ktr_len;
        }
-       error = VOP_WRITE(vp, &auio, &offset, IO_UNIT|IO_APPEND, u.u_cred);
+       VOP_LOCK(vp);
+       error = VOP_WRITE(vp, &auio, IO_UNIT|IO_APPEND, u.u_cred);
+       VOP_UNLOCK(vp);
+       if (!error)
+               return;
+       /*
+        * If error encountered, give up tracing on this vnode.
+        */
+       uprintf("\ntrace write failed with errno %d, tracing stopped\n", error);
+       for (p = allproc; p != NULL; p = p->p_nxt) {
+               if (p->p_tracep == vp) {
+                       p->p_tracep = NULL;
+                       p->p_traceflag = 0;
+                       vrele(vp);
+               }
+       }
 }
 #endif
 }
 #endif