diff options
| author | Richard Qin <richard.qin.x@gmail.com> | 2025-12-27 21:56:42 +0800 |
|---|---|---|
| committer | Richard Qin <richard.qin.x@gmail.com> | 2025-12-27 21:56:42 +0800 |
| commit | 7ececbe2818510a8acaa2a2e513085c768b14d15 (patch) | |
| tree | d884b6ad1b7e28bc22528b8433a80456fa1f7895 /src/kernel/trap/handler.cc | |
| parent | be71d44b9dfcf65fba3394fbd3dc2b3e06962897 (diff) | |
| download | lume-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.cc | 50 |
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 |
