aboutsummaryrefslogtreecommitdiff
path: root/arch/riscv64/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'arch/riscv64/kernel')
-rw-r--r--arch/riscv64/kernel/proc.c21
-rw-r--r--arch/riscv64/kernel/vmem.c18
2 files changed, 22 insertions, 17 deletions
diff --git a/arch/riscv64/kernel/proc.c b/arch/riscv64/kernel/proc.c
index bbe9782..c95021d 100644
--- a/arch/riscv64/kernel/proc.c
+++ b/arch/riscv64/kernel/proc.c
@@ -8,33 +8,32 @@
#include "regs.h"
#include "csr.h"
-stat_t jump_to_userspace(struct tcb *t, int argc, char **argv)
+/* TODO: actually map fdt into the target address space */
+stat_t run_init(struct tcb *t, void *fdt)
{
- csr_write(CSR_SEPC, t->entry);
csr_write(CSR_SSCRATCH, t);
- __asm__ volatile ("mv sp, %0\n" : : "r" (t->proc_stack_top) : "memory");
+ __asm__ volatile ("mv sp, %0\n" : : "r" (t->thread_stack_top) : "memory");
+ __asm__ volatile ("mv a0, %0\n" : : "r" (fdt) : );
__asm__ volatile ("sret\n" ::: "memory");
/* we should never reach this */
return ERR_ADDR;
}
-stat_t return_to_userspace(struct tcb *t)
+stat_t set_return(vm_t v)
{
- /* lol */
- return ERR_ADDR;
+ csr_write(CSR_SEPC, v);
+ return OK;
}
stat_t prepare_thread(struct tcb *t)
{
/* get location of registers in memory */
/* TODO: check alignment, should be fine but just to be sure */
- struct riscv_regs *r = (struct riscv_regs *)t;
- r--;
+ struct riscv_regs *r = (struct riscv_regs *)(--t);
- r->sp = (long)t->proc_stack_top;
+ /* insert important values into register slots */
+ r->sp = (long)t->thread_stack_top;
r->tp = (long)t;
- /* set entry point */
- csr_write(CSR_SEPC, t->entry);
return OK;
}
diff --git a/arch/riscv64/kernel/vmem.c b/arch/riscv64/kernel/vmem.c
index cd5e4c4..73db4dc 100644
--- a/arch/riscv64/kernel/vmem.c
+++ b/arch/riscv64/kernel/vmem.c
@@ -96,12 +96,12 @@ static void __destroy_branch(struct vmem *b)
if (!b)
return;
- for (size_t i = 0; i < BASE_PAGE_SIZE / sizeof(pm_t); ++i) {
+ for (size_t i = 0; i < RISCV_NUM_LEAVES; ++i) {
if (is_branch(b->leaf[i]))
__destroy_branch((struct vmem *)pte_addr(b->leaf[i]));
-
- free_page(MM_KPAGE, (pm_t)pte_addr(b->leaf[i]));
}
+
+ free_page(MM_KPAGE, (pm_t)__pa(b));
}
stat_t map_vpage(struct vmem *branch, pm_t paddr, vm_t vaddr, vmflags_t flags,
@@ -150,7 +150,7 @@ void flush_tlb_all()
__asm__ volatile ("sfence.vma\n" ::: "memory");
}
-static void __start_vmem(struct vmem *branch, enum mm_mode m)
+static void __use_vmem(struct vmem *branch, enum mm_mode m)
{
branch = (struct vmem *)__pa(branch);
@@ -173,7 +173,7 @@ struct vmem *init_vmem(void *fdt)
UNUSED(fdt);
struct vmem *b = create_vmem();
/* update which memory branch to use */
- __start_vmem(b, Sv39);
+ use_vmem(b);
return b;
}
@@ -186,9 +186,15 @@ struct vmem *create_vmem()
return b;
}
+stat_t use_vmem(struct vmem *b)
+{
+ __use_vmem(b, Sv39);
+ return OK;
+}
+
stat_t destroy_vmem(struct vmem *b)
{
- free_page(MM_KPAGE, (pm_t)b);
+ __destroy_branch(b);
return OK;
}