aboutsummaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/riscv64/kernel/vmem.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/arch/riscv64/kernel/vmem.c b/arch/riscv64/kernel/vmem.c
index 5a44f53..1648706 100644
--- a/arch/riscv64/kernel/vmem.c
+++ b/arch/riscv64/kernel/vmem.c
@@ -309,9 +309,7 @@ stat_t map_vpage(struct vmem *branch, pm_t paddr, vm_t vaddr, vmflags_t flags,
}
size_t idx = vm_to_index(vaddr, top);
- if (is_branch(branch->leaf[idx]))
- /* something has gone terribly wrong? */
- __destroy_branch(branch->leaf[idx]);
+ assert(!is_branch(branch->leaf[idx]));
branch->leaf[idx] =
(struct vmem *)to_pte((pm_t)__pa(paddr), vp_flags(flags));
@@ -482,6 +480,20 @@ void destroy_vmem(struct vmem *b)
free_page(MM_KPAGE, (pm_t)b);
}
+void destroy_rpcmem(struct vmem *b)
+{
+ if (!b)
+ return;
+
+ /* only destroy branches that the rpc vmem is sure to own */
+ for (size_t i = CSTACK_PAGE; i < KERNEL_PAGE; ++i) {
+ if (is_branch(b->leaf[i]))
+ __destroy_branch((struct vmem *)pte_addr(b->leaf[i]));
+ }
+
+ free_page(MM_KPAGE, (pm_t)b);
+}
+
/**
* Helper for mapping in the kernel virtual page.
* Remember that the kernel lives on its own in a 2MiB (riscv64) region at