From 336d6e2c528a89f3a504e76fc8a6e7ef54ba6cb1 Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Sun, 26 Apr 2026 00:22:01 -0400 Subject: [PATCH] sp1: vm: Add function to unmap vm regions Signed-off-by: Ian Moffett --- usr/src/sp1/common/mm/vm_map.c | 28 +++++++++++++++++++++++----- usr/src/sp1/head/mm/vm.h | 10 ++++++++++ 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/usr/src/sp1/common/mm/vm_map.c b/usr/src/sp1/common/mm/vm_map.c index f9ff06b..4408327 100644 --- a/usr/src/sp1/common/mm/vm_map.c +++ b/usr/src/sp1/common/mm/vm_map.c @@ -51,15 +51,33 @@ mm_vm_map(struct mmu_vfr *vfr, struct vm_map *mapping, int prot) for (size_t i = 0; i < len; i += gran) { status = mu_mmu_map(vfr, vma + i, pma + i, prot, mapping->ps); - /* - * TODO: We need to clean up here instead of leaving a big hole - * when this fails. - */ + /* Destroy what we created on failure */ if (status != STATUS_SUCCESS) { - pr_trace("mapping failed, leaked %d bytes\n", len); + mm_vm_unmap(vfr, mapping); return status; } } return STATUS_SUCCESS; } + +status_t +mm_vm_unmap(struct mmu_vfr *vfr, struct vm_map *mapping) +{ + size_t gran, len; + uintptr_t vma; + + if (vfr == NULL || mapping == NULL) { + return STATUS_INVALID_PARAM; + } + + gran = GRAN(mapping->ps); + vma = ALIGN_DOWN(mapping->vma_base, gran); + len = ALIGN_UP(len + (len & (gran - 1)), gran); + + for (size_t i = 0; i < len; i += gran) { + mu_mmu_unmap(vfr, vma + i, mapping->ps); + } + + return STATUS_SUCCESS; +} diff --git a/usr/src/sp1/head/mm/vm.h b/usr/src/sp1/head/mm/vm.h index 5cba19b..909ccfa 100644 --- a/usr/src/sp1/head/mm/vm.h +++ b/usr/src/sp1/head/mm/vm.h @@ -24,6 +24,8 @@ * @vma_base: Virtual memory base * @pma_base: Physical memory base * @length: Number of bytes to map + * + * XXX: `pma_base' is unused when unmapping regions */ struct vm_map { pagesize_t ps; @@ -49,6 +51,14 @@ struct vm_map { */ status_t mm_vm_map(struct mmu_vfr *vfr, struct vm_map *mapping, int prot); +/* + * Destroy a virtual memory mapping + * + * @vfr: Virtual fuck region to unmap within + * @mapping: Mapping to destroy + */ +status_t mm_vm_unmap(struct mmu_vfr *vfr, struct vm_map *mapping); + /* * Initialize the virtual memory management */