diff --git a/api/src/imp/fs/ctl.rs b/api/src/imp/fs/ctl.rs index 37dce1f3f..a055edf16 100644 --- a/api/src/imp/fs/ctl.rs +++ b/api/src/imp/fs/ctl.rs @@ -1,7 +1,7 @@ use core::ffi::{c_char, c_void}; use alloc::string::ToString; -use arceos_posix_api::AT_FDCWD; +use arceos_posix_api::{AT_FDCWD, FD_TABLE}; use axerrno::{AxError, LinuxError, LinuxResult}; use macro_rules_attribute::apply; @@ -10,6 +10,18 @@ use crate::{ syscall_instrument, }; +#[allow(missing_docs)] +pub const TIOCGWINSZ: usize = 0x5413; + +#[repr(C)] +#[derive(Clone, Copy, Default)] +pub struct ConsoleWinSize { + ws_row: u16, + ws_col: u16, + ws_xpixel: u16, + ws_ypixel: u16, +} + /// The ioctl() system call manipulates the underlying device parameters /// of special files. /// @@ -19,9 +31,26 @@ use crate::{ /// and of type int in musl and other UNIX systems. /// * `argp` - The argument to the request. It is a pointer to a memory location #[apply(syscall_instrument)] -pub fn sys_ioctl(_fd: i32, _op: usize, _argp: UserPtr) -> LinuxResult { - warn!("Unimplemented syscall: SYS_IOCTL"); - Ok(0) +pub fn sys_ioctl(fd: i32, op: usize, argp: UserPtr) -> LinuxResult { + if fd >= FD_TABLE.read().count() as i32 { + debug!("fd {} is out of range", fd); + return Err(LinuxError::EBADF); + } + if FD_TABLE.read().get(fd as usize).is_none() { + debug!("fd {} is none", fd); + return Err(LinuxError::EBADF); + } + let argp = argp.get_as_bytes(size_of::())?; + match op { + TIOCGWINSZ => { + let winsize = argp as *mut ConsoleWinSize; + unsafe { + *winsize = ConsoleWinSize::default(); + } + Ok(0) + } + _ => Err(LinuxError::EOPNOTSUPP), + } } pub fn sys_chdir(path: UserConstPtr) -> LinuxResult { @@ -256,6 +285,11 @@ pub fn sys_linkat( .map_err(|err| err.into()) } +pub fn sys_unlink(_path: UserConstPtr) -> LinuxResult { + warn!("sys_unlink: not implemented"); + Ok(0) +} + /// remove link of specific file (can be used to delete file) /// dir_fd: the directory of link to be removed /// path: the name of link to be removed diff --git a/api/src/imp/fs/io.rs b/api/src/imp/fs/io.rs index 8be57b4b9..1c7f21375 100644 --- a/api/src/imp/fs/io.rs +++ b/api/src/imp/fs/io.rs @@ -5,6 +5,10 @@ use axerrno::LinuxResult; use crate::ptr::{PtrWrapper, UserConstPtr, UserPtr}; +pub fn sys_lseek(fd: i32, offset: isize, whence: i32) -> LinuxResult { + Ok(api::sys_lseek(fd, offset as _, whence) as _) +} + pub fn sys_read(fd: i32, buf: UserPtr, count: usize) -> LinuxResult { let buf = buf.get_as_bytes(count)?; Ok(api::sys_read(fd, buf, count)) @@ -38,3 +42,22 @@ pub fn sys_open(path: UserConstPtr, flags: i32, modes: mode_t) -> LinuxR use arceos_posix_api::AT_FDCWD; sys_openat(AT_FDCWD as _, path, flags, modes) } + +pub fn sys_readlink( + _pathname: UserConstPtr, + _buf: UserPtr, + _bufsiz: usize, +) -> LinuxResult { + warn!("sys_readlink: not implemented"); + Ok(0) +} + +pub fn sys_readlinkat( + _dirfd: i32, + _pathname: UserConstPtr, + _buf: UserPtr, + _bufsiz: usize, +) -> LinuxResult { + warn!("sys_readlinkat: not implemented"); + Ok(0) +} diff --git a/api/src/imp/signal.rs b/api/src/imp/signal.rs index a24c420d9..f06850464 100644 --- a/api/src/imp/signal.rs +++ b/api/src/imp/signal.rs @@ -23,3 +23,12 @@ pub fn sys_rt_sigaction( warn!("sys_rt_sigaction: not implemented"); Ok(0) } + +pub fn sys_rt_sigtimedwait( + _set: UserConstPtr, + _info: UserPtr, + _timeout: UserConstPtr, +) -> LinuxResult { + warn!("sys_rt_sigtimedwait: not implemented"); + Ok(0) +} diff --git a/api/src/imp/sys.rs b/api/src/imp/sys.rs index ccfc15661..d8b2dfb6b 100644 --- a/api/src/imp/sys.rs +++ b/api/src/imp/sys.rs @@ -1,6 +1,8 @@ +use core::ffi::c_void; + use axerrno::LinuxResult; -use crate::ptr::{PtrWrapper, UserPtr}; +use crate::ptr::{PtrWrapper, UserConstPtr, UserPtr}; pub fn sys_getuid() -> LinuxResult { Ok(0) @@ -47,3 +49,28 @@ pub fn sys_uname(name: UserPtr) -> LinuxResult { unsafe { *name.get()? = UtsName::default() }; Ok(0) } + +pub fn sys_prlimit64( + _pid: i32, + _resource: i32, + _new_limit: UserConstPtr, + _old_limit: UserPtr, +) -> LinuxResult { + warn!("sys_prlimit64: not implemented"); + Ok(0) +} + +pub fn sys_rseq( + _rseq: UserPtr, + _rseq_len: u32, + _flags: u32, + _sig: UserPtr, +) -> LinuxResult { + warn!("sys_rseq: not implemented"); + Ok(0) +} + +pub fn sys_getrandom(_buf: UserPtr, _buflen: usize, _flags: u32) -> LinuxResult { + warn!("sys_getrandom: not implemented"); + Ok(0) +} diff --git a/api/src/imp/task/thread.rs b/api/src/imp/task/thread.rs index 990e07f14..b3d8f15c2 100644 --- a/api/src/imp/task/thread.rs +++ b/api/src/imp/task/thread.rs @@ -1,4 +1,7 @@ -use core::{ffi::c_char, ptr}; +use core::{ + ffi::{c_char, c_void}, + ptr, +}; use alloc::vec::Vec; use axerrno::{LinuxError, LinuxResult}; @@ -210,3 +213,15 @@ pub fn sys_execve( unreachable!("execve should never return"); } + +#[apply(syscall_instrument)] +pub fn sys_gettid() -> LinuxResult { + warn!("sys_gettid: not implemented"); + Ok(axtask::current().task_ext().proc_id as _) +} + +#[apply(syscall_instrument)] +pub fn sys_set_robust_list(_head: UserPtr, _len: usize) -> LinuxResult { + warn!("sys_set_robust_list: not implemented"); + Ok(0) +} diff --git a/apps/oscomp/judge_libctest.py b/apps/oscomp/judge_libctest.py index fcc36d7fd..64acb36eb 100644 --- a/apps/oscomp/judge_libctest.py +++ b/apps/oscomp/judge_libctest.py @@ -2,12 +2,195 @@ import sys # TODO: Add more commands to test here -libctest_baseline = """""" +libctest_baseline = """ +========== START entry-static.exe argv ========== +Pass! +========== END entry-static.exe argv ========== +========== START entry-static.exe basename ========== +Pass! +========== END entry-static.exe basename ========== +========== START entry-static.exe dirname ========== +Pass! +========== END entry-static.exe dirname ========== +========== START entry-static.exe env ========== +Pass! +========== END entry-static.exe env ========== +========== START entry-static.exe fdopen ========== +Pass! +========== END entry-static.exe fdopen ========== +========== START entry-static.exe inet_pton ========== +Pass! +========== END entry-static.exe inet_pton ========== +========== START entry-static.exe memstream ========== +Pass! +========== END entry-static.exe memstream ========== +========== START entry-static.exe random ========== +Pass! +========== END entry-static.exe random ========== +========== START entry-static.exe search_hsearch ========== +Pass! +========== END entry-static.exe search_hsearch ========== +========== START entry-static.exe search_insque ========== +Pass! +========== END entry-static.exe search_insque ========== +========== START entry-static.exe search_lsearch ========== +Pass! +========== END entry-static.exe search_lsearch ========== +========== START entry-static.exe search_tsearch ========== +Pass! +========== END entry-static.exe search_tsearch ========== +========== START entry-static.exe snprintf ========== +Pass! +========== END entry-static.exe snprintf ========== +========== START entry-static.exe string ========== +Pass! +========== END entry-static.exe string ========== +========== START entry-static.exe string_memcpy ========== +Pass! +========== END entry-static.exe string_memcpy ========== +========== START entry-static.exe string_memmem ========== +Pass! +========== END entry-static.exe string_memmem ========== +========== START entry-static.exe string_memset ========== +Pass! +========== END entry-static.exe string_memset ========== +========== START entry-static.exe string_strchr ========== +Pass! +========== END entry-static.exe string_strchr ========== +========== START entry-static.exe string_strcspn ========== +Pass! +========== END entry-static.exe string_strcspn ========== +========== START entry-static.exe string_strstr ========== +Pass! +========== END entry-static.exe string_strstr ========== +========== START entry-static.exe strptime ========== +Pass! +========== END entry-static.exe strptime ========== +========== START entry-static.exe strtod ========== +Pass! +========== END entry-static.exe strtod ========== +========== START entry-static.exe strtod_simple ========== +Pass! +========== END entry-static.exe strtod_simple ========== +========== START entry-static.exe strtof ========== +Pass! +========== END entry-static.exe strtof ========== +========== START entry-static.exe strtold ========== +Pass! +========== END entry-static.exe strtold ========== +========== START entry-static.exe tgmath ========== +Pass! +========== END entry-static.exe tgmath ========== +========== START entry-static.exe time ========== +Pass! +========== END entry-static.exe time ========== +========== START entry-static.exe tls_align ========== +Pass! +========== END entry-static.exe tls_align ========== +Pass! +========== START entry-static.exe udiv ========== +Pass! +========== END entry-static.exe udiv ========== +========== START entry-static.exe wcsstr ========== +Pass! +========== END entry-static.exe wcsstr ========== +========== START entry-static.exe fgets_eof ========== +Pass! +========== END entry-static.exe fgets_eof ========== +========== START entry-static.exe inet_ntop_v4mapped ========== +Pass! +========== END entry-static.exe inet_ntop_v4mapped ========== +========== START entry-static.exe inet_pton_empty_last_field ========== +Pass! +========== END entry-static.exe inet_pton_empty_last_field ========== +========== START entry-static.exe iswspace_null ========== +Pass! +========== END entry-static.exe iswspace_null ========== +========== START entry-static.exe lrand48_signextend ========== +Pass! +========== END entry-static.exe lrand48_signextend ========== +========== START entry-static.exe malloc_0 ========== +Pass! +========== END entry-static.exe malloc_0 ========== +========== START entry-static.exe mbsrtowcs_overflow ========== +Pass! +========== END entry-static.exe mbsrtowcs_overflow ========== +========== START entry-static.exe memmem_oob_read ========== +Pass! +========== END entry-static.exe memmem_oob_read ========== +========== START entry-static.exe memmem_oob ========== +Pass! +========== END entry-static.exe memmem_oob ========== +========== START entry-static.exe mkdtemp_failure ========== +Pass! +========== END entry-static.exe mkdtemp_failure ========== +========== START entry-static.exe mkstemp_failure ========== +Pass! +========== END entry-static.exe mkstemp_failure ========== +========== START entry-static.exe printf_1e9_oob ========== +Pass! +========== END entry-static.exe printf_1e9_oob ========== +========== START entry-static.exe printf_fmt_g_round ========== +Pass! +========== END entry-static.exe printf_fmt_g_round ========== +========== START entry-static.exe printf_fmt_g_zeros ========== +Pass! +========== END entry-static.exe printf_fmt_g_zeros ========== +========== START entry-static.exe printf_fmt_n ========== +Pass! +========== END entry-static.exe printf_fmt_n ========== +========== START entry-static.exe putenv_doublefree ========== +Pass! +========== END entry-static.exe putenv_doublefree ========== +========== START entry-static.exe regex_backref_0 ========== +Pass! +========== END entry-static.exe regex_backref_0 ========== +========== START entry-static.exe regex_bracket_icase ========== +Pass! +========== END entry-static.exe regex_bracket_icase ========== +========== START entry-static.exe regex_negated_range ========== +Pass! +========== END entry-static.exe regex_negated_range ========== +========== START entry-static.exe regexec_nosub ========== +Pass! +========== END entry-static.exe regexec_nosub ========== +========== START entry-static.exe scanf_bytes_consumed ========== +Pass! +========== END entry-static.exe scanf_bytes_consumed ========== +========== START entry-static.exe scanf_match_literal_eof ========== +Pass! +========== END entry-static.exe scanf_match_literal_eof ========== +========== START entry-static.exe scanf_nullbyte_char ========== +Pass! +========== END entry-static.exe scanf_nullbyte_char ========== +========== START entry-static.exe sigprocmask_internal ========== +Pass! +========== END entry-static.exe sigprocmask_internal ========== +========== START entry-static.exe sscanf_eof ========== +Pass! +========== END entry-static.exe sscanf_eof ========== +========== START entry-static.exe strverscmp ========== +Pass! +========== END entry-static.exe strverscmp ========== +========== START entry-static.exe syscall_sign_extend ========== +Pass! +========== END entry-static.exe syscall_sign_extend ========== +========== START entry-static.exe uselocale_0 ========== +Pass! +========== END entry-static.exe uselocale_0 ========== +========== START entry-static.exe wcsncpy_read_overflow ========== +Pass! +========== END entry-static.exe wcsncpy_read_overflow ========== +========== START entry-static.exe wcsstr_false_negative ========== +Pass! +========== END entry-static.exe wcsstr_false_negative ========== +""" def parse_libctest(output): ans = {} key = "" for line in output.split("\n"): + line = line.replace('\n', '').replace('\r', '') if "START entry-static.exe" in line: key = "libctest static " + line.split(" ")[3] elif "START entry-dynamic.exe" in line: diff --git a/core/src/task.rs b/core/src/task.rs index ce71f5592..7045938c2 100644 --- a/core/src/task.rs +++ b/core/src/task.rs @@ -93,8 +93,8 @@ impl TaskExt { let kstack_top = curr.kernel_stack_top().unwrap(); info!( "Enter user space: entry={:#x}, ustack={:#x}, kstack={:#x}", - curr.task_ext().uctx.get_ip(), - curr.task_ext().uctx.get_sp(), + curr.task_ext().uctx.ip(), + curr.task_ext().uctx.sp(), kstack_top, ); unsafe { curr.task_ext().uctx.enter_uspace(kstack_top) }; @@ -102,7 +102,10 @@ impl TaskExt { current().id_name(), axconfig::plat::KERNEL_STACK_SIZE, ); - + #[cfg(any(target_arch = "x86_64", target_arch = "aarch64"))] + new_task + .ctx_mut() + .set_tls(axhal::arch::read_thread_pointer().into()); let current_task = current(); let mut current_aspace = current_task.task_ext().aspace.lock(); let mut new_aspace = current_aspace.clone_or_err()?; @@ -118,7 +121,10 @@ impl TaskExt { } // Skip current instruction #[cfg(any(target_arch = "riscv64", target_arch = "loongarch64"))] - new_uctx.set_ip(new_uctx.get_ip() + 4); + { + let new_ip = new_uctx.ip() + 4; + new_uctx.set_ip(new_ip); + } new_uctx.set_retval(0); let return_id: u64 = new_task.id().as_u64(); let new_task_ext = TaskExt::new( @@ -248,8 +254,8 @@ pub fn spawn_user_task( let kstack_top = curr.kernel_stack_top().unwrap(); info!( "Enter user space: entry={:#x}, ustack={:#x}, kstack={:#x}", - curr.task_ext().uctx.get_ip(), - curr.task_ext().uctx.get_sp(), + curr.task_ext().uctx.ip(), + curr.task_ext().uctx.sp(), kstack_top, ); unsafe { curr.task_ext().uctx.enter_uspace(kstack_top) }; diff --git a/scripts/oscomp_test.sh b/scripts/oscomp_test.sh index 2e810dda4..ff0a6df97 100755 --- a/scripts/oscomp_test.sh +++ b/scripts/oscomp_test.sh @@ -1,6 +1,6 @@ #!/bin/bash -TIMEOUT=60s +TIMEOUT=600s EXIT_STATUS=0 ROOT=$(realpath $(dirname $0))/../ AX_ROOT=$ROOT/.arceos @@ -24,8 +24,9 @@ if [ "$ARCH" != "x86_64" ] && [ "$ARCH" != "riscv64" ] && [ "$ARCH" != "aarch64" exit $S_FAILED fi -LIBC=musl - +if [ -z "$LIBC" ]; then + LIBC=musl +fi if [ "$LIBC" != "musl" ] && [ "$LIBC" != "glibc" ]; then echo "Unknown libc: $LIBC" exit $S_FAILED @@ -56,6 +57,7 @@ basic_testlist=( "/$LIBC/basic/open" "/$LIBC/basic/pipe" "/$LIBC/basic/read" + "/$LIBC/basic/sleep" "/$LIBC/basic/times" "/$LIBC/basic/umount" "/$LIBC/basic/uname" @@ -68,7 +70,68 @@ basic_testlist=( busybox_testlist=("/$LIBC/busybox sh /$LIBC/busybox_testcode.sh") iozone_testlist=("/$LIBC/busybox sh /$LIBC/iozone_testcode.sh") lua_testlist=("/$LIBC/busybox sh /$LIBC/lua_testcode.sh") -libctest_testlist=("/$LIBC/busybox sh /$LIBC/libctest_testcode.sh") +libctest_testlist=( + "/$LIBC/runtest.exe -w entry-static.exe argv" + "/$LIBC/runtest.exe -w entry-static.exe basename" + "/$LIBC/runtest.exe -w entry-static.exe dirname" + "/$LIBC/runtest.exe -w entry-static.exe env" + "/$LIBC/runtest.exe -w entry-static.exe fdopen" + "/$LIBC/runtest.exe -w entry-static.exe inet_pton" + "/$LIBC/runtest.exe -w entry-static.exe memstream" + "/$LIBC/runtest.exe -w entry-static.exe random" + "/$LIBC/runtest.exe -w entry-static.exe search_hsearch" + "/$LIBC/runtest.exe -w entry-static.exe search_insque" + "/$LIBC/runtest.exe -w entry-static.exe search_lsearch" + "/$LIBC/runtest.exe -w entry-static.exe search_tsearch" + "/$LIBC/runtest.exe -w entry-static.exe snprintf" + "/$LIBC/runtest.exe -w entry-static.exe string" + "/$LIBC/runtest.exe -w entry-static.exe string_memcpy" + "/$LIBC/runtest.exe -w entry-static.exe string_memmem" + "/$LIBC/runtest.exe -w entry-static.exe string_memset" + "/$LIBC/runtest.exe -w entry-static.exe string_strchr" + "/$LIBC/runtest.exe -w entry-static.exe string_strcspn" + "/$LIBC/runtest.exe -w entry-static.exe string_strstr" + "/$LIBC/runtest.exe -w entry-static.exe strptime" + "/$LIBC/runtest.exe -w entry-static.exe strtod" + "/$LIBC/runtest.exe -w entry-static.exe strtod_simple" + "/$LIBC/runtest.exe -w entry-static.exe strtof" + "/$LIBC/runtest.exe -w entry-static.exe strtold" + "/$LIBC/runtest.exe -w entry-static.exe tgmath" + "/$LIBC/runtest.exe -w entry-static.exe time" + "/$LIBC/runtest.exe -w entry-static.exe tls_align" + "/$LIBC/runtest.exe -w entry-static.exe udiv" + "/$LIBC/runtest.exe -w entry-static.exe wcsstr" + "/$LIBC/runtest.exe -w entry-static.exe fgets_eof" + "/$LIBC/runtest.exe -w entry-static.exe inet_ntop_v4mapped" + "/$LIBC/runtest.exe -w entry-static.exe inet_pton_empty_last_field" + "/$LIBC/runtest.exe -w entry-static.exe iswspace_null" + "/$LIBC/runtest.exe -w entry-static.exe lrand48_signextend" + "/$LIBC/runtest.exe -w entry-static.exe malloc_0" + "/$LIBC/runtest.exe -w entry-static.exe mbsrtowcs_overflow" + "/$LIBC/runtest.exe -w entry-static.exe memmem_oob_read" + "/$LIBC/runtest.exe -w entry-static.exe memmem_oob" + "/$LIBC/runtest.exe -w entry-static.exe mkdtemp_failure" + "/$LIBC/runtest.exe -w entry-static.exe mkstemp_failure" + "/$LIBC/runtest.exe -w entry-static.exe printf_1e9_oob" + "/$LIBC/runtest.exe -w entry-static.exe printf_fmt_g_round" + "/$LIBC/runtest.exe -w entry-static.exe printf_fmt_g_zeros" + "/$LIBC/runtest.exe -w entry-static.exe printf_fmt_n" + "/$LIBC/runtest.exe -w entry-static.exe putenv_doublefree" + "/$LIBC/runtest.exe -w entry-static.exe regex_backref_0" + "/$LIBC/runtest.exe -w entry-static.exe regex_bracket_icase" + "/$LIBC/runtest.exe -w entry-static.exe regex_negated_range" + "/$LIBC/runtest.exe -w entry-static.exe regexec_nosub" + "/$LIBC/runtest.exe -w entry-static.exe scanf_bytes_consumed" + "/$LIBC/runtest.exe -w entry-static.exe scanf_match_literal_eof" + "/$LIBC/runtest.exe -w entry-static.exe scanf_nullbyte_char" + "/$LIBC/runtest.exe -w entry-static.exe sigprocmask_internal" + "/$LIBC/runtest.exe -w entry-static.exe sscanf_eof" + "/$LIBC/runtest.exe -w entry-static.exe strverscmp" + "/$LIBC/runtest.exe -w entry-static.exe syscall_sign_extend" + "/$LIBC/runtest.exe -w entry-static.exe uselocale_0" + "/$LIBC/runtest.exe -w entry-static.exe wcsncpy_read_overflow" + "/$LIBC/runtest.exe -w entry-static.exe wcsstr_false_negative" +) testcases_type=( "basic" diff --git a/src/syscall.rs b/src/syscall.rs index 1a946a8f2..b6057edb0 100644 --- a/src/syscall.rs +++ b/src/syscall.rs @@ -12,7 +12,16 @@ fn handle_syscall(tf: &TrapFrame, syscall_num: usize) -> isize { info!("Syscall {:?}", Sysno::from(syscall_num as u32)); time_stat_from_user_to_kernel(); let result: LinuxResult = match Sysno::from(syscall_num as u32) { + Sysno::lseek => sys_lseek(tf.arg0() as _, tf.arg1() as _, tf.arg2() as _), Sysno::read => sys_read(tf.arg0() as _, tf.arg1().into(), tf.arg2() as _), + #[cfg(target_arch = "x86_64")] + Sysno::readlink => sys_readlink(tf.arg0().into(), tf.arg1().into(), tf.arg2() as _), + Sysno::readlinkat => sys_readlinkat( + tf.arg0() as _, + tf.arg1().into(), + tf.arg2().into(), + tf.arg3() as _, + ), Sysno::write => sys_write(tf.arg0() as _, tf.arg1().into(), tf.arg2() as _), Sysno::mmap => sys_mmap( tf.arg0().into(), @@ -27,6 +36,7 @@ fn handle_syscall(tf: &TrapFrame, syscall_num: usize) -> isize { Sysno::sched_yield => sys_sched_yield(), Sysno::nanosleep => sys_nanosleep(tf.arg0().into(), tf.arg1().into()), Sysno::getpid => sys_getpid(), + Sysno::gettid => sys_gettid(), Sysno::getppid => sys_getppid(), Sysno::exit => sys_exit(tf.arg0() as _), Sysno::gettimeofday => sys_get_time_of_day(tf.arg0().into()), @@ -41,6 +51,8 @@ fn handle_syscall(tf: &TrapFrame, syscall_num: usize) -> isize { tf.arg3() as _, tf.arg4() as _, ), + #[cfg(target_arch = "x86_64")] + Sysno::fork => sys_clone(17, 0, 0, 0, 0), Sysno::wait4 => sys_wait4(tf.arg0() as _, tf.arg1().into(), tf.arg2() as _), Sysno::pipe2 => sys_pipe2(tf.arg0().into()), Sysno::close => sys_close(tf.arg0() as _), @@ -63,6 +75,8 @@ fn handle_syscall(tf: &TrapFrame, syscall_num: usize) -> isize { tf.arg3().into(), tf.arg4() as _, ), + #[cfg(target_arch = "x86_64")] + Sysno::unlink => sys_unlink(tf.arg0().into()), Sysno::unlinkat => sys_unlinkat(tf.arg0() as _, tf.arg1().into(), tf.arg2() as _), Sysno::uname => sys_uname(tf.arg0().into()), Sysno::fstat => sys_fstat(tf.arg0() as _, tf.arg1().into()), @@ -117,6 +131,23 @@ fn handle_syscall(tf: &TrapFrame, syscall_num: usize) -> isize { tf.arg2().into(), tf.arg3() as _, ), + Sysno::rt_sigtimedwait => { + sys_rt_sigtimedwait(tf.arg0().into(), tf.arg1().into(), tf.arg2().into()) + } + Sysno::prlimit64 => sys_prlimit64( + tf.arg0() as _, + tf.arg1() as _, + tf.arg2().into(), + tf.arg3().into(), + ), + Sysno::set_robust_list => sys_set_robust_list(tf.arg0().into(), tf.arg1() as _), + Sysno::rseq => sys_rseq( + tf.arg0().into(), + tf.arg1() as _, + tf.arg2() as _, + tf.arg3().into(), + ), + Sysno::getrandom => sys_getrandom(tf.arg0().into(), tf.arg1() as _, tf.arg2() as _), _ => { warn!("Unimplemented syscall: {}", syscall_num); axtask::exit(LinuxError::ENOSYS as _)