aboutsummaryrefslogtreecommitdiff
path: root/arch/riscv/init
diff options
context:
space:
mode:
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);
+}