aboutsummaryrefslogtreecommitdiff
path: root/arch/riscv/init
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2021-12-20 12:28:30 +0200
committerKimplul <kimi.h.kuparinen@gmail.com>2021-12-20 12:37:55 +0200
commitdc2e2cc9dc9d7790e23dd9a4ccc265d7bb6d76aa (patch)
treeee12863bb4aab536810bbe13638bf21317b37658 /arch/riscv/init
parent98255910aa82c27d04ba79704086eca2310b3075 (diff)
downloadkmi-dc2e2cc9dc9d7790e23dd9a4ccc265d7bb6d76aa.tar.gz
kmi-dc2e2cc9dc9d7790e23dd9a4ccc265d7bb6d76aa.zip
Added init back
Diffstat (limited to 'arch/riscv/init')
-rw-r--r--arch/riscv/init/init.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/arch/riscv/init/init.c b/arch/riscv/init/init.c
new file mode 100644
index 0000000..d9b32a0
--- /dev/null
+++ b/arch/riscv/init/init.c
@@ -0,0 +1,29 @@
+#include <apos/types.h>
+#include <apos/attrs.h>
+#include <vmem.h>
+#include <csr.h>
+
+/* assume 64 bit for now */
+struct __packed init_vmem {
+ int *leaf[512];
+};
+
+struct init_vmem root_branch;
+
+/* assume Sv48 for now */
+void init_lowmem()
+{
+ size_t flags = VM_V | VM_X | VM_R | VM_W;
+ for(size_t i = 0; i < 512; ++i)
+ root_branch.leaf[i] = (int *)((1UL << 37) * i | flags);
+
+ csr_write(CSR_SATP, SATP_MODE_Sv48 | ((size_t)&root_branch >> 12));
+}
+
+void __section(".init.start") main(void *fdt)
+{
+ extern char *__init_end;
+ void (*kernel_main)(void *fdt) = (void (*)(void *))(VM_KERN + (size_t)&__init_end);
+ init_lowmem();
+ kernel_main(fdt);
+}