return flags and generation number in stat structure
[unix-history] / usr / src / sys / kern / sys_process.c
index 53ce081..90a993f 100644 (file)
@@ -1,19 +1,24 @@
-/*     sys_process.c   5.5     82/10/31        */
-
-#include "../h/param.h"
-#include "../h/systm.h"
-#include "../h/dir.h"
-#include "../h/user.h"
-#include "../h/proc.h"
-#include "../h/inode.h"
-#include "../h/reg.h"
-#include "../h/text.h"
-#include "../h/seg.h"
-#include "../h/pte.h"
-#include "../h/psl.h"
-#include "../h/vm.h"
-#include "../h/buf.h"
-#include "../h/acct.h"
+/*
+ * Copyright (c) 1982, 1986, 1989 Regents of the University of California.
+ * All rights reserved.  The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ *
+ *     @(#)sys_process.c       7.6 (Berkeley) %G%
+ */
+
+#define IPCREG
+#include "param.h"
+#include "user.h"
+#include "proc.h"
+#include "vnode.h"
+#include "text.h"
+#include "seg.h"
+#include "buf.h"
+#include "ptrace.h"
+
+#include "machine/reg.h"
+#include "machine/psl.h"
+#include "machine/pte.h"
 
 /*
  * Priority for tracing
 
 /*
  * Priority for tracing
@@ -54,7 +59,8 @@ ptrace()
                return;
        }
        p = pfind(uap->pid);
                return;
        }
        p = pfind(uap->pid);
-       if (p == 0 || p->p_stat != SSTOP || p->p_ppid != u.u_procp->p_pid) {
+       if (p == 0 || p->p_stat != SSTOP || p->p_ppid != u.u_procp->p_pid ||
+           !(p->p_flag & STRC)) {
                u.u_error = ESRCH;
                return;
        }
                u.u_error = ESRCH;
                return;
        }
@@ -77,21 +83,7 @@ ptrace()
        wakeup((caddr_t)&ipc);
 }
 
        wakeup((caddr_t)&ipc);
 }
 
-#if vax
-#define        NIPCREG 16
-#endif
-#if sun
-#define        NIPCREG 17
-#endif
-int ipcreg[NIPCREG] =
-#if vax
-       {R0,R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,AP,FP,SP,PC};
-#endif
-#if sun
-       {R0,R1,R2,R3,R4,R5,R6,R7,AR0,AR1,AR2,AR3,AR4,AR5,AR6,AR7,PC};
-#endif
-
-#define        PHYSOFF(p, o)
+#define        PHYSOFF(p, o) \
        ((physadr)(p)+((o)/sizeof(((physadr)0)->r[0])))
 
 /*
        ((physadr)(p)+((o)/sizeof(((physadr)0)->r[0])))
 
 /*
@@ -104,6 +96,8 @@ procxmt()
        register int i;
        register *p;
        register struct text *xp;
        register int i;
        register *p;
        register struct text *xp;
+       struct vattr vattr;
+       struct vnode *vp;
 
        if (ipc.ip_lock != u.u_procp->p_pid)
                return (0);
 
        if (ipc.ip_lock != u.u_procp->p_pid)
                return (0);
@@ -112,38 +106,35 @@ procxmt()
        ipc.ip_req = 0;
        switch (i) {
 
        ipc.ip_req = 0;
        switch (i) {
 
-       /* read user I */
-       case 1:
+       case PT_READ_I:                 /* read the child's text space */
                if (!useracc((caddr_t)ipc.ip_addr, 4, B_READ))
                        goto error;
                ipc.ip_data = fuiword((caddr_t)ipc.ip_addr);
                break;
 
                if (!useracc((caddr_t)ipc.ip_addr, 4, B_READ))
                        goto error;
                ipc.ip_data = fuiword((caddr_t)ipc.ip_addr);
                break;
 
-       /* read user D */
-       case 2:
+       case PT_READ_D:                 /* read the child's data space */
                if (!useracc((caddr_t)ipc.ip_addr, 4, B_READ))
                        goto error;
                ipc.ip_data = fuword((caddr_t)ipc.ip_addr);
                break;
 
                if (!useracc((caddr_t)ipc.ip_addr, 4, B_READ))
                        goto error;
                ipc.ip_data = fuword((caddr_t)ipc.ip_addr);
                break;
 
-       /* read u */
-       case 3:
+       case PT_READ_U:                 /* read the child's u. */
                i = (int)ipc.ip_addr;
                if (i<0 || i >= ctob(UPAGES))
                        goto error;
                ipc.ip_data = *(int *)PHYSOFF(&u, i);
                break;
 
                i = (int)ipc.ip_addr;
                if (i<0 || i >= ctob(UPAGES))
                        goto error;
                ipc.ip_data = *(int *)PHYSOFF(&u, i);
                break;
 
