Break out the MI part of the /dev/[k]mem and /dev/io drivers into

their own directory and module, leaving the MD parts in the MD
area (the MD parts _are_ part of the modules). /dev/mem and /dev/io
are now loadable modules, thus taking us one step further towards
a kernel created entirely out of modules. Of course, there is nothing
preventing the kernel from having these statically compiled.
This commit is contained in:
Mark Murray 2004-08-01 11:40:54 +00:00
parent dcd6f4bd48
commit 8ab2f5ecc5
37 changed files with 833 additions and 692 deletions

View File

@ -59,84 +59,18 @@ __FBSDID("$FreeBSD$");
#include <sys/uio.h>
#include <machine/md_var.h>
#ifdef PERFMON
#include <machine/perfmon.h>
#endif
#include <vm/vm.h>
#include <vm/pmap.h>
#include <vm/vm_extern.h>
static struct cdev *memdev, *kmemdev;
#ifdef PERFMON
static struct cdev *perfdev;
#endif /* PERFMON */
static d_open_t mmopen;
static d_close_t mmclose;
static d_read_t mmrw;
static d_ioctl_t mmioctl;
static d_mmap_t memmmap;
#define CDEV_MAJOR 2
static struct cdevsw mem_cdevsw = {
.d_version = D_VERSION,
.d_open = mmopen,
.d_close = mmclose,
.d_read = mmrw,
.d_write = mmrw,
.d_ioctl = mmioctl,
.d_mmap = memmmap,
.d_name = "mem",
.d_maj = CDEV_MAJOR,
.d_flags = D_MEM | D_NEEDGIANT,
};
#include <machine/memdev.h>
struct mem_range_softc mem_range_softc;
static int
mmclose(struct cdev *dev, int flags, int fmt, struct thread *td)
{
switch (minor(dev)) {
#ifdef PERFMON
case 32:
return perfmon_close(dev, flags, fmt, td);
#endif
default:
break;
}
return (0);
}
static int
mmopen(struct cdev *dev, int flags, int fmt, struct thread *td)
{
int error;
switch (minor(dev)) {
case 0:
case 1:
if (flags & FWRITE) {
error = securelevel_gt(td->td_ucred, 0);
if (error)
return (error);
}
break;
case 32:
#ifdef PERFMON
return perfmon_open(dev, flags, fmt, td);
#else
return ENODEV;
#endif
default:
break;
}
return (0);
}
/*ARGSUSED*/
static int
mmrw(struct cdev *dev, struct uio *uio, int flags)
/* ARGSUSED */
int
memrw(struct cdev *dev, struct uio *uio, int flags)
{
vm_offset_t o, v;
int c = 0;
@ -152,13 +86,10 @@ mmrw(struct cdev *dev, struct uio *uio, int flags)
uio->uio_iov++;
uio->uio_iovcnt--;
if (uio->uio_iovcnt < 0)
panic("mmrw");
panic("memrw");
continue;
}
switch (minor(dev)) {
/* minor device 0 is physical memory */
case 0:
if (minor(dev) == CDEV_MINOR_MEM) {
v = uio->uio_offset;
kmemphys:
/* Allow reads only in RAM. */
@ -174,9 +105,8 @@ mmrw(struct cdev *dev, struct uio *uio, int flags)
error =
uiomove((caddr_t)ALPHA_PHYS_TO_K0SEG(v), c, uio);
continue;
/* minor device 1 is kernel memory */
case 1:
}
else if (minor(dev) == CDEV_MINOR_KMEM) {
v = uio->uio_offset;
if (v >= ALPHA_K0SEG_BASE && v <= ALPHA_K0SEG_END) {
@ -186,8 +116,9 @@ mmrw(struct cdev *dev, struct uio *uio, int flags)
c = min(iov->iov_len, MAXPHYS);
/*
* Make sure that all of the pages are currently resident so
* that we don't create any zero-fill pages.
* Make sure that all of the pages are currently
* resident so that we don't create any zero-fill
* pages.
*/
addr = trunc_page(v);
eaddr = round_page(v + c);
@ -203,22 +134,16 @@ mmrw(struct cdev *dev, struct uio *uio, int flags)
error = uiomove((caddr_t)v, c, uio);
continue;
}
if (error)
break;
iov->iov_base = (char *)iov->iov_base + c;
iov->iov_len -= c;
uio->uio_offset += c;
uio->uio_resid -= c;
/* else panic! */
}
return (error);
}
/*******************************************************\
* allow user processes to MMAP some memory sections *
* instead of going through read/write *
\*******************************************************/
static int
/*
* allow user processes to MMAP some memory sections
* instead of going through read/write
*/
int
memmmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int prot)
{
/*
@ -227,7 +152,7 @@ memmmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int prot)
* could be transient and hence incorrect or invalid at
* a later time.
*/
if (minor(dev) != 0)
if (minor(dev) != CDEV_MINOR_MEM)
return (-1);
/*
@ -239,59 +164,7 @@ memmmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int prot)
return (0);
}
static int
mmioctl(struct cdev *dev, u_long cmd, caddr_t cmdarg, int flags, struct thread *td)
void
dev_mem_md_init(void)
{
switch(minor(dev)) {
#ifdef PERFMON
case 32:
return perfmon_ioctl(dev, cmd, cmdarg, flags, td);
#endif
default:
return ENODEV;
}
return (0);
}
static int
mem_modevent(module_t mod, int type, void *data)
{
switch(type) {
case MOD_LOAD:
if (bootverbose)
printf("mem: <memory & I/O>\n");
/* XXX - ??? */
#if 0
/* Initialise memory range handling */
if (mem_range_softc.mr_op != NULL)
mem_range_softc.mr_op->init(&mem_range_softc);
#endif
memdev = make_dev(&mem_cdevsw, 0, UID_ROOT, GID_KMEM,
0640, "mem");
kmemdev = make_dev(&mem_cdevsw, 1, UID_ROOT, GID_KMEM,
0640, "kmem");
#ifdef PERFMON
perfdev = make_dev(&mem_cdevsw, 32, UID_ROOT, GID_KMEM,
0640, "perfmon");
#endif /* PERFMON */
return 0;
case MOD_UNLOAD:
destroy_dev(memdev);
destroy_dev(kmemdev);
#ifdef PERFMON
destroy_dev(perfdev);
#endif /* PERFMON */
return 0;
case MOD_SHUTDOWN:
return 0;
default:
return EOPNOTSUPP;
}
}
DEV_MODULE(mem, mem_modevent, NULL);

View File

@ -171,8 +171,10 @@ device wb # Winbond W89C840F
device xl # 3Com 3c90x (``Boomerang'', ``Cyclone'')
# Pseudo devices.
device random # Entropy device
device loop # Network loopback
device mem # Memory and kernel memory devices
device null # Null and zero devices
device random # Entropy device
device ether # Ethernet support
device sl # Kernel SLIP
device ppp # Kernel PPP

