diff options
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/riscv64/kernel/vmem.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/arch/riscv64/kernel/vmem.c b/arch/riscv64/kernel/vmem.c index 7ffde86..0285f39 100644 --- a/arch/riscv64/kernel/vmem.c +++ b/arch/riscv64/kernel/vmem.c @@ -168,16 +168,28 @@ static void __start_vmem(struct vm_branch *branch, enum mm_mode m) struct vm_branch *init_vmem(void *fdt) { UNUSED(fdt); + struct vm_branch *b = create_vmem(); + /* update which memory branch to use */ + __start_vmem(b, Sv39); + return b; +} + +struct vm_branch *create_vmem() +{ struct vm_branch *b = (struct vm_branch *)alloc_page(MM_KPAGE, 0); memset(b, 0, MM_KPAGE_SIZE); - populate_root_branch(b); - /* update which memory branch to use */ - __start_vmem(b, Sv39); + populate_kvmem(b); return b; } -void populate_root_branch(struct vm_branch *b) +stat_t destroy_vmem(struct vm_branch *b) +{ + free_page(MM_KPAGE, (pm_t)b); + return OK; +} + +stat_t populate_kvmem(struct vm_branch *b) { size_t flags = VM_V | VM_R | VM_W | VM_X | VM_G; for (size_t i = KSTART_PAGE; i < IO_PAGE; ++i) @@ -187,6 +199,7 @@ void populate_root_branch(struct vm_branch *b) /* map kernel IO to zero for now, this will be overridden later * (if at all) */ b->leaf[IO_PAGE] = (struct vm_branch *)to_pte(0, flags); + return OK; } #if defined(DEBUG) @@ -200,7 +213,7 @@ vm_t setup_kernel_io(struct vm_branch *b, vm_t paddr) } #endif -stat_t clone_vmbranch(struct vm_branch *r, struct vm_branch *b) +stat_t clone_uvmem(struct vm_branch *r, struct vm_branch *b) { /* TODO: error checking? */ for (size_t i = 0; i <= CSTACK_PAGE; ++i) |
