diff options
Diffstat (limited to 'vm/vm_kmem.c')
-rw-r--r-- | vm/vm_kmem.c | 31 |
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) { |