no swplo
[unix-history] / usr / src / sys / kern / kern_proc.c
index e08ed2f..156351a 100644 (file)
@@ -1,4 +1,4 @@
-/*     kern_proc.c     3.5     %H%     */
+/*     kern_proc.c     3.12    %G%     */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -12,7 +12,7 @@
 #include "../h/inode.h"
 #include "../h/seg.h"
 #include "../h/acct.h"
 #include "../h/inode.h"
 #include "../h/seg.h"
 #include "../h/acct.h"
-#include <wait.h>
+#include "/usr/include/wait.h"
 #include "../h/pte.h"
 #include "../h/vm.h"
 #include "../h/text.h"
 #include "../h/pte.h"
 #include "../h/vm.h"
 #include "../h/text.h"
@@ -61,7 +61,7 @@ exece()
        ne = 0;
        nc = 0;
        uap = (struct execa *)u.u_ap;
        ne = 0;
        nc = 0;
        uap = (struct execa *)u.u_ap;
-       if ((bno = malloc(swapmap, ctod(clrnd((int) btoc(NCARGS))))) == 0) {
+       if ((bno = malloc(argmap, ctod(clrnd((int) btoc(NCARGS))))) == 0) {
                swkill(u.u_procp, "exece");
                goto bad;
        }
                swkill(u.u_procp, "exece");
                goto bad;
        }
@@ -99,7 +99,8 @@ exece()
                        if ((nc&BMASK) == 0) {
                                if (bp)
                                        bdwrite(bp);
                        if ((nc&BMASK) == 0) {
                                if (bp)
                                        bdwrite(bp);
-                               bp = getblk(swapdev, (daddr_t)(dbtofsb(swplo+bno)+(nc>>BSHIFT)));
+                               bp = getblk(argdev,
+                                   (daddr_t)(dbtofsb(bno)+(nc>>BSHIFT)));
                                cp = bp->b_un.b_addr;
                        }
                        nc++;
                                cp = bp->b_un.b_addr;
                        }
                        nc++;
@@ -113,7 +114,7 @@ exece()
        if (getxfile(ip, nc) || u.u_error) {
 badarg:
                for (c = 0; c < nc; c += BSIZE)
        if (getxfile(ip, nc) || u.u_error) {
 badarg:
                for (c = 0; c < nc; c += BSIZE)
-                       if (bp = baddr(swapdev, dbtofsb(swplo+bno)+(c>>BSHIFT))) {
+                       if (bp = baddr(argdev, dbtofsb(bno)+(c>>BSHIFT))) {
                                bp->b_flags |= B_AGE;           /* throw away */
                                bp->b_flags &= ~B_DELWRI;       /* cancel io */
                                brelse(bp);
                                bp->b_flags |= B_AGE;           /* throw away */
                                bp->b_flags &= ~B_DELWRI;       /* cancel io */
                                brelse(bp);
@@ -144,7 +145,8 @@ badarg:
                        if ((nc&BMASK) == 0) {
                                if (bp)
                                        brelse(bp);
                        if ((nc&BMASK) == 0) {
                                if (bp)
                                        brelse(bp);
-                               bp = bread(swapdev, (daddr_t)(dbtofsb(swplo+bno)+(nc>>BSHIFT)));
+                               bp = bread(argdev,
+                                   (daddr_t)(dbtofsb(bno)+(nc>>BSHIFT)));
                                bp->b_flags |= B_AGE;           /* throw away */
                                bp->b_flags &= ~B_DELWRI;       /* cancel io */
                                cp = bp->b_un.b_addr;
                                bp->b_flags |= B_AGE;           /* throw away */
                                bp->b_flags &= ~B_DELWRI;       /* cancel io */
                                cp = bp->b_un.b_addr;
@@ -160,7 +162,7 @@ bad:
        if (bp)
                brelse(bp);
        if (bno)
        if (bp)
                brelse(bp);
        if (bno)
-               mfree(swapmap, ctod(clrnd((int) btoc(NCARGS))), bno);
+               mfree(argmap, ctod(clrnd((int) btoc(NCARGS))), bno);
        iput(ip);
 }
 
        iput(ip);
 }
 
@@ -253,7 +255,8 @@ register struct inode *ip;
        ds = clrnd(btoc((u.u_exdata.ux_dsize+u.u_exdata.ux_bsize)));
        ss = clrnd(SSIZE + btoc(nargc));
        if (overlay) {
        ds = clrnd(btoc((u.u_exdata.ux_dsize+u.u_exdata.ux_bsize)));
        ss = clrnd(SSIZE + btoc(nargc));
        if (overlay) {
-               if ((u.u_procp->p_flag & SPAGI) || u.u_sep==0 && ctos(ts) != ctos(u.u_tsize) || nargc) {
+               if ((u.u_procp->p_flag & SPAGI) ||
+                   u.u_sep==0 && ctos(ts) != ctos(u.u_tsize) || nargc) {
                        u.u_error = ENOMEM;
                        goto bad;
                }
                        u.u_error = ENOMEM;
                        goto bad;
                }
@@ -356,14 +359,10 @@ setregs()
 
                default:
                        /*
 
                default:
                        /*
-                        * Normal or deferring catch.
-                        * If deferred, now hold it, else
-                        * revert to default.
+                        * Normal or deferring catch; revert to default.
                         */
                         */
-                       if (SIGISDEFER(*rp))
-                               *rp = SIG_HOLD;
-                       else
-                               *rp = SIG_DFL;
+                       (void) spl6();
+                       *rp = SIG_DFL;
                        if ((int)*rp & 1)
                                u.u_procp->p_siga0 |= sigmask;
                        else
                        if ((int)*rp & 1)
                                u.u_procp->p_siga0 |= sigmask;
                        else
@@ -372,6 +371,7 @@ setregs()
                                u.u_procp->p_siga1 |= sigmask;
                        else
                                u.u_procp->p_siga1 &= ~sigmask;
                                u.u_procp->p_siga1 |= sigmask;
                        else
                                u.u_procp->p_siga1 &= ~sigmask;
+                       (void) spl0();
                        continue;
                }
        }
                        continue;
                }
        }
@@ -437,9 +437,8 @@ exit(rv)
        if ((int)SIG_IGN & 2)
                p->p_siga1 = ~0;
        else
        if ((int)SIG_IGN & 2)
                p->p_siga1 = ~0;
        else
-               p->p_siga0 = 0;
+               p->p_siga1 = 0;
        (void) spl0();
        (void) spl0();
-       rate.v_pgin -= p->p_aveflt;
        p->p_aveflt = 0;
        for(i=0; i<NSIG; i++)
                u.u_signal[i] = SIG_IGN;
        p->p_aveflt = 0;
        for(i=0; i<NSIG; i++)
                u.u_signal[i] = SIG_IGN;
@@ -472,7 +471,8 @@ exit(rv)
        vrelpt(u.u_procp);
        vrelu(u.u_procp, 0);
        multprog--;
        vrelpt(u.u_procp);
        vrelu(u.u_procp, 0);
        multprog--;
-       spl7();                 /* clock will get mad because of overlaying */
+/*     spl7();                 /* clock will get mad because of overlaying */
+       noproc = 1;
        p->p_stat = SZOMB;
        i = PIDHASH(p->p_pid);
        x = p - proc;
        p->p_stat = SZOMB;
        i = PIDHASH(p->p_pid);
        x = p - proc;
@@ -496,13 +496,25 @@ done:
                        q->p_ppid = 1;
                        wakeup((caddr_t)&proc[1]);
                        /*
                        q->p_ppid = 1;
                        wakeup((caddr_t)&proc[1]);
                        /*
-                        * Stopped or traced processes are killed
+                        * Traced processes are killed
                         * since their existence means someone is screwing up.
                         * since their existence means someone is screwing up.
+                        * Traced processes are sent a hangup and a continue.
+                        * This is designed to be ``safe'' for setuid
+                        * processes since they must be willing to tolerate
+                        * hangups anyways.
                         */
                         */
-                       if (q->p_stat == SSTOP || q->p_flag&STRC) {
+                       if (q->p_flag&STRC) {
                                q->p_flag &= ~STRC;
                                psignal(q, SIGKILL);
                                q->p_flag &= ~STRC;
                                psignal(q, SIGKILL);
+                       } else if (q->p_stat == SSTOP) {
+                               psignal(q, SIGHUP);
+                               psignal(q, SIGCONT);
                        }
                        }
+                       /*
+                        * Protect this process from future
+                        * tty signals, and clear TSTP/TTIN/TTOU if pending.
+                        */
+                       spgrp(q, -1);
                }
        wakeup((caddr_t)p->p_pptr);
        psignal(p->p_pptr, SIGCHLD);
                }
        wakeup((caddr_t)p->p_pptr);
        psignal(p->p_pptr, SIGCHLD);
@@ -581,10 +593,12 @@ loop:
                u.u_r.r_val1 = 0;
                return;
        }
                u.u_r.r_val1 = 0;
                return;
        }
+/*
        if (setjmp(u.u_qsav)) {
                u.u_eosys = RESTARTSYS;
                return;
        }
        if (setjmp(u.u_qsav)) {
                u.u_eosys = RESTARTSYS;
                return;
        }
+*/
        sleep((caddr_t)u.u_procp, PWAIT);
        goto loop;
 }
        sleep((caddr_t)u.u_procp, PWAIT);
        goto loop;
 }