View File

@ -0,0 +1,38 @@
/*-
* Copyright (c) 2004 Mark R V Murray
* All rights reserved.
*
* 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
* in this position and unchanged.
* 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.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``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 AUTHOR 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.
*
* $FreeBSD$
*/
#define CDEV_MAJOR 2
#define CDEV_MINOR_MEM 0
#define CDEV_MINOR_KMEM 1
d_open_t memopen;
d_read_t memrw;
#define memioctl (d_ioctl_t *)NULL;
d_mmap_t memmmap;
void dev_mem_md_init(void);

77
sys/amd64/amd64/io.c Normal file
View File

@ -0,0 +1,77 @@
/*-
* Copyright (c) 2004 Mark R V Murray
* All rights reserved.
*
* 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
* in this position and unchanged.
* 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.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``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 AUTHOR 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.
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/conf.h>
#include <sys/fcntl.h>
#include <sys/lock.h>
#include <sys/malloc.h>
#include <sys/mutex.h>
#include <sys/proc.h>
#include <sys/signalvar.h>
#include <sys/systm.h>
#include <machine/db_machdep.h>
#include <machine/frame.h>
#include <machine/psl.h>
#include <machine/specialreg.h>
#include <vm/vm.h>
#include <vm/pmap.h>
#include <machine/iodev.h>
/* ARGSUSED */
int
ioopen(struct cdev *dev __unused, int flags __unused, int fmt __unused,
struct thread *td)
{
int error;
error = suser(td);
if (error != 0)
return (error);
error = securelevel_gt(td->td_ucred, 0);
if (error != 0)
return (error);
td->td_frame->tf_rflags |= PSL_IOPL;
return (0);
}
/* ARGSUSED */
int
ioclose(struct cdev *dev __unused, int flags __unused, int fmt __unused,
struct thread *td)
{
td->td_frame->tf_rflags &= ~PSL_IOPL;
return (0);
}

View File

@ -47,7 +47,6 @@ __FBSDID("$FreeBSD$");
#include <sys/conf.h>
#include <sys/fcntl.h>
#include <sys/ioccom.h>
#include <sys/kernel.h>
#include <sys/lock.h>
#include <sys/malloc.h>
#include <sys/memrange.h>
@ -58,82 +57,19 @@ __FBSDID("$FreeBSD$");
#include <sys/systm.h>
#include <sys/uio.h>
#include <machine/db_machdep.h>
#include <machine/frame.h>
#include <machine/psl.h>
#include <machine/specialreg.h>
#include <machine/vmparam.h>
#include <vm/vm.h>
#include <vm/pmap.h>
#include <vm/vm_extern.h>
static struct cdev *memdev, *kmemdev, *iodev;
static d_open_t mmopen;
static d_close_t mmclose;
static d_read_t mmrw;
static d_ioctl_t mmioctl;
static d_mmap_t memmmap;
#define CDEV_MAJOR 2
static struct cdevsw mem_cdevsw = {
.d_version = D_VERSION,
.d_open = mmopen,
.d_close = mmclose,
.d_read = mmrw,
.d_write = mmrw,
.d_ioctl = mmioctl,
.d_mmap = memmmap,
.d_name = "mem",
.d_maj = CDEV_MAJOR,
.d_flags = D_MEM | D_NEEDGIANT,
};
MALLOC_DEFINE(M_MEMDESC, "memdesc", "memory range descriptors");
#include <machine/memdev.h>
struct mem_range_softc mem_range_softc;
static int
mmclose(struct cdev *dev, int flags, int fmt, struct thread *td)
{
switch (minor(dev)) {
case 14:
td->td_frame->tf_rflags &= ~PSL_IOPL;
}
return (0);
}
static int
mmopen(struct cdev *dev, int flags, int fmt, struct thread *td)
{
int error;
switch (minor(dev)) {
case 0:
case 1:
if (flags & FWRITE) {
error = securelevel_gt(td->td_ucred, 0);
if (error != 0)
return (error);
}
break;
case 14:
error = suser(td);
if (error != 0)
return (error);
error = securelevel_gt(td->td_ucred, 0);
if (error != 0)
return (error);
td->td_frame->tf_rflags |= PSL_IOPL;
break;
}
return (0);
}
/*ARGSUSED*/
static int
mmrw(struct cdev *dev, struct uio *uio, int flags)
/* ARGSUSED */
int
memrw(struct cdev *dev, struct uio *uio, int flags)
{
int o;
u_long c = 0, v;
@ -149,22 +85,18 @@ mmrw(struct cdev *dev, struct uio *uio, int flags)
uio->uio_iov++;
uio->uio_iovcnt--;
if (uio->uio_iovcnt < 0)
panic("mmrw");
panic("memrw");
continue;
}
switch (minor(dev)) {
/* minor device 0 is physical memory */
case 0:
if (minor(dev) == CDEV_MINOR_MEM) {
v = uio->uio_offset;
kmemphys:
o = v & PAGE_MASK;
c = min(uio->uio_resid, (u_int)(PAGE_SIZE - o));
error = uiomove((void *)PHYS_TO_DMAP(v), (int)c, uio);
continue;
/* minor device 1 is kernel memory */
case 1:
}
else if (minor(dev) == CDEV_MINOR_KMEM) {
v = uio->uio_offset;
if (v >= DMAP_MIN_ADDRESS && v < DMAP_MAX_ADDRESS) {
@ -175,8 +107,9 @@ mmrw(struct cdev *dev, struct uio *uio, int flags)
c = iov->iov_len;
/*
* Make sure that all of the pages are currently resident so
* that we don't create any zero-fill pages.
* Make sure that all of the pages are currently
* resident so that we don't create any zero-fill
* pages.
*/
addr = trunc_page(v);
eaddr = round_page(v + c);
@ -194,44 +127,24 @@ mmrw(struct cdev *dev, struct uio *uio, int flags)
error = uiomove((caddr_t)(long)v, (int)c, uio);
continue;
default:
return (ENODEV);
}
if (error)
break;
iov->iov_base = (char *)iov->iov_base + c;
iov->iov_len -= c;
uio->uio_offset += c;
uio->uio_resid -= c;
/* else panic! */
}
return (error);
}
/*******************************************************\
* allow user processes to MMAP some memory sections *
* instead of going through read/write *
\*******************************************************/
static int
/*
* allow user processes to MMAP some memory sections
* instead of going through read/write
*/
int
memmmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int prot)
{
switch (minor(dev))
{
/* minor device 0 is physical memory */
case 0:
if (minor(dev) == CDEV_MINOR_MEM)
*paddr = offset;
break;
/* minor device 1 is kernel memory */
case 1:
else if (minor(dev) == CDEV_MINOR_KMEM)
*paddr = vtophys(offset);
break;
default:
return (-1);
}
/* else panic! */
return (0);
}
@ -241,8 +154,9 @@ memmmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int prot)
* This is basically just an ioctl shim for mem_range_attr_get
* and mem_range_attr_set.
*/
static int
mmioctl(struct cdev *dev, u_long cmd, caddr_t data, int flags, struct thread *td)
int
memioctl(struct cdev *dev, u_long cmd, caddr_t data, int flags,
struct thread *td)
{
int nd, error = 0;
struct mem_range_op *mo = (struct mem_range_op *)data;
@ -331,37 +245,9 @@ mem_range_AP_init(void)
}
#endif
static int
mem_modevent(module_t mod, int type, void *data)
void
dev_mem_md_init(void)
{
switch(type) {
case MOD_LOAD:
if (bootverbose)
printf("mem: <memory & I/O>\n");
/* Initialise memory range handling */
if (mem_range_softc.mr_op != NULL)
mem_range_softc.mr_op->init(&mem_range_softc);
memdev = make_dev(&mem_cdevsw, 0, UID_ROOT, GID_KMEM,
0640, "mem");
kmemdev = make_dev(&mem_cdevsw, 1, UID_ROOT, GID_KMEM,
0640, "kmem");
iodev = make_dev(&mem_cdevsw, 14, UID_ROOT, GID_WHEEL,
0600, "io");
return (0);
case MOD_UNLOAD:
destroy_dev(memdev);
destroy_dev(kmemdev);
destroy_dev(iodev);
return (0);
case MOD_SHUTDOWN:
return (0);
default:
return (EOPNOTSUPP);
}
if (mem_range_softc.mr_op != NULL)
mem_range_softc.mr_op->init(&mem_range_softc);
}
DEV_MODULE(mem, mem_modevent, NULL);

