aboutsummaryrefslogtreecommitdiff
path: root/arch/riscv/init/init.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2022-01-06 23:39:12 +0200
committerKimplul <kimi.h.kuparinen@gmail.com>2022-01-07 14:05:06 +0200
commit9cc125fb3cfdc2c8ae7153b5ae0fe705980835fb (patch)
treea1974f9513458acab0bd8d09758259b24b6d7d8c /arch/riscv/init/init.c
parentf0eba93472e0afecc57180fc0d638eeef8e6f3c6 (diff)
downloadkmi-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.c70
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));
-}