Add syscall epoll_pwait

This commit is contained in:
StanPlatinum
2024-04-22 16:00:19 +08:00
committed by Tate, Hongliang Tian
parent 1435dd0896
commit 2b67dee1fc
5 changed files with 36 additions and 3 deletions

View File

@ -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 | ❌ |

View File

@ -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<SyscallReturn> {
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 {

View File

@ -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),

View File

@ -10,6 +10,7 @@ TESTS ?= \
chmod_test \
chown_test \
chroot_test \
epoll_test \
fsync_test \
getdents_test \
link_test \

View File

@ -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