From 6f8e5772d17d277842be3f6162ddd665a17e5be9 Mon Sep 17 00:00:00 2001 From: Kimplul Date: Mon, 20 Dec 2021 14:53:44 +0200 Subject: More sensible init + Who knew some reservations were a good thing? (at least relativelyy speaking) --- Makefile | 2 ++ arch/riscv/conf/apos.its | 4 ++-- arch/riscv/conf/init-link.S | 3 ++- arch/riscv/config.h | 6 ++++-- arch/riscv/init/init.c | 42 ++++++++++++++++++++++++++++++++++-------- arch/riscv/kernel/main.c | 4 +++- arch/riscv/mm.txt | 4 ++++ common/initrd.c | 6 ++++-- include/apos/attrs.h | 1 + include/apos/vmem.h | 3 ++- 10 files changed, 58 insertions(+), 17 deletions(-) diff --git a/Makefile b/Makefile index 80fe0e5..939e5e1 100644 --- a/Makefile +++ b/Makefile @@ -51,6 +51,8 @@ INIT_LD != ./scripts/gen-deps --link "$(INIT_LINK).S" include deps.mk +$(INIT_LD): kernel.bin + init.elf: $(INIT_OBJECTS) $(INIT_LD) $(GENELF) -T $(INIT_LD) $(INIT_OBJECTS) -o $@ 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 = ; } 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 #include +#include #include #include @@ -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 diff --git a/common/initrd.c b/common/initrd.c index 6dd698d..61aaaff 100644 --- a/common/initrd.c +++ b/common/initrd.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -60,7 +61,8 @@ pm_t get_initrdtop(void *fdt) void *initrd_end_ptr = (void *)fdt_getprop(fdt, chosen_offset, "linux,initrd-end", NULL); - return (pm_t)fdt_load_int_ptr(ci.addr_cells, initrd_end_ptr); + /* fdt is only aware of physical memory pointers */ + return (pm_t)__va(fdt_load_int_ptr(ci.addr_cells, initrd_end_ptr)); } pm_t get_initrdbase(void *fdt) @@ -71,7 +73,7 @@ pm_t get_initrdbase(void *fdt) void *initrd_base_ptr = (void *)fdt_getprop(fdt, chosen_offset, "linux,initrd-start", NULL); - return (pm_t)fdt_load_int_ptr(ci.addr_cells, initrd_base_ptr); + return (pm_t)__va(fdt_load_int_ptr(ci.addr_cells, initrd_base_ptr)); } static char init_n[] = "init"; diff --git a/include/apos/attrs.h b/include/apos/attrs.h index 469b7bd..64ec27d 100644 --- a/include/apos/attrs.h +++ b/include/apos/attrs.h @@ -8,5 +8,6 @@ #define __weak __attribute__((weak)) #define __main __section(".kernel.start") __noinline +#define __init __section(".init.start") __noinline #endif /* APOS_COMPILER_ATTRIBUTES_H */ diff --git a/include/apos/vmem.h b/include/apos/vmem.h index daa9d10..38432ee 100644 --- a/include/apos/vmem.h +++ b/include/apos/vmem.h @@ -26,7 +26,8 @@ struct sp_mem { #define mem_container(ptr)\ container_of(ptr, struct sp_mem, sp_n) - +#define __va(x) (((char *)(x)) + VM_DMAP - RAM_BASE) +#define __pa(x) (((char *)(x)) + RAM_BASE - VM_DMAP) /* general overview of the different functions: * (un)map_vmem: map one known page of physical memory to one known page of -- cgit v1.3