summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Lee <me@nwlee.tech>2026-07-30 13:43:03 -0500
committerNathan Lee <me@nwlee.tech>2026-07-30 13:43:03 -0500
commit6982057b61e939fa14418356969753a3c33ebf94 (patch)
treed373cd73b70f3d6217f9c97df33aa4cd1fa6980c
parent1329d1db52ede274d63b56a7aa37dd25c833ec67 (diff)
create stub for syscalls
-rw-r--r--kernel/kernel.c11
-rw-r--r--kernel/start.S92
2 files changed, 98 insertions, 5 deletions
diff --git a/kernel/kernel.c b/kernel/kernel.c
index 70a0ad8..e41d239 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -3,21 +3,28 @@
#include <bump.h>
#include <log.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", hart);
+ 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!");
+ 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("kernel init was successful\n");
}
void kernel_trap() {
diff --git a/kernel/start.S b/kernel/start.S
index dce0faa..ecec47b 100644
--- a/kernel/start.S
+++ b/kernel/start.S
@@ -1,10 +1,17 @@
.section .text._start
.global _start
.type _start, @function
+.type _syscall_start, @function
+.type _syscall_exit, @function
+
+.extern user_regs
_start:
- csrw mstatus, zero
- csrw mie, zero
+ csrw sstatus, zero
+ csrw sie, zero
+
+ la t0, _syscall_start
+ csrw stvec, t0
la sp, __stack_top
@@ -17,4 +24,83 @@ _start:
bltu t0, t1, 1b
2:
call kernel_main
- j .
+ 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