diff options
| author | Richard Qin <richard.qin.x@gmail.com> | 2025-12-28 00:48:24 +0800 |
|---|---|---|
| committer | Richard Qin <richard.qin.x@gmail.com> | 2025-12-28 00:48:24 +0800 |
| commit | a82ab8ad6d277ededc128678aebabf5fbdb01c45 (patch) | |
| tree | 71d1d333d45e7272ba79a1868942dc710f673ff3 /src/kernel/trap/handler.cc | |
| parent | 7ececbe2818510a8acaa2a2e513085c768b14d15 (diff) | |
| download | lume-a82ab8ad6d277ededc128678aebabf5fbdb01c45.tar.gz lume-a82ab8ad6d277ededc128678aebabf5fbdb01c45.tar.xz | |
feat(syscall): Implement syscall dispatch and process lifecycle (exit/wait/sleep)
Diffstat (limited to 'src/kernel/trap/handler.cc')
| -rw-r--r-- | src/kernel/trap/handler.cc | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/src/kernel/trap/handler.cc b/src/kernel/trap/handler.cc index 4bb8c06..14ef4c5 100644 --- a/src/kernel/trap/handler.cc +++ b/src/kernel/trap/handler.cc @@ -3,8 +3,11 @@ #include "drivers/uart.h" #include "kernel/proc.h" #include "kernel/timer.h" +#include "kernel/syscall.h" +#include "kernel/riscv.h" extern void usertrapret(); +extern void forkret(); void panic(const char *s) { @@ -71,10 +74,10 @@ namespace Trap switch (scause) { case 8: - Drivers::uart_puts("[Syscall] ecall for User Mode\n"); - tf->epc += 4; + Drivers::uart_puts("[Syscall] ecall from Kernel Mode? Panic.\n"); + panic("Kernel Ecall"); break; - + case 12: case 13: case 15: @@ -136,9 +139,12 @@ extern "C" void usertrap() struct Proc *p = myproc(); extern struct Proc procs[]; - for(int i = 0; i < 10; ++i) - if(procs[i].state == RUNNING) - p = &procs[i]; + if (!p) + { + for (int i = 0; i < 10; ++i) + if (procs[i].state == RUNNING) + p = &procs[i]; + } uint64 sepc; asm volatile("csrr %0, sepc" : "=r"(sepc)); @@ -146,31 +152,26 @@ extern "C" void usertrap() if(scause == 8) { + intr_on(); p->tf->epc += 4; - uint64 syscall_num = p->tf->a7; + syscall(); - if (syscall_num == 1) - { - char c = (char)p->tf->a0; - Drivers::uart_putc(c); - } - else - { - Drivers::uart_puts("Unknown Syscall\n"); - } + intr_off(); } else if ((scause & (1L << 63)) && (scause & 0xF) == 5) { + Drivers::uart_puts("\nTick\n"); Timer::set_next_trigger(); ProcManager::yield(); } else { Drivers::uart_puts("Unexpected User Trap!\n"); + Drivers::print_hex(scause); while (1) ; } - forkret(); + usertrapret(); }
\ No newline at end of file |
