mem.c: Add mmap support to /dev/mem, validate offset for I/O on same.
conf.c: Add mmmap, move MEM_MAJ to 3 for SunOS compatibility.
This commit is contained in:
parent
e21b88980e
commit
3743860a4a
|
@ -1 +1 @@
|
|||
revision 1.16 intentionally removed
|
||||
revision 1.17 intentionally removed
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
/*
|
||||
* Copyright (c) 1993 Adam Glass
|
||||
* Copyright (c) 1988 University of Utah.
|
||||
* Copyright (c) 1982, 1986, 1990 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* 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
|
||||
|
@ -38,8 +38,8 @@
|
|||
*
|
||||
* from: Utah $Hdr: mem.c 1.14 90/10/12$
|
||||
*
|
||||
* from: @(#)mem.c 7.5 (Berkeley) 5/7/91
|
||||
* mem.c,v 1.2 1993/05/22 07:57:35 cgd Exp
|
||||
* from: @(#)mem.c 8.3 (Berkeley) 1/12/94
|
||||
* $Id: mem.c,v 1.9 1994/06/01 15:28:17 gwr Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -48,52 +48,6 @@
|
|||
|
||||
#include <sys/param.h>
|
||||
#include <sys/conf.h>
|
||||
/*
|
||||
* 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
|
||||
* 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.
|
||||
*
|
||||
* from: Utah $Hdr: mem.c 1.14 90/10/12$
|
||||
*
|
||||
* from: @(#)mem.c 7.5 (Berkeley) 5/7/91
|
||||
* mem.c,v 1.2 1993/05/22 07:57:35 cgd Exp
|
||||
*/
|
||||
|
||||
/*
|
||||
* Memory special file
|
||||
*/
|
||||
#include <sys/buf.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/malloc.h>
|
||||
|
@ -107,12 +61,14 @@
|
|||
#include <machine/cpu.h>
|
||||
#include <machine/obio.h>
|
||||
|
||||
extern int physmem;
|
||||
extern caddr_t vmmap;
|
||||
caddr_t zeropage;
|
||||
|
||||
/*
|
||||
* Sun3: XXXXX
|
||||
*
|
||||
* Need support for various vme spaces, and is /dev/zero right?
|
||||
* Need support for various vme spaces,
|
||||
* Also make the unit constants into macros.
|
||||
*
|
||||
*/
|
||||
|
@ -127,7 +83,6 @@ mmrw(dev, uio, flags)
|
|||
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;
|
||||
|
@ -143,29 +98,31 @@ mmrw(dev, uio, flags)
|
|||
/* minor device 0 is physical memory */
|
||||
case 0:
|
||||
v = uio->uio_offset;
|
||||
#ifdef notdef
|
||||
#ifndef DEBUG
|
||||
/* allow reads only in RAM (except for DEBUG) */
|
||||
if (v >= 0xFFFFFFFC || v < lowram)
|
||||
if (v >= (u_int)physmem)
|
||||
return (EFAULT);
|
||||
#endif
|
||||
pmap_enter(pmap_kernel(), vmmap, trunc_page(v),
|
||||
uio->uio_rw == UIO_READ ?
|
||||
VM_PROT_READ : VM_PROT_WRITE, TRUE);
|
||||
pmap_enter(kernel_pmap, (vm_offset_t)vmmap,
|
||||
trunc_page(v), uio->uio_rw == UIO_READ ?
|
||||
VM_PROT_READ : VM_PROT_WRITE, TRUE);
|
||||
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, uio);
|
||||
pmap_remove(pmap_kernel(), vmmap, &vmmap[NBPG]);
|
||||
pmap_remove(kernel_pmap, (vm_offset_t)vmmap,
|
||||
(vm_offset_t)&vmmap[NBPG]);
|
||||
continue;
|
||||
|
||||
/* minor device 1 is kernel memory */
|
||||
case 1:
|
||||
o = uio->uio_offset;
|
||||
c = min(iov->iov_len, MAXPHYS);
|
||||
if (!kernacc((caddr_t)(long)uio->uio_offset, c,
|
||||
if (!kernacc((caddr_t)o, c,
|
||||
uio->uio_rw == UIO_READ ? B_READ : B_WRITE))
|
||||
return (EFAULT);
|
||||
error = uiomove((caddr_t)(long)uio->uio_offset, (int)c, uio);
|
||||
error = uiomove((caddr_t)o, (int)c, uio);
|
||||
continue;
|
||||
|
||||
/* minor device 2 is EOF/RATHOLE */
|
||||
|
@ -181,7 +138,7 @@ mmrw(dev, uio, flags)
|
|||
return (ENXIO);
|
||||
o = uio->uio_offset;
|
||||
if (o >= OBIO_EEPROM_SIZE)
|
||||
return (EFAULT); /* Not ENXIO? -gwr */
|
||||
return (EFAULT);
|
||||
c = min(uio->uio_resid, OBIO_EEPROM_SIZE - o);
|
||||
error = uiomove(eeprom_va + o, (int)c, uio);
|
||||
return (error);
|
||||
|
@ -192,13 +149,17 @@ mmrw(dev, uio, flags)
|
|||
c = iov->iov_len;
|
||||
break;
|
||||
}
|
||||
if (zbuf == NULL) {
|
||||
zbuf = (caddr_t)
|
||||
/*
|
||||
* On the first call, allocate and zero a page
|
||||
* of memory for use with /dev/zero.
|
||||
*/
|
||||
if (zeropage == NULL) {
|
||||
zeropage = (caddr_t)
|
||||
malloc(CLBYTES, M_TEMP, M_WAITOK);
|
||||
bzero(zbuf, CLBYTES);
|
||||
bzero(zeropage, CLBYTES);
|
||||
}
|
||||
c = min(iov->iov_len, CLBYTES);
|
||||
error = uiomove(zbuf, (int)c, uio);
|
||||
error = uiomove(zeropage, (int)c, uio);
|
||||
continue;
|
||||
|
||||
default:
|
||||
|
@ -211,7 +172,30 @@ mmrw(dev, uio, flags)
|
|||
uio->uio_offset += c;
|
||||
uio->uio_resid -= c;
|
||||
}
|
||||
if (zbuf)
|
||||
free(zbuf, M_TEMP);
|
||||
return (error);
|
||||
}
|
||||
|
||||
mmmap(dev, off, prot)
|
||||
dev_t dev;
|
||||
int off, prot;
|
||||
{
|
||||
/*
|
||||
* /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) != 0)
|
||||
return (-1);
|
||||
/*
|
||||
* Allow access only in RAM.
|
||||
*
|
||||
* XXX could be extended to allow access to IO space but must
|
||||
* be very careful.
|
||||
*/
|
||||
if ((u_int)off >= (u_int)physmem)
|
||||
return (-1);
|
||||
return (sun3_btop(off));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue