mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-23 09:23:25 +00:00
Add syscall rt_sigsuspend
This commit is contained in:
committed by
Tate, Hongliang Tian
parent
25b7007ffa
commit
89b21ba3b4
@ -150,7 +150,7 @@ provided by Linux on x86-64 architecture.
|
|||||||
| 127 | rt_sigpending | ❌ |
|
| 127 | rt_sigpending | ❌ |
|
||||||
| 128 | rt_sigtimedwait | ❌ |
|
| 128 | rt_sigtimedwait | ❌ |
|
||||||
| 129 | rt_sigqueueinfo | ❌ |
|
| 129 | rt_sigqueueinfo | ❌ |
|
||||||
| 130 | rt_sigsuspend | ❌ |
|
| 130 | rt_sigsuspend | ✅ |
|
||||||
| 131 | sigaltstack | ✅ |
|
| 131 | sigaltstack | ✅ |
|
||||||
| 132 | utime | ❌ |
|
| 132 | utime | ❌ |
|
||||||
| 133 | mknod | ❌ |
|
| 133 | mknod | ❌ |
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
// SPDX-License-Identifier: MPL-2.0
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
use super::{constants::MIN_STD_SIG_NUM, sig_num::SigNum};
|
use super::{constants::MIN_STD_SIG_NUM, sig_num::SigNum};
|
||||||
|
use crate::prelude::*;
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone, Default, PartialEq, Eq)]
|
#[derive(Debug, Copy, Clone, Default, PartialEq, Eq, Pod)]
|
||||||
|
#[repr(C)]
|
||||||
pub struct SigMask {
|
pub struct SigMask {
|
||||||
bits: u64,
|
bits: u64,
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,7 @@ use self::{
|
|||||||
listen::sys_listen,
|
listen::sys_listen,
|
||||||
pread64::sys_pread64,
|
pread64::sys_pread64,
|
||||||
recvfrom::sys_recvfrom,
|
recvfrom::sys_recvfrom,
|
||||||
|
rt_sigsuspend::sys_rt_sigsuspend,
|
||||||
sendto::sys_sendto,
|
sendto::sys_sendto,
|
||||||
setfsgid::sys_setfsgid,
|
setfsgid::sys_setfsgid,
|
||||||
setfsuid::sys_setfsuid,
|
setfsuid::sys_setfsuid,
|
||||||
@ -191,6 +192,7 @@ mod rmdir;
|
|||||||
mod rt_sigaction;
|
mod rt_sigaction;
|
||||||
mod rt_sigprocmask;
|
mod rt_sigprocmask;
|
||||||
mod rt_sigreturn;
|
mod rt_sigreturn;
|
||||||
|
mod rt_sigsuspend;
|
||||||
mod sched_yield;
|
mod sched_yield;
|
||||||
mod select;
|
mod select;
|
||||||
mod sendto;
|
mod sendto;
|
||||||
@ -352,6 +354,7 @@ define_syscall_nums!(
|
|||||||
SYS_SETFSUID = 122,
|
SYS_SETFSUID = 122,
|
||||||
SYS_SETFSGID = 123,
|
SYS_SETFSGID = 123,
|
||||||
SYS_GETSID = 124,
|
SYS_GETSID = 124,
|
||||||
|
SYS_RT_SIGSUSPEND = 130,
|
||||||
SYS_SIGALTSTACK = 131,
|
SYS_SIGALTSTACK = 131,
|
||||||
SYS_STATFS = 137,
|
SYS_STATFS = 137,
|
||||||
SYS_FSTATFS = 138,
|
SYS_FSTATFS = 138,
|
||||||
@ -544,6 +547,7 @@ pub fn syscall_dispatch(
|
|||||||
SYS_SETFSUID => syscall_handler!(1, sys_setfsuid, args),
|
SYS_SETFSUID => syscall_handler!(1, sys_setfsuid, args),
|
||||||
SYS_SETFSGID => syscall_handler!(1, sys_setfsgid, args),
|
SYS_SETFSGID => syscall_handler!(1, sys_setfsgid, args),
|
||||||
SYS_GETSID => syscall_handler!(1, sys_getsid, args),
|
SYS_GETSID => syscall_handler!(1, sys_getsid, args),
|
||||||
|
SYS_RT_SIGSUSPEND => syscall_handler!(2, sys_rt_sigsuspend, args),
|
||||||
SYS_SIGALTSTACK => syscall_handler!(2, sys_sigaltstack, args),
|
SYS_SIGALTSTACK => syscall_handler!(2, sys_sigaltstack, args),
|
||||||
SYS_STATFS => syscall_handler!(2, sys_statfs, args),
|
SYS_STATFS => syscall_handler!(2, sys_statfs, args),
|
||||||
SYS_FSTATFS => syscall_handler!(2, sys_fstatfs, args),
|
SYS_FSTATFS => syscall_handler!(2, sys_fstatfs, args),
|
||||||
|
42
kernel/aster-nix/src/syscall/rt_sigsuspend.rs
Normal file
42
kernel/aster-nix/src/syscall/rt_sigsuspend.rs
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
|
use super::{SyscallReturn, SYS_RT_SIGSUSPEND};
|
||||||
|
use crate::{
|
||||||
|
log_syscall_entry,
|
||||||
|
prelude::*,
|
||||||
|
process::signal::{
|
||||||
|
constants::{SIGKILL, SIGSTOP},
|
||||||
|
sig_mask::SigMask,
|
||||||
|
Pauser,
|
||||||
|
},
|
||||||
|
util::read_val_from_user,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub fn sys_rt_sigsuspend(sigmask_addr: Vaddr, sigmask_size: usize) -> Result<SyscallReturn> {
|
||||||
|
log_syscall_entry!(SYS_RT_SIGSUSPEND);
|
||||||
|
debug!(
|
||||||
|
"sigmask_addr = 0x{:x}, sigmask_size = {}",
|
||||||
|
sigmask_addr, sigmask_size
|
||||||
|
);
|
||||||
|
|
||||||
|
debug_assert!(sigmask_size == core::mem::size_of::<SigMask>());
|
||||||
|
if sigmask_size != core::mem::size_of::<SigMask>() {
|
||||||
|
return_errno_with_message!(Errno::EINVAL, "invalid sigmask size");
|
||||||
|
}
|
||||||
|
|
||||||
|
let sigmask = {
|
||||||
|
let mut mask: SigMask = read_val_from_user(sigmask_addr)?;
|
||||||
|
// It is not possible to block SIGKILL or SIGSTOP,
|
||||||
|
// specifying these signals in mask has no effect.
|
||||||
|
mask.remove_signal(SIGKILL);
|
||||||
|
mask.remove_signal(SIGSTOP);
|
||||||
|
mask
|
||||||
|
};
|
||||||
|
|
||||||
|
// Pause until receiving any signal
|
||||||
|
let pauser = Pauser::new_with_mask(sigmask);
|
||||||
|
pauser.pause_until(|| None::<()>)?;
|
||||||
|
|
||||||
|
// This syscall should always return `Err(EINTR)`. This path should never be reached.
|
||||||
|
unreachable!("rt_sigsuspend always return EINTR");
|
||||||
|
}
|
Reference in New Issue
Block a user