From e90b72ec3082588b296956730bd2930cf8d5d671 Mon Sep 17 00:00:00 2001 From: Richard Qin Date: Fri, 10 Jul 2026 11:31:46 +0800 Subject: refactor: promote new architecture to repository root Archive the deprecated implementation under lume-legacy, make the new kernel the default root-level build, and update repository entry points without changing kernel behavior. --- arch/riscv/syscall/syscall_md.cc | 42 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 arch/riscv/syscall/syscall_md.cc (limited to 'arch/riscv/syscall') diff --git a/arch/riscv/syscall/syscall_md.cc b/arch/riscv/syscall/syscall_md.cc new file mode 100644 index 0000000..26320c8 --- /dev/null +++ b/arch/riscv/syscall/syscall_md.cc @@ -0,0 +1,42 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* Copyright (C) 2026 Richard Qin */ + +/* + * Syscall MD Layer — RISC-V Register Extraction + * + * Extracts syscall number (a7) and arguments (a0-a5) from the TrapFrame, + * calls the MI dispatcher, and writes the return value back to a0. + * + * Reference: docs/specs/syscall.md §5 + */ + +#include +#include +#include +#include + +void syscall_dispatch_md(arch::TrapFrame* tf) +{ + uint64 nr = tf->a[7]; /* RISC-V ABI: syscall number in a7 */ + + uint64 args[6] = { + tf->a[0], tf->a[1], tf->a[2], + tf->a[3], tf->a[4], tf->a[5], + }; + + /* Enable interrupts so timer and preemption work during syscalls */ + arch::cpu::intr_on(); + + int64 ret = syscall_dispatch(nr, args); + + arch::cpu::intr_off(); + + /* sys_rt_sigreturn restores the entire TrapFrame from the signal + * frame on the user stack. Writing ret into a[0] would clobber + * the restored value, so we must skip the writeback. */ + if (nr == static_cast(SYS_rt_sigreturn)){ + return; + } + tf->a[0] = static_cast(ret); /* Return value in a0 */ +} + -- cgit v1.2.3