View File

@ -217,8 +217,10 @@ device awi # BayStack 660 and others
device wi # WaveLAN/Intersil/Symbol 802.11 wireless NICs.
# Pseudo devices.
device random # Entropy device
device loop # Network loopback
device mem # Memory and kernel memory devices
device null # Null and zero devices
device random # Entropy device
device ether # Ethernet support
device sl # Kernel SLIP
device ppp # Kernel PPP

View File

@ -517,3 +517,7 @@ options TIMER_FREQ=((14318182+6)/12)
options VM_KMEM_SIZE
options VM_KMEM_SIZE_MAX
options VM_KMEM_SIZE_SCALE
# The I/O device
device io

33
sys/amd64/include/iodev.h Normal file
View File

@ -0,0 +1,33 @@
/*-
* Copyright (c) 2004 Mark R V Murray
* All rights reserved.
*
* 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
* in this position and unchanged.
* 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.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``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 AUTHOR 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.
*
* $FreeBSD$
*/
#define CDEV_MAJOR 2
#define CDEV_MINOR_IO 14
d_open_t ioopen;
d_close_t ioclose;

View File

@ -0,0 +1,38 @@
/*-
* Copyright (c) 2004 Mark R V Murray
* All rights reserved.
*
* 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
* in this position and unchanged.
* 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.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``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 AUTHOR 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.
*
* $FreeBSD$
*/
#define CDEV_MAJOR 2
#define CDEV_MINOR_MEM 0
#define CDEV_MINOR_KMEM 1
d_open_t memopen;
d_read_t memrw;
d_ioctl_t memioctl;
d_mmap_t memmmap;
void dev_mem_md_init(void);

View File

@ -836,9 +836,15 @@ options EXT2FS
# unsuitable for inclusion on machines with untrusted local users.
options VFS_AIO
# Cryptographically secure random number generator; /dev/[u]random
# Cryptographically secure random number generator; /dev/random
device random
# The bit-bucket; /dev/null
device null
# The system memory devices; /dev/mem, /dev/kmem
device mem
# Optional character code conversion support with LIBICONV.
# Each option requires their base file system and LIBICONV.
options CD9660_ICONV

View File

@ -545,6 +545,7 @@ dev/mca/mca_bus.c optional mca
dev/mcd/mcd.c optional mcd isa nowerror
dev/mcd/mcd_isa.c optional mcd isa nowerror
dev/md/md.c optional md
dev/mem/memdev.c optional mem
dev/mii/amphy.c optional miibus
dev/mii/bmtphy.c optional miibus
dev/mii/brgphy.c optional miibus
@ -583,8 +584,8 @@ dev/mpt/mpt_pci.c optional mpt pci
dev/my/if_my.c optional my
dev/musycc/musycc.c optional musycc
dev/nge/if_nge.c optional nge
dev/null/null.c standard
dev/nmdm/nmdm.c optional nmdm
dev/null/null.c optional null
dev/patm/if_patm.c optional patm pci
dev/patm/if_patm_intr.c optional patm pci
dev/patm/if_patm_ioctl.c optional patm pci

View File

@ -71,7 +71,7 @@ alpha/alpha/in_cksum.c optional inet
alpha/alpha/interrupt.c standard
alpha/alpha/locore.s standard no-obj
alpha/alpha/machdep.c standard
alpha/alpha/mem.c standard
alpha/alpha/mem.c optional mem
alpha/alpha/pmap.c standard
alpha/alpha/mp_machdep.c optional smp
alpha/alpha/prom.c standard

View File

@ -59,12 +59,13 @@ amd64/amd64/identcpu.c standard
amd64/amd64/in_cksum.c optional inet
amd64/amd64/initcpu.c standard
amd64/amd64/intr_machdep.c standard
amd64/amd64/io.c optional io
amd64/amd64/io_apic.c standard
amd64/amd64/legacy.c standard
amd64/amd64/local_apic.c standard
amd64/amd64/locore.S standard no-obj
amd64/amd64/machdep.c standard
amd64/amd64/mem.c standard
amd64/amd64/mem.c optional mem
amd64/amd64/mp_machdep.c optional smp
amd64/amd64/mpboot.S optional smp
amd64/amd64/mptable.c optional mptable
@ -100,6 +101,7 @@ dev/fb/fb.c optional fb
dev/fb/fb.c optional vga
dev/fb/splash.c optional splash
dev/fb/vga.c optional vga
dev/io/iodev.c optional io
dev/fdc/fdc.c optional fdc
dev/fdc/fdc_acpi.c optional fdc
dev/fdc/fdc_isa.c optional fdc isa

View File

