summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/alpha/alpha/mem.c167
-rw-r--r--sys/alpha/conf/GENERIC4
-rw-r--r--sys/alpha/include/memdev.h38
-rw-r--r--sys/amd64/amd64/io.c77
-rw-r--r--sys/amd64/amd64/mem.c168
-rw-r--r--sys/amd64/conf/GENERIC4
-rw-r--r--sys/amd64/conf/NOTES4
-rw-r--r--sys/amd64/include/iodev.h33
-rw-r--r--sys/amd64/include/memdev.h38
-rw-r--r--sys/conf/NOTES8
-rw-r--r--sys/conf/files3
-rw-r--r--sys/conf/files.alpha2
-rw-r--r--sys/conf/files.amd644
-rw-r--r--sys/conf/files.i3868
-rw-r--r--sys/conf/files.ia642
-rw-r--r--sys/conf/files.pc982
-rw-r--r--sys/conf/files.sparc642
-rw-r--r--sys/dev/io/iodev.c89
-rw-r--r--sys/dev/mem/memdev.c108
-rw-r--r--sys/dev/null/null.c36
-rw-r--r--sys/i386/conf/GENERIC6
-rw-r--r--sys/i386/conf/NOTES4
-rw-r--r--sys/i386/i386/io.c77
-rw-r--r--sys/i386/i386/mem.c180
-rw-r--r--sys/i386/include/iodev.h33
-rw-r--r--sys/i386/include/memdev.h40
-rw-r--r--sys/ia64/conf/GENERIC2
-rw-r--r--sys/ia64/ia64/mem.c171
-rw-r--r--sys/ia64/include/memdev.h38
-rw-r--r--sys/modules/Makefile7
-rw-r--r--sys/modules/io/Makefile10
-rw-r--r--sys/modules/mem/Makefile10
-rw-r--r--sys/pc98/conf/GENERIC4
-rw-r--r--sys/powerpc/conf/GENERIC4
-rw-r--r--sys/sparc64/conf/GENERIC4
-rw-r--r--sys/sparc64/include/memdev.h38
-rw-r--r--sys/sparc64/sparc64/mem.c100
37 files changed, 833 insertions, 692 deletions
diff --git a/sys/alpha/alpha/mem.c b/sys/alpha/alpha/mem.c
index a64ea2a..fdc59ca 100644
--- a/sys/alpha/alpha/mem.c
+++ b/sys/alpha/alpha/mem.c
@@ -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 @@ kmemphys:
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 @@ kmemphys:
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 @@ kmemphys:
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)
-{
- 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)
+void
+dev_mem_md_init(void)
{
- 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);
diff --git a/sys/alpha/conf/GENERIC b/sys/alpha/conf/GENERIC
index b472cf5..08edc0f 100644
--- a/sys/alpha/conf/GENERIC
+++ b/sys/alpha/conf/GENERIC
@@ -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
diff --git a/sys/alpha/include/memdev.h b/sys/alpha/include/memdev.h
new file mode 100644
index 0000000..e2ec491
--- /dev/null
+++ b/sys/alpha/include/memdev.h
@@ -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);
diff --git a/sys/amd64/amd64/io.c b/sys/amd64/amd64/io.c
new file mode 100644
index 0000000..1aaf2ef
--- /dev/null
+++ b/sys/amd64/amd64/io.c
@@ -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);
+}
diff --git a/sys/amd64/amd64/mem.c b/sys/amd64/amd64/mem.c
index 739ae6d..2d0506e 100644
--- a/sys/amd64/amd64/mem.c
+++ b/sys/amd64/amd64/mem.c
@@ -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 @@ kmemphys:
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 @@ kmemphys:
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);
diff --git a/sys/amd64/conf/GENERIC b/sys/amd64/conf/GENERIC
index aa9848d..a6368d3 100644
--- a/sys/amd64/conf/GENERIC
+++ b/sys/amd64/conf/GENERIC
@@ -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
diff --git a/sys/amd64/conf/NOTES b/sys/amd64/conf/NOTES
index d3610a6..b21160c 100644
--- a/sys/amd64/conf/NOTES
+++ b/sys/amd64/conf/NOTES
@@ -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
diff --git a/sys/amd64/include/iodev.h b/sys/amd64/include/iodev.h
new file mode 100644
index 0000000..2273620
--- /dev/null
+++ b/sys/amd64/include/iodev.h
@@ -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;
diff --git a/sys/amd64/include/memdev.h b/sys/amd64/include/memdev.h
new file mode 100644
index 0000000..b6d3122
--- /dev/null
+++ b/sys/amd64/include/memdev.h
@@ -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);
diff --git a/sys/conf/NOTES b/sys/conf/NOTES
index 40d23b4..c919e31 100644
--- a/sys/conf/NOTES
+++ b/sys/conf/NOTES
@@ -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
diff --git a/sys/conf/files b/sys/conf/files
index ab5ff56..b84fdaf 100644
--- a/sys/conf/files
+++ b/sys/conf/files
@@ -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
diff --git a/sys/conf/files.alpha b/sys/conf/files.alpha
index 73f166d..6b3553b 100644
--- a/sys/conf/files.alpha
+++ b/sys/conf/files.alpha
@@ -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
diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64
index 2147cce..74a254a 100644
--- a/sys/conf/files.amd64
+++ b/sys/conf/files.amd64
@@ -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
diff --git a/sys/conf/files.i386 b/sys/conf/files.i386
index d569b44..b5aa266 100644
--- a/sys/conf/files.i386
+++ b/sys/conf/files.i386
@@ -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
diff --git a/sys/conf/files.ia64 b/sys/conf/files.ia64
index b4d2e94..8d1ccab 100644
--- a/sys/conf/files.ia64
+++ b/sys/conf/files.ia64
@@ -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
diff --git a/sys/conf/files.pc98 b/sys/conf/files.pc98
index 3a377b7..bfb08a7 100644
--- a/sys/conf/files.pc98
+++ b/sys/conf/files.pc98
@@ -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
diff --git a/sys/conf/files.sparc64 b/sys/conf/files.sparc64
index 878930e..148483e 100644
--- a/sys/conf/files.sparc64
+++ b/sys/conf/files.sparc64
@@ -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
diff --git a/sys/dev/io/iodev.c b/sys/dev/io/iodev.c
new file mode 100644
index 0000000..d1b3170
--- /dev/null
+++ b/sys/dev/io/iodev.c
@@ -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);
diff --git a/sys/dev/mem/memdev.c b/sys/dev/mem/memdev.c
new file mode 100644
index 0000000..290259a
--- /dev/null
+++ b/sys/dev/mem/memdev.c
@@ -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);
diff --git a/sys/dev/null/null.c b/sys/dev/null/null.c
index 4f7bd9c..653d732 100644
--- a/sys/dev/null/null.c
+++ b/sys/dev/null/null.c
@@ -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,19 +111,23 @@ 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)
{
switch(type) {
@@ -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;
diff --git a/sys/i386/conf/GENERIC b/sys/i386/conf/GENERIC
index 3fce0da..f8ae817 100644
--- a/sys/i386/conf/GENERIC
+++ b/sys/i386/conf/GENERIC
@@ -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
diff --git a/sys/i386/conf/NOTES b/sys/i386/conf/NOTES
index c1d05f5..6a6b4e6 100644
--- a/sys/i386/conf/NOTES
+++ b/sys/i386/conf/NOTES
@@ -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
diff --git a/sys/i386/i386/io.c b/sys/i386/i386/io.c
new file mode 100644
index 0000000..1c0866d
--- /dev/null
+++ b/sys/i386/i386/io.c
@@ -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);
+}
diff --git a/sys/i386/i386/mem.c b/sys/i386/i386/mem.c
index 379b59c..444499c 100644
--- a/sys/i386/i386/mem.c
+++ b/sys/i386/i386/mem.c
@@ -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);
diff --git a/sys/i386/include/iodev.h b/sys/i386/include/iodev.h
new file mode 100644
index 0000000..2273620
--- /dev/null
+++ b/sys/i386/include/iodev.h
@@ -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;
diff --git a/sys/i386/include/memdev.h b/sys/i386/include/memdev.h
new file mode 100644
index 0000000..4443e36
--- /dev/null
+++ b/sys/i386/include/memdev.h
@@ -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);
diff --git a/sys/ia64/conf/GENERIC b/sys/ia64/conf/GENERIC
index 859cd9d..f19dfc3 100644
--- a/sys/ia64/conf/GENERIC
+++ b/sys/ia64/conf/GENERIC
@@ -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)
diff --git a/sys/ia64/ia64/mem.c b/sys/ia64/ia64/mem.c
index d03051f..79c97ee 100644
--- a/sys/ia64/ia64/mem.c
+++ b/sys/ia64/ia64/mem.c
@@ -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 @@ kmemphys:
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 @@ kmemphys:
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);
diff --git a/sys/ia64/include/memdev.h b/sys/ia64/include/memdev.h
new file mode 100644
index 0000000..e2ec491
--- /dev/null
+++ b/sys/ia64/include/memdev.h
@@ -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);
diff --git a/sys/modules/Makefile b/sys/modules/Makefile
index 98052a7..938c4c8 100644
--- a/sys/modules/Makefile
+++ b/sys/modules/Makefile
@@ -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
diff --git a/sys/modules/io/Makefile b/sys/modules/io/Makefile
new file mode 100644
index 0000000..ffb3442
--- /dev/null
+++ b/sys/modules/io/Makefile
@@ -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>
diff --git a/sys/modules/mem/Makefile b/sys/modules/mem/Makefile
new file mode 100644
index 0000000..d1529a5
--- /dev/null
+++ b/sys/modules/mem/Makefile
@@ -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>
diff --git a/sys/pc98/conf/GENERIC b/sys/pc98/conf/GENERIC
index 6498139..23db02c 100644
--- a/sys/pc98/conf/GENERIC
+++ b/sys/pc98/conf/GENERIC
@@ -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
diff --git a/sys/powerpc/conf/GENERIC b/sys/powerpc/conf/GENERIC
index 0da074d..c0cebc3 100644
--- a/sys/powerpc/conf/GENERIC
+++ b/sys/powerpc/conf/GENERIC
@@ -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
diff --git a/sys/sparc64/conf/GENERIC b/sys/sparc64/conf/GENERIC
index d5fe010..dab8d2e 100644
--- a/sys/sparc64/conf/GENERIC
+++ b/sys/sparc64/conf/GENERIC
@@ -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
diff --git a/sys/sparc64/include/memdev.h b/sys/sparc64/include/memdev.h
new file mode 100644
index 0000000..671a6b4
--- /dev/null
+++ b/sys/sparc64/include/memdev.h
@@ -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);
diff --git a/sys/sparc64/sparc64/mem.c b/sys/sparc64/sparc64/mem.c
index d7a1818..66bbea9 100644
--- a/sys/sparc64/sparc64/mem.c
+++ b/sys/sparc64/sparc64/mem.c
@@ -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;
-
-static d_open_t mmopen;
-static d_close_t mmclose;
-static d_read_t mmrw;
-
-#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)
-{
+#include <machine/memdev.h>
- return (0);
-}
+struct mem_range_softc 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;
- 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);
OpenPOWER on IntegriCloud