summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1999-09-11 20:31:32 +0000
committerpeter <peter@FreeBSD.org>1999-09-11 20:31:32 +0000
commit718e870486a4b898bbf0a37fd0cbe35eadb916d7 (patch)
tree508c8d1264ed08823c16bee71fe6b77892c80b4c /sys
parent68d776c14a7f61af74a1da7f209bc4099d2efd06 (diff)
downloadFreeBSD-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.c20
-rw-r--r--sys/amd64/include/pmap.h1
-rw-r--r--sys/i386/i386/pmap.c20
-rw-r--r--sys/i386/include/pmap.h1
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
OpenPOWER on IntegriCloud