From 61291639524e4aebf93a3315661e7180ac1b9c1e Mon Sep 17 00:00:00 2001 From: Kimplul Date: Mon, 20 Dec 2021 21:03:37 +0200 Subject: Right up to init_proc, FUCK YEAH + Lots to do still, should keep a more detailed TODO.txt, among other things implement Sv48 support, make more things single truths etc. --- arch/riscv/config.h | 6 ++--- arch/riscv/init/init.c | 7 +++-- arch/riscv/kernel/main.c | 67 ++++++++++++++++++++++++++---------------------- arch/riscv/kernel/vmem.c | 7 ++--- 4 files changed, 49 insertions(+), 38 deletions(-) (limited to 'arch') diff --git a/arch/riscv/config.h b/arch/riscv/config.h index 35e0b6e..fa6785e 100644 --- a/arch/riscv/config.h +++ b/arch/riscv/config.h @@ -8,9 +8,9 @@ /* don't touch >:( */ -#define PM_STACK_BASE (PM_KERN + SZ_2M) -#define PM_STACK_TOP (PM_STACK_BASE + SZ_2M - 2) -#define VM_DMAP (-SZ_256G) /* testing for now */ +#define PM_STACK_BASE (PM_KERN) +#define PM_STACK_TOP (RAM_BASE + SZ_1M) +#define VM_DMAP (0xffffffc000000000) /* testing for now */ #define VM_KERN (VM_DMAP + SZ_256K) #define TMP_PTE (-SZ_2G) #define ROOT_PTE (0) diff --git a/arch/riscv/init/init.c b/arch/riscv/init/init.c index 728f8dd..029c855 100644 --- a/arch/riscv/init/init.c +++ b/arch/riscv/init/init.c @@ -11,6 +11,8 @@ struct __packed init_vmem { struct init_vmem *root_branch; +#define to_pte(a, f) (((a) >> 12) << 10 | (f)) + /* assume Sv39 for now */ void init_vmem() { @@ -23,12 +25,13 @@ void init_vmem() /* direct mapping (temp) */ for(size_t i = 0; i < 256; ++i) - root_branch->leaf[i] = (int *)((1UL << 28) * i | flags); + root_branch->leaf[i] = (int*)to_pte(SZ_1G * i, flags); /* kernel (also sort of direct mapping) */ /* FIXME set up actually correct addressing retard */ + flags |= VM_G; for(size_t i = 256; i < 512; ++i) - root_branch->leaf[256] = (int *)(((RAM_BASE >> 12) << 10) | flags); + root_branch->leaf[i] = (int *)to_pte(RAM_BASE + SZ_1G * (i - 256), flags); csr_write(CSR_SATP, SATP_MODE_Sv39 | ((size_t)root_branch >> 12)); } diff --git a/arch/riscv/kernel/main.c b/arch/riscv/kernel/main.c index 5576d68..794b71b 100644 --- a/arch/riscv/kernel/main.c +++ b/arch/riscv/kernel/main.c @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -54,7 +55,7 @@ static struct pm_layout_t get_memlayout(void *fdt) /* -1 because base is a legitimate memory address */ pm_t top = (pm_t)fdt_load_int_ptr(ci.size_cells, mem_reg) + base - 1; - return (struct pm_layout_t){__va(base), __va(top)}; + return (struct pm_layout_t){(size_t)__va(base), (size_t)__va(top)}; } static pm_t get_kerneltop() @@ -161,10 +162,12 @@ static struct pm_layout_t setup_pmem(void *fdt) static struct pm_orders_t init_pmem(void *fdt) { - enum mm_mode_t mmode = get_mmode(fdt); + /* bad idea for now */ + /* enum mm_mode_t mmode = get_mmode(fdt); */ size_t max_order = 0; size_t order_bits = 9; + enum mm_mode_t mmode = Sv39; switch(mmode){ case Sv32: max_order = 1; @@ -193,16 +196,21 @@ static struct pm_orders_t init_pmem(void *fdt) return ret; } -static void populate_root_branch(struct vm_branch_t *b, size_t mul) +/* assume Sv39 for now */ +#define to_pte(a, f) (((a) >> 12) << 10 | (f)) +static void populate_root_branch(struct vm_branch_t *b) { - for(size_t i = 0; i <= (MM_KPAGE_SIZE / sizeof(size_t))/2; ++i) - b->leaf[i] = (struct vm_branch_t *)(mul * i | VM_V | VM_R | VM_W | VM_X | VM_G); + size_t flags = VM_V | VM_R | VM_W | VM_X | VM_G; + for(size_t i = 256; i < 512; ++i) + b->leaf[i] = (struct vm_branch_t *)to_pte(RAM_BASE + SZ_1G * (i - 256), flags); } static void start_vmem(struct vm_branch_t *branch, enum mm_mode_t m) { /* TODO: get ASID from CPU id */ + branch = (struct vm_branch_t *)__pa(branch); + if(m == Sv32) csr_write(CSR_SATP, SATP_MODE_Sv32 | pm_to_pnum((pm_t)(branch))); else if (m == Sv39) @@ -216,35 +224,15 @@ static void start_vmem(struct vm_branch_t *branch, enum mm_mode_t m) static struct vm_branch_t *init_vmem(void *fdt) { - struct pm_orders_t o = init_pmem(fdt); + init_pmem(fdt); setup_pmem(fdt); struct vm_branch_t *b = (struct vm_branch_t *)alloc_page(MM_KPAGE, 0); memset(b, 0, sizeof(struct vm_branch_t)); - enum mm_mode_t mm = Sv48; - size_t mul = 0; - switch(o.max_order){ - case 3: /* Sv48 */ - mm = Sv48; - mul = 1UL << 37; - break; - - case 2: /* Sv39 */ - mm = Sv39; - mul = 1UL << 28; - break; - - case 1: /* Sv32 */ - mm = Sv32; - mul = 1UL << 20; - break; - } - - set_uvmem_size(mul); - populate_root_branch(b, uvmem_size()); - /* jump to vmem */ - start_vmem(b, mm); + populate_root_branch(b); + /* update which memory branch to use */ + start_vmem(b, Sv39); return b; } @@ -259,7 +247,8 @@ static void init_proc(void *fdt, struct vm_branch_t *b) t->pid = 0; t->tid = 0; threads_insert(t); - sp_mem_init(&t->sp_r, -uvmem_size(), uvmem_size() - 1); + /* first page reserved to avoid issues with null pointers being legal*/ + sp_mem_init(&t->sp_r, SZ_4K, SZ_256G); /* binary itself */ size_t sz = align_up(get_init_size(fdt), BASE_PAGE_SIZE); @@ -274,8 +263,26 @@ static void init_proc(void *fdt, struct vm_branch_t *b) jump_to_userspace(t, 0, 0); } +#define __va_reg(reg)\ +{\ + vm_t reg = 0;\ + __asm__("mv %0, " QUOTE(reg) : "=r" (reg) :: );\ + reg = (vm_t)__va(reg);\ + __asm__("mv " QUOTE(reg) ", %0" :: "rK" (reg) : );\ +} + +static void update_stack() +{ + __va_reg(sp); + __va_reg(gp); +} + void __main main(void *fdt) { + __va_reg(sp); + __va_reg(fp); + __va_reg(gp); + /* correct fdt pointer */ fdt = (void *)__va(fdt); init_dbg(fdt); diff --git a/arch/riscv/kernel/vmem.c b/arch/riscv/kernel/vmem.c index 4cb84a6..744f633 100644 --- a/arch/riscv/kernel/vmem.c +++ b/arch/riscv/kernel/vmem.c @@ -4,11 +4,12 @@ #include #include #include +#include #define pte_ppn(pte) (((pm_t)(pte)) >> 10) #define pte_flags(pte) (((pm_t)(pte)) & 0xff) -#define to_pte(p, f) ((pm_to_pnum(p) << 10) + (f)) -#define pte_addr(pte) (pnum_to_paddr(pte_ppn(pte))) +#define to_pte(p, f) ((pm_to_pnum((pm_t)__pa(p)) << 10) | (f)) +#define pte_addr(pte) __va(pnum_to_paddr(pte_ppn(pte))) #define vm_to_index(a, o) (pm_to_index(a, o)) void mod_vmem(struct vm_branch_t *branch, vm_t vaddr, uint8_t flags, enum mm_order_t order) @@ -51,7 +52,7 @@ void unmap_vmem(struct vm_branch_t *branch, vm_t vaddr, enum mm_order_t order) size_t idx = pm_to_index(vaddr, order); if (branch->leaf[idx]) - free_page(order, pte_addr(branch->leaf[idx])); + free_page(order, (pm_t)pte_addr(branch->leaf[idx])); branch->leaf[idx] = 0; } -- cgit v1.3