diff options
author | nwhitehorn <nwhitehorn@FreeBSD.org> | 2014-09-04 18:24:47 +0000 |
---|---|---|
committer | nwhitehorn <nwhitehorn@FreeBSD.org> | 2014-09-04 18:24:47 +0000 |
commit | ff75003b88c2692803422cd7cefda9bafe2e9285 (patch) | |
tree | d7f60e7e9cf9f29144b9392722a9b1f5c5119bdf /sys/powerpc/powerpc | |
parent | fb8b6d3e049d6ff50a8f60558ec70e78e57f0178 (diff) | |
download | FreeBSD-src-ff75003b88c2692803422cd7cefda9bafe2e9285.zip FreeBSD-src-ff75003b88c2692803422cd7cefda9bafe2e9285.tar.gz |
MFC r268880:
Allow mappings of memory not previously direct-mapped by the kernel when
calling mmap on /dev/mem and add a handler for the possible userland
machine checks that may result. Remove some pointless and wrong copy/paste
that has been in here for a decade as well.
This results in a /dev/mem with identical semantics to the x86 version.
Diffstat (limited to 'sys/powerpc/powerpc')
-rw-r--r-- | sys/powerpc/powerpc/mem.c | 24 |
1 files changed, 7 insertions, 17 deletions
diff --git a/sys/powerpc/powerpc/mem.c b/sys/powerpc/powerpc/mem.c index 08e1cce..358871c 100644 --- a/sys/powerpc/powerpc/mem.c +++ b/sys/powerpc/powerpc/mem.c @@ -179,22 +179,13 @@ memmmap(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, { int i; - /* - * /dev/mem is the only one that makes sense through this - * interface. For /dev/kmem any physaddr we return here - * could be transient and hence incorrect or invalid at - * a later time. - */ - if (dev2unit(dev) != CDEV_MINOR_MEM) - return (-1); - - /* Only direct-mapped addresses. */ - if (mem_valid(offset, 0) - && pmap_dev_direct_mapped(offset, 0)) + if (dev2unit(dev) == CDEV_MINOR_MEM) + *paddr = offset; + else if (dev2unit(dev) == CDEV_MINOR_KMEM) + *paddr = vtophys(offset); + else return (EFAULT); - *paddr = offset; - for (i = 0; i < mem_range_softc.mr_ndesc; i++) { if (!(mem_range_softc.mr_desc[i].mr_flags & MDF_ACTIVE)) continue; @@ -231,9 +222,7 @@ ppc_mrinit(struct mem_range_softc *sc) sc->mr_cap = 0; sc->mr_ndesc = 8; /* XXX: Should be dynamically expandable */ sc->mr_desc = malloc(sc->mr_ndesc * sizeof(struct mem_range_desc), - M_MEMDESC, M_NOWAIT | M_ZERO); - if (sc->mr_desc == NULL) - panic("%s: malloc returns NULL", __func__); + M_MEMDESC, M_WAITOK | M_ZERO); } static int @@ -328,3 +317,4 @@ memioctl(struct cdev *dev __unused, u_long cmd, caddr_t data, int flags, } return (error); } + |