@ -152,6 +152,7 @@ dev/kbd/kbd.c optional sc
dev/kbd/kbd.c optional ukbd
dev/kbd/kbd.c optional vt
dev/lnc/if_lnc_isa.c optional lnc isa
dev/io/iodev.c optional io
dev/ppc/ppc.c optional ppc
dev/ppc/ppc_puc.c optional ppc puc pci
dev/random/nehemiah.c optional random
@ -216,19 +217,20 @@ i386/i386/elf_machdep.c standard
i386/i386/exception.s standard
i386/i386/gdb_machdep.c optional gdb
i386/i386/geode.c optional cpu_geode
i386/i386/i686_mem.c standard
i386/i386/i686_mem.c optional mem
i386/i386/identcpu.c standard
i386/i386/in_cksum.c optional inet
i386/i386/initcpu.c standard
i386/i386/intr_machdep.c standard
i386/i386/io_apic.c optional apic
i386/i386/k6_mem.c standard
i386/i386/io.c optional io
i386/i386/k6_mem.c optional mem
i386/i386/legacy.c standard
i386/i386/local_apic.c optional apic
i386/i386/locore.s standard no-obj
i386/i386/longrun.c optional cpu_enable_longrun
i386/i386/machdep.c standard
i386/i386/mem.c standard
i386/i386/mem.c optional mem
i386/i386/mp_clock.c optional smp
i386/i386/mp_machdep.c optional smp
i386/i386/mpboot.s optional smp

View File

@ -104,7 +104,7 @@ ia64/ia64/interrupt.c standard
ia64/ia64/locore.S standard no-obj
ia64/ia64/machdep.c standard
ia64/ia64/mca.c standard
ia64/ia64/mem.c standard
ia64/ia64/mem.c optional mem
ia64/ia64/mp_machdep.c optional smp
ia64/ia64/nexus.c standard
ia64/ia64/pal.S standard

View File

@ -157,7 +157,7 @@ i386/i386/k6_mem.c standard
i386/i386/legacy.c standard
i386/i386/local_apic.c optional apic
i386/i386/locore.s standard no-obj
i386/i386/mem.c standard
i386/i386/mem.c optional mem
i386/i386/mp_clock.c optional smp
i386/i386/mp_machdep.c optional smp
i386/i386/mpboot.s optional smp

View File

@ -88,7 +88,7 @@ sparc64/sparc64/intr_machdep.c standard
sparc64/sparc64/iommu.c standard
sparc64/sparc64/locore.S standard no-obj
sparc64/sparc64/machdep.c standard
sparc64/sparc64/mem.c standard
sparc64/sparc64/mem.c optional mem
sparc64/sparc64/mp_exception.S optional smp
sparc64/sparc64/mp_locore.S optional smp
sparc64/sparc64/mp_machdep.c optional smp

89
sys/dev/io/iodev.c Normal file
View File

@ -0,0 +1,89 @@
/*-
* Copyright (c) 2004 Mark R V Murray
* All rights reserved.
*
* 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
* in this position and unchanged.
* 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.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``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 AUTHOR 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.
*
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/conf.h>
#include <sys/fcntl.h>
#include <sys/kernel.h>
#include <sys/lock.h>
#include <sys/malloc.h>
#include <sys/module.h>
#include <sys/mutex.h>
#include <sys/proc.h>
#include <sys/signalvar.h>
#include <sys/systm.h>
#include <sys/uio.h>
#include <machine/specialreg.h>
#include <vm/vm.h>
#include <vm/pmap.h>
#include <machine/iodev.h>
static struct cdev *iodev;
static struct cdevsw io_cdevsw = {
.d_version = D_VERSION,
.d_flags = D_NEEDGIANT,
.d_open = ioopen,
.d_close = ioclose,
.d_name = "io",
};
/* ARGSUSED */
static int
io_modevent(module_t mod __unused, int type, void *data __unused)
{
switch(type) {
case MOD_LOAD:
if (bootverbose)
printf("io: <I/O>\n");
iodev = make_dev(&io_cdevsw, CDEV_MINOR_IO,
UID_ROOT, GID_WHEEL, 0600, "io");
break;
case MOD_UNLOAD:
destroy_dev(iodev);
break;
case MOD_SHUTDOWN:
break;
default:
return(EOPNOTSUPP);
break;
}
return (0);
}
DEV_MODULE(io, io_modevent, NULL);

108
sys/dev/mem/memdev.c Normal file
View File

@ -0,0 +1,108 @@
/*-
* Copyright (c) 2004 Mark R V Murray
* All rights reserved.
*
* 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
* in this position and unchanged.
* 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.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``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 AUTHOR 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.
*
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/conf.h>
#include <sys/fcntl.h>
#include <sys/kernel.h>
#include <sys/lock.h>
#include <sys/malloc.h>
#include <sys/memrange.h>
#include <sys/module.h>
#include <sys/mutex.h>
#include <sys/proc.h>
#include <sys/signalvar.h>
#include <sys/systm.h>
#include <sys/uio.h>
#include <vm/vm.h>
#include <vm/pmap.h>
#include <machine/memdev.h>
static struct cdev *memdev, *kmemdev;
static struct cdevsw mem_cdevsw = {
.d_version = D_VERSION,
.d_flags = D_MEM|D_NEEDGIANT,
.d_open = memopen,
.d_read = memrw,
.d_write = memrw,
.d_ioctl = memioctl,
.d_mmap = memmmap,
.d_name = "mem",
};
/* ARGSUSED */
int
memopen(struct cdev *dev __unused, int flags, int fmt __unused,
struct thread *td)
{
int error = 0;
if (flags & FWRITE)
error = securelevel_gt(td->td_ucred, 0);
return (error);
}
/* ARGSUSED */
static int
mem_modevent(module_t mod __unused, int type, void *data __unused)
{
switch(type) {
case MOD_LOAD:
if (bootverbose)
printf("mem: <memory>\n");
dev_mem_md_init(); /* Machine dependant bit */
memdev = make_dev(&mem_cdevsw, CDEV_MINOR_MEM,
UID_ROOT, GID_KMEM, 0640, "mem");
kmemdev = make_dev(&mem_cdevsw, CDEV_MINOR_KMEM,
UID_ROOT, GID_KMEM, 0640, "kmem");
break;
case MOD_UNLOAD:
destroy_dev(memdev);
destroy_dev(kmemdev);
break;
case MOD_SHUTDOWN:
break;
default:
return(EOPNOTSUPP);
break;
}
return (0);
}
DEV_MODULE(mem, mem_modevent, NULL);

View File

