From 13fe461374c0716404e2ee7726781b9cd12dbaa7 Mon Sep 17 00:00:00 2001 From: Kimplul Date: Sat, 25 Sep 2021 12:24:24 +0300 Subject: Added default stack location --- arch/riscv/config.h | 6 ++++-- arch/riscv/include/pages.h | 46 +++++----------------------------------------- arch/riscv/init/head.S | 2 +- arch/riscv/init/init.c | 9 +++++++-- 4 files changed, 17 insertions(+), 46 deletions(-) (limited to 'arch') diff --git a/arch/riscv/config.h b/arch/riscv/config.h index 3eedb39..8bfe360 100644 --- a/arch/riscv/config.h +++ b/arch/riscv/config.h @@ -1,5 +1,7 @@ #include -#define PM_KERN 0x83800000 +#define PM_KERN 0x83800000 +#define PM_STACK_BASE 0x83900000 +#define PM_STACK_TOP (PM_STACK_BASE + SZ_2M - 2) #define VM_KERN ((-1) - SZ_1G) #define MAX_ORDER 3 @@ -7,4 +9,4 @@ #define O0_WIDTH 9 #define O1_WIDTH 9 #define O2_WIDTH 9 -#define O3_WIDTH 0 +#define O3_WIDTH 9 diff --git a/arch/riscv/include/pages.h b/arch/riscv/include/pages.h index 9e16c00..1533f7b 100644 --- a/arch/riscv/include/pages.h +++ b/arch/riscv/include/pages.h @@ -2,50 +2,14 @@ #define APOS_RISCV_PAGES_H #include +#include -typedef uint8_t pagemask_t; -typedef uint8_t lockbit_t; /* assume riscv64 for now */ typedef uint64_t pm_t; -struct mm_kpages { - pagemask_t page[64]; -}; - -struct mm_mpages { - lockbit_t lockbit[64]; - pagemask_t empty[64]; - pagemask_t full[64]; - struct mm_kpages kilo[512]; -}; - -/* Sv39 */ -struct mm_gpages { - lockbit_t lockbit[64]; - pagemask_t empty[64]; - pagemask_t full[64]; - struct mm_mpages mega[512]; -}; - -struct mm_tpages { - lockbit_t lockbit[64]; - pagemask_t empty[64]; - pagemask_t full[64]; - struct mm_gpages giga[512]; -}; - -struct mm_ptinfo { - short tera_num; - struct terapages *tera_top; - - short giga_num; - struct gigapages *giga_top; - - short mega_num; - struct megapages *mega_top; - - short kilo_num; - struct kilopages *kilo_top; -}; +#define MM_KPAGE MM_O0 +#define MM_MPAGE MM_O1 +#define MM_GPAGE MM_O2 +#define MM_TPAGE MM_O3 #endif /* APOS_RISCV_PAGES_H */ diff --git a/arch/riscv/init/head.S b/arch/riscv/init/head.S index bbd2945..3589ead 100644 --- a/arch/riscv/init/head.S +++ b/arch/riscv/init/head.S @@ -2,6 +2,6 @@ .global _start .type _start, @function _start: - /* stack pointer is whatever? */ + li sp, PM_STACK_TOP /* go to proper init */ j init diff --git a/arch/riscv/init/init.c b/arch/riscv/init/init.c index 5612d0b..86c2563 100644 --- a/arch/riscv/init/init.c +++ b/arch/riscv/init/init.c @@ -112,8 +112,8 @@ static pm_t get_kerneltop() /* interesting, for some reason if I define these to be just char * pointers I get some wacky values. Not sure why that would be, but * this works. */ - extern char __init_end[], __kernel_size[]; - return (pm_t)__init_end + (pm_t)__kernel_size; + extern char __init_end, __kernel_size; + return (pm_t)&__init_end + (pm_t)&__kernel_size; } static pm_t get_initrdtop(void *fdt) @@ -146,11 +146,16 @@ static void setup_pmem(void *fdt) dbg("kernel_top:\t%#lx\n", kernel_top); dbg("fdt_top:\t%#lx\n", fdt_top); + /* TODO: check that pmap placement doesn't overwrite anything, such as + * stack or go over top address of memory */ /* riscv handles two byte boundaries better than one byte, so align * upwards */ populate_pmap(pmem.base, pmem.top - pmem.base, align_up(top + 1, 2)); /* TODO: mark used pages */ + + /* mark init stack */ + mark_used(PM_STACK_BASE, MM_MPAGE); } void init(void *fdt) -- cgit v1.3