diff --git a/vm/address-space.c b/vm/address-space.c index 4fc68a6..da2a73b 100644 --- a/vm/address-space.c +++ b/vm/address-space.c @@ -661,9 +661,8 @@ static void area_unmap(struct vm_area *area) pmap_t pmap = area->vma_space->s_pmap; virt_addr_t base = area->vma_base; virt_addr_t limit = area->vma_limit; - for (virt_addr_t i = base; i < limit; i += VM_PAGE_SIZE) { - pmap_remove(pmap, i); - } + pmap_remove_range(pmap, base, limit - base); + pmap_flush(); } static kern_status_t address_space_cleanup(struct object *obj) @@ -844,11 +843,9 @@ static kern_status_t split_area( } put_entry(&root->s_mappings, right); - for (size_t i = unmap_base; i < unmap_limit; i += VM_PAGE_SIZE) { - tracek("pmap_remove %zx", i); - pmap_remove(root->s_pmap, i); - } + pmap_remove_range(root->s_pmap, unmap_base, unmap_limit - unmap_base); + pmap_flush(); return KERN_OK; } @@ -883,10 +880,8 @@ static kern_status_t left_reduce_area( } tracek(" pmap_remove %zx-%zx (%zx bytes)", base, base + length, length); - for (size_t i = base; i < limit; i += VM_PAGE_SIZE) { - pmap_remove(root->s_pmap, i); - } - + pmap_remove_range(root->s_pmap, base, length); + pmap_flush(); return KERN_OK; } @@ -920,10 +915,8 @@ static kern_status_t right_reduce_area( } tracek(" pmap_remove %zx-%zx (%zx bytes)", base, base + length, length); - for (size_t i = base; i < limit; i += VM_PAGE_SIZE) { - pmap_remove(root->s_pmap, i); - } - + pmap_remove_range(root->s_pmap, base, limit - base); + pmap_flush(); return KERN_OK; } @@ -942,10 +935,11 @@ static kern_status_t delete_area( mapping->vma_limit, mapping->vma_limit - mapping->vma_base); - for (size_t i = mapping->vma_base; i < mapping->vma_limit; - i += VM_PAGE_SIZE) { - pmap_remove(root->s_pmap, i); - } + pmap_remove_range( + root->s_pmap, + mapping->vma_base, + mapping->vma_limit - mapping->vma_base); + pmap_flush(); struct vm_object *object = mapping->vma_object; unsigned long flags;