Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions src/rawposix/src/sys_calls.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ use sysdefs::constants::sys_const::{
DEFAULT_GID, DEFAULT_UID, EXIT_SUCCESS, ITIMER_REAL, SIGCHLD, SIGKILL, SIGSTOP, SIG_BLOCK,
SIG_SETMASK, SIG_UNBLOCK, WNOHANG,
};
use sysdefs::constants::syscall_const;
use sysdefs::data::fs_struct::{ITimerVal, SigactionStruct};
use sysdefs::{constants::sys_const, data::sys_struct};
use typemap::datatype_conversion::*;
Expand Down Expand Up @@ -183,7 +184,7 @@ pub extern "C" fn fork_syscall(
// - Resume execution in parent and child
threei::make_syscall(
RAWPOSIX_CAGEID,
56, // clone syscall number
syscall_const::CLONE_SYSCALL as u64,
UNUSED_NAME,
WASMTIME_CAGEID,
clone_arg,
Expand Down Expand Up @@ -268,7 +269,7 @@ pub extern "C" fn exec_syscall(

threei::make_syscall(
RAWPOSIX_CAGEID,
59, // exec syscall number
syscall_const::EXEC_SYSCALL as u64,
UNUSED_NAME,
WASMTIME_CAGEID,
path,
Expand Down Expand Up @@ -406,7 +407,7 @@ pub extern "C" fn exit_syscall(
// See comments in wasmtime/lind-multi-process
threei::make_syscall(
RAWPOSIX_CAGEID,
60, // exit syscall number
syscall_const::EXIT_SYSCALL as u64,
UNUSED_NAME,
WASMTIME_CAGEID,
status_arg,
Expand Down
225 changes: 127 additions & 98 deletions src/rawposix/src/syscall_table.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,12 @@ use super::fs_calls::{
close_syscall, dup2_syscall, dup3_syscall, dup_syscall, fchdir_syscall, fchmod_syscall,
fcntl_syscall, fdatasync_syscall, flock_syscall, fstat_syscall, fstatfs_syscall, fsync_syscall,
ftruncate_syscall, futex_syscall, getcwd_syscall, getdents_syscall, getrandom_syscall,
ioctl_syscall, link_syscall, lseek_syscall, mkdir_syscall, mknod_syscall, mmap_syscall,
mprotect_syscall, munmap_syscall, nanosleep_time64_syscall, open_syscall, pipe2_syscall,
pipe_syscall, pread_syscall, pwrite_syscall, read_syscall, readlink_syscall,
readlinkat_syscall, readv_syscall, rename_syscall, rmdir_syscall, shmat_syscall,
shmctl_syscall, shmdt_syscall, shmget_syscall, stat_syscall, statfs_syscall,
sync_file_range_syscall, truncate_syscall, unlink_syscall, unlinkat_syscall, write_syscall,
writev_syscall,
ioctl_syscall, link_syscall, lseek_syscall, mkdir_syscall, mmap_syscall, mprotect_syscall,
munmap_syscall, nanosleep_time64_syscall, open_syscall, pipe2_syscall, pipe_syscall,
pread_syscall, pwrite_syscall, read_syscall, readlink_syscall, readlinkat_syscall,
readv_syscall, rename_syscall, rmdir_syscall, shmat_syscall, shmctl_syscall, shmdt_syscall,
shmget_syscall, stat_syscall, statfs_syscall, sync_file_range_syscall, truncate_syscall,
unlink_syscall, unlinkat_syscall, write_syscall, writev_syscall,
};
use super::init::RawCallFunc;
use super::net_calls::{
Expand All @@ -29,97 +28,127 @@ use super::sys_calls::{
getpid_syscall, getppid_syscall, getuid_syscall, kill_syscall, sched_yield_syscall,
setitimer_syscall, sigaction_syscall, sigprocmask_syscall, waitpid_syscall,
};
use sysdefs::constants::syscall_const;

pub const SYSCALL_TABLE: &[(u64, RawCallFunc)] = &[
(0, read_syscall),
(1, write_syscall),
(2, open_syscall),
(3, close_syscall),
(7, poll_syscall),
(4, stat_syscall),
(5, fstat_syscall),
(8, lseek_syscall),
(9, mmap_syscall),
(10, mprotect_syscall),
(11, munmap_syscall),
(12, brk_syscall),
(13, sigaction_syscall),
(14, sigprocmask_syscall),
(16, ioctl_syscall),
(17, pread_syscall),
(18, pwrite_syscall),
(19, readv_syscall),
(20, writev_syscall),
(21, access_syscall),
(22, pipe_syscall),
(23, select_syscall),
(24, sched_yield_syscall),
(29, shmget_syscall),
(30, shmat_syscall),
(31, shmctl_syscall),
(32, dup_syscall),
(33, dup2_syscall),
(35, nanosleep_time64_syscall),
(38, setitimer_syscall),
(39, getpid_syscall),
(41, socket_syscall),
(42, connect_syscall),
(43, accept_syscall),
(44, sendto_syscall),
(45, recvfrom_syscall),
(46, sendmsg_syscall),
(47, recvmsg_syscall),
(48, shutdown_syscall),
(49, bind_syscall),
(50, listen_syscall),
(51, getsockname_syscall),
(52, getpeername_syscall),
(53, socketpair_syscall),
(54, setsockopt_syscall),
(55, getsockopt_syscall),
(56, fork_syscall),
(59, exec_syscall),
(60, exit_syscall),
(61, waitpid_syscall),
(62, kill_syscall),
(67, shmdt_syscall),
(72, fcntl_syscall),
(73, flock_syscall),
(74, fsync_syscall),
(75, fdatasync_syscall),
(76, truncate_syscall),
(77, ftruncate_syscall),
(78, getdents_syscall),
(79, getcwd_syscall),
(80, chdir_syscall),
(81, fchdir_syscall),
(82, rename_syscall),
(83, mkdir_syscall),
(84, rmdir_syscall),
(86, link_syscall),
(87, unlink_syscall),
(89, readlink_syscall),
(90, chmod_syscall),
(91, fchmod_syscall),
(102, getuid_syscall),
(104, getgid_syscall),
(107, geteuid_syscall),
(108, getegid_syscall),
(110, getppid_syscall),
(133, mknod_syscall),
(137, statfs_syscall),
(138, fstatfs_syscall),
(170, gethostname_syscall),
(202, futex_syscall),
(213, epoll_create_syscall),
(228, clock_gettime_syscall),
(232, epoll_wait_syscall),
(233, epoll_ctl_syscall),
(263, unlinkat_syscall),
(267, readlinkat_syscall),
(277, sync_file_range_syscall),
(291, epoll_create1_syscall),
(292, dup3_syscall),
(293, pipe2_syscall),
(318, getrandom_syscall),
(syscall_const::READ_SYSCALL as u64, read_syscall),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe this makes sense. Maybe it should be autogenerated. I'm not sure.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed. Auto-generation would be the cleaner long-term solution. For now this PR replaces the hardcoded magic numbers with named constants to unblock #612, and we can follow up with a generation script as a next step.

(syscall_const::WRITE_SYSCALL as u64, write_syscall),
(syscall_const::OPEN_SYSCALL as u64, open_syscall),
(syscall_const::CLOSE_SYSCALL as u64, close_syscall),
(syscall_const::POLL_SYSCALL as u64, poll_syscall),
(syscall_const::STAT_SYSCALL as u64, stat_syscall),
(syscall_const::FSTAT_SYSCALL as u64, fstat_syscall),
(syscall_const::LSEEK_SYSCALL as u64, lseek_syscall),
(syscall_const::MMAP_SYSCALL as u64, mmap_syscall),
(syscall_const::MPROTECT_SYSCALL as u64, mprotect_syscall),
(syscall_const::MUNMAP_SYSCALL as u64, munmap_syscall),
(syscall_const::BRK_SYSCALL as u64, brk_syscall),
(syscall_const::SIGACTION_SYSCALL as u64, sigaction_syscall),
(
syscall_const::SIGPROCMASK_SYSCALL as u64,
sigprocmask_syscall,
),
(syscall_const::IOCTL_SYSCALL as u64, ioctl_syscall),
(syscall_const::PREAD_SYSCALL as u64, pread_syscall),
(syscall_const::PWRITE_SYSCALL as u64, pwrite_syscall),
(syscall_const::READV_SYSCALL as u64, readv_syscall),
(syscall_const::WRITEV_SYSCALL as u64, writev_syscall),
(syscall_const::ACCESS_SYSCALL as u64, access_syscall),
(syscall_const::PIPE_SYSCALL as u64, pipe_syscall),
(syscall_const::SELECT_SYSCALL as u64, select_syscall),
(
syscall_const::SCHED_YIELD_SYSCALL as u64,
sched_yield_syscall,
),
(syscall_const::SHMGET_SYSCALL as u64, shmget_syscall),
(syscall_const::SHMAT_SYSCALL as u64, shmat_syscall),
(syscall_const::SHMCTL_SYSCALL as u64, shmctl_syscall),
(syscall_const::DUP_SYSCALL as u64, dup_syscall),
(syscall_const::DUP2_SYSCALL as u64, dup2_syscall),
(
syscall_const::NANOSLEEP_SYSCALL as u64,
nanosleep_time64_syscall,
),
(syscall_const::SETITIMER_SYSCALL as u64, setitimer_syscall),
(syscall_const::GETPID_SYSCALL as u64, getpid_syscall),
(syscall_const::SOCKET_SYSCALL as u64, socket_syscall),
(syscall_const::CONNECT_SYSCALL as u64, connect_syscall),
(syscall_const::ACCEPT_SYSCALL as u64, accept_syscall),
(syscall_const::SENDTO_SYSCALL as u64, sendto_syscall),
(syscall_const::RECVFROM_SYSCALL as u64, recvfrom_syscall),
(syscall_const::SENDMSG_SYSCALL as u64, sendmsg_syscall),
(syscall_const::RECVMSG_SYSCALL as u64, recvmsg_syscall),
(syscall_const::SHUTDOWN_SYSCALL as u64, shutdown_syscall),
(syscall_const::BIND_SYSCALL as u64, bind_syscall),
(syscall_const::LISTEN_SYSCALL as u64, listen_syscall),
(
syscall_const::GETSOCKNAME_SYSCALL as u64,
getsockname_syscall,
),
(
syscall_const::GETPEERNAME_SYSCALL as u64,
getpeername_syscall,
),
(syscall_const::SOCKETPAIR_SYSCALL as u64, socketpair_syscall),
(syscall_const::SETSOCKOPT_SYSCALL as u64, setsockopt_syscall),
(syscall_const::GETSOCKOPT_SYSCALL as u64, getsockopt_syscall),
(syscall_const::CLONE_SYSCALL as u64, fork_syscall),
(syscall_const::EXEC_SYSCALL as u64, exec_syscall),
(syscall_const::EXIT_SYSCALL as u64, exit_syscall),
(syscall_const::WAITPID_SYSCALL as u64, waitpid_syscall),
(syscall_const::KILL_SYSCALL as u64, kill_syscall),
(syscall_const::SHMDT_SYSCALL as u64, shmdt_syscall),
(syscall_const::FCNTL_SYSCALL as u64, fcntl_syscall),
(syscall_const::FLOCK_SYSCALL as u64, flock_syscall),
(syscall_const::FSYNC_SYSCALL as u64, fsync_syscall),
(syscall_const::FDATASYNC_SYSCALL as u64, fdatasync_syscall),
(syscall_const::TRUNCATE_SYSCALL as u64, truncate_syscall),
(syscall_const::FTRUNCATE_SYSCALL as u64, ftruncate_syscall),
(syscall_const::GETDENTS_SYSCALL as u64, getdents_syscall),
(syscall_const::GETCWD_SYSCALL as u64, getcwd_syscall),
(syscall_const::CHDIR_SYSCALL as u64, chdir_syscall),
(syscall_const::FCHDIR_SYSCALL as u64, fchdir_syscall),
(syscall_const::RENAME_SYSCALL as u64, rename_syscall),
(syscall_const::MKDIR_SYSCALL as u64, mkdir_syscall),
(syscall_const::RMDIR_SYSCALL as u64, rmdir_syscall),
(syscall_const::LINK_SYSCALL as u64, link_syscall),
(syscall_const::UNLINK_SYSCALL as u64, unlink_syscall),
(syscall_const::READLINK_SYSCALL as u64, readlink_syscall),
(syscall_const::CHMOD_SYSCALL as u64, chmod_syscall),
(syscall_const::FCHMOD_SYSCALL as u64, fchmod_syscall),
(syscall_const::GETUID_SYSCALL as u64, getuid_syscall),
(syscall_const::GETGID_SYSCALL as u64, getgid_syscall),
(syscall_const::GETEUID_SYSCALL as u64, geteuid_syscall),
(syscall_const::GETEGID_SYSCALL as u64, getegid_syscall),
(syscall_const::GETPPID_SYSCALL as u64, getppid_syscall),
(syscall_const::STATFS_SYSCALL as u64, statfs_syscall),
(syscall_const::FSTATFS_SYSCALL as u64, fstatfs_syscall),
(
syscall_const::GETHOSTNAME_SYSCALL as u64,
gethostname_syscall,
),
(syscall_const::FUTEX_SYSCALL as u64, futex_syscall),
(
syscall_const::EPOLL_CREATE_SYSCALL as u64,
epoll_create_syscall,
),
(
syscall_const::CLOCK_GETTIME_SYSCALL as u64,
clock_gettime_syscall,
),
(syscall_const::EPOLL_WAIT_SYSCALL as u64, epoll_wait_syscall),
(syscall_const::EPOLL_CTL_SYSCALL as u64, epoll_ctl_syscall),
(syscall_const::UNLINKAT_SYSCALL as u64, unlinkat_syscall),
(syscall_const::READLINKAT_SYSCALL as u64, readlinkat_syscall),
(
syscall_const::SYNC_FILE_RANGE_SYSCALL as u64,
sync_file_range_syscall,
),
(
syscall_const::EPOLL_CREATE1_SYSCALL as u64,
epoll_create1_syscall,
),
(syscall_const::DUP3_SYSCALL as u64, dup3_syscall),
(syscall_const::PIPE2_SYSCALL as u64, pipe2_syscall),
(syscall_const::GETRANDOM_SYSCALL as u64, getrandom_syscall),
];
2 changes: 2 additions & 0 deletions src/sysdefs/src/constants/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@ pub mod fs_const;
pub mod lind_platform_const;
pub mod net_const;
pub mod sys_const;
pub mod syscall_const;

pub use err_const::*;
pub use fs_const::*;
pub use lind_platform_const::*;
pub use net_const::*;
pub use sys_const::*;
pub use syscall_const::*;
99 changes: 99 additions & 0 deletions src/sysdefs/src/constants/syscall_const.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
//! Syscall number constants for the Lind platform.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Was this manually copied over or is there a script, etc.? Is the same information in glibc? How does this + the kernel sync? Is it so slow moving that this doesn't matter?

Copy link
Contributor Author

@celinehoang177 celinehoang177 Mar 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These were manually copied from the Linux x86_64 syscall table. The same numbers are already in glibc's lind_syscall_num.h, so this file is basically the Rust equivalent of that. Since the Linux syscall table is append-only (existing numbers never get reassigned), sync drift isn't really a concern in practice. But yeah, I think auto-generating both the C header and this Rust file from a single source would definitely be cleaner and is a good follow-up to do!

//!
//! Source of truth: Linux x86_64 syscall table
//! https://github.com/torvalds/linux/blob/v6.16-rc1/arch/x86/entry/syscalls/syscall_64.tbl
//! (Historical overview: https://filippo.io/linux-syscall-table/)
//!
//! Keep these in sync with glibc's lind_syscall_num.h and RawPOSIX dispatcher.

pub const READ_SYSCALL: i32 = 0;
pub const WRITE_SYSCALL: i32 = 1;
pub const OPEN_SYSCALL: i32 = 2;
pub const CLOSE_SYSCALL: i32 = 3;
pub const STAT_SYSCALL: i32 = 4;
pub const FSTAT_SYSCALL: i32 = 5;
pub const POLL_SYSCALL: i32 = 7;
pub const LSEEK_SYSCALL: i32 = 8;
pub const MMAP_SYSCALL: i32 = 9;
pub const MPROTECT_SYSCALL: i32 = 10;
pub const MUNMAP_SYSCALL: i32 = 11;
pub const BRK_SYSCALL: i32 = 12;
pub const SIGACTION_SYSCALL: i32 = 13;
pub const SIGPROCMASK_SYSCALL: i32 = 14;
pub const IOCTL_SYSCALL: i32 = 16;
pub const PREAD_SYSCALL: i32 = 17;
pub const PWRITE_SYSCALL: i32 = 18;
pub const READV_SYSCALL: i32 = 19;
pub const WRITEV_SYSCALL: i32 = 20;
pub const ACCESS_SYSCALL: i32 = 21;
pub const PIPE_SYSCALL: i32 = 22;
pub const SELECT_SYSCALL: i32 = 23;
pub const SCHED_YIELD_SYSCALL: i32 = 24;
pub const SHMGET_SYSCALL: i32 = 29;
pub const SHMAT_SYSCALL: i32 = 30;
pub const SHMCTL_SYSCALL: i32 = 31;
pub const DUP_SYSCALL: i32 = 32;
pub const DUP2_SYSCALL: i32 = 33;
pub const NANOSLEEP_SYSCALL: i32 = 35;
pub const SETITIMER_SYSCALL: i32 = 38;
pub const GETPID_SYSCALL: i32 = 39;
pub const SOCKET_SYSCALL: i32 = 41;
pub const CONNECT_SYSCALL: i32 = 42;
pub const ACCEPT_SYSCALL: i32 = 43;
pub const SENDTO_SYSCALL: i32 = 44;
pub const RECVFROM_SYSCALL: i32 = 45;
pub const SENDMSG_SYSCALL: i32 = 46;
pub const RECVMSG_SYSCALL: i32 = 47;
pub const SHUTDOWN_SYSCALL: i32 = 48;
pub const BIND_SYSCALL: i32 = 49;
pub const LISTEN_SYSCALL: i32 = 50;
pub const GETSOCKNAME_SYSCALL: i32 = 51;
pub const GETPEERNAME_SYSCALL: i32 = 52;
pub const SOCKETPAIR_SYSCALL: i32 = 53;
pub const SETSOCKOPT_SYSCALL: i32 = 54;
pub const GETSOCKOPT_SYSCALL: i32 = 55;
pub const CLONE_SYSCALL: i32 = 56;
pub const FORK_SYSCALL: i32 = 57;
pub const EXEC_SYSCALL: i32 = 59;
pub const EXIT_SYSCALL: i32 = 60;
pub const WAITPID_SYSCALL: i32 = 61;
pub const KILL_SYSCALL: i32 = 62;
pub const SHMDT_SYSCALL: i32 = 67;
pub const FCNTL_SYSCALL: i32 = 72;
pub const FLOCK_SYSCALL: i32 = 73;
pub const FSYNC_SYSCALL: i32 = 74;
pub const FDATASYNC_SYSCALL: i32 = 75;
pub const TRUNCATE_SYSCALL: i32 = 76;
pub const FTRUNCATE_SYSCALL: i32 = 77;
pub const GETDENTS_SYSCALL: i32 = 78;
pub const GETCWD_SYSCALL: i32 = 79;
pub const CHDIR_SYSCALL: i32 = 80;
pub const FCHDIR_SYSCALL: i32 = 81;
pub const RENAME_SYSCALL: i32 = 82;
pub const MKDIR_SYSCALL: i32 = 83;
pub const RMDIR_SYSCALL: i32 = 84;
pub const LINK_SYSCALL: i32 = 86;
pub const UNLINK_SYSCALL: i32 = 87;
pub const READLINK_SYSCALL: i32 = 89;
pub const CHMOD_SYSCALL: i32 = 90;
pub const FCHMOD_SYSCALL: i32 = 91;
pub const GETUID_SYSCALL: i32 = 102;
pub const GETGID_SYSCALL: i32 = 104;
pub const GETEUID_SYSCALL: i32 = 107;
pub const GETEGID_SYSCALL: i32 = 108;
pub const GETPPID_SYSCALL: i32 = 110;
pub const STATFS_SYSCALL: i32 = 137;
pub const FSTATFS_SYSCALL: i32 = 138;
pub const GETHOSTNAME_SYSCALL: i32 = 170;
pub const FUTEX_SYSCALL: i32 = 202;
pub const EPOLL_CREATE_SYSCALL: i32 = 213;
pub const CLOCK_GETTIME_SYSCALL: i32 = 228;
pub const EPOLL_WAIT_SYSCALL: i32 = 232;
pub const EPOLL_CTL_SYSCALL: i32 = 233;
pub const UNLINKAT_SYSCALL: i32 = 263;
pub const READLINKAT_SYSCALL: i32 = 267;
pub const SYNC_FILE_RANGE_SYSCALL: i32 = 277;
pub const EPOLL_CREATE1_SYSCALL: i32 = 291;
pub const DUP3_SYSCALL: i32 = 292;
pub const PIPE2_SYSCALL: i32 = 293;
pub const GETRANDOM_SYSCALL: i32 = 318;
2 changes: 1 addition & 1 deletion src/wasmtime/crates/lind-common/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ use wasmtime_lind_multi_process::{get_memory_base, LindHost};
// `UNUSED_ID` / `UNUSED_ARG` / `UNUSED_NAME` is a placeholder argument
// for functions that require a fixed number of parameters but do not utilize
// all of them.
use wasmtime_lind_utils::lind_syscall_numbers::{CLONE_SYSCALL, EXEC_SYSCALL, EXIT_SYSCALL};
use sysdefs::constants::syscall_const::{CLONE_SYSCALL, EXEC_SYSCALL, EXIT_SYSCALL};

/// Stores argv and environment variables for the guest program. During glibc's
/// `_start()`, the guest calls 4 imported host functions (`args_sizes_get`,
Expand Down
Loading
Loading