-       /* write user I */
-       /* Must set up to allow writing */
-       case 4:
+       case PT_WRITE_I:                /* write the child's text space */
                /*
                 * If text, must assure exclusive use
                 */
                if (xp = u.u_procp->p_textp) {
                /*
                 * If text, must assure exclusive use
                 */
                if (xp = u.u_procp->p_textp) {
-                       if (xp->x_count!=1 || xp->x_iptr->i_mode&ISVTX)
+                       vp = xp->x_vptr;
+                       VOP_GETATTR(vp, &vattr, u.u_cred);
+                       if (xp->x_count!=1 || (vattr.va_mode & VSVTX))
                                goto error;
                                goto error;
-                       xp->x_iptr->i_flag &= ~ITEXT;
+                       xp->x_flag |= XTRC;
                }
                i = -1;
                if ((i = suiword((caddr_t)ipc.ip_addr, ipc.ip_data)) < 0) {
                }
                i = -1;
                if ((i = suiword((caddr_t)ipc.ip_addr, ipc.ip_data)) < 0) {
@@ -155,19 +146,26 @@ procxmt()
                }
                if (i < 0)
                        goto error;
                }
                if (i < 0)
                        goto error;
-               if (xp)
+#if defined(tahoe)
+               /* make sure the old value is not in cache */
+               ckeyrelease(u.u_procp->p_ckey);
+               u.u_procp->p_ckey = getcodekey();
+#endif
+               if (xp) {
                        xp->x_flag |= XWRIT;
                        xp->x_flag |= XWRIT;
+#if defined(tahoe)
+                       xp->x_ckey = u.u_procp->p_ckey;
+#endif
+               }
                break;
 
                break;
 
-       /* write user D */
-       case 5:
+       case PT_WRITE_D:                /* write the child's data space */
                if (suword((caddr_t)ipc.ip_addr, 0) < 0)
                        goto error;
                (void) suword((caddr_t)ipc.ip_addr, ipc.ip_data);
                break;
 
                if (suword((caddr_t)ipc.ip_addr, 0) < 0)
                        goto error;
                (void) suword((caddr_t)ipc.ip_addr, ipc.ip_data);
                break;
 
-       /* write u */
-       case 6:
+       case PT_WRITE_U:                /* write the child's u. */
                i = (int)ipc.ip_addr;
                p = (int *)PHYSOFF(&u, i);
                for (i=0; i<NIPCREG; i++)
                i = (int)ipc.ip_addr;
                p = (int *)PHYSOFF(&u, i);
                for (i=0; i<NIPCREG; i++)
@@ -176,6 +174,10 @@ procxmt()
                if (p == &u.u_ar0[PS]) {
                        ipc.ip_data |= PSL_USERSET;
                        ipc.ip_data &=  ~PSL_USERCLR;
                if (p == &u.u_ar0[PS]) {
                        ipc.ip_data |= PSL_USERSET;
                        ipc.ip_data &=  ~PSL_USERCLR;
+#ifdef PSL_CM_CLR
+                       if (ipc.ip_data & PSL_CM)
+                               ipc.ip_data &= ~PSL_CM_CLR;
+#endif
                        goto ok;
                }
                goto error;
                        goto ok;
                }
                goto error;
@@ -184,22 +186,19 @@ procxmt()
                *p = ipc.ip_data;
                break;
 
                *p = ipc.ip_data;
                break;
 
-       /* set signal and continue */
-       /* one version causes a trace-trap */
-       case 9:
-       case 7:
+       case PT_STEP:                   /* single step the child */
+       case PT_CONTINUE:               /* continue the child */
                if ((int)ipc.ip_addr != 1)
                        u.u_ar0[PC] = (int)ipc.ip_addr;
                if ((unsigned)ipc.ip_data > NSIG)
                        goto error;
                u.u_procp->p_cursig = ipc.ip_data;      /* see issig */
                if ((int)ipc.ip_addr != 1)
                        u.u_ar0[PC] = (int)ipc.ip_addr;
                if ((unsigned)ipc.ip_data > NSIG)
                        goto error;
                u.u_procp->p_cursig = ipc.ip_data;      /* see issig */
-               if (i == 9)
+               if (i == PT_STEP) 
                        u.u_ar0[PS] |= PSL_T;
                wakeup((caddr_t)&ipc);
                return (1);
 
                        u.u_ar0[PS] |= PSL_T;
                wakeup((caddr_t)&ipc);
                return (1);
 
-       /* force exit */
-       case 8:
+       case PT_KILL:                   /* kill the child process */
                wakeup((caddr_t)&ipc);
                exit(u.u_procp->p_cursig);
 
                wakeup((caddr_t)&ipc);
                exit(u.u_procp->p_cursig);