diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2021-09-25 12:24:24 +0300 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2021-09-25 12:24:24 +0300 |
| commit | 13fe461374c0716404e2ee7726781b9cd12dbaa7 (patch) | |
| tree | 8081e42fbebe8561d87f4e685e0f2c38b40fc0c4 /arch | |
| parent | 68fcd6d027b88581992b4fb10ee1edc301e30678 (diff) | |
| download | kmi-13fe461374c0716404e2ee7726781b9cd12dbaa7.tar.gz kmi-13fe461374c0716404e2ee7726781b9cd12dbaa7.zip | |
Added default stack location
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/riscv/config.h | 6 | ||||
| -rw-r--r-- | arch/riscv/include/pages.h | 46 | ||||
| -rw-r--r-- | arch/riscv/init/head.S | 2 | ||||
| -rw-r--r-- | arch/riscv/init/init.c | 9 |
4 files changed, 17 insertions, 46 deletions
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 <apos/sizes.h> -#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 <apos/types.h> +#include <apos/pmem.h> -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) |
