Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/sommerfeld_i386mp_1]: src/sys/arch/i386/i386 - Use DEV_ constants, inste...



details:   https://anonhg.NetBSD.org/src/rev/5353c5d6d1f7
branches:  sommerfeld_i386mp_1
changeset: 482505:5353c5d6d1f7
user:      christos <christos%NetBSD.org@localhost>
date:      Wed Feb 27 01:20:54 2002 +0000

description:
- Use DEV_ constants, instead of documenting the numbers!
- Delete cdev_decl(mm); where appropriate, and other hand-crufting [hi powerpc!]

diffstat:

 sys/arch/i386/i386/mem.c |  217 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 217 insertions(+), 0 deletions(-)

diffs (221 lines):

diff -r 7054fbd0c9e0 -r 5353c5d6d1f7 sys/arch/i386/i386/mem.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/i386/i386/mem.c  Wed Feb 27 01:20:54 2002 +0000
@@ -0,0 +1,217 @@
+/*     $NetBSD: mem.c,v 1.51.8.2 2002/02/27 01:20:54 christos Exp $    */
+
+/*
+ * Copyright (c) 1988 University of Utah.
+ * Copyright (c) 1982, 1986, 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * the Systems Programming Group of the University of Utah Computer
+ * Science Department.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. 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 BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)mem.c       8.3 (Berkeley) 1/12/94
+ */
+
+/*
+ * Memory special file
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: mem.c,v 1.51.8.2 2002/02/27 01:20:54 christos Exp $");
+
+#include "opt_compat_netbsd.h"
+
+#include <sys/param.h>
+#include <sys/buf.h>
+#include <sys/systm.h>
+#include <sys/uio.h>
+#include <sys/malloc.h>
+#include <sys/proc.h>
+#include <sys/fcntl.h>
+
+#include <machine/cpu.h>
+#include <machine/conf.h>
+
+#include <uvm/uvm_extern.h>
+
+extern char *vmmap;            /* poor name! */
+caddr_t zeropage;
+
+/*ARGSUSED*/
+int
+mmopen(dev, flag, mode, p)
+       dev_t dev;
+       int flag, mode;
+       struct proc *p;
+{
+
+       switch (minor(dev)) {
+#ifdef COMPAT_10
+       /* This is done by i386_iopl(3) now. */
+       case DEV_IO:
+               if (flag & FWRITE) {
+                       struct trapframe *fp;
+                       fp = curproc->p_md.md_regs;
+                       fp->tf_eflags |= PSL_IOPL;
+               }
+               break;
+#endif
+
+       default:
+               break;
+       }
+       return (0);
+}
+
+/*ARGSUSED*/
+int
+mmclose(dev, flag, mode, p)
+       dev_t dev;
+       int flag, mode;
+       struct proc *p;
+{
+
+       return (0);
+}
+
+/*ARGSUSED*/
+int
+mmrw(dev, uio, flags)
+       dev_t dev;
+       struct uio *uio;
+       int flags;
+{
+       register vaddr_t o, v;
+       register int c;
+       register struct iovec *iov;
+       int error = 0;
+       static int physlock;
+       vm_prot_t prot;
+
+       if (minor(dev) == DEV_MEM) {
+               /* lock against other uses of shared vmmap */
+               while (physlock > 0) {
+                       physlock++;
+                       error = tsleep((caddr_t)&physlock, PZERO | PCATCH,
+                           "mmrw", 0);
+                       if (error)
+                               return (error);
+               }
+               physlock = 1;
+       }
+       while (uio->uio_resid > 0 && !error) {
+               iov = uio->uio_iov;
+               if (iov->iov_len == 0) {
+                       uio->uio_iov++;
+                       uio->uio_iovcnt--;
+                       if (uio->uio_iovcnt < 0)
+                               panic("mmrw");
+                       continue;
+               }
+               switch (minor(dev)) {
+               case DEV_MEM:
+                       v = uio->uio_offset;
+                       prot = uio->uio_rw == UIO_READ ? VM_PROT_READ :
+                           VM_PROT_WRITE;
+                       pmap_enter(pmap_kernel(), (vaddr_t)vmmap,
+                           trunc_page(v), prot, PMAP_WIRED|prot);
+                       pmap_update(pmap_kernel());
+                       o = uio->uio_offset & PGOFSET;
+                       c = min(uio->uio_resid, (int)(PAGE_SIZE - o));
+                       error = uiomove((caddr_t)vmmap + o, c, uio);
+                       pmap_remove(pmap_kernel(), (vaddr_t)vmmap,
+                           (vaddr_t)vmmap + PAGE_SIZE);
+                       pmap_update(pmap_kernel());
+                       break;
+
+               case DEV_KMEM:
+                       v = uio->uio_offset;
+                       c = min(iov->iov_len, MAXPHYS);
+                       if (!uvm_kernacc((caddr_t)v, c,
+                           uio->uio_rw == UIO_READ ? B_READ : B_WRITE))
+                               return (EFAULT);
+                       error = uiomove((caddr_t)v, c, uio);
+                       break;
+
+               case DEV_NULL:
+                       if (uio->uio_rw == UIO_WRITE)
+                               uio->uio_resid = 0;
+                       return (0);
+
+               case DEV_ZERO:
+                       if (uio->uio_rw == UIO_WRITE) {
+                               uio->uio_resid = 0;
+                               return (0);
+                       }
+                       if (zeropage == NULL) {
+                               zeropage = (caddr_t)
+                                   malloc(PAGE_SIZE, M_TEMP, M_WAITOK);
+                               memset(zeropage, 0, PAGE_SIZE);
+                       }
+                       c = min(iov->iov_len, PAGE_SIZE);
+                       error = uiomove(zeropage, c, uio);
+                       break;
+
+               default:
+                       return (ENXIO);
+               }
+       }
+       if (minor(dev) == DEV_MEM) {
+               if (physlock > 1)
+                       wakeup((caddr_t)&physlock);
+               physlock = 0;
+       }
+       return (error);
+}
+
+paddr_t
+mmmmap(dev, off, prot)
+       dev_t dev;
+       off_t off;
+       int prot;
+{
+       struct proc *p = curproc;       /* XXX */
+
+       /*
+        * /dev/mem is the only one that makes sense through this
+        * interface.  For /dev/kmem any physaddr we return here
+        * could be transient and hence incorrect or invalid at
+        * a later time.  /dev/null just doesn't make any sense
+        * and /dev/zero is a hack that is handled via the default
+        * pager in mmap().
+        */
+       if (minor(dev) != DEV_MEM)
+               return (-1);
+
+       if ((u_int)off > ctob(physmem) && suser(p->p_ucred, &p->p_acflag) != 0)
+               return (-1);
+       return (i386_btop((u_int)off));
+}



Home | Main Index | Thread Index | Old Index