reno changes
[unix-history] / usr / src / sys / i386 / i386 / mem.c
index 2b3e3d6..490cc52 100644 (file)
@@ -1,13 +1,17 @@
 /*-
 /*-
- * Copyright (c) 1990 The Regents of the University of California.
+ * Copyright (c) 1988 University of Utah.
+ * Copyright (c) 1982, 1986, 1990 The Regents of the University of California.
  * All rights reserved.
  *
  * This code is derived from software contributed to Berkeley by
  * All rights reserved.
  *
  * This code is derived from software contributed to Berkeley by
- * William Jolitz.
+ * the Systems Programming Group of the University of Utah Computer
+ * Science Department, and code derived from software contributed to
+ * Berkeley by William Jolitz.
  *
  *
- * %sccs.include.noredist.c%
+ * %sccs.include.redist.c%
  *
  *
- *     @(#)mem.c       5.5 (Berkeley) %G%
+ * from: Utah $Hdr: mem.c 1.13 89/10/08$
+ *     @(#)mem.c       5.6 (Berkeley) %G%
  */
 
 /*
  */
 
 /*
@@ -17,7 +21,6 @@
 #include "machine/pte.h"
 
 #include "param.h"
 #include "machine/pte.h"
 
 #include "param.h"
-#include "dir.h"
 #include "user.h"
 #include "conf.h"
 #include "buf.h"
 #include "user.h"
 #include "conf.h"
 #include "buf.h"
 #include "vm.h"
 #include "cmap.h"
 #include "uio.h"
 #include "vm.h"
 #include "cmap.h"
 #include "uio.h"
+#include "malloc.h"
 
 
-mmread(dev, uio)
-       dev_t dev;
-       struct uio *uio;
-{
-
-       return (mmrw(dev, uio, UIO_READ));
-}
+#include "machine/cpu.h"
 
 
-mmwrite(dev, uio)
+/*ARGSUSED*/
+mmrw(dev, uio, flags)
        dev_t dev;
        struct uio *uio;
        dev_t dev;
        struct uio *uio;
-{
-
-       return (mmrw(dev, uio, UIO_WRITE));
-}
-
-mmrw(dev, uio, rw)
-       dev_t dev;
-       struct uio *uio;
-       enum uio_rw rw;
+       int flags;
 {
        register int o;
        register u_int c, v;
        register struct iovec *iov;
        int error = 0;
 {
        register int o;
        register u_int c, v;
        register struct iovec *iov;
        int error = 0;
-
+       caddr_t zbuf = NULL;
 
        while (uio->uio_resid > 0 && error == 0) {
                iov = uio->uio_iov;
 
        while (uio->uio_resid > 0 && error == 0) {
                iov = uio->uio_iov;
@@ -66,34 +57,50 @@ mmrw(dev, uio, rw)
 
 /* minor device 0 is physical memory */
                case 0:
 
 /* minor device 0 is physical memory */
                case 0:
-                       v = btop(uio->uio_offset);
-                       if (v >= physmem)
-                               goto fault;
-                       *(int *)mmap = ctob(v) | PG_V |
-                               (rw == UIO_READ ? PG_KR : PG_KW);
-                       load_cr3(u.u_pcb.pcb_ptd);
+                       v = uio->uio_offset;
+                       *(int *)mmap = (v & PG_FRAME) | PG_V |
+                               (uio->uio_rw == UIO_READ ? PG_KR : PG_KW);
+                       load_cr3(u.u_pcb.pcb_cr3);
                        o = (int)uio->uio_offset & PGOFSET;
                        c = (u_int)(NBPG - ((int)iov->iov_base & PGOFSET));
                        c = MIN(c, (u_int)(NBPG - o));
                        c = MIN(c, (u_int)iov->iov_len);
                        o = (int)uio->uio_offset & PGOFSET;
                        c = (u_int)(NBPG - ((int)iov->iov_base & PGOFSET));
                        c = MIN(c, (u_int)(NBPG - o));
                        c = MIN(c, (u_int)iov->iov_len);
-                       error = uiomove((caddr_t)&vmmap[o], (int)c, rw, uio);
+                       error = uiomove((caddr_t)&vmmap[o], (int)c, uio);
                        continue;
 
 /* minor device 1 is kernel memory */
                case 1:
                        c = iov->iov_len;
                        continue;
 
 /* minor device 1 is kernel memory */
                case 1:
                        c = iov->iov_len;
-                       if (!kernacc((caddr_t)uio->uio_offset, c, rw == UIO_READ ? B_READ : B_WRITE))
+                       if (!kernacc((caddr_t)uio->uio_offset, c,
+                           uio->uio_rw == UIO_READ ? B_READ : B_WRITE))
                                goto fault;
                                goto fault;
-                       error = uiomove((caddr_t)uio->uio_offset, (int)c, rw, uio);
+                       error = uiomove((caddr_t)uio->uio_offset, (int)c, uio);
                        continue;
 
 /* minor device 2 is EOF/RATHOLE */
                case 2:
                        continue;
 
 /* minor device 2 is EOF/RATHOLE */
                case 2:
-                       if (rw == UIO_READ)
+                       if (uio->uio_rw == UIO_READ)
                                return (0);
                        c = iov->iov_len;
                        break;
 
                                return (0);
                        c = iov->iov_len;
                        break;
 
+/* minor device 12 (/dev/zero) is source of nulls on read, rathole on write */
+               case 12:
+                       if (uio->uio_rw == UIO_WRITE) {
+                               c = iov->iov_len;
+                               break;
+                       }
+                       if (zbuf == NULL) {
+                               zbuf = (caddr_t)
+                                   malloc(CLBYTES, M_TEMP, M_WAITOK);
+                               bzero(zbuf, CLBYTES);
+                       }
+                       c = MIN(iov->iov_len, CLBYTES);
+                       error = uiomove(zbuf, (int)c, uio);
+                       continue;
+
+               default:
+                       return (ENXIO);
                }
                if (error)
                        break;
                }
                if (error)
                        break;
@@ -102,6 +109,8 @@ mmrw(dev, uio, rw)
                uio->uio_offset += c;
                uio->uio_resid -= c;
        }
                uio->uio_offset += c;
                uio->uio_resid -= c;
        }
+       if (zbuf)
+               free(zbuf, M_TEMP);
        return (error);
 fault:
        return (EFAULT);
        return (error);
 fault:
        return (EFAULT);