From d4eb22af1b6d21546e58ee73d793d962016eb27a Mon Sep 17 00:00:00 2001 From: Richard Qin Date: Wed, 13 May 2026 16:24:33 +0800 Subject: feat: add syscall interface and syscall numbers for RISC-V LP64 --- na/include/lume/syscall.h | 38 +++++++++++++++++++++++++++ na/include/lume/syscall_nr.h | 61 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 na/include/lume/syscall.h create mode 100644 na/include/lume/syscall_nr.h (limited to 'na/include') 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 + +/* 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; -- cgit v1.2.3