summaryrefslogtreecommitdiff
path: root/na
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2026-05-13 16:24:33 +0800
committerRichard Qin <richard.qin.x@gmail.com>2026-05-13 16:24:33 +0800
commitd4eb22af1b6d21546e58ee73d793d962016eb27a (patch)
tree068c7f52aea4cb5db903c10a138cb7f17ccfead1 /na
parent04d302d84c8024df4f0c8c87bdd284ac21ef11f4 (diff)
downloadlume-d4eb22af1b6d21546e58ee73d793d962016eb27a.tar.gz
lume-d4eb22af1b6d21546e58ee73d793d962016eb27a.tar.xz
feat: add syscall interface and syscall numbers for RISC-V LP64
Diffstat (limited to 'na')
-rw-r--r--na/include/lume/syscall.h38
-rw-r--r--na/include/lume/syscall_nr.h61
2 files changed, 99 insertions, 0 deletions
diff --git a/na/include/lume/syscall.h b/na/include/lume/syscall.h
new file mode 100644
index 0000000..8185096
--- /dev/null
+++ b/na/include/lume/syscall.h
@@ -0,0 +1,38 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/* Copyright (C) 2026 Richard Qin */
+
+#pragma once
+
+/*
+ * System Call Interface — Machine-Independent Layer
+ *
+ * Defines the unified syscall handler signature and the MI dispatch function.
+ * MD layer (arch/riscv/syscall/syscall_md.cc) extracts registers into args[6]
+ * and calls syscall_dispatch().
+ *
+ * Reference: docs/specs/syscall.md §4
+ */
+
+#include <lume/types.h>
+
+/* Unified syscall handler signature.
+ * All arguments and return value are register-width (uint64).
+ * Individual sys_* functions cast internally. */
+using SyscallHandler = int64 (*)(uint64, uint64, uint64,
+ uint64, uint64, uint64);
+
+/* MI-layer syscall dispatcher.
+ * Called by MD layer after extracting syscall number and arguments.
+ * Returns the syscall result (negative errno on error). */
+int64 syscall_dispatch(uint64 nr, uint64 args[6]);
+
+/* Register all implemented syscall handlers into the jump table.
+ * Called from kernel_main() after sched_init(). */
+void syscall_init();
+
+/* MD-layer entry point — called from trap handler on TrapCause::Syscall.
+ * Extracts registers from TrapFrame, calls syscall_dispatch, writes result. */
+namespace arch {
+struct TrapFrame;
+}
+void syscall_dispatch_md(arch::TrapFrame* tf);
diff --git a/na/include/lume/syscall_nr.h b/na/include/lume/syscall_nr.h
new file mode 100644
index 0000000..1b677d4
--- /dev/null
+++ b/na/include/lume/syscall_nr.h
@@ -0,0 +1,61 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/* Copyright (C) 2026 Richard Qin */
+
+#pragma once
+
+/*
+ * System Call Numbers — RISC-V LP64 (asm-generic/unistd.h compatible)
+ *
+ * Numbering strictly follows Linux asm-generic so that musl libc / Busybox
+ * binaries can be run without modification.
+ *
+ * Reference: docs/specs/syscall.md §4.3
+ */
+
+inline constexpr int SYS_exit = 93;
+inline constexpr int SYS_exit_group = 94;
+inline constexpr int SYS_set_tid_address = 96;
+inline constexpr int SYS_sched_yield = 124;
+inline constexpr int SYS_uname = 160;
+inline constexpr int SYS_getpid = 172;
+inline constexpr int SYS_getppid = 173;
+inline constexpr int SYS_getuid = 174;
+inline constexpr int SYS_getgid = 176;
+inline constexpr int SYS_gettid = 178;
+inline constexpr int SYS_brk = 214;
+inline constexpr int SYS_munmap = 215;
+inline constexpr int SYS_clone = 220;
+inline constexpr int SYS_execve = 221;
+inline constexpr int SYS_mmap = 222;
+inline constexpr int SYS_mprotect = 226;
+inline constexpr int SYS_wait4 = 260;
+
+inline constexpr int SYS_getcwd = 17;
+inline constexpr int SYS_dup = 23;
+inline constexpr int SYS_dup3 = 24;
+inline constexpr int SYS_ioctl = 29;
+inline constexpr int SYS_mkdirat = 34;
+inline constexpr int SYS_unlinkat = 35;
+inline constexpr int SYS_chdir = 49;
+inline constexpr int SYS_openat = 56;
+inline constexpr int SYS_close = 57;
+inline constexpr int SYS_pipe2 = 59;
+inline constexpr int SYS_lseek = 62;
+inline constexpr int SYS_read = 63;
+inline constexpr int SYS_write = 64;
+inline constexpr int SYS_writev = 66;
+inline constexpr int SYS_ppoll = 73;
+inline constexpr int SYS_fstatat = 79;
+inline constexpr int SYS_fstat = 80;
+
+inline constexpr int SYS_kill = 129;
+inline constexpr int SYS_rt_sigaction = 134;
+inline constexpr int SYS_rt_sigprocmask = 135;
+inline constexpr int SYS_rt_sigreturn = 139;
+
+inline constexpr int SYS_futex = 98;
+inline constexpr int SYS_nanosleep = 101;
+inline constexpr int SYS_clock_gettime = 113;
+inline constexpr int SYS_epoll_create1 = 20;
+inline constexpr int SYS_epoll_ctl = 21;
+inline constexpr int SYS_epoll_pwait = 22;