aboutsummaryrefslogtreecommitdiff
path: root/arch/riscv64
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2022-05-22 15:05:39 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2022-05-22 15:05:39 +0300
commit5793a61eb824a7b97e9bab5913b595a778205cef (patch)
treef31931b924058cb6474b80cd02472940ad8cfcd5 /arch/riscv64
parenta4851206bef5ceecef18b3fde5be6918a67cca21 (diff)
downloadkmi-5793a61eb824a7b97e9bab5913b595a778205cef.tar.gz
kmi-5793a61eb824a7b97e9bab5913b595a778205cef.zip
improved tcb handling in preparation for processes
Diffstat (limited to 'arch/riscv64')
-rw-r--r--arch/riscv64/kernel/vmem.c23
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)