diff options
author | peter <peter@FreeBSD.org> | 1999-09-11 20:31:32 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 1999-09-11 20:31:32 +0000 |
commit | 718e870486a4b898bbf0a37fd0cbe35eadb916d7 (patch) | |
tree | 508c8d1264ed08823c16bee71fe6b77892c80b4c /sys | |
parent | 68d776c14a7f61af74a1da7f209bc4099d2efd06 (diff) | |
download | FreeBSD-src-718e870486a4b898bbf0a37fd0cbe35eadb916d7.zip FreeBSD-src-718e870486a4b898bbf0a37fd0cbe35eadb916d7.tar.gz |
Make pmap_mapdev() deal with non-page-aligned requests.
Add a corresponding pmap_unmapdev() to release the KVM back to kernel_map.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/amd64/amd64/pmap.c | 20 | ||||
-rw-r--r-- | sys/amd64/include/pmap.h | 1 | ||||
-rw-r--r-- | sys/i386/i386/pmap.c | 20 | ||||
-rw-r--r-- | sys/i386/include/pmap.h | 1 |
4 files changed, 36 insertions, 6 deletions
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index 6129ed8..ac9cd3c 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -3280,10 +3280,11 @@ pmap_mapdev(pa, size) vm_offset_t pa; vm_size_t size; { - vm_offset_t va, tmpva; + vm_offset_t va, tmpva, offset; unsigned *pte; - size = roundup(size, PAGE_SIZE); + offset = pa & PAGE_MASK; + size = roundup(offset + size, PAGE_SIZE); va = kmem_alloc_pageable(kernel_map, size); #if !defined(MAX_PERF) @@ -3301,7 +3302,20 @@ pmap_mapdev(pa, size) } invltlb(); - return ((void *) va); + return ((void *)(va + offset)); +} + +void +pmap_unmapdev(va, size) + vm_offset_t va; + vm_size_t size; +{ + vm_offset_t base, offset; + + base = va & PG_FRAME; + offset = va & PAGE_MASK; + size = roundup(offset + size, PAGE_SIZE); + kmem_free(kernel_map, base, size); } /* diff --git a/sys/amd64/include/pmap.h b/sys/amd64/include/pmap.h index b9f3f74..bb617ab 100644 --- a/sys/amd64/include/pmap.h +++ b/sys/amd64/include/pmap.h @@ -253,6 +253,7 @@ extern vm_offset_t virtual_end; void pmap_bootstrap __P(( vm_offset_t, vm_offset_t)); pmap_t pmap_kernel __P((void)); void *pmap_mapdev __P((vm_offset_t, vm_size_t)); +void pmap_unmapdev __P((vm_offset_t, vm_size_t)); unsigned *pmap_pte __P((pmap_t, vm_offset_t)) __pure2; vm_page_t pmap_use_pt __P((pmap_t, vm_offset_t)); #ifdef SMP diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c index 6129ed8..ac9cd3c 100644 --- a/sys/i386/i386/pmap.c +++ b/sys/i386/i386/pmap.c @@ -3280,10 +3280,11 @@ pmap_mapdev(pa, size) vm_offset_t pa; vm_size_t size; { - vm_offset_t va, tmpva; + vm_offset_t va, tmpva, offset; unsigned *pte; - size = roundup(size, PAGE_SIZE); + offset = pa & PAGE_MASK; + size = roundup(offset + size, PAGE_SIZE); va = kmem_alloc_pageable(kernel_map, size); #if !defined(MAX_PERF) @@ -3301,7 +3302,20 @@ pmap_mapdev(pa, size) } invltlb(); - return ((void *) va); + return ((void *)(va + offset)); +} + +void +pmap_unmapdev(va, size) + vm_offset_t va; + vm_size_t size; +{ + vm_offset_t base, offset; + + base = va & PG_FRAME; + offset = va & PAGE_MASK; + size = roundup(offset + size, PAGE_SIZE); + kmem_free(kernel_map, base, size); } /* diff --git a/sys/i386/include/pmap.h b/sys/i386/include/pmap.h index b9f3f74..bb617ab 100644 --- a/sys/i386/include/pmap.h +++ b/sys/i386/include/pmap.h @@ -253,6 +253,7 @@ extern vm_offset_t virtual_end; void pmap_bootstrap __P(( vm_offset_t, vm_offset_t)); pmap_t pmap_kernel __P((void)); void *pmap_mapdev __P((vm_offset_t, vm_size_t)); +void pmap_unmapdev __P((vm_offset_t, vm_size_t)); unsigned *pmap_pte __P((pmap_t, vm_offset_t)) __pure2; vm_page_t pmap_use_pt __P((pmap_t, vm_offset_t)); #ifdef SMP |