@ -43,14 +43,17 @@ __FBSDID("$FreeBSD$");
/* For use with destroy_dev(9). */
static struct cdev *null_dev;
static struct cdev *zero_dev;
static struct cdev *full_dev;
static d_write_t null_write;
static d_ioctl_t null_ioctl;
static d_read_t zero_read;
static d_write_t full_write;
#define CDEV_MAJOR 2
#define NULL_MINOR 2
#define ZERO_MINOR 12
#define NULL_MINOR 0
#define ZERO_MINOR 1
#define FULL_MINOR 2
static struct cdevsw null_cdevsw = {
.d_version = D_VERSION,
@ -70,6 +73,14 @@ static struct cdevsw zero_cdevsw = {
.d_flags = D_MMAP_ANON,
};
static struct cdevsw full_cdevsw = {
.d_version = D_VERSION,
.d_read = (d_read_t *)nullop,
.d_write = full_write,
.d_name = "full",
.d_maj = CDEV_MAJOR,
};
static void *zbuf;
/* ARGSUSED */
@ -100,17 +111,21 @@ null_ioctl(struct cdev *dev __unused, u_long cmd, caddr_t data __unused,
static int
zero_read(struct cdev *dev __unused, struct uio *uio, int flags __unused)
{
int c;
int error = 0;
while (uio->uio_resid > 0 && error == 0) {
c = uio->uio_resid < PAGE_SIZE ? uio->uio_resid : PAGE_SIZE;
error = uiomove(zbuf, c, uio);
}
while (uio->uio_resid > 0 && error == 0)
error = uiomove(zbuf, MIN(uio->uio_resid, PAGE_SIZE), uio);
return (error);
}
/* ARGSUSED */
static int
full_write(struct cdev *dev __unused, struct uio *uio, int flags __unused)
{
return (ENOSPC);
}
/* ARGSUSED */
static int
null_modevent(module_t mod __unused, int type, void *data __unused)
@ -120,15 +135,18 @@ null_modevent(module_t mod __unused, int type, void *data __unused)
if (bootverbose)
printf("null: <null device, zero device>\n");
zbuf = (void *)malloc(PAGE_SIZE, M_TEMP, M_WAITOK | M_ZERO);
zero_dev = make_dev(&zero_cdevsw, ZERO_MINOR, UID_ROOT,
GID_WHEEL, 0666, "zero");
null_dev = make_dev(&null_cdevsw, NULL_MINOR, UID_ROOT,
GID_WHEEL, 0666, "null");
zero_dev = make_dev(&zero_cdevsw, ZERO_MINOR, UID_ROOT,
GID_WHEEL, 0666, "zero");
full_dev = make_dev(&full_cdevsw, FULL_MINOR, UID_ROOT,
GID_WHEEL, 0666, "full");
break;
case MOD_UNLOAD:
destroy_dev(null_dev);
destroy_dev(zero_dev);
destroy_dev(full_dev);
free(zbuf, M_TEMP);
break;

View File

@ -29,7 +29,7 @@ ident GENERIC
makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols
options SCHED_ULE # ULE scheduler
options SCHED_4BSD
options INET # InterNETworking
options INET6 # IPv6 communications protocols
options FFS # Berkeley Fast Filesystem
@ -239,8 +239,10 @@ device wi # WaveLAN/Intersil/Symbol 802.11 wireless NICs.
#device wl # Older non 802.11 Wavelan wireless NIC.
# Pseudo devices.
device random # Entropy device
device loop # Network loopback
device mem # Memory and kernel memory devices
device null # Null and zero devices
device random # Entropy device
device ether # Ethernet support
device sl # Kernel SLIP
device ppp # Kernel PPP

View File

@ -1053,3 +1053,7 @@ options TIMER_FREQ=((14318182+6)/12)
options VM_KMEM_SIZE
options VM_KMEM_SIZE_MAX
options VM_KMEM_SIZE_SCALE
# The I/O device
device io

77
sys/i386/i386/io.c Normal file
View File

@ -0,0 +1,77 @@
/*-
* Copyright (c) 2004 Mark R V Murray
* All rights reserved.
*
* 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
* in this position and unchanged.
* 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.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``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 AUTHOR 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.
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/conf.h>
#include <sys/fcntl.h>
#include <sys/lock.h>
#include <sys/malloc.h>
#include <sys/mutex.h>
#include <sys/proc.h>
#include <sys/signalvar.h>
#include <sys/systm.h>
#include <machine/db_machdep.h>
#include <machine/frame.h>
#include <machine/psl.h>
#include <machine/specialreg.h>
#include <vm/vm.h>
#include <vm/pmap.h>
#include <machine/iodev.h>
/* ARGSUSED */
int
ioopen(struct cdev *dev __unused, int flags __unused, int fmt __unused,
struct thread *td)
{
int error;
error = suser(td);
if (error != 0)
return (error);
error = securelevel_gt(td->td_ucred, 0);
if (error != 0)
return (error);
td->td_frame->tf_eflags |= PSL_IOPL;
return (0);
}
/* ARGSUSED */
int
ioclose(struct cdev *dev __unused, int flags __unused, int fmt __unused,
struct thread *td)
{
td->td_frame->tf_eflags &= ~PSL_IOPL;
return (0);
}

View File

@ -58,81 +58,31 @@ __FBSDID("$FreeBSD$");
#include <sys/systm.h>
#include <sys/uio.h>
#include <machine/db_machdep.h>
#include <machine/frame.h>
#include <machine/psl.h>
#include <machine/specialreg.h>
#include <vm/vm.h>
#include <vm/pmap.h>
#include <vm/vm_extern.h>
static struct cdev *memdev, *kmemdev, *iodev;
static d_open_t mmopen;
static d_close_t mmclose;
static d_read_t mmrw;
static d_ioctl_t mmioctl;
static d_mmap_t memmmap;
#define CDEV_MAJOR 2
static struct cdevsw mem_cdevsw = {
.d_version = D_VERSION,
.d_open = mmopen,
.d_close = mmclose,
.d_read = mmrw,
.d_write = mmrw,
.d_ioctl = mmioctl,
.d_mmap = memmmap,
.d_name = "mem",
.d_maj = CDEV_MAJOR,
.d_flags = D_MEM | D_NEEDGIANT,
};
#include <machine/memdev.h>
/*
* Used in /dev/mem drivers and elsewhere
*/
MALLOC_DEFINE(M_MEMDESC, "memdesc", "memory range descriptors");
struct mem_range_softc mem_range_softc;
static int
mmclose(struct cdev *dev, int flags, int fmt, struct thread *td)
void
mem_range_AP_init(void)
{
switch (minor(dev)) {
case 14:
td->td_frame->tf_eflags &= ~PSL_IOPL;
}
return (0);
if (mem_range_softc.mr_op && mem_range_softc.mr_op->initAP)
mem_range_softc.mr_op->initAP(&mem_range_softc);
}
static int
mmopen(struct cdev *dev, int flags, int fmt, struct thread *td)
{
int error;
switch (minor(dev)) {
case 0:
case 1:
if (flags & FWRITE) {
error = securelevel_gt(td->td_ucred, 0);
if (error != 0)
return (error);
}
break;
case 14:
error = suser(td);
if (error != 0)
return (error);
error = securelevel_gt(td->td_ucred, 0);
if (error != 0)
return (error);
td->td_frame->tf_eflags |= PSL_IOPL;
break;
}
return (0);
}
/*ARGSUSED*/
static int
mmrw(struct cdev *dev, struct uio *uio, int flags)
/* ARGSUSED */
int
memrw(struct cdev *dev, struct uio *uio, int flags)
{
int o;
u_int c = 0, v;
@ -148,13 +98,10 @@ mmrw(struct cdev *dev, struct uio *uio, int flags)
uio->uio_iov++;
uio->uio_iovcnt--;
if (uio->uio_iovcnt < 0)
panic("mmrw");
panic("memrw");
continue;
}
switch (minor(dev)) {
/* minor device 0 is physical memory */
case 0:
if (minor(dev) == CDEV_MINOR_MEM) {
v = uio->uio_offset;
v &= ~PAGE_MASK;
pmap_kenter((vm_offset_t)ptvmmap, v);
@ -165,14 +112,14 @@ mmrw(struct cdev *dev, struct uio *uio, int flags)
error = uiomove((caddr_t)&ptvmmap[o], (int)c, uio);
pmap_qremove((vm_offset_t)ptvmmap, 1);
continue;
/* minor device 1 is kernel memory */
case 1:
}
else if (minor(dev) == CDEV_MINOR_KMEM) {
c = iov->iov_len;
/*
* Make sure that all of the pages are currently resident so
* that we don't create any zero-fill pages.
* Make sure that all of the pages are currently
* resident so that we don't create any zero-fill
* pages.
*/
addr = trunc_page(uio->uio_offset);
eaddr = round_page(uio->uio_offset + c);
@ -189,44 +136,26 @@ mmrw(struct cdev *dev, struct uio *uio, int flags)
return (EFAULT);
error = uiomove((caddr_t)(int)uio->uio_offset, (int)c, uio);
continue;
default:
return (ENODEV);
}
if (error)
break;
iov->iov_base = (char *)iov->iov_base + c;
iov->iov_len -= c;
uio->uio_offset += c;
uio->uio_resid -= c;
/* else panic! */
}
return (error);
}
/*******************************************************\
* allow user processes to MMAP some memory sections *
* instead of going through read/write *
\*******************************************************/
static int
memmmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int prot)
/*
* allow user processes to MMAP some memory sections
* instead of going through read/write
*/
/* ARGSUSED */
int
memmmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr,
int prot __unused)
{
switch (minor(dev))
{
/* minor device 0 is physical memory */
case 0:
if (minor(dev) == CDEV_MINOR_MEM)
*paddr = offset;
break;
/* minor device 1 is kernel memory */
case 1:
else if (minor(dev) == CDEV_MINOR_KMEM)
*paddr = vtophys(offset);
break;
default:
return (-1);
}
/* else panic! */
return (0);
}
@ -236,8 +165,10 @@ memmmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int prot)
* This is basically just an ioctl shim for mem_range_attr_get
* and mem_range_attr_set.
*/
static int
mmioctl(struct cdev *dev, u_long cmd, caddr_t data, int flags, struct thread *td)
/* ARGSUSED */
int
memioctl(struct cdev *dev __unused, u_long cmd, caddr_t data, int flags,
struct thread *td)
{
int nd, error = 0;
struct mem_range_op *mo = (struct mem_range_op *)data;
@ -317,46 +248,9 @@ mem_range_attr_set(struct mem_range_desc *mrd, int *arg)
return (mem_range_softc.mr_op->set(&mem_range_softc, mrd, arg));
}
#ifdef SMP
void
mem_range_AP_init(void)
dev_mem_md_init(void)
{
if (mem_range_softc.mr_op && mem_range_softc.mr_op->initAP)
(mem_range_softc.mr_op->initAP(&mem_range_softc));
if (mem_range_softc.mr_op != NULL)
mem_range_softc.mr_op->init(&mem_range_softc);
}
#endif
static int
mem_modevent(module_t mod, int type, void *data)
{
switch(type) {
case MOD_LOAD:
if (bootverbose)
printf("mem: <memory & I/O>\n");
/* Initialise memory range handling */
if (mem_range_softc.mr_op != NULL)
mem_range_softc.mr_op->init(&mem_range_softc);
memdev = make_dev(&mem_cdevsw, 0, UID_ROOT, GID_KMEM,
0640, "mem");
kmemdev = make_dev(&mem_cdevsw, 1, UID_ROOT, GID_KMEM,
0640, "kmem");
iodev = make_dev(&mem_cdevsw, 14, UID_ROOT, GID_WHEEL,
0600, "io");
return (0);
case MOD_UNLOAD:
destroy_dev(memdev);
destroy_dev(kmemdev);
destroy_dev(iodev);
return (0);
case MOD_SHUTDOWN:
return (0);
default:
return (EOPNOTSUPP);
}
}
DEV_MODULE(mem, mem_modevent, NULL);

