From fc26c9f1dc7d005c8f5ba8c1026173e3cf9302a1 Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Sun, 17 Dec 2006 20:07:33 +0000 Subject: [PATCH] Repo copy machine/pc32/i386/mem.c to kern/kern_memio.c and separate out the (few) machine-dependant parts. This file primarily controls access to /dev/zero, /dev/null, /dev/random, and kernel memory, and does not belong in a machine-dependant directory. --- sys/conf/files | 3 +- sys/kern/kern_memio.c | 27 +- sys/platform/pc32/conf/files | 3 +- sys/platform/pc32/i386/i686_mem.c | 5 +- sys/platform/pc32/i386/k6_mem.c | 5 +- sys/platform/pc32/i386/mem.c | 558 --------------------------- sys/platform/pc32/i386/sys_machdep.c | 24 +- sys/sys/memrange.h | 6 +- 8 files changed, 53 insertions(+), 578 deletions(-) delete mode 100644 sys/platform/pc32/i386/mem.c diff --git a/sys/conf/files b/sys/conf/files index 27462aeeea..d54e8a944c 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -1,5 +1,5 @@ # $FreeBSD: src/sys/conf/files,v 1.340.2.137 2003/06/04 17:10:30 sam Exp $ -# $DragonFly: src/sys/conf/files,v 1.146 2006/12/14 16:20:22 swildner Exp $ +# $DragonFly: src/sys/conf/files,v 1.147 2006/12/17 20:07:27 dillon Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -543,6 +543,7 @@ kern/kern_cputimer.c standard kern/kern_mpipe.c standard kern/kern_shutdown.c standard kern/kern_sig.c standard +kern/kern_memio.c standard kern/kern_upcall.c standard kern/kern_sfbuf.c standard kern/kern_msfbuf.c standard diff --git a/sys/kern/kern_memio.c b/sys/kern/kern_memio.c index f784ff9efc..3c31d760e5 100644 --- a/sys/kern/kern_memio.c +++ b/sys/kern/kern_memio.c @@ -39,7 +39,7 @@ * from: Utah $Hdr: mem.c 1.13 89/10/08$ * from: @(#)mem.c 7.2 (Berkeley) 5/9/91 * $FreeBSD: src/sys/i386/i386/mem.c,v 1.79.2.9 2003/01/04 22:58:01 njl Exp $ - * $DragonFly: src/sys/kern/kern_memio.c,v 1.23 2006/11/07 06:43:24 dillon Exp $ + * $DragonFly: src/sys/kern/kern_memio.c,v 1.24 2006/12/17 20:07:29 dillon Exp $ */ /* @@ -62,11 +62,6 @@ #include #include -#include -#include -#include -#include - #include #include #include @@ -113,34 +108,40 @@ mmopen(struct dev_open_args *ap) case 1: if ((ap->a_oflags & FWRITE) && securelevel > 0) return (EPERM); + error = 0; break; case 14: error = suser_cred(ap->a_cred, 0); if (error != 0) - return (error); - if (securelevel > 0) - return (EPERM); - curproc->p_md.md_regs->tf_eflags |= PSL_IOPL; + break; + if (securelevel > 0) { + error = EPERM; + break; + } + error = cpu_set_iopl(); break; default: + error = 0; break; } - return (0); + return (error); } static int mmclose(struct dev_close_args *ap) { cdev_t dev = ap->a_head.a_dev; + int error; switch (minor(dev)) { case 14: - curproc->p_md.md_regs->tf_eflags &= ~PSL_IOPL; + error = cpu_clr_iopl(); break; default: + error = 0; break; } - return (0); + return (error); } diff --git a/sys/platform/pc32/conf/files b/sys/platform/pc32/conf/files index 47f80db1a3..a1dcd141b4 100644 --- a/sys/platform/pc32/conf/files +++ b/sys/platform/pc32/conf/files @@ -2,7 +2,7 @@ # files marked standard are always included. # # $FreeBSD: src/sys/conf/files.i386,v 1.307.2.38 2003/01/02 20:41:33 kan Exp $ -# $DragonFly: src/sys/platform/pc32/conf/files,v 1.3 2006/11/07 17:51:23 dillon Exp $ +# $DragonFly: src/sys/platform/pc32/conf/files,v 1.4 2006/12/17 20:07:30 dillon Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -177,7 +177,6 @@ machine/pc32/i386/tls.c standard # arch/i386/i386/locore.s standard machine/pc32/i386/machdep.c standard machine/pc32/i386/math_emulate.c optional math_emulate -machine/pc32/i386/mem.c standard machine/pc32/icu/icu_abi.c standard machine/pc32/icu/icu_ipl.s standard machine/pc32/icu/icu_vector.s standard diff --git a/sys/platform/pc32/i386/i686_mem.c b/sys/platform/pc32/i386/i686_mem.c index ea0e093280..bcfae17740 100644 --- a/sys/platform/pc32/i386/i686_mem.c +++ b/sys/platform/pc32/i386/i686_mem.c @@ -24,7 +24,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/i386/i386/i686_mem.c,v 1.8.2.4 2002/09/24 08:12:51 mdodd Exp $ - * $DragonFly: src/sys/platform/pc32/i386/i686_mem.c,v 1.5 2006/09/05 03:48:11 dillon Exp $ + * $DragonFly: src/sys/platform/pc32/i386/i686_mem.c,v 1.6 2006/12/17 20:07:32 dillon Exp $ */ #include @@ -33,8 +33,11 @@ #include #include #include +#include +#include #include +#include #include #ifdef SMP diff --git a/sys/platform/pc32/i386/k6_mem.c b/sys/platform/pc32/i386/k6_mem.c index 9598f74bbe..dbf5220db7 100644 --- a/sys/platform/pc32/i386/k6_mem.c +++ b/sys/platform/pc32/i386/k6_mem.c @@ -24,7 +24,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/i386/i386/k6_mem.c,v 1.4.2.2 2002/09/16 21:58:41 dwmalone Exp $ - * $DragonFly: src/sys/platform/pc32/i386/k6_mem.c,v 1.6 2006/09/05 03:48:11 dillon Exp $ + * $DragonFly: src/sys/platform/pc32/i386/k6_mem.c,v 1.7 2006/12/17 20:07:32 dillon Exp $ * */ @@ -34,8 +34,11 @@ #include #include #include +#include +#include #include +#include #include #include diff --git a/sys/platform/pc32/i386/mem.c b/sys/platform/pc32/i386/mem.c deleted file mode 100644 index bd02707fd4..0000000000 --- a/sys/platform/pc32/i386/mem.c +++ /dev/null @@ -1,558 +0,0 @@ -/*- - * Copyright (c) 1988 University of Utah. - * Copyright (c) 1982, 1986, 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * the Systems Programming Group of the University of Utah Computer - * Science Department, and code derived from software contributed to - * Berkeley by William Jolitz. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * from: Utah $Hdr: mem.c 1.13 89/10/08$ - * from: @(#)mem.c 7.2 (Berkeley) 5/9/91 - * $FreeBSD: src/sys/i386/i386/mem.c,v 1.79.2.9 2003/01/04 22:58:01 njl Exp $ - * $DragonFly: src/sys/platform/pc32/i386/Attic/mem.c,v 1.23 2006/11/07 06:43:24 dillon Exp $ - */ - -/* - * Memory special file - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include - - -static d_open_t mmopen; -static d_close_t mmclose; -static d_read_t mmread; -static d_write_t mmwrite; -static d_ioctl_t mmioctl; -static d_mmap_t memmmap; -static d_poll_t mmpoll; - -#define CDEV_MAJOR 2 -static struct dev_ops mem_ops = { - { "mem", CDEV_MAJOR, D_MEM }, - .d_open = mmopen, - .d_close = mmclose, - .d_read = mmread, - .d_write = mmwrite, - .d_ioctl = mmioctl, - .d_poll = mmpoll, - .d_mmap = memmmap, -}; - -static int rand_bolt; -static caddr_t zbuf; - -MALLOC_DEFINE(M_MEMDESC, "memdesc", "memory range descriptors"); -static int mem_ioctl (cdev_t, u_long, caddr_t, int, struct ucred *); -static int random_ioctl (cdev_t, u_long, caddr_t, int, struct ucred *); - -struct mem_range_softc mem_range_softc; - - -static int -mmopen(struct dev_open_args *ap) -{ - cdev_t dev = ap->a_head.a_dev; - int error; - - switch (minor(dev)) { - case 0: - case 1: - if ((ap->a_oflags & FWRITE) && securelevel > 0) - return (EPERM); - break; - case 14: - error = suser_cred(ap->a_cred, 0); - if (error != 0) - return (error); - if (securelevel > 0) - return (EPERM); - curproc->p_md.md_regs->tf_eflags |= PSL_IOPL; - break; - default: - break; - } - return (0); -} - -static int -mmclose(struct dev_close_args *ap) -{ - cdev_t dev = ap->a_head.a_dev; - - switch (minor(dev)) { - case 14: - curproc->p_md.md_regs->tf_eflags &= ~PSL_IOPL; - break; - default: - break; - } - return (0); -} - - -static int -mmrw(cdev_t dev, struct uio *uio, int flags) -{ - int o; - u_int c, v; - u_int poolsize; - struct iovec *iov; - int error = 0; - caddr_t buf = NULL; - - while (uio->uio_resid > 0 && error == 0) { - iov = uio->uio_iov; - if (iov->iov_len == 0) { - uio->uio_iov++; - uio->uio_iovcnt--; - if (uio->uio_iovcnt < 0) - panic("mmrw"); - continue; - } - switch (minor(dev)) { - case 0: - /* - * minor device 0 is physical memory, /dev/mem - */ - v = uio->uio_offset; - v &= ~PAGE_MASK; - pmap_kenter((vm_offset_t)ptvmmap, v); - o = (int)uio->uio_offset & PAGE_MASK; - c = (u_int)(PAGE_SIZE - ((int)iov->iov_base & PAGE_MASK)); - c = min(c, (u_int)(PAGE_SIZE - o)); - c = min(c, (u_int)iov->iov_len); - error = uiomove((caddr_t)&ptvmmap[o], (int)c, uio); - pmap_kremove((vm_offset_t)ptvmmap); - continue; - - case 1: { - /* - * minor device 1 is kernel memory, /dev/kmem - */ - vm_offset_t addr, eaddr; - c = iov->iov_len; - - /* - * 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); - - if (addr < (vm_offset_t)VADDR(PTDPTDI, 0)) - return EFAULT; - if (eaddr >= (vm_offset_t)VADDR(APTDPTDI, 0)) - return EFAULT; - for (; addr < eaddr; addr += PAGE_SIZE) - if (pmap_extract(kernel_pmap, addr) == 0) - return EFAULT; - - if (!kernacc((caddr_t)(int)uio->uio_offset, c, - uio->uio_rw == UIO_READ ? - VM_PROT_READ : VM_PROT_WRITE)) - return (EFAULT); - error = uiomove((caddr_t)(int)uio->uio_offset, (int)c, uio); - continue; - } - case 2: - /* - * minor device 2 is EOF/RATHOLE - */ - if (uio->uio_rw == UIO_READ) - return (0); - c = iov->iov_len; - break; - case 3: - /* - * minor device 3 (/dev/random) is source of filth - * on read, seeder on write - */ - if (buf == NULL) - buf = kmalloc(PAGE_SIZE, M_TEMP, M_WAITOK); - c = min(iov->iov_len, PAGE_SIZE); - if (uio->uio_rw == UIO_WRITE) { - error = uiomove(buf, (int)c, uio); - if (error == 0) - error = add_buffer_randomness(buf, c); - } else { - poolsize = read_random(buf, c); - if (poolsize == 0) { - if (buf) - kfree(buf, M_TEMP); - if ((flags & IO_NDELAY) != 0) - return (EWOULDBLOCK); - return (0); - } - c = min(c, poolsize); - error = uiomove(buf, (int)c, uio); - } - continue; - case 4: - /* - * minor device 4 (/dev/urandom) is source of muck - * on read, writes are disallowed. - */ - c = min(iov->iov_len, PAGE_SIZE); - if (uio->uio_rw == UIO_WRITE) { - error = EPERM; - break; - } - if (CURSIG(curproc) != 0) { - /* - * Use tsleep() to get the error code right. - * It should return immediately. - */ - error = tsleep(&rand_bolt, PCATCH, "urand", 1); - if (error != 0 && error != EWOULDBLOCK) - continue; - } - if (buf == NULL) - buf = kmalloc(PAGE_SIZE, M_TEMP, M_WAITOK); - poolsize = read_random_unlimited(buf, c); - c = min(c, poolsize); - error = uiomove(buf, (int)c, uio); - continue; - case 12: - /* - * minor device 12 (/dev/zero) is source of nulls - * on read, write are disallowed. - */ - if (uio->uio_rw == UIO_WRITE) { - c = iov->iov_len; - break; - } - if (zbuf == NULL) { - zbuf = (caddr_t) - kmalloc(PAGE_SIZE, M_TEMP, M_WAITOK); - bzero(zbuf, PAGE_SIZE); - } - c = min(iov->iov_len, PAGE_SIZE); - error = uiomove(zbuf, (int)c, uio); - continue; - default: - return (ENODEV); - } - if (error) - break; - iov->iov_base += c; - iov->iov_len -= c; - uio->uio_offset += c; - uio->uio_resid -= c; - } - if (buf) - kfree(buf, M_TEMP); - return (error); -} - -static int -mmread(struct dev_read_args *ap) -{ - return(mmrw(ap->a_head.a_dev, ap->a_uio, ap->a_ioflag)); -} - -static int -mmwrite(struct dev_write_args *ap) -{ - return(mmrw(ap->a_head.a_dev, ap->a_uio, ap->a_ioflag)); -} - - - - - -/*******************************************************\ -* allow user processes to MMAP some memory sections * -* instead of going through read/write * -\*******************************************************/ - -static int -memmmap(struct dev_mmap_args *ap) -{ - cdev_t dev = ap->a_head.a_dev; - - switch (minor(dev)) { - case 0: - /* - * minor device 0 is physical memory - */ - ap->a_result = i386_btop(ap->a_offset); - return 0; - case 1: - /* - * minor device 1 is kernel memory - */ - ap->a_result = i386_btop(vtophys(ap->a_offset)); - return 0; - - default: - return EINVAL; - } -} - -static int -mmioctl(struct dev_ioctl_args *ap) -{ - cdev_t dev = ap->a_head.a_dev; - - switch (minor(dev)) { - case 0: - return mem_ioctl(dev, ap->a_cmd, ap->a_data, - ap->a_fflag, ap->a_cred); - case 3: - case 4: - return random_ioctl(dev, ap->a_cmd, ap->a_data, - ap->a_fflag, ap->a_cred); - } - return (ENODEV); -} - -/* - * Operations for changing memory attributes. - * - * This is basically just an ioctl shim for mem_range_attr_get - * and mem_range_attr_set. - */ -static int -mem_ioctl(cdev_t dev, u_long cmd, caddr_t data, int flags, struct ucred *cred) -{ - int nd, error = 0; - struct mem_range_op *mo = (struct mem_range_op *)data; - struct mem_range_desc *md; - - /* is this for us? */ - if ((cmd != MEMRANGE_GET) && - (cmd != MEMRANGE_SET)) - return (ENOTTY); - - /* any chance we can handle this? */ - if (mem_range_softc.mr_op == NULL) - return (EOPNOTSUPP); - - /* do we have any descriptors? */ - if (mem_range_softc.mr_ndesc == 0) - return (ENXIO); - - switch (cmd) { - case MEMRANGE_GET: - nd = imin(mo->mo_arg[0], mem_range_softc.mr_ndesc); - if (nd > 0) { - md = (struct mem_range_desc *) - kmalloc(nd * sizeof(struct mem_range_desc), - M_MEMDESC, M_WAITOK); - error = mem_range_attr_get(md, &nd); - if (!error) - error = copyout(md, mo->mo_desc, - nd * sizeof(struct mem_range_desc)); - kfree(md, M_MEMDESC); - } else { - nd = mem_range_softc.mr_ndesc; - } - mo->mo_arg[0] = nd; - break; - - case MEMRANGE_SET: - md = (struct mem_range_desc *)kmalloc(sizeof(struct mem_range_desc), - M_MEMDESC, M_WAITOK); - error = copyin(mo->mo_desc, md, sizeof(struct mem_range_desc)); - /* clamp description string */ - md->mr_owner[sizeof(md->mr_owner) - 1] = 0; - if (error == 0) - error = mem_range_attr_set(md, &mo->mo_arg[0]); - kfree(md, M_MEMDESC); - break; - } - return (error); -} - -/* - * Implementation-neutral, kernel-callable functions for manipulating - * memory range attributes. - */ -int -mem_range_attr_get(struct mem_range_desc *mrd, int *arg) -{ - /* can we handle this? */ - if (mem_range_softc.mr_op == NULL) - return (EOPNOTSUPP); - - if (*arg == 0) { - *arg = mem_range_softc.mr_ndesc; - } else { - bcopy(mem_range_softc.mr_desc, mrd, (*arg) * sizeof(struct mem_range_desc)); - } - return (0); -} - -int -mem_range_attr_set(struct mem_range_desc *mrd, int *arg) -{ - /* can we handle this? */ - if (mem_range_softc.mr_op == NULL) - return (EOPNOTSUPP); - - return (mem_range_softc.mr_op->set(&mem_range_softc, mrd, arg)); -} - -#ifdef SMP -void -mem_range_AP_init(void) -{ - if (mem_range_softc.mr_op && mem_range_softc.mr_op->initAP) - return (mem_range_softc.mr_op->initAP(&mem_range_softc)); -} -#endif - -static int -random_ioctl(cdev_t dev, u_long cmd, caddr_t data, int flags, struct ucred *cred) -{ - int error; - int intr; - - /* - * Even inspecting the state is privileged, since it gives a hint - * about how easily the randomness might be guessed. - */ - error = 0; - - switch (cmd) { - /* Really handled in upper layer */ - case FIOASYNC: - break; - case MEM_SETIRQ: - intr = *(int16_t *)data; - if ((error = suser_cred(cred, 0)) != 0) - break; - if (intr < 0 || intr >= MAX_INTS) - return (EINVAL); - register_randintr(intr); - break; - case MEM_CLEARIRQ: - intr = *(int16_t *)data; - if ((error = suser_cred(cred, 0)) != 0) - break; - if (intr < 0 || intr >= MAX_INTS) - return (EINVAL); - unregister_randintr(intr); - break; - case MEM_RETURNIRQ: - error = ENOTSUP; - break; - case MEM_FINDIRQ: - intr = *(int16_t *)data; - if ((error = suser_cred(cred, 0)) != 0) - break; - if (intr < 0 || intr >= MAX_INTS) - return (EINVAL); - intr = next_registered_randintr(intr); - if (intr == MAX_INTS) - return (ENOENT); - *(u_int16_t *)data = intr; - break; - default: - error = ENOTSUP; - break; - } - return (error); -} - -int -mmpoll(struct dev_poll_args *ap) -{ - cdev_t dev = ap->a_head.a_dev; - int revents; - - switch (minor(dev)) { - case 3: /* /dev/random */ - revents = random_poll(dev, ap->a_events); - break; - case 4: /* /dev/urandom */ - default: - revents = seltrue(dev, ap->a_events); - break; - } - ap->a_events = revents; - return (0); -} - -int -iszerodev(cdev_t dev) -{ - return ((major(dev) == mem_ops.head.maj) - && minor(dev) == 12); -} - -static void -mem_drvinit(void *unused) -{ - - /* Initialise memory range handling */ - if (mem_range_softc.mr_op != NULL) - mem_range_softc.mr_op->init(&mem_range_softc); - - dev_ops_add(&mem_ops, 0xf0, 0); - make_dev(&mem_ops, 0, UID_ROOT, GID_KMEM, 0640, "mem"); - make_dev(&mem_ops, 1, UID_ROOT, GID_KMEM, 0640, "kmem"); - make_dev(&mem_ops, 2, UID_ROOT, GID_WHEEL, 0666, "null"); - make_dev(&mem_ops, 3, UID_ROOT, GID_WHEEL, 0644, "random"); - make_dev(&mem_ops, 4, UID_ROOT, GID_WHEEL, 0644, "urandom"); - make_dev(&mem_ops, 12, UID_ROOT, GID_WHEEL, 0666, "zero"); - make_dev(&mem_ops, 14, UID_ROOT, GID_WHEEL, 0600, "io"); -} - -SYSINIT(memdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,mem_drvinit,NULL) - diff --git a/sys/platform/pc32/i386/sys_machdep.c b/sys/platform/pc32/i386/sys_machdep.c index d3d5578f49..c94c4ff416 100644 --- a/sys/platform/pc32/i386/sys_machdep.c +++ b/sys/platform/pc32/i386/sys_machdep.c @@ -32,7 +32,7 @@ * * from: @(#)sys_machdep.c 5.5 (Berkeley) 1/19/91 * $FreeBSD: src/sys/i386/i386/sys_machdep.c,v 1.47.2.3 2002/10/07 17:20:00 jhb Exp $ - * $DragonFly: src/sys/platform/pc32/i386/sys_machdep.c,v 1.26 2006/11/07 18:50:07 dillon Exp $ + * $DragonFly: src/sys/platform/pc32/i386/sys_machdep.c,v 1.27 2006/12/17 20:07:32 dillon Exp $ * */ @@ -43,6 +43,7 @@ #include #include #include +#include #include #include @@ -550,3 +551,24 @@ check_descs(union descriptor *descs, int num) } return (0); } + +/* + * Called when /dev/io is opened + */ +int +cpu_set_iopl(void) +{ + curproc->p_md.md_regs->tf_eflags |= PSL_IOPL; + return(0); +} + +/* + * Called when /dev/io is closed + */ +int +cpu_clr_iopl(void) +{ + curproc->p_md.md_regs->tf_eflags &= ~PSL_IOPL; + return(0); +} + diff --git a/sys/sys/memrange.h b/sys/sys/memrange.h index 5b2db78518..5c53211293 100644 --- a/sys/sys/memrange.h +++ b/sys/sys/memrange.h @@ -3,7 +3,7 @@ * Memory range attribute operations, peformed on /dev/mem * * $FreeBSD: src/sys/sys/memrange.h,v 1.4.2.2 2002/09/16 21:58:37 dwmalone Exp $ - * $DragonFly: src/sys/sys/memrange.h,v 1.3 2006/05/20 02:42:13 dillon Exp $ + * $DragonFly: src/sys/sys/memrange.h,v 1.4 2006/12/17 20:07:33 dillon Exp $ */ #ifndef _SYS_MEMRANGE_H_ @@ -69,6 +69,8 @@ struct mem_range_ops void (*init)(struct mem_range_softc *sc); int (*set)(struct mem_range_softc *sc, struct mem_range_desc *mrd, int *arg); void (*initAP)(struct mem_range_softc *sc); + void (*set_iopl)(struct mem_range_softc *sc); + void (*clr_iopl)(struct mem_range_softc *sc); }; struct mem_range_softc @@ -84,6 +86,8 @@ extern struct mem_range_softc mem_range_softc; extern int mem_range_attr_get(struct mem_range_desc *mrd, int *arg); extern int mem_range_attr_set(struct mem_range_desc *mrd, int *arg); extern void mem_range_AP_init(void); +extern int cpu_set_iopl(void); +extern int cpu_clr_iopl(void); #endif #endif -- 2.41.0