diff options
| author | Nathan Lee <me@nwlee.tech> | 2026-07-30 13:43:03 -0500 |
|---|---|---|
| committer | Nathan Lee <me@nwlee.tech> | 2026-07-30 13:43:03 -0500 |
| commit | 6982057b61e939fa14418356969753a3c33ebf94 (patch) | |
| tree | d373cd73b70f3d6217f9c97df33aa4cd1fa6980c | |
| parent | 1329d1db52ede274d63b56a7aa37dd25c833ec67 (diff) | |
create stub for syscalls
| -rw-r--r-- | kernel/kernel.c | 11 | ||||
| -rw-r--r-- | kernel/start.S | 92 |
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 |