33
sys/i386/include/iodev.h Normal file
View File

@ -0,0 +1,33 @@
/*-
* Copyright (c) 2004 Mark R V Murray
* All rights reserved.
*
* 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
* in this position and unchanged.
* 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.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``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 AUTHOR 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.
*
* $FreeBSD$
*/
#define CDEV_MAJOR 2
#define CDEV_MINOR_IO 14
d_open_t ioopen;
d_close_t ioclose;

40
sys/i386/include/memdev.h Normal file
View File

@ -0,0 +1,40 @@
/*-
* Copyright (c) 2004 Mark R V Murray
* All rights reserved.
*
* 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
* in this position and unchanged.
* 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.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``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 AUTHOR 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.
*
* $FreeBSD$
*/
#define CDEV_MAJOR 2
#define CDEV_MINOR_MEM 0
#define CDEV_MINOR_KMEM 1
d_open_t memopen;
d_read_t memrw;
d_ioctl_t memioctl;
d_mmap_t memmmap;
void dev_mem_md_init(void);
MALLOC_DECLARE(M_MEMDEV);

View File

@ -140,6 +140,8 @@ device loop # Network loopback
device md # Memory "disks"
device pty # Pseudo-ttys (telnet etc)
device puc # Multi I/O cards and multi-channel UARTs
device null # Null and zero devices
device mem # Memory and kernel memory devices
device random # Entropy device
device tun # Packet tunnel.
device uart # Serial port (UART)

View File

