aboutsummaryrefslogtreecommitdiff
path: root/arch/riscv64/kernel/vmem.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2024-07-06 18:14:04 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2024-07-06 18:14:04 +0300
commit76517486919657ecadda9867125dc6730f29a5b7 (patch)
tree02d975db2b911ec7b92c4b1be7c5a2510b418ae1 /arch/riscv64/kernel/vmem.c
parent608f44306a6f0d5692f5c81bcbfe7a621ec254ba (diff)
downloadkmi-76517486919657ecadda9867125dc6730f29a5b7.tar.gz
kmi-76517486919657ecadda9867125dc6730f29a5b7.zip
pretty massive virtual memory rewrite
+ The system is now a bit simpler and hopefully easier to understand, while also extending the shared memory to be 1:N, where there is one owner who may become a zombie while waiting for the N to die.
Diffstat (limited to 'arch/riscv64/kernel/vmem.c')
-rw-r--r--arch/riscv64/kernel/vmem.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/arch/riscv64/kernel/vmem.c b/arch/riscv64/kernel/vmem.c
index 3f29446..f717771 100644
--- a/arch/riscv64/kernel/vmem.c
+++ b/arch/riscv64/kernel/vmem.c
@@ -236,6 +236,9 @@ stat_t stat_vpage(struct vmem *branch, vm_t vaddr, pm_t *paddr,
static struct vmem *__create_leaf()
{
pm_t new_leaf = alloc_page(MM_KPAGE);
+ if (!new_leaf)
+ return NULL;
+
memset((void *)new_leaf, 0, sizeof(struct vmem));
return (struct vmem *)to_pte((pm_t)__pa(new_leaf), VM_V);
}
@@ -293,8 +296,13 @@ stat_t map_vpage(struct vmem *branch, pm_t paddr, vm_t vaddr, vmflags_t flags,
while (top != order) {
size_t idx = vm_to_index(vaddr, top);
- if (__unused((pm_t)branch->leaf[idx]))
- branch->leaf[idx] = __create_leaf();
+ if (__unused((pm_t)branch->leaf[idx])) {
+ struct vmem *leaf = __create_leaf();
+ if (!leaf)
+ return ERR_OOMEM;
+
+ branch->leaf[idx] = leaf;
+ }
branch = (struct vmem *)pte_addr(branch->leaf[idx]);
top--;
@@ -438,16 +446,14 @@ struct vmem *create_vmem()
return b;
}
-stat_t use_vmem(struct vmem *b)
+void use_vmem(struct vmem *b)
{
__use_vmem(__pa(b), DEFAULT_Sv_MODE);
- return OK;
}
-stat_t destroy_vmem(struct vmem *b)
+void destroy_vmem(struct vmem *b)
{
__destroy_branch(b);
- return OK;
}
stat_t populate_kvmem(struct vmem *b)
@@ -541,7 +547,7 @@ void destroy_rpc_stack(struct tcb *t)
pm_t page = 0; enum mm_order order = BASE_PAGE;
stat_vpage(t->rpc.vmem, RPC_STACK_BASE + BASE_PAGE_SIZE * i,
&page, &order, NULL);
- free_page(page, order);
+ free_page(order, page);
}
}