diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2022-01-06 23:39:12 +0200 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2022-01-07 14:05:06 +0200 |
| commit | 9cc125fb3cfdc2c8ae7153b5ae0fe705980835fb (patch) | |
| tree | a1974f9513458acab0bd8d09758259b24b6d7d8c /arch/riscv/init/init.c | |
| parent | f0eba93472e0afecc57180fc0d638eeef8e6f3c6 (diff) | |
| download | kmi-9cc125fb3cfdc2c8ae7153b5ae0fe705980835fb.tar.gz kmi-9cc125fb3cfdc2c8ae7153b5ae0fe705980835fb.zip | |
Allow building with clang
+ Release mode is sort of broken, as lto doesn't work with linker
relaxation and turning the relaxation off causes issues with the jump
from init to kernel (as I've currently implemented it, could probably
be fixed with a manual jump from assembly, I'll add it to my TODO
list)
Diffstat (limited to 'arch/riscv/init/init.c')
| -rw-r--r-- | arch/riscv/init/init.c | 70 |
1 files changed, 0 insertions, 70 deletions
diff --git a/arch/riscv/init/init.c b/arch/riscv/init/init.c deleted file mode 100644 index 23dcadd..0000000 --- a/arch/riscv/init/init.c +++ /dev/null @@ -1,70 +0,0 @@ -#include <apos/types.h> -#include <apos/attrs.h> -#include <apos/utils.h> -#include <apos/vmem.h> -#include <vmem.h> -#include <csr.h> - -/* assume 64 bit for now */ -struct __packed init_vmem { - int *leaf[512]; -}; - -struct init_vmem *root_branch; - -#define to_pte(a, f) (((a) >> 12) << 10 | (f)) - -/* assume Sv39 for now */ -void init_bootmem() -{ - 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); - - /* direct mapping (temp) */ - for(size_t i = 0; i < CSTACK_PAGE; ++i) - root_branch->leaf[i] = (int*)to_pte(SZ_1G * i, flags); - - /* kernel (also sort of direct mapping) */ - flags |= VM_G; - for(size_t i = KSTART_PAGE; i < IO_PAGE; ++i) - root_branch->leaf[i] = (int *)to_pte(RAM_BASE + SZ_1G * (i - 256), flags); - - /* kernel IO, map to 0 for now, will be updated in the future */ - root_branch->leaf[IO_PAGE] = (int *)to_pte(0, flags); - - csr_write(CSR_SATP, SATP_MODE_Sv39 | ((size_t)root_branch >> 12)); -} - -void move_kernel() -{ - extern char *__init_end; - extern char *__kernel_size; - - 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]; -} - -#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) : );\ -} - -void init(void *fdt) -{ - extern char *__init_end; - void (*kernel_main)(void *fdt) = (void (*)(void *))(VM_KERN); - init_bootmem(); - move_kernel(); - __va_reg(sp); - __va_reg(fp); - __va_reg(gp); - kernel_main(__va(fdt)); -} |
