summaryrefslogtreecommitdiff
path: root/kernel/riscv
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/riscv')
-rw-r--r--kernel/riscv/kernel.c45
-rw-r--r--kernel/riscv/start.S106
2 files changed, 151 insertions, 0 deletions
diff --git a/kernel/riscv/kernel.c b/kernel/riscv/kernel.c
new file mode 100644
index 0000000..4e72e2a
--- /dev/null
+++ b/kernel/riscv/kernel.c
@@ -0,0 +1,45 @@
+#include <sys/log.h>
+#include <sys/mem.h>
+#include <sys/cpio.h>
+#include <early/bump.h>
+
+#define KERNEL_SIZE 3 * 1024 * 1024
+
+uint32_t user_regs[31];
+
+void kernel_main(size_t hart, void *fdt) {
+ printk("Doing kernel init with hard ID %d\n", hart);
+
+ struct dt_node *head = dt_parse(fdt);
+ struct mem_info *info = km_find_memory(head);
+
+
+ if (!info) {
+ printk("failed to find memory info!\n");
+ return;
+ }
+
+ info->start = (void *)((uint8_t *)info->start + KERNEL_SIZE);
+ info->size -= KERNEL_SIZE;
+
+ km_init(info);
+
+ printk("memory blocks initialized\n");
+
+ size_t len = 0;
+ uint32_t *initrd = dt_get_prop(head, "initrd", &len);
+ if (!initrd || len < 8) {
+ printk("failed to find initrd!\n");
+ return;
+ }
+ uint32_t base = btohi(initrd[0]);
+ uint32_t size = btohi(initrd[1]);
+
+ char *file = cpio_get_file((void*)base, (size_t)size, "/sbin/init");
+ (void)file;
+}
+
+void kernel_trap() {
+
+
+}
diff --git a/kernel/riscv/start.S b/kernel/riscv/start.S
new file mode 100644
index 0000000..ecec47b
--- /dev/null
+++ b/kernel/riscv/start.S
@@ -0,0 +1,106 @@
+.section .text._start
+.global _start
+.type _start, @function
+.type _syscall_start, @function
+.type _syscall_exit, @function
+
+.extern user_regs
+
+_start:
+ csrw sstatus, zero
+ csrw sie, zero
+
+ la t0, _syscall_start
+ csrw stvec, t0
+
+ la sp, __stack_top
+
+ la t0, __bss_start
+ la t1, __bss_end
+ beq t0, t1, 2f
+1:
+ sw zero, 0(t0)
+ addi t0, t0, 4
+ bltu t0, t1, 1b
+2:
+ call kernel_main
+ wfi
+
+_syscall_start:
+ csrw sscratch, x1
+ la x1, user_regs
+
+ sw x2, 4(x1)
+ sw x3, 8(x1)
+ sw x4, 12(x1)
+ sw x5, 16(x1)
+ sw x6, 20(x1)
+ sw x7, 24(x1)
+ sw x8, 28(x1)
+ sw x9, 32(x1)
+ sw x10, 36(x1)
+ sw x11, 40(x1)
+ sw x12, 44(x1)
+ sw x13, 48(x1)
+ sw x14, 52(x1)
+ sw x15, 56(x1)
+ sw x16, 60(x1)
+ sw x17, 64(x1)
+ sw x18, 68(x1)
+ sw x19, 72(x1)
+ sw x20, 76(x1)
+ sw x21, 80(x1)
+ sw x22, 84(x1)
+ sw x23, 88(x1)
+ sw x24, 92(x1)
+ sw x25, 96(x1)
+ sw x26, 100(x1)
+ sw x27, 104(x1)
+ sw x28, 108(x1)
+ sw x29, 112(x1)
+ sw x30, 116(x1)
+ sw x31, 120(x1)
+
+ csrr t0, sscratch
+ sw t0, 0(x1)
+
+ jal kernel_trap
+
+_syscall_exit:
+ csrw sscratch, x1
+ la x1, user_regs
+
+ lw x2, 4(x1)
+ lw x3, 8(x1)
+ lw x4, 12(x1)
+ lw x5, 16(x1)
+ lw x6, 20(x1)
+ lw x7, 24(x1)
+ lw x8, 28(x1)
+ lw x9, 32(x1)
+ lw x10, 36(x1)
+ lw x11, 40(x1)
+ lw x12, 44(x1)
+ lw x13, 48(x1)
+ lw x14, 52(x1)
+ lw x15, 56(x1)
+ lw x16, 60(x1)
+ lw x17, 64(x1)
+ lw x18, 68(x1)
+ lw x19, 72(x1)
+ lw x20, 76(x1)
+ lw x21, 80(x1)
+ lw x22, 84(x1)
+ lw x23, 88(x1)
+ lw x24, 92(x1)
+ lw x25, 96(x1)
+ lw x26, 100(x1)
+ lw x27, 104(x1)
+ lw x28, 108(x1)
+ lw x29, 112(x1)
+ lw x30, 116(x1)
+ lw x31, 120(x1)
+
+ csrr x1, sscratch
+
+ sret