diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2021-12-20 14:53:44 +0200 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2021-12-20 14:53:44 +0200 |
| commit | 6f8e5772d17d277842be3f6162ddd665a17e5be9 (patch) | |
| tree | 45f5a2b9df6b6c2f3c369cf5b7e5b46c9acbccdd /arch/riscv | |
| parent | 6b2465318b2dc922de282deea96c1621f7f41039 (diff) | |
| download | kmi-6f8e5772d17d277842be3f6162ddd665a17e5be9.tar.gz kmi-6f8e5772d17d277842be3f6162ddd665a17e5be9.zip | |
More sensible init
+ Who knew some reservations were a good thing? (at least relativelyy
speaking)
Diffstat (limited to 'arch/riscv')
| -rw-r--r-- | arch/riscv/conf/apos.its | 4 | ||||
| -rw-r--r-- | arch/riscv/conf/init-link.S | 3 | ||||
| -rw-r--r-- | arch/riscv/config.h | 6 | ||||
| -rw-r--r-- | arch/riscv/init/init.c | 42 | ||||
| -rw-r--r-- | arch/riscv/kernel/main.c | 4 | ||||
| -rw-r--r-- | arch/riscv/mm.txt | 4 |
6 files changed, 49 insertions, 14 deletions
diff --git a/arch/riscv/conf/apos.its b/arch/riscv/conf/apos.its index 15db4a4..da48860 100644 --- a/arch/riscv/conf/apos.its +++ b/arch/riscv/conf/apos.its @@ -12,8 +12,8 @@ arch = "riscv"; os = "apos"; compression = "none"; - load = <0x83800000>; - entry = <0x83800000>; + load = <0x80080000>; + entry = <0x80080000>; hash-1 { algo = "sha1"; }; diff --git a/arch/riscv/conf/init-link.S b/arch/riscv/conf/init-link.S index 642e831..53d24ab 100644 --- a/arch/riscv/conf/init-link.S +++ b/arch/riscv/conf/init-link.S @@ -1,5 +1,5 @@ OUTPUT_ARCH(riscv) -ENTRY(main) +ENTRY(init) SECTIONS { . = ABSOLUTE(PM_KERN); @@ -27,4 +27,5 @@ SECTIONS { } __init_end = . ; + __kernel_size = <KERNEL_SIZE>; } diff --git a/arch/riscv/config.h b/arch/riscv/config.h index fa3c178..35e0b6e 100644 --- a/arch/riscv/config.h +++ b/arch/riscv/config.h @@ -2,14 +2,16 @@ /* --- START ARCH USER CONFIG VALUES --- */ /* physical address to which the kernel will be loaded */ -#define PM_KERN 0x83800000 +#define RAM_BASE 0x80000000 +#define PM_KERN (RAM_BASE + SZ_512K) /* --- END ARCH USER CONFIG VALUES --- */ /* don't touch >:( */ #define PM_STACK_BASE (PM_KERN + SZ_2M) #define PM_STACK_TOP (PM_STACK_BASE + SZ_2M - 2) -#define VM_KERN (-SZ_1G) +#define VM_DMAP (-SZ_256G) /* testing for now */ +#define VM_KERN (VM_DMAP + SZ_256K) #define TMP_PTE (-SZ_2G) #define ROOT_PTE (0) #define ROOT_REGION (SZ_4K) diff --git a/arch/riscv/init/init.c b/arch/riscv/init/init.c index d9b32a0..728f8dd 100644 --- a/arch/riscv/init/init.c +++ b/arch/riscv/init/init.c @@ -1,5 +1,6 @@ #include <apos/types.h> #include <apos/attrs.h> +#include <apos/utils.h> #include <vmem.h> #include <csr.h> @@ -8,22 +9,47 @@ struct __packed init_vmem { int *leaf[512]; }; -struct init_vmem root_branch; +struct init_vmem *root_branch; -/* assume Sv48 for now */ -void init_lowmem() +/* assume Sv39 for now */ +void init_vmem() { size_t flags = VM_V | VM_X | VM_R | VM_W; + + extern char *__init_start; + root_branch = (struct init_vmem *)align_down((size_t)&__init_start - SZ_4K, SZ_4K); for(size_t i = 0; i < 512; ++i) - root_branch.leaf[i] = (int *)((1UL << 37) * i | flags); + root_branch->leaf[i] = 0; + + /* direct mapping (temp) */ + for(size_t i = 0; i < 256; ++i) + root_branch->leaf[i] = (int *)((1UL << 28) * i | flags); + + /* kernel (also sort of direct mapping) */ + /* FIXME set up actually correct addressing retard */ + for(size_t i = 256; i < 512; ++i) + root_branch->leaf[256] = (int *)(((RAM_BASE >> 12) << 10) | flags); + + csr_write(CSR_SATP, SATP_MODE_Sv39 | ((size_t)root_branch >> 12)); +} + +void move_kernel() +{ + extern char *__init_end; + extern char *__kernel_size; - csr_write(CSR_SATP, SATP_MODE_Sv48 | ((size_t)&root_branch >> 12)); + size_t sz = (size_t)&__kernel_size; + char *src = (char *)&__init_end; + char *dst = (char *)VM_KERN; + for(size_t i = 0; i < sz; ++i) + dst[i] = src[i]; } -void __section(".init.start") main(void *fdt) +void __init init(void *fdt) { extern char *__init_end; - void (*kernel_main)(void *fdt) = (void (*)(void *))(VM_KERN + (size_t)&__init_end); - init_lowmem(); + void (*kernel_main)(void *fdt) = (void (*)(void *))(VM_KERN); + init_vmem(); + move_kernel(); kernel_main(fdt); } diff --git a/arch/riscv/kernel/main.c b/arch/riscv/kernel/main.c index 6c504f8..5576d68 100644 --- a/arch/riscv/kernel/main.c +++ b/arch/riscv/kernel/main.c @@ -54,7 +54,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){base, top}; + return (struct pm_layout_t){__va(base), __va(top)}; } static pm_t get_kerneltop() @@ -276,6 +276,8 @@ static void init_proc(void *fdt, struct vm_branch_t *b) void __main main(void *fdt) { + /* correct fdt pointer */ + fdt = (void *)__va(fdt); init_dbg(fdt); dbg_fdt(fdt); diff --git a/arch/riscv/mm.txt b/arch/riscv/mm.txt index fa06180..30ffc88 100644 --- a/arch/riscv/mm.txt +++ b/arch/riscv/mm.txt @@ -14,6 +14,10 @@ Offset | Size | Purpose -255 GiB | 1 GiB | Kernel IO -256 GiB | 1 GiB | Kernel +(alternate scheme: Kernel vmem is itself a direct mapping?) +(first 256KiB page reserved for whatever, next 256KiB reserved for kernel vma, + next 512KiB reserved for kernel pma?) + Sv48: Offset | Size | Purpose |
