summaryrefslogtreecommitdiff
path: root/vm/vm_kmem.c
diff options
context:
space:
mode:
Diffstat (limited to 'vm/vm_kmem.c')
-rw-r--r--vm/vm_kmem.c31
1 files changed, 17 insertions, 14 deletions
diff --git a/vm/vm_kmem.c b/vm/vm_kmem.c
index 0583bb9c..c0a91f15 100644
--- a/vm/vm_kmem.c
+++ b/vm/vm_kmem.c
@@ -33,14 +33,6 @@
#include <vm/vm_page.h>
#include <vm/vm_prot.h>
-/*
- * Kernel map and storage.
- */
-static struct vm_map kernel_map_store;
-struct vm_map *kernel_map __read_mostly = &kernel_map_store;
-
-static struct vm_object vm_kmem_kernel_object;
-
static uint64_t
vm_kmem_offset(uintptr_t va)
{
@@ -54,7 +46,7 @@ vm_kmem_setup(void)
uint64_t size;
size = vm_kmem_offset(PMAP_END_KMEM_ADDRESS);
- vm_object_init(&vm_kmem_kernel_object, size);
+ vm_object_init(vm_object_get_kernel_object(), size);
return 0;
}
@@ -96,7 +88,7 @@ vm_kmem_alloc_va(size_t size)
va = 0;
flags = VM_MAP_FLAGS(VM_PROT_ALL, VM_PROT_ALL, VM_INHERIT_NONE,
VM_ADV_DEFAULT, 0);
- error = vm_map_enter(kernel_map, &va, size, 0, flags, NULL, 0);
+ error = vm_map_enter(vm_map_get_kernel_map(), &va, size, 0, flags, NULL, 0);
if (error) {
return NULL;
@@ -112,12 +104,14 @@ vm_kmem_free_va(void *addr, size_t size)
va = (uintptr_t)addr;
assert(vm_kmem_free_check(va, size) == 0);
- vm_map_remove(kernel_map, va, va + vm_page_round(size));
+ vm_map_remove(vm_map_get_kernel_map(), va, va + vm_page_round(size));
}
void *
vm_kmem_alloc(size_t size)
{
+ struct vm_object *kernel_object;
+ struct pmap *kernel_pmap;
struct vm_page *page;
uintptr_t va, start, end;
int error;
@@ -129,6 +123,9 @@ vm_kmem_alloc(size_t size)
return NULL;
}
+ kernel_object = vm_object_get_kernel_object();
+ kernel_pmap = pmap_get_kernel_pmap();
+
for (start = va, end = va + size; start < end; start += PAGE_SIZE) {
page = vm_page_alloc(0, VM_PAGE_SEL_HIGHMEM, VM_PAGE_KERNEL);
@@ -140,8 +137,7 @@ vm_kmem_alloc(size_t size)
* The page becomes managed by the object and is freed in case
* of failure.
*/
- error = vm_object_insert(&vm_kmem_kernel_object, page,
- vm_kmem_offset(start));
+ error = vm_object_insert(kernel_object, page, vm_kmem_offset(start));
if (error) {
goto error;
@@ -172,12 +168,14 @@ void
vm_kmem_free(void *addr, size_t size)
{
const struct cpumap *cpumap;
+ struct pmap *kernel_pmap;
uintptr_t va, end;
va = (uintptr_t)addr;
size = vm_page_round(size);
end = va + size;
cpumap = cpumap_all();
+ kernel_pmap = pmap_get_kernel_pmap();
while (va < end) {
pmap_remove(kernel_pmap, va, cpumap);
@@ -185,7 +183,7 @@ vm_kmem_free(void *addr, size_t size)
}
pmap_update(kernel_pmap);
- vm_object_remove(&vm_kmem_kernel_object,
+ vm_object_remove(vm_object_get_kernel_object(),
vm_kmem_offset((uintptr_t)addr),
vm_kmem_offset(end));
vm_kmem_free_va(addr, size);
@@ -195,11 +193,14 @@ void *
vm_kmem_map_pa(phys_addr_t pa, size_t size,
uintptr_t *map_vap, size_t *map_sizep)
{
+ struct pmap *kernel_pmap;
uintptr_t offset, map_va;
size_t map_size;
phys_addr_t start;
int error;
+ kernel_pmap = pmap_get_kernel_pmap();
+
start = vm_page_trunc(pa);
map_size = vm_page_round(pa + size) - start;
map_va = (uintptr_t)vm_kmem_alloc_va(map_size);
@@ -242,9 +243,11 @@ void
vm_kmem_unmap_pa(uintptr_t map_va, size_t map_size)
{
const struct cpumap *cpumap;
+ struct pmap *kernel_pmap;
uintptr_t va, end;
cpumap = cpumap_all();
+ kernel_pmap = pmap_get_kernel_pmap();
end = map_va + map_size;
for (va = map_va; va < end; va += PAGE_SIZE) {