@ -34,9 +34,11 @@
*
* from: Utah $Hdr: mem.c 1.13 89/10/08$
* from: @(#)mem.c 7.2 (Berkeley) 5/9/91
* $FreeBSD$
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
/*
* Memory special file
*/
@ -58,38 +60,12 @@
#include <machine/cpu.h>
#include <machine/frame.h>
#ifdef PERFMON
#include <machine/perfmon.h>
#endif
#include <vm/vm.h>
#include <vm/pmap.h>
#include <vm/vm_extern.h>
static struct cdev *memdev, *kmemdev;
#ifdef PERFMON
static struct cdev *perfdev;
#endif /* PERFMON */
static d_open_t mmopen;
static d_close_t mmclose;
static d_read_t mmrw;
static d_ioctl_t mmioctl;
static d_mmap_t memmmap;
#define CDEV_MAJOR 2
static struct cdevsw mem_cdevsw = {
.d_version = D_VERSION,
.d_open = mmopen,
.d_close = mmclose,
.d_read = mmrw,
.d_write = mmrw,
.d_ioctl = mmioctl,
.d_mmap = memmmap,
.d_name = "mem",
.d_maj = CDEV_MAJOR,
.d_flags = D_MEM | D_NEEDGIANT,
};
#include <machine/memdev.h>
struct mem_range_softc mem_range_softc;
@ -99,49 +75,9 @@ ia64_pa_access(vm_offset_t pa)
return (VM_PROT_READ|VM_PROT_WRITE);
}
static int
mmclose(struct cdev *dev, int flags, int fmt, struct thread *td)
{
switch (minor(dev)) {
#ifdef PERFMON
case 32:
return perfmon_close(dev, flags, fmt, td);
#endif
default:
break;
}
return (0);
}
static int
mmopen(struct cdev *dev, int flags, int fmt, struct thread *td)
{
int error;
switch (minor(dev)) {
case 0:
case 1:
if (flags & FWRITE) {
error = securelevel_gt(td->td_ucred, 0);
if (error)
return error;
}
break;
case 32:
#ifdef PERFMON
return perfmon_open(dev, flags, fmt, td);
#else
return ENODEV;
#endif
default:
break;
}
return (0);
}
/*ARGSUSED*/
static int
mmrw(struct cdev *dev, struct uio *uio, int flags)
/* ARGSUSED */
int
memrw(strct cdev *dev, struct uio *uio, int flags)
{
struct iovec *iov;
vm_offset_t addr, eaddr, o, v;
@ -154,14 +90,11 @@ mmrw(struct cdev *dev, struct uio *uio, int flags)
uio->uio_iov++;
uio->uio_iovcnt--;
if (uio->uio_iovcnt < 0)
panic("mmrw");
panic("memrw");
continue;
}
switch (minor(dev)) {
/* minor device 0 is physical memory */
case 0:
if (minor(dev) == CDEV_MINOR_MEM) {
v = uio->uio_offset;
kmemphys:
/* Allow reads only in RAM. */
@ -177,9 +110,8 @@ mmrw(struct cdev *dev, struct uio *uio, int flags)
c = min(uio->uio_resid, (int)(PAGE_SIZE - o));
error = uiomove((caddr_t)IA64_PHYS_TO_RR7(v), c, uio);
continue;
/* minor device 1 is kernel memory */
case 1:
}
else if (minor(dev) == CDEV_MINOR_KMEM) {
v = uio->uio_offset;
if (v >= IA64_RR_BASE(6)) {
@ -205,27 +137,18 @@ mmrw(struct cdev *dev, struct uio *uio, int flags)
return (EFAULT);
error = uiomove((caddr_t)v, c, uio);
continue;
default:
return (ENODEV);
}
if (error)
break;
iov->iov_base = (char *)iov->iov_base + c;
iov->iov_len -= c;
uio->uio_offset += c;
uio->uio_resid -= c;
/* else panic! */
}
return (error);
}
/*******************************************************\
* allow user processes to MMAP some memory sections *
* instead of going through read/write *
\*******************************************************/
static int
memmmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int prot)
/*
* allow user processes to MMAP some memory sections
* instead of going through read/write
*/
int
memmmap(strct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int prot)
{
/*
* /dev/mem is the only one that makes sense through this
@ -233,7 +156,7 @@ memmmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int prot)
* could be transient and hence incorrect or invalid at
* a later time.
*/
if (minor(dev) != 0)
if (minor(dev) != CDEV_MINOR_MEM)
return (-1);
/*
@ -245,59 +168,7 @@ memmmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int prot)
return (0);
}
static int
mmioctl(struct cdev *dev, u_long cmd, caddr_t cmdarg, int flags, struct thread *td)
void
dev_mem_md_init(void)
{
switch(minor(dev)) {
#ifdef PERFMON
case 32:
return perfmon_ioctl(dev, cmd, cmdarg, flags, td);
#endif
default:
return ENODEV;
}
return (0);
}
static int
mem_modevent(module_t mod, int type, void *data)
{
switch(type) {
case MOD_LOAD:
if (bootverbose)
printf("mem: <memory & I/O>\n");
/* XXX - ??? */
#if 0
/* Initialise memory range handling */
if (mem_range_softc.mr_op != NULL)
mem_range_softc.mr_op->init(&mem_range_softc);
#endif
memdev = make_dev(&mem_cdevsw, 0, UID_ROOT, GID_KMEM,
0640, "mem");
kmemdev = make_dev(&mem_cdevsw, 1, UID_ROOT, GID_KMEM,
0640, "kmem");
#ifdef PERFMON
perfdev = make_dev(&mem_cdevsw, 32, UID_ROOT, GID_KMEM,
0640, "perfmon");
#endif /* PERFMON */
return 0;
case MOD_UNLOAD:
destroy_dev(memdev);
destroy_dev(kmemdev);
#ifdef PERFMON
destroy_dev(perfdev);
#endif /* PERFMON */
return 0;
case MOD_SHUTDOWN:
return 0;
default:
return EOPNOTSUPP;
}
}
DEV_MODULE(mem, mem_modevent, NULL);

38
sys/ia64/include/memdev.h Normal file
View File

@ -0,0 +1,38 @@
/*-
* Copyright (c) 2004 Mark R V Murray
* All rights reserved.
*
* 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
* in this position and unchanged.
* 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.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``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 AUTHOR 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.
*
* $FreeBSD$
*/
#define CDEV_MAJOR 2
#define CDEV_MINOR_MEM 0
#define CDEV_MINOR_KMEM 1
d_open_t memopen;
d_read_t memrw;
#define memioctl (d_ioctl_t *)NULL;
d_mmap_t memmmap;
void dev_mem_md_init(void);

View File

@ -101,6 +101,7 @@ SUBDIR= ${_3dfx} \
if_tun \
if_vlan \
${_iir} \
${_io} \
ip6fw \
${_ipfilter} \
ipfw \
@ -131,6 +132,7 @@ SUBDIR= ${_3dfx} \
mac_test \
mcd \
md \
mem \
mii \
mlx \
${_mly} \
@ -149,7 +151,7 @@ SUBDIR= ${_3dfx} \
${_nsp} \
ntfs \
ntfs_iconv \
${_null} \
null \
nullfs \
${_nwfs} \
${_oltr} \
@ -252,7 +254,6 @@ _syscons= syscons
.endif
.if defined(ALL_MODULES)
_null= null
_ufs= ufs
.endif
@ -301,6 +302,7 @@ _hfa= hfa
_i2c= i2c
_ibcs2= ibcs2
_ie= ie
_io= io
_linprocfs= linprocfs
_linux= linux
_lnc= lnc
@ -374,6 +376,7 @@ _sppp= sppp
.endif
.if ${MACHINE_ARCH} == "amd64"
_io= io
#_ndis= ndis
.endif

