BSD 4_3_Reno release
[unix-history] / usr / src / sys / kern / kern_sig.c
index 8e517e9..a271cdc 100644 (file)
@@ -2,9 +2,22 @@
  * Copyright (c) 1982, 1986, 1989 Regents of the University of California.
  * All rights reserved.
  *
  * Copyright (c) 1982, 1986, 1989 Regents of the University of California.
  * All rights reserved.
  *
- * %sccs.include.redist.c%
+ * Redistribution is only permitted until one year after the first shipment
+ * of 4.4BSD by the Regents.  Otherwise, redistribution and use in source and
+ * binary forms are permitted provided that: (1) source distributions retain
+ * this entire copyright notice and comment, and (2) distributions including
+ * binaries display the following acknowledgement:  This product includes
+ * software developed by the University of California, Berkeley and its
+ * contributors'' in the documentation or other materials provided with the
+ * distribution and in all advertising materials mentioning features or use
+ * of this software.  Neither the name of the University nor the names of
+ * its contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  *
- *     @(#)kern_sig.c  7.25 (Berkeley) %G%
+ *     @(#)kern_sig.c  7.23 (Berkeley) 6/28/90
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -15,7 +28,9 @@
 #include "timeb.h"
 #include "times.h"
 #include "buf.h"
 #include "timeb.h"
 #include "times.h"
 #include "buf.h"
+#include "text.h"
 #include "seg.h"
 #include "seg.h"
+#include "vm.h"
 #include "acct.h"
 #include "uio.h"
 #include "file.h"
 #include "acct.h"
 #include "uio.h"
 #include "file.h"
@@ -24,9 +39,9 @@
 #include "ktrace.h"
 
 #include "machine/reg.h"
 #include "ktrace.h"
 
 #include "machine/reg.h"
+#include "machine/pte.h"
 #include "machine/psl.h"
 #include "machine/mtpr.h"
 #include "machine/psl.h"
 #include "machine/mtpr.h"
-#include "../vm/vm_param.h"
 
 #define        ttystopsigmask  (sigmask(SIGTSTP)|sigmask(SIGTTIN)|sigmask(SIGTTOU))
 #define        stopsigmask     (sigmask(SIGSTOP)|ttystopsigmask)
 
 #define        ttystopsigmask  (sigmask(SIGTSTP)|sigmask(SIGTTIN)|sigmask(SIGTTOU))
 #define        stopsigmask     (sigmask(SIGSTOP)|ttystopsigmask)
@@ -580,16 +595,6 @@ psignal(p, sig)
        case SIGTSTP:
        case SIGTTIN:
        case SIGTTOU:
        case SIGTSTP:
        case SIGTTIN:
        case SIGTTOU:
-               /*
-                * If sending a tty stop signal to a member of an orphaned
-                * process group, discard the signal here if the action
-                * is default; don't stop the process below if sleeping,
-                * and don't clear any pending SIGCONT.
-                */
-               if (p->p_pgrp->pg_jobc == 0 && action == SIG_DFL)
-                       return;
-               /* FALLTHROUGH */
-
        case SIGSTOP:
                p->p_sig &= ~sigmask(SIGCONT);
                break;
        case SIGSTOP:
                p->p_sig &= ~sigmask(SIGCONT);
                break;
@@ -970,6 +975,13 @@ core()
        if (ctob(UPAGES + u.u_dsize + u.u_ssize) >=
            u.u_rlimit[RLIMIT_CORE].rlim_cur)
                return (EFAULT);
        if (ctob(UPAGES + u.u_dsize + u.u_ssize) >=
            u.u_rlimit[RLIMIT_CORE].rlim_cur)
                return (EFAULT);
+       if (p->p_textp) {
+               VOP_LOCK(p->p_textp->x_vptr);
+               error = VOP_ACCESS(p->p_textp->x_vptr, VREAD, u.u_cred);
+               VOP_UNLOCK(p->p_textp->x_vptr);
+               if (error)
+                       return (EFAULT);
+       }
        ndp->ni_segflg = UIO_SYSSPACE;
        ndp->ni_dirp = "core";
        if (error = vn_open(ndp, FCREAT|FWRITE, 0644))
        ndp->ni_segflg = UIO_SYSSPACE;
        ndp->ni_dirp = "core";
        if (error = vn_open(ndp, FCREAT|FWRITE, 0644))
@@ -982,6 +994,12 @@ core()
                vput(vp);
                return (EFAULT);
        }
                vput(vp);
                return (EFAULT);
        }
+#ifdef MAPMEM
+       if (error = mmcore(p)) {
+               vput(vp);
+               return (error);
+       }
+#endif
        VATTR_NULL(&vattr);
        vattr.va_size = 0;
        VOP_SETATTR(vp, &vattr, u.u_cred);
        VATTR_NULL(&vattr);
        vattr.va_size = 0;
        VOP_SETATTR(vp, &vattr, u.u_cred);
@@ -999,13 +1017,14 @@ core()
        error = vn_rdwr(UIO_WRITE, vp, (caddr_t)&u, ctob(UPAGES), (off_t)0,
            UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, ndp->ni_cred, (int *)0);
        if (error == 0)
        error = vn_rdwr(UIO_WRITE, vp, (caddr_t)&u, ctob(UPAGES), (off_t)0,
            UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, ndp->ni_cred, (int *)0);
        if (error == 0)
-               error = vn_rdwr(UIO_WRITE, vp, u.u_daddr,
+               error = vn_rdwr(UIO_WRITE, vp,
+                   (caddr_t)ctob(dptov(p, 0)),
                    (int)ctob(u.u_dsize), (off_t)ctob(UPAGES), UIO_USERSPACE,
                    IO_NODELOCKED|IO_UNIT, ndp->ni_cred, (int *)0);
        if (error == 0)
                error = vn_rdwr(UIO_WRITE, vp,
                    (int)ctob(u.u_dsize), (off_t)ctob(UPAGES), UIO_USERSPACE,
                    IO_NODELOCKED|IO_UNIT, ndp->ni_cred, (int *)0);
        if (error == 0)
                error = vn_rdwr(UIO_WRITE, vp,
-                   trunc_page(USRSTACK - ctob(u.u_ssize)),
-                   round_page(ctob(u.u_ssize)),
+                   (caddr_t)ctob(sptov(p, u.u_ssize - 1)),
+                   (int)ctob(u.u_ssize),
                    (off_t)ctob(UPAGES) + ctob(u.u_dsize), UIO_USERSPACE,
                    IO_NODELOCKED|IO_UNIT, ndp->ni_cred, (int *)0);
        vput(vp);
                    (off_t)ctob(UPAGES) + ctob(u.u_dsize), UIO_USERSPACE,
                    IO_NODELOCKED|IO_UNIT, ndp->ni_cred, (int *)0);
        vput(vp);