From d98ec57128628b81fcd32269a92742a037b7f713 Mon Sep 17 00:00:00 2001 From: Kimplul Date: Sun, 26 Dec 2021 17:50:11 +0200 Subject: First useful jump to userspace! --- arch/riscv/conf/init | Bin 1032 -> 1040 bytes arch/riscv/conf/initrd | Bin 1536 -> 1536 bytes arch/riscv/conf/s.S | 5 ++++- arch/riscv/include/csr.h | 1 + arch/riscv/kernel/main.c | 11 +++++------ arch/riscv/kernel/proc.c | 4 ++-- arch/riscv/kernel/vmem.c | 5 +++-- 7 files changed, 15 insertions(+), 11 deletions(-) (limited to 'arch') diff --git a/arch/riscv/conf/init b/arch/riscv/conf/init index 06e61e0..43a179c 100755 Binary files a/arch/riscv/conf/init and b/arch/riscv/conf/init differ diff --git a/arch/riscv/conf/initrd b/arch/riscv/conf/initrd index 8dc931b..e3704f2 100644 Binary files a/arch/riscv/conf/initrd and b/arch/riscv/conf/initrd differ diff --git a/arch/riscv/conf/s.S b/arch/riscv/conf/s.S index 7b796ce..e6997ac 100644 --- a/arch/riscv/conf/s.S +++ b/arch/riscv/conf/s.S @@ -1,4 +1,7 @@ .text .global _start _start: -loop: j loop +li a1, 1 +loop: +add a0, a0, a1 +jal loop diff --git a/arch/riscv/include/csr.h b/arch/riscv/include/csr.h index bd02b04..b309f0b 100644 --- a/arch/riscv/include/csr.h +++ b/arch/riscv/include/csr.h @@ -39,6 +39,7 @@ /* status CSR bits */ #define SSTATUS_SUM (1 << 18) +#define SSTATUS_SPP (1 << 8) /* directly lifted from Linux:/arch/riscv/include/asm/asm.h:9-13 */ #ifdef __ASSEMBLY__ diff --git a/arch/riscv/kernel/main.c b/arch/riscv/kernel/main.c index 914dcba..1964514 100644 --- a/arch/riscv/kernel/main.c +++ b/arch/riscv/kernel/main.c @@ -252,17 +252,13 @@ static void init_proc(void *fdt, struct vm_branch_t *b) /* binary itself */ size_t sz = get_init_size(fdt); - /* these need to be fixed and actually map the addresses that the ELF - * binary wants, instead of willy nilly */ - t->bin = alloc_uvmem(t, sz, VM_V | VM_X | VM_R | VM_W | VM_U); - /* stack */ + /* stack (?) */ t->stack = alloc_uvmem(t, SZ_2M, VM_V | VM_R | VM_W | VM_U); /* should probably wrap this in like tlb_flush_all() or something */ __asm__ ("sfence.vma" : : : "memory"); - move_init(fdt, (void *)t->bin); - jump_to_userspace(t, 0, 0); + jump_to_userspace(t, get_init_base(fdt), 0, 0); } #define __va_reg(reg)\ @@ -292,6 +288,9 @@ void __main main(void *fdt) /* allow supervisor code to touch user data */ csr_set(CSR_SSTATUS, SSTATUS_SUM); + /* maybe this is too early but mark that we want to jump to user mode + * eventually*/ + csr_clear(CSR_SSTATUS, SSTATUS_SPP); struct vm_branch_t *b = init_vmem(fdt); init_mem_blocks(); init_irq(fdt); diff --git a/arch/riscv/kernel/proc.c b/arch/riscv/kernel/proc.c index 3a39dd3..6d351bc 100644 --- a/arch/riscv/kernel/proc.c +++ b/arch/riscv/kernel/proc.c @@ -2,9 +2,9 @@ #include #include -void jump_to_userspace(struct tcb *t, char **argv, int argc) +void jump_to_userspace(struct tcb *t, vm_t bin, int argc, char **argv) { - csr_write(CSR_SEPC, bin_entry(t->bin)); + csr_write(CSR_SEPC, prepare_proc(t, bin)); __asm__("mv sp, %0\n" : "=r" (t->stack) :: "memory"); __asm__("sret\n" ::: "memory"); } diff --git a/arch/riscv/kernel/vmem.c b/arch/riscv/kernel/vmem.c index bf49716..e3680b3 100644 --- a/arch/riscv/kernel/vmem.c +++ b/arch/riscv/kernel/vmem.c @@ -19,7 +19,8 @@ static pm_t *__find_vmem(struct vm_branch_t *b, vm_t v, enum mm_order_t *o) { enum mm_order_t top = __mm_max_order; - *o = MM_O0; + if(o) + *o = MM_O0; do { size_t idx = vm_to_index(v, top); pm_t pte = (pm_t)b->leaf[idx]; @@ -59,7 +60,7 @@ int stat_vmem(struct vm_branch_t *branch, vm_t vaddr, pm_t *paddr, pm_t *pte = __find_vmem(branch, vaddr, order); if(pte){ if(paddr) - *paddr = pte_paddr(*pte); + *paddr = (pm_t)pte_addr(*pte); if(flags) *flags = pte_flags(*pte); -- cgit v1.3