From 2b67dee1fc774d318d7ea42d93510a7e49bc2701 Mon Sep 17 00:00:00 2001 From: StanPlatinum Date: Mon, 22 Apr 2024 16:00:19 +0800 Subject: [PATCH] Add syscall epoll_pwait --- docs/src/kernel/linux-compatibility.md | 2 +- kernel/aster-nix/src/syscall/epoll.rs | 16 +++++++++++++++- kernel/aster-nix/src/syscall/mod.rs | 6 +++++- regression/syscall_test/Makefile | 1 + regression/syscall_test/blocklists/epoll_test | 14 ++++++++++++++ 5 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 regression/syscall_test/blocklists/epoll_test diff --git a/docs/src/kernel/linux-compatibility.md b/docs/src/kernel/linux-compatibility.md index a80514ce..139beeff 100644 --- a/docs/src/kernel/linux-compatibility.md +++ b/docs/src/kernel/linux-compatibility.md @@ -301,7 +301,7 @@ provided by Linux on x86-64 architecture. | 278 | vmsplice | ❌ | | 279 | move_pages | ❌ | | 280 | utimensat | ✅ | -| 281 | epoll_pwait | ❌ | +| 281 | epoll_pwait | ✅ | | 282 | signalfd | ❌ | | 283 | timerfd_create | ❌ | | 284 | eventfd | ❌ | diff --git a/kernel/aster-nix/src/syscall/epoll.rs b/kernel/aster-nix/src/syscall/epoll.rs index 109d495b..f71fc041 100644 --- a/kernel/aster-nix/src/syscall/epoll.rs +++ b/kernel/aster-nix/src/syscall/epoll.rs @@ -2,7 +2,7 @@ use core::time::Duration; -use super::{SyscallReturn, SYS_EPOLL_CREATE1, SYS_EPOLL_CTL, SYS_EPOLL_WAIT}; +use super::{SyscallReturn, SYS_EPOLL_CREATE1, SYS_EPOLL_CTL, SYS_EPOLL_PWAIT, SYS_EPOLL_WAIT}; use crate::{ events::IoEvents, fs::{ @@ -137,6 +137,20 @@ pub fn sys_epoll_wait( Ok(SyscallReturn::Return(epoll_events.len() as _)) } +pub fn sys_epoll_pwait( + epfd: FileDescripter, + events_addr: Vaddr, + max_events: i32, + timeout: i32, + sigmask: Vaddr, //TODO: handle sigmask +) -> Result { + log_syscall_entry!(SYS_EPOLL_PWAIT); + if sigmask != 0 { + warn!("epoll_pwait cannot handle signal mask, yet"); + } + sys_epoll_wait(epfd, events_addr, max_events, timeout) +} + #[derive(Debug, Clone, Copy, Pod)] #[repr(C, packed)] struct c_epoll_event { diff --git a/kernel/aster-nix/src/syscall/mod.rs b/kernel/aster-nix/src/syscall/mod.rs index acec1487..bf745633 100644 --- a/kernel/aster-nix/src/syscall/mod.rs +++ b/kernel/aster-nix/src/syscall/mod.rs @@ -30,7 +30,9 @@ use crate::{ clone::sys_clone, close::sys_close, dup::{sys_dup, sys_dup2}, - epoll::{sys_epoll_create, sys_epoll_create1, sys_epoll_ctl, sys_epoll_wait}, + epoll::{ + sys_epoll_create, sys_epoll_create1, sys_epoll_ctl, sys_epoll_pwait, sys_epoll_wait, + }, execve::sys_execve, exit::sys_exit, exit_group::sys_exit_group, @@ -360,6 +362,7 @@ define_syscall_nums!( SYS_FCHMODAT = 268, SYS_SET_ROBUST_LIST = 273, SYS_UTIMENSAT = 280, + SYS_EPOLL_PWAIT = 281, SYS_EPOLL_CREATE1 = 291, SYS_PIPE2 = 293, SYS_PRLIMIT64 = 302, @@ -549,6 +552,7 @@ pub fn syscall_dispatch( SYS_FCHMODAT => syscall_handler!(3, sys_fchmodat, args), SYS_SET_ROBUST_LIST => syscall_handler!(2, sys_set_robust_list, args), SYS_UTIMENSAT => syscall_handler!(4, sys_utimensat, args), + SYS_EPOLL_PWAIT => syscall_handler!(5, sys_epoll_pwait, args), SYS_EPOLL_CREATE1 => syscall_handler!(1, sys_epoll_create1, args), SYS_PIPE2 => syscall_handler!(2, sys_pipe2, args), SYS_PRLIMIT64 => syscall_handler!(4, sys_prlimit64, args), diff --git a/regression/syscall_test/Makefile b/regression/syscall_test/Makefile index ca366952..c878332c 100644 --- a/regression/syscall_test/Makefile +++ b/regression/syscall_test/Makefile @@ -10,6 +10,7 @@ TESTS ?= \ chmod_test \ chown_test \ chroot_test \ + epoll_test \ fsync_test \ getdents_test \ link_test \ diff --git a/regression/syscall_test/blocklists/epoll_test b/regression/syscall_test/blocklists/epoll_test new file mode 100644 index 00000000..42256262 --- /dev/null +++ b/regression/syscall_test/blocklists/epoll_test @@ -0,0 +1,14 @@ +EpollTest.AllWritable +EpollTest.LastReadable +EpollTest.LastNonWritable +EpollTest.Timeout_NoRandomSave +EpollTest.WaitThenUnblock +EpollTest.UnblockWithSignal +EpollTest.TimeoutNoFds +EpollTest.UnblockWithNewFD +EpollTest.Oneshot +EpollTest.EdgeTriggered_NoRandomSave +EpollTest.OneshotAndEdgeTriggered +EpollTest.CycleOfOneDisallowed +EpollTest.CycleOfThreeDisallowed +EpollTest.CloseFile \ No newline at end of file