summaryrefslogtreecommitdiff
path: root/na
diff options
context:
space:
mode:
Diffstat (limited to 'na')
-rw-r--r--na/arch/riscv/syscall/syscall_md.cc28
1 files changed, 28 insertions, 0 deletions
diff --git a/na/arch/riscv/syscall/syscall_md.cc b/na/arch/riscv/syscall/syscall_md.cc
new file mode 100644
index 0000000..a52eb0e
--- /dev/null
+++ b/na/arch/riscv/syscall/syscall_md.cc
@@ -0,0 +1,28 @@
+/* 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 <lume/syscall.h>
+#include <arch/trapframe.h>
+
+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],
+ };
+
+ int64 ret = syscall_dispatch(nr, args);
+
+ tf->a[0] = static_cast<uint64>(ret); /* Return value in a0 */
+}