diff options
author | simokawa <simokawa@FreeBSD.org> | 2003-06-22 12:59:43 +0000 |
---|---|---|
committer | simokawa <simokawa@FreeBSD.org> | 2003-06-22 12:59:43 +0000 |
commit | 4287eff1593c6c55d0cab7cbb09116098d962a31 (patch) | |
tree | 59053719e98fb6c3d39a7e5aee2e952bfd07685e /sys/amd64 | |
parent | cc83270ff23f3bab2a5895415dcadfc261be4b59 (diff) | |
download | FreeBSD-src-4287eff1593c6c55d0cab7cbb09116098d962a31.zip FreeBSD-src-4287eff1593c6c55d0cab7cbb09116098d962a31.tar.gz |
- Allow access to direct mapped region via /dev/kmem. This makes
'netstat -r' work.
- Use direct map for /dev/mem.
Diffstat (limited to 'sys/amd64')
-rw-r--r-- | sys/amd64/amd64/mem.c | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/sys/amd64/amd64/mem.c b/sys/amd64/amd64/mem.c index dd403f7..158de76 100644 --- a/sys/amd64/amd64/mem.c +++ b/sys/amd64/amd64/mem.c @@ -157,26 +157,28 @@ mmrw(dev_t dev, struct uio *uio, int flags) /* minor device 0 is physical memory */ case 0: v = uio->uio_offset; - v &= ~PAGE_MASK; - pmap_kenter((vm_offset_t)ptvmmap, v); - o = (int)uio->uio_offset & PAGE_MASK; - c = (u_long)(PAGE_SIZE - ((long)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_qremove((vm_offset_t)ptvmmap, 1); +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: - c = iov->iov_len; + v = uio->uio_offset; + + if (v >= DMAP_MIN_ADDRESS && v < DMAP_MAX_ADDRESS) { + v = DMAP_TO_PHYS(v); + goto 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. */ - addr = trunc_page(uio->uio_offset); - eaddr = round_page(uio->uio_offset + c); + addr = trunc_page(v); + eaddr = round_page(v + c); if (addr < (vm_offset_t)KERNBASE) return (EFAULT); @@ -184,11 +186,12 @@ mmrw(dev_t dev, struct uio *uio, int flags) if (pmap_extract(kernel_pmap, addr) == 0) return (EFAULT); - if (!kernacc((caddr_t)(long)uio->uio_offset, c, + if (!kernacc((caddr_t)(long)v, c, uio->uio_rw == UIO_READ ? VM_PROT_READ : VM_PROT_WRITE)) return (EFAULT); - error = uiomove((caddr_t)(long)uio->uio_offset, (int)c, uio); + + error = uiomove((caddr_t)(long)v, (int)c, uio); continue; default: |