summaryrefslogtreecommitdiff
path: root/src/kernel/trap/handler.cc
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2025-12-27 21:56:42 +0800
committerRichard Qin <richard.qin.x@gmail.com>2025-12-27 21:56:42 +0800
commit7ececbe2818510a8acaa2a2e513085c768b14d15 (patch)
treed884b6ad1b7e28bc22528b8433a80456fa1f7895 /src/kernel/trap/handler.cc
parentbe71d44b9dfcf65fba3394fbd3dc2b3e06962897 (diff)
downloadlume-7ececbe2818510a8acaa2a2e513085c768b14d15.tar.gz
lume-7ececbe2818510a8acaa2a2e513085c768b14d15.tar.xz
feat: Implement the first user program of the lume OS
Diffstat (limited to 'src/kernel/trap/handler.cc')
-rw-r--r--src/kernel/trap/handler.cc50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/kernel/trap/handler.cc b/src/kernel/trap/handler.cc
index df4f202..4bb8c06 100644
--- a/src/kernel/trap/handler.cc
+++ b/src/kernel/trap/handler.cc
@@ -4,6 +4,7 @@
#include "kernel/proc.h"
#include "kernel/timer.h"
+extern void usertrapret();
void panic(const char *s)
{
@@ -123,4 +124,53 @@ namespace Trap
}
}
}
+}
+
+extern "C" void usertrap()
+{
+ asm volatile("csrw stvec, %0" : : "r"(Trap::kernelvec));
+
+ uint64 scause;
+ asm volatile("csrr %0, scause" : "=r"(scause));
+
+ struct Proc *p = myproc();
+
+ extern struct Proc procs[];
+ for(int i = 0; i < 10; ++i)
+ if(procs[i].state == RUNNING)
+ p = &procs[i];
+
+ uint64 sepc;
+ asm volatile("csrr %0, sepc" : "=r"(sepc));
+ p->tf->epc = sepc;
+
+ if(scause == 8)
+ {
+ p->tf->epc += 4;
+
+ uint64 syscall_num = p->tf->a7;
+
+ if (syscall_num == 1)
+ {
+ char c = (char)p->tf->a0;
+ Drivers::uart_putc(c);
+ }
+ else
+ {
+ Drivers::uart_puts("Unknown Syscall\n");
+ }
+ }
+ else if ((scause & (1L << 63)) && (scause & 0xF) == 5)
+ {
+ Timer::set_next_trigger();
+ ProcManager::yield();
+ }
+ else
+ {
+ Drivers::uart_puts("Unexpected User Trap!\n");
+ while (1)
+ ;
+ }
+
+ forkret();
} \ No newline at end of file