10
sys/modules/io/Makefile Normal file
View File

@ -0,0 +1,10 @@
# $FreeBSD$
.PATH: ${.CURDIR}/../../dev/io
.PATH: ${.CURDIR}/../../${MACHINE_ARCH}/${MACHINE_ARCH}
KMOD= io
SRCS= iodev.c io.c
SRCS+= bus_if.h device_if.h vnode_if.h
.include <bsd.kmod.mk>

10
sys/modules/mem/Makefile Normal file
View File

@ -0,0 +1,10 @@
# $FreeBSD$
.PATH: ${.CURDIR}/../../dev/mem
.PATH: ${.CURDIR}/../../${MACHINE_ARCH}/${MACHINE_ARCH}
KMOD= mem
SRCS= memdev.c mem.c
SRCS+= bus_if.h device_if.h vnode_if.h
.include <bsd.kmod.mk>

View File

@ -216,8 +216,10 @@ device wi # WaveLAN/Intersil/Symbol 802.11 wireless NICs.
#device wl # Older non 802.11 Wavelan wireless NIC.
# Pseudo devices.
device random # Entropy device
device loop # Network loopback
device mem # Memory and kernel memory devices
device null # Null and zero devices
device random # Entropy device
device ether # Ethernet support
device sl # Kernel SLIP
device ppp # Kernel PPP

View File

@ -102,8 +102,10 @@ device dc # DEC/Intel 21143 and various workalikes
device fxp # Intel EtherExpress PRO/100B (82557, 82558)
# Pseudo devices.
device random # Entropy device
device loop # Network loopback
device mem # Memory and kernel memory devices
device null # Null and zero devices
device random # Entropy device
device ether # Ethernet support
device sl # Kernel SLIP
device ppp # Kernel PPP

View File

@ -165,8 +165,10 @@ device rl # RealTek 8129/8139
device xl # 3Com 3c90x (``Boomerang'', ``Cyclone'')
# Pseudo devices.
device random # Entropy device
device loop # Network loopback
device mem # Memory and kernel memory devices
device null # Null and zero devices
device random # Entropy device
device ether # Ethernet support
device sl # Kernel SLIP
device ppp # Kernel PPP

View File

@ -0,0 +1,38 @@
/*-
* Copyright (c) 2004 Mark R V Murray
* All rights reserved.
*
* 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
* in this position and unchanged.
* 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.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``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 AUTHOR 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.
*
* $FreeBSD$
*/
#define CDEV_MAJOR 2
#define CDEV_MINOR_MEM 0
#define CDEV_MINOR_KMEM 1
d_open_t memopen;
d_read_t memrw;
#define memioctl (d_ioctl_t *)NULL
#define memmmap (d_mmap_t *)NULL
void dev_mem_md_init(void);

View File

@ -35,10 +35,11 @@
* from: Utah $Hdr: mem.c 1.13 89/10/08$
* from: @(#)mem.c 7.2 (Berkeley) 5/9/91
* from: FreeBSD: src/sys/i386/i386/mem.c,v 1.94 2001/09/26
*
* $FreeBSD$
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
/*
* Memory special file
*
@ -52,9 +53,10 @@
#include <sys/fcntl.h>
#include <sys/kernel.h>
#include <sys/lock.h>
#include <sys/malloc.h>
#include <sys/memrange.h>
#include <sys/module.h>
#include <sys/mutex.h>
#include <sys/module.h>
#include <sys/proc.h>
#include <sys/signalvar.h>
#include <sys/systm.h>
@ -73,54 +75,13 @@
#include <machine/tlb.h>
#include <machine/upa.h>
static struct cdev *memdev, *kmemdev;
#include <machine/memdev.h>
static d_open_t mmopen;
static d_close_t mmclose;
static d_read_t mmrw;
struct mem_range_softc mem_range_softc;
#define CDEV_MAJOR 2
static struct cdevsw mem_cdevsw = {
.d_version = D_VERSION,
.d_open = mmopen,
.d_close = mmclose,
.d_read = mmrw,
.d_write = mmrw,
.d_name = "mem",
.d_maj = CDEV_MAJOR,
.d_flags = D_MEM | D_NEEDGIANT,
};
static int
mmclose(struct cdev *dev, int flags, int fmt, struct thread *td)
{
return (0);
}
static int
mmopen(struct cdev *dev, int flags, int fmt, struct thread *td)
{
int error;
switch (minor(dev)) {
case 0:
case 1:
if (flags & FWRITE) {
error = securelevel_gt(td->td_ucred, 0);
if (error != 0)
return (error);
}
break;
default:
return (ENXIO);
}
return (0);
}
/*ARGSUSED*/
static int
mmrw(struct cdev *dev, struct uio *uio, int flags)
/* ARGSUSED */
int
memrw(struct cdev *dev, struct uio *uio, int flags)
{
struct iovec *iov;
vm_offset_t eva;
@ -147,12 +108,10 @@ mmrw(struct cdev *dev, struct uio *uio, int flags)
uio->uio_iov++;
uio->uio_iovcnt--;
if (uio->uio_iovcnt < 0)
panic("mmrw");
panic("memrw");
continue;
}
switch (minor(dev)) {
case 0:
/* mem (physical memory) */
if (minor(dev) == CDEV_MINOR_MEM) {
pa = uio->uio_offset & ~PAGE_MASK;
if (!is_physical_memory(pa)) {
error = EFAULT;
@ -193,8 +152,8 @@ mmrw(struct cdev *dev, struct uio *uio, int flags)
uio);
}
break;
case 1:
/* kmem (kernel memory) */
}
else if (minor(dev) == CDEV_MINOR_KMEM) {
va = trunc_page(uio->uio_offset);
eva = round_page(uio->uio_offset + iov->iov_len);
@ -215,40 +174,15 @@ mmrw(struct cdev *dev, struct uio *uio, int flags)
error = uiomove((void *)va, iov->iov_len, uio);
break;
default:
return (ENODEV);
}
/* else panic! */
}
if (ova != 0)
kmem_free_wakeup(kernel_map, ova, PAGE_SIZE * DCACHE_COLORS);
return (error);
}
static int
mem_modevent(module_t mod, int type, void *data)
void
dev_mem_md_init(void)
{
switch(type) {
case MOD_LOAD:
if (bootverbose)
printf("mem: <memory & I/O>\n");
memdev = make_dev(&mem_cdevsw, 0, UID_ROOT, GID_KMEM,
0640, "mem");
kmemdev = make_dev(&mem_cdevsw, 1, UID_ROOT, GID_KMEM,
0640, "kmem");
return 0;
case MOD_UNLOAD:
destroy_dev(memdev);
destroy_dev(kmemdev);
return 0;
case MOD_SHUTDOWN:
return 0;
default:
return EOPNOTSUPP;
}
}
DEV_MODULE(mem, mem_modevent, NULL);