xref: /DragonOS/kernel/src/ipc/signal_types.rs (revision dc9b4fea1bcff86cfb49293552654e2dd038ae9e)
10d6cf65aSLoGin use core::{
20d6cf65aSLoGin     ffi::c_void,
30d6cf65aSLoGin     mem::size_of,
40d6cf65aSLoGin     ops::{Deref, DerefMut},
50d6cf65aSLoGin     sync::atomic::AtomicI64,
60d6cf65aSLoGin };
73c82aa56SChiichen 
80d6cf65aSLoGin use alloc::{boxed::Box, vec::Vec};
991e9d4abSLoGin use system_error::SystemError;
103c82aa56SChiichen 
113c82aa56SChiichen use crate::{
123c82aa56SChiichen     arch::{
133c82aa56SChiichen         asm::bitops::ffz,
143c82aa56SChiichen         interrupt::TrapFrame,
153c82aa56SChiichen         ipc::signal::{SigCode, SigFlags, SigSet, Signal, MAX_SIG_NUM},
163c82aa56SChiichen     },
173c82aa56SChiichen     mm::VirtAddr,
183c82aa56SChiichen     process::Pid,
1991e9d4abSLoGin     syscall::user_access::UserBufferWriter,
203c82aa56SChiichen };
213c82aa56SChiichen 
223c82aa56SChiichen /// 用户态程序传入的SIG_DFL的值
233c82aa56SChiichen pub const USER_SIG_DFL: u64 = 0;
243c82aa56SChiichen /// 用户态程序传入的SIG_IGN的值
253c82aa56SChiichen pub const USER_SIG_IGN: u64 = 1;
263c82aa56SChiichen /// 用户态程序传入的SIG_ERR的值
273c82aa56SChiichen pub const USER_SIG_ERR: u64 = 2;
283c82aa56SChiichen 
293c82aa56SChiichen // 因为 Rust 编译器不能在常量声明中正确识别级联的 "|" 运算符(experimental feature: https://github.com/rust-lang/rust/issues/67792),因此
303c82aa56SChiichen // 暂时只能通过这种方法来声明这些常量,这些常量暂时没有全部用到,但是都出现在 linux 的判断逻辑中,所以都保留下来了
313c82aa56SChiichen #[allow(dead_code)]
323c82aa56SChiichen pub const SIG_KERNEL_ONLY_MASK: SigSet =
333c82aa56SChiichen     Signal::into_sigset(Signal::SIGSTOP).union(Signal::into_sigset(Signal::SIGKILL));
343c82aa56SChiichen 
353c82aa56SChiichen pub const SIG_KERNEL_STOP_MASK: SigSet = Signal::into_sigset(Signal::SIGSTOP)
363c82aa56SChiichen     .union(Signal::into_sigset(Signal::SIGTSTP))
373c82aa56SChiichen     .union(Signal::into_sigset(Signal::SIGTTIN))
383c82aa56SChiichen     .union(Signal::into_sigset(Signal::SIGTTOU));
393c82aa56SChiichen #[allow(dead_code)]
403c82aa56SChiichen pub const SIG_KERNEL_COREDUMP_MASK: SigSet = Signal::into_sigset(Signal::SIGQUIT)
413c82aa56SChiichen     .union(Signal::into_sigset(Signal::SIGILL))
423c82aa56SChiichen     .union(Signal::into_sigset(Signal::SIGTRAP))
433c82aa56SChiichen     .union(Signal::into_sigset(Signal::SIGABRT_OR_IOT))
443c82aa56SChiichen     .union(Signal::into_sigset(Signal::SIGFPE))
453c82aa56SChiichen     .union(Signal::into_sigset(Signal::SIGSEGV))
463c82aa56SChiichen     .union(Signal::into_sigset(Signal::SIGBUS))
473c82aa56SChiichen     .union(Signal::into_sigset(Signal::SIGSYS))
483c82aa56SChiichen     .union(Signal::into_sigset(Signal::SIGXCPU))
493c82aa56SChiichen     .union(Signal::into_sigset(Signal::SIGXFSZ));
503c82aa56SChiichen #[allow(dead_code)]
513c82aa56SChiichen pub const SIG_KERNEL_IGNORE_MASK: SigSet = Signal::into_sigset(Signal::SIGCONT)
523c82aa56SChiichen     .union(Signal::into_sigset(Signal::SIGFPE))
533c82aa56SChiichen     .union(Signal::into_sigset(Signal::SIGSEGV))
543c82aa56SChiichen     .union(Signal::into_sigset(Signal::SIGBUS))
553c82aa56SChiichen     .union(Signal::into_sigset(Signal::SIGTRAP))
563c82aa56SChiichen     .union(Signal::into_sigset(Signal::SIGCHLD))
573c82aa56SChiichen     .union(Signal::into_sigset(Signal::SIGIO_OR_POLL))
583c82aa56SChiichen     .union(Signal::into_sigset(Signal::SIGSYS));
593c82aa56SChiichen 
603c82aa56SChiichen /// SignalStruct 在 pcb 中加锁
613c82aa56SChiichen #[derive(Debug)]
623c82aa56SChiichen pub struct SignalStruct {
630d6cf65aSLoGin     inner: Box<InnerSignalStruct>,
640d6cf65aSLoGin }
650d6cf65aSLoGin 
660d6cf65aSLoGin #[derive(Debug)]
67bd70d2d1SLoGin #[allow(dead_code)]
680d6cf65aSLoGin pub struct InnerSignalStruct {
693c82aa56SChiichen     pub cnt: AtomicI64,
703c82aa56SChiichen     /// 如果对应linux,这部分会有一个引用计数,但是没发现在哪里有用到需要计算引用的地方,因此
713c82aa56SChiichen     /// 暂时删掉,不然这个Arc会导致其他地方的代码十分丑陋
72b5b571e0SLoGin     pub handlers: [Sigaction; MAX_SIG_NUM],
733c82aa56SChiichen }
743c82aa56SChiichen 
750d6cf65aSLoGin impl SignalStruct {
760d6cf65aSLoGin     #[inline(never)]
new() -> Self770d6cf65aSLoGin     pub fn new() -> Self {
780d6cf65aSLoGin         Self {
79b5b571e0SLoGin             inner: Box::<InnerSignalStruct>::default(),
800d6cf65aSLoGin         }
810d6cf65aSLoGin     }
820d6cf65aSLoGin }
830d6cf65aSLoGin 
84*dc9b4feaSLoGin impl Default for SignalStruct {
default() -> Self85*dc9b4feaSLoGin     fn default() -> Self {
86*dc9b4feaSLoGin         Self::new()
87*dc9b4feaSLoGin     }
88*dc9b4feaSLoGin }
89*dc9b4feaSLoGin 
900d6cf65aSLoGin impl Deref for SignalStruct {
910d6cf65aSLoGin     type Target = InnerSignalStruct;
920d6cf65aSLoGin 
deref(&self) -> &Self::Target930d6cf65aSLoGin     fn deref(&self) -> &Self::Target {
940d6cf65aSLoGin         &self.inner
950d6cf65aSLoGin     }
960d6cf65aSLoGin }
970d6cf65aSLoGin 
980d6cf65aSLoGin impl DerefMut for SignalStruct {
deref_mut(&mut self) -> &mut Self::Target990d6cf65aSLoGin     fn deref_mut(&mut self) -> &mut Self::Target {
1000d6cf65aSLoGin         &mut self.inner
1010d6cf65aSLoGin     }
1020d6cf65aSLoGin }
1030d6cf65aSLoGin 
1040d6cf65aSLoGin impl Default for InnerSignalStruct {
default() -> Self1053c82aa56SChiichen     fn default() -> Self {
1063c82aa56SChiichen         Self {
1073c82aa56SChiichen             cnt: Default::default(),
108b5b571e0SLoGin             handlers: [Sigaction::default(); MAX_SIG_NUM],
1093c82aa56SChiichen         }
1103c82aa56SChiichen     }
1113c82aa56SChiichen }
1123c82aa56SChiichen 
1133c82aa56SChiichen #[derive(Debug, Copy, Clone)]
1143c82aa56SChiichen #[allow(dead_code)]
1153c82aa56SChiichen pub enum SigactionType {
1163c82aa56SChiichen     SaHandler(SaHandlerType),
1173c82aa56SChiichen     SaSigaction(
1183c82aa56SChiichen         Option<
1193c82aa56SChiichen             unsafe extern "C" fn(
1203c82aa56SChiichen                 sig: ::core::ffi::c_int,
1213c82aa56SChiichen                 sinfo: *mut SigInfo,
1223c82aa56SChiichen                 arg1: *mut ::core::ffi::c_void,
1233c82aa56SChiichen             ),
1243c82aa56SChiichen         >,
1253c82aa56SChiichen     ), // 暂时没有用上
1263c82aa56SChiichen }
1273c82aa56SChiichen 
1283c82aa56SChiichen impl SigactionType {
1293c82aa56SChiichen     /// Returns `true` if the sa handler type is [`SaHandler(SaHandlerType::SigIgnore)`].
1303c82aa56SChiichen     ///
1313c82aa56SChiichen     /// [`SigIgnore`]: SaHandlerType::SigIgnore
is_ignore(&self) -> bool1323c82aa56SChiichen     pub fn is_ignore(&self) -> bool {
133b5b571e0SLoGin         return matches!(self, Self::SaHandler(SaHandlerType::Ignore));
1343c82aa56SChiichen     }
1353c82aa56SChiichen     /// Returns `true` if the sa handler type is [`SaHandler(SaHandlerType::SigCustomized(_))`].
1363c82aa56SChiichen     ///
1373c82aa56SChiichen     /// [`SigCustomized`]: SaHandlerType::SigCustomized(_)
is_customized(&self) -> bool1383c82aa56SChiichen     pub fn is_customized(&self) -> bool {
139b5b571e0SLoGin         return matches!(self, Self::SaHandler(SaHandlerType::Customized(_)));
1403c82aa56SChiichen     }
1413c82aa56SChiichen }
1423c82aa56SChiichen 
1433c82aa56SChiichen #[derive(Debug, Copy, Clone)]
1443c82aa56SChiichen #[allow(dead_code)]
1453c82aa56SChiichen pub enum SaHandlerType {
146b5b571e0SLoGin     Error, // 暂时没有用上
147b5b571e0SLoGin     Default,
148b5b571e0SLoGin     Ignore,
149b5b571e0SLoGin     Customized(VirtAddr),
1503c82aa56SChiichen }
1513c82aa56SChiichen 
152b5b571e0SLoGin impl From<SaHandlerType> for usize {
from(value: SaHandlerType) -> Self153b5b571e0SLoGin     fn from(value: SaHandlerType) -> Self {
154b5b571e0SLoGin         match value {
155b5b571e0SLoGin             SaHandlerType::Error => 2,
156b5b571e0SLoGin             SaHandlerType::Ignore => 1,
157b5b571e0SLoGin             SaHandlerType::Default => 0,
158b5b571e0SLoGin             SaHandlerType::Customized(handler) => handler.data(),
1593c82aa56SChiichen         }
1603c82aa56SChiichen     }
1613c82aa56SChiichen }
1623c82aa56SChiichen 
1633c82aa56SChiichen impl SaHandlerType {
1643c82aa56SChiichen     /// Returns `true` if the sa handler type is [`SigDefault`].
1653c82aa56SChiichen     ///
1663c82aa56SChiichen     /// [`SigDefault`]: SaHandlerType::SigDefault
is_sig_default(&self) -> bool1673c82aa56SChiichen     pub fn is_sig_default(&self) -> bool {
168b5b571e0SLoGin         matches!(self, Self::Default)
1693c82aa56SChiichen     }
1703c82aa56SChiichen 
1713c82aa56SChiichen     /// Returns `true` if the sa handler type is [`SigIgnore`].
1723c82aa56SChiichen     ///
1733c82aa56SChiichen     /// [`SigIgnore`]: SaHandlerType::SigIgnore
is_sig_ignore(&self) -> bool1743c82aa56SChiichen     pub fn is_sig_ignore(&self) -> bool {
175b5b571e0SLoGin         matches!(self, Self::Ignore)
1763c82aa56SChiichen     }
1773c82aa56SChiichen 
1783c82aa56SChiichen     /// Returns `true` if the sa handler type is [`SigError`].
1793c82aa56SChiichen     ///
1803c82aa56SChiichen     /// [`SigError`]: SaHandlerType::SigError
is_sig_error(&self) -> bool1813c82aa56SChiichen     pub fn is_sig_error(&self) -> bool {
182b5b571e0SLoGin         matches!(self, Self::Error)
1833c82aa56SChiichen     }
1843c82aa56SChiichen }
1853c82aa56SChiichen 
1863c82aa56SChiichen /// 信号处理结构体
1873c82aa56SChiichen ///
1883c82aa56SChiichen #[derive(Debug, Copy, Clone)]
1893c82aa56SChiichen pub struct Sigaction {
1903c82aa56SChiichen     action: SigactionType,
1913c82aa56SChiichen     flags: SigFlags,
1923c82aa56SChiichen     mask: SigSet, // 为了可扩展性而设置的sa_mask
1933c82aa56SChiichen     /// 信号处理函数执行结束后,将会跳转到这个函数内进行执行,然后执行sigreturn系统调用
1943c82aa56SChiichen     restorer: Option<VirtAddr>,
1953c82aa56SChiichen }
1963c82aa56SChiichen 
1973c82aa56SChiichen impl Default for Sigaction {
default() -> Self1983c82aa56SChiichen     fn default() -> Self {
1993c82aa56SChiichen         Self {
200b5b571e0SLoGin             action: SigactionType::SaHandler(SaHandlerType::Default),
2013c82aa56SChiichen             flags: Default::default(),
2023c82aa56SChiichen             mask: Default::default(),
2033c82aa56SChiichen             restorer: Default::default(),
2043c82aa56SChiichen         }
2053c82aa56SChiichen     }
2063c82aa56SChiichen }
2073c82aa56SChiichen 
2083c82aa56SChiichen impl Sigaction {
2093c82aa56SChiichen     /// 判断传入的信号是否被忽略
2103c82aa56SChiichen     ///
2113c82aa56SChiichen     /// ## 参数
2123c82aa56SChiichen     ///
2133c82aa56SChiichen     /// - `sig` 传入的信号
2143c82aa56SChiichen     ///
2153c82aa56SChiichen     /// ## 返回值
2163c82aa56SChiichen     ///
2173c82aa56SChiichen     /// - `true` 被忽略
2183c82aa56SChiichen     /// - `false`未被忽略
is_ignore(&self) -> bool2193c82aa56SChiichen     pub fn is_ignore(&self) -> bool {
2203c82aa56SChiichen         return self.action.is_ignore();
2213c82aa56SChiichen     }
new( action: SigactionType, flags: SigFlags, mask: SigSet, restorer: Option<VirtAddr>, ) -> Self2223c82aa56SChiichen     pub fn new(
2233c82aa56SChiichen         action: SigactionType,
2243c82aa56SChiichen         flags: SigFlags,
2253c82aa56SChiichen         mask: SigSet,
2263c82aa56SChiichen         restorer: Option<VirtAddr>,
2273c82aa56SChiichen     ) -> Self {
2283c82aa56SChiichen         Self {
2293c82aa56SChiichen             action,
2303c82aa56SChiichen             flags,
2313c82aa56SChiichen             mask,
2323c82aa56SChiichen             restorer,
2333c82aa56SChiichen         }
2343c82aa56SChiichen     }
2353c82aa56SChiichen 
action(&self) -> SigactionType2363c82aa56SChiichen     pub fn action(&self) -> SigactionType {
2373c82aa56SChiichen         self.action
2383c82aa56SChiichen     }
2393c82aa56SChiichen 
flags(&self) -> SigFlags2403c82aa56SChiichen     pub fn flags(&self) -> SigFlags {
2413c82aa56SChiichen         self.flags
2423c82aa56SChiichen     }
2433c82aa56SChiichen 
restorer(&self) -> Option<VirtAddr>2443c82aa56SChiichen     pub fn restorer(&self) -> Option<VirtAddr> {
2453c82aa56SChiichen         self.restorer
2463c82aa56SChiichen     }
2473c82aa56SChiichen 
flags_mut(&mut self) -> &mut SigFlags2483c82aa56SChiichen     pub fn flags_mut(&mut self) -> &mut SigFlags {
2493c82aa56SChiichen         &mut self.flags
2503c82aa56SChiichen     }
2513c82aa56SChiichen 
set_action(&mut self, action: SigactionType)2523c82aa56SChiichen     pub fn set_action(&mut self, action: SigactionType) {
2533c82aa56SChiichen         self.action = action;
2543c82aa56SChiichen     }
2553c82aa56SChiichen 
mask(&self) -> SigSet2563c82aa56SChiichen     pub fn mask(&self) -> SigSet {
2573c82aa56SChiichen         self.mask
2583c82aa56SChiichen     }
2593c82aa56SChiichen 
mask_mut(&mut self) -> &mut SigSet2603c82aa56SChiichen     pub fn mask_mut(&mut self) -> &mut SigSet {
2613c82aa56SChiichen         &mut self.mask
2623c82aa56SChiichen     }
2633c82aa56SChiichen 
set_restorer(&mut self, restorer: Option<VirtAddr>)2643c82aa56SChiichen     pub fn set_restorer(&mut self, restorer: Option<VirtAddr>) {
2653c82aa56SChiichen         self.restorer = restorer;
2663c82aa56SChiichen     }
2673c82aa56SChiichen 
2683c82aa56SChiichen     /// 默认信号处理程序占位符(用于在sighand结构体中的action数组中占位)
2693c82aa56SChiichen     pub const DEFAULT_SIGACTION: Sigaction = Sigaction {
270b5b571e0SLoGin         action: SigactionType::SaHandler(SaHandlerType::Default),
2713c82aa56SChiichen         flags: SigFlags::empty(),
2723c82aa56SChiichen         mask: SigSet::from_bits_truncate(0),
2733c82aa56SChiichen         restorer: None,
2743c82aa56SChiichen     };
2753c82aa56SChiichen 
2763c82aa56SChiichen     /// 默认的“忽略信号”的sigaction
2773c82aa56SChiichen     pub const DEFAULT_SIGACTION_IGNORE: Sigaction = Sigaction {
278b5b571e0SLoGin         action: SigactionType::SaHandler(SaHandlerType::Ignore),
2793c82aa56SChiichen         flags: SigFlags::empty(),
2803c82aa56SChiichen         mask: SigSet::from_bits_truncate(0),
2813c82aa56SChiichen         restorer: None,
2823c82aa56SChiichen     };
2833c82aa56SChiichen }
2843c82aa56SChiichen 
2853c82aa56SChiichen /// 用户态传入的sigaction结构体(符合posix规范)
2863c82aa56SChiichen /// 请注意,我们会在sys_sigaction函数里面将其转换成内核使用的sigaction结构体
2873c82aa56SChiichen #[repr(C)]
2883c82aa56SChiichen #[derive(Debug, Clone, Copy)]
2893c82aa56SChiichen pub struct UserSigaction {
2903c82aa56SChiichen     pub handler: *mut core::ffi::c_void,
2913c82aa56SChiichen     pub flags: SigFlags,
2923c82aa56SChiichen     pub restorer: *mut core::ffi::c_void,
2933c82aa56SChiichen     pub mask: SigSet,
2943c82aa56SChiichen }
2953c82aa56SChiichen 
2963c82aa56SChiichen /**
2973c82aa56SChiichen  * siginfo中,根据signal的来源不同,该info中对应了不同的数据./=
2983c82aa56SChiichen  * 请注意,该info最大占用16字节
2993c82aa56SChiichen  */
3003c82aa56SChiichen 
3013c82aa56SChiichen #[repr(C)]
3023c82aa56SChiichen #[derive(Copy, Clone, Debug)]
3033c82aa56SChiichen pub struct SigInfo {
3043c82aa56SChiichen     sig_no: i32,
3053c82aa56SChiichen     sig_code: SigCode,
3063c82aa56SChiichen     errno: i32,
3073c82aa56SChiichen     sig_type: SigType,
3083c82aa56SChiichen }
3093c82aa56SChiichen 
3103c82aa56SChiichen impl SigInfo {
sig_code(&self) -> SigCode3113c82aa56SChiichen     pub fn sig_code(&self) -> SigCode {
3123c82aa56SChiichen         self.sig_code
3133c82aa56SChiichen     }
3143c82aa56SChiichen 
set_sig_type(&mut self, sig_type: SigType)3153c82aa56SChiichen     pub fn set_sig_type(&mut self, sig_type: SigType) {
3163c82aa56SChiichen         self.sig_type = sig_type;
3173c82aa56SChiichen     }
3183c82aa56SChiichen     /// @brief 将siginfo结构体拷贝到用户栈
3193c82aa56SChiichen     /// ## 参数
3203c82aa56SChiichen     ///
3213c82aa56SChiichen     /// `to` 用户空间指针
3223c82aa56SChiichen     ///
3233c82aa56SChiichen     /// ## 注意
3243c82aa56SChiichen     ///
325e7071df6SLoGin     /// 该函数对应Linux中的https://code.dragonos.org.cn/xref/linux-6.1.9/kernel/signal.c#3323
326e7071df6SLoGin     /// Linux还提供了 https://code.dragonos.org.cn/xref/linux-6.1.9/kernel/signal.c#3383 用来实现
3273c82aa56SChiichen     /// kernel_siginfo 保存到 用户的 compact_siginfo 的功能,但是我们系统内还暂时没有对这两种
3283c82aa56SChiichen     /// siginfo做区分,因此暂时不需要第二个函数
copy_siginfo_to_user(&self, to: *mut SigInfo) -> Result<i32, SystemError>3293c82aa56SChiichen     pub fn copy_siginfo_to_user(&self, to: *mut SigInfo) -> Result<i32, SystemError> {
3303c82aa56SChiichen         // 验证目标地址是否为用户空间
3313c82aa56SChiichen         let mut user_buffer = UserBufferWriter::new(to, size_of::<SigInfo>(), true)?;
3323c82aa56SChiichen 
3333c82aa56SChiichen         let retval: Result<i32, SystemError> = Ok(0);
3343c82aa56SChiichen 
3353c82aa56SChiichen         user_buffer.copy_one_to_user(self, 0)?;
3363c82aa56SChiichen         return retval;
3373c82aa56SChiichen     }
3383c82aa56SChiichen }
3393c82aa56SChiichen 
3403c82aa56SChiichen #[derive(Copy, Clone, Debug)]
3413c82aa56SChiichen pub enum SigType {
3423c82aa56SChiichen     Kill(Pid),
343fbd63a30SSMALLC     Alarm(Pid),
3443c82aa56SChiichen     // 后续完善下列中的具体字段
3453c82aa56SChiichen     // Timer,
3463c82aa56SChiichen     // Rt,
3473c82aa56SChiichen     // SigChild,
3483c82aa56SChiichen     // SigFault,
3493c82aa56SChiichen     // SigPoll,
3503c82aa56SChiichen     // SigSys,
3513c82aa56SChiichen }
3523c82aa56SChiichen 
3533c82aa56SChiichen impl SigInfo {
new(sig: Signal, sig_errno: i32, sig_code: SigCode, sig_type: SigType) -> Self3543c82aa56SChiichen     pub fn new(sig: Signal, sig_errno: i32, sig_code: SigCode, sig_type: SigType) -> Self {
3553c82aa56SChiichen         Self {
3563c82aa56SChiichen             sig_no: sig as i32,
3573c82aa56SChiichen             sig_code,
3583c82aa56SChiichen             errno: sig_errno,
3593c82aa56SChiichen             sig_type,
3603c82aa56SChiichen         }
3613c82aa56SChiichen     }
3623c82aa56SChiichen }
3633c82aa56SChiichen 
364b5b571e0SLoGin #[derive(Debug, Default)]
3653c82aa56SChiichen pub struct SigPending {
3663c82aa56SChiichen     signal: SigSet,
3673c82aa56SChiichen     queue: SigQueue,
3683c82aa56SChiichen }
3693c82aa56SChiichen 
3703c82aa56SChiichen impl SigPending {
371bf4a4899SLoGin     /// 判断是否有待处理的信号
has_pending(&self) -> bool372bf4a4899SLoGin     pub fn has_pending(&self) -> bool {
373bf4a4899SLoGin         return !self.signal.is_empty();
374bf4a4899SLoGin     }
375bf4a4899SLoGin 
signal(&self) -> SigSet3763c82aa56SChiichen     pub fn signal(&self) -> SigSet {
3773c82aa56SChiichen         self.signal
3783c82aa56SChiichen     }
3793c82aa56SChiichen 
queue(&self) -> &SigQueue3803c82aa56SChiichen     pub fn queue(&self) -> &SigQueue {
3813c82aa56SChiichen         &self.queue
3823c82aa56SChiichen     }
3833c82aa56SChiichen 
queue_mut(&mut self) -> &mut SigQueue3843c82aa56SChiichen     pub fn queue_mut(&mut self) -> &mut SigQueue {
3853c82aa56SChiichen         &mut self.queue
3863c82aa56SChiichen     }
3873c82aa56SChiichen 
signal_mut(&mut self) -> &mut SigSet3883c82aa56SChiichen     pub fn signal_mut(&mut self) -> &mut SigSet {
3893c82aa56SChiichen         &mut self.signal
3903c82aa56SChiichen     }
3913c82aa56SChiichen     /// @brief 获取下一个要处理的信号(sig number越小的信号,优先级越高)
3923c82aa56SChiichen     ///
3933c82aa56SChiichen     /// @param pending 等待处理的信号
3943c82aa56SChiichen     /// @param sig_mask 屏蔽了的信号
3953c82aa56SChiichen     /// @return i32 下一个要处理的信号的number. 如果为0,则无效
next_signal(&self, sig_mask: &SigSet) -> Signal3963c82aa56SChiichen     pub fn next_signal(&self, sig_mask: &SigSet) -> Signal {
3973c82aa56SChiichen         let mut sig = Signal::INVALID;
3983c82aa56SChiichen 
3993c82aa56SChiichen         let s = self.signal();
4003c82aa56SChiichen         let m = *sig_mask;
4013c82aa56SChiichen         m.is_empty();
4023c82aa56SChiichen         // 获取第一个待处理的信号的号码
4033c82aa56SChiichen         let x = s & (!m);
4043c82aa56SChiichen         if x.bits() != 0 {
4053c82aa56SChiichen             sig = Signal::from(ffz(x.complement().bits()) + 1);
4063c82aa56SChiichen             return sig;
4073c82aa56SChiichen         }
4083c82aa56SChiichen 
4093c82aa56SChiichen         // 暂时只支持64种信号
4103c82aa56SChiichen         assert_eq!(MAX_SIG_NUM, 64);
4113c82aa56SChiichen 
4123c82aa56SChiichen         return sig;
4133c82aa56SChiichen     }
4143c82aa56SChiichen     /// @brief 收集信号的信息
4153c82aa56SChiichen     ///
4163c82aa56SChiichen     /// @param sig 要收集的信号的信息
4173c82aa56SChiichen     /// @param pending 信号的排队等待标志
4183c82aa56SChiichen     /// @return SigInfo 信号的信息
collect_signal(&mut self, sig: Signal) -> SigInfo4193c82aa56SChiichen     pub fn collect_signal(&mut self, sig: Signal) -> SigInfo {
4203c82aa56SChiichen         let (info, still_pending) = self.queue_mut().find_and_delete(sig);
4213c82aa56SChiichen 
4223c82aa56SChiichen         // 如果没有仍在等待的信号,则清除pending位
4233c82aa56SChiichen         if !still_pending {
4243c82aa56SChiichen             self.signal_mut().remove(sig.into());
4253c82aa56SChiichen         }
4263c82aa56SChiichen 
427b5b571e0SLoGin         if let Some(info) = info {
428b5b571e0SLoGin             return info;
4293c82aa56SChiichen         } else {
4303c82aa56SChiichen             // 信号不在sigqueue中,这意味着当前信号是来自快速路径,因此直接把siginfo设置为0即可。
4313c82aa56SChiichen             let mut ret = SigInfo::new(sig, 0, SigCode::User, SigType::Kill(Pid::from(0)));
4323c82aa56SChiichen             ret.set_sig_type(SigType::Kill(Pid::new(0)));
4333c82aa56SChiichen             return ret;
4343c82aa56SChiichen         }
4353c82aa56SChiichen     }
4363c82aa56SChiichen 
4373c82aa56SChiichen     /// @brief 从当前进程的sigpending中取出下一个待处理的signal,并返回给调用者。(调用者应当处理这个信号)
4383c82aa56SChiichen     /// 请注意,进入本函数前,当前进程应当持有current_pcb().sighand.siglock
dequeue_signal(&mut self, sig_mask: &SigSet) -> (Signal, Option<SigInfo>)4393c82aa56SChiichen     pub fn dequeue_signal(&mut self, sig_mask: &SigSet) -> (Signal, Option<SigInfo>) {
4402eab6dd7S曾俊         // debug!("dequeue signal");
4413c82aa56SChiichen         // 获取下一个要处理的信号的编号
4423c82aa56SChiichen         let sig = self.next_signal(sig_mask);
4433c82aa56SChiichen 
444b5b571e0SLoGin         let info: Option<SigInfo> = if sig != Signal::INVALID {
4453c82aa56SChiichen             // 如果下一个要处理的信号是合法的,则收集其siginfo
446b5b571e0SLoGin             Some(self.collect_signal(sig))
4473c82aa56SChiichen         } else {
448b5b571e0SLoGin             None
449b5b571e0SLoGin         };
4503c82aa56SChiichen 
4513c82aa56SChiichen         // 当一个进程具有多个线程之后,在这里需要重新计算线程的flag中的TIF_SIGPENDING位
4523c82aa56SChiichen         // recalc_sigpending();
4533c82aa56SChiichen         return (sig, info);
4543c82aa56SChiichen     }
4553c82aa56SChiichen     /// @brief 从sigpending中删除mask中被置位的信号。也就是说,比如mask的第1位被置为1,那么就从sigqueue中删除所有signum为2的信号的信息。
flush_by_mask(&mut self, mask: &SigSet)4563c82aa56SChiichen     pub fn flush_by_mask(&mut self, mask: &SigSet) {
4573c82aa56SChiichen         // 定义过滤器,从sigqueue中删除mask中被置位的信号
4581a72a751SLoGin         let filter = |x: &SigInfo| !mask.contains(SigSet::from_bits_truncate(x.sig_no as u64));
4591a72a751SLoGin         self.queue.q.retain(filter);
4603c82aa56SChiichen     }
4613c82aa56SChiichen }
4623c82aa56SChiichen 
4633c82aa56SChiichen /// @brief 进程接收到的信号的队列
464b5b571e0SLoGin #[derive(Debug, Clone, Default)]
4653c82aa56SChiichen pub struct SigQueue {
4663c82aa56SChiichen     pub q: Vec<SigInfo>,
4673c82aa56SChiichen }
4683c82aa56SChiichen 
4693c82aa56SChiichen #[allow(dead_code)]
4703c82aa56SChiichen impl SigQueue {
4713c82aa56SChiichen     /// @brief 初始化一个新的信号队列
new(capacity: usize) -> Self4723c82aa56SChiichen     pub fn new(capacity: usize) -> Self {
4733c82aa56SChiichen         SigQueue {
4743c82aa56SChiichen             q: Vec::with_capacity(capacity),
4753c82aa56SChiichen         }
4763c82aa56SChiichen     }
4773c82aa56SChiichen 
4783c82aa56SChiichen     /// @brief 在信号队列中寻找第一个满足要求的siginfo, 并返回它的引用
4793c82aa56SChiichen     ///
4803c82aa56SChiichen     /// @return (第一个满足要求的siginfo的引用; 是否有多个满足条件的siginfo)
find(&self, sig: Signal) -> (Option<&SigInfo>, bool)4813c82aa56SChiichen     pub fn find(&self, sig: Signal) -> (Option<&SigInfo>, bool) {
4823c82aa56SChiichen         // 是否存在多个满足条件的siginfo
4833c82aa56SChiichen         let mut still_pending = false;
4843c82aa56SChiichen         let mut info: Option<&SigInfo> = None;
4853c82aa56SChiichen 
4863c82aa56SChiichen         for x in self.q.iter() {
4873c82aa56SChiichen             if x.sig_no == sig as i32 {
4883c82aa56SChiichen                 if info.is_some() {
4893c82aa56SChiichen                     still_pending = true;
4903c82aa56SChiichen                     break;
4913c82aa56SChiichen                 } else {
4923c82aa56SChiichen                     info = Some(x);
4933c82aa56SChiichen                 }
4943c82aa56SChiichen             }
4953c82aa56SChiichen         }
4963c82aa56SChiichen         return (info, still_pending);
4973c82aa56SChiichen     }
4983c82aa56SChiichen 
4993c82aa56SChiichen     /// @brief 在信号队列中寻找第一个满足要求的siginfo, 并将其从队列中删除,然后返回这个siginfo
5003c82aa56SChiichen     ///
5013c82aa56SChiichen     /// @return (第一个满足要求的siginfo; 从队列中删除前是否有多个满足条件的siginfo)
find_and_delete(&mut self, sig: Signal) -> (Option<SigInfo>, bool)5023c82aa56SChiichen     pub fn find_and_delete(&mut self, sig: Signal) -> (Option<SigInfo>, bool) {
5033c82aa56SChiichen         // 是否存在多个满足条件的siginfo
5043c82aa56SChiichen         let mut still_pending = false;
5053c82aa56SChiichen         let mut first = true; // 标记变量,记录当前是否已经筛选出了一个元素
5063c82aa56SChiichen 
5073c82aa56SChiichen         let filter = |x: &mut SigInfo| {
5083c82aa56SChiichen             if x.sig_no == sig as i32 {
5093c82aa56SChiichen                 if !first {
5103c82aa56SChiichen                     // 如果之前已经筛选出了一个元素,则不把当前元素删除
5113c82aa56SChiichen                     still_pending = true;
5123c82aa56SChiichen                     return false;
5133c82aa56SChiichen                 } else {
5143c82aa56SChiichen                     // 当前是第一个被筛选出来的元素
5153c82aa56SChiichen                     first = false;
5163c82aa56SChiichen                     return true;
5173c82aa56SChiichen                 }
5183c82aa56SChiichen             }
5193c82aa56SChiichen             return false;
5203c82aa56SChiichen         };
5213c82aa56SChiichen         // 从sigqueue中过滤出结果
5221a72a751SLoGin         let mut filter_result: Vec<SigInfo> = self.q.extract_if(filter).collect();
5233c82aa56SChiichen         // 筛选出的结果不能大于1个
5243c82aa56SChiichen         assert!(filter_result.len() <= 1);
5253c82aa56SChiichen 
5263c82aa56SChiichen         return (filter_result.pop(), still_pending);
5273c82aa56SChiichen     }
5283c82aa56SChiichen 
5293c82aa56SChiichen     /// @brief 从C的void*指针转换为static生命周期的可变引用
from_c_void(p: *mut c_void) -> &'static mut SigQueue5303c82aa56SChiichen     pub fn from_c_void(p: *mut c_void) -> &'static mut SigQueue {
5313c82aa56SChiichen         let sq = p as *mut SigQueue;
5323c82aa56SChiichen         let sq = unsafe { sq.as_mut::<'static>() }.unwrap();
5333c82aa56SChiichen         return sq;
5343c82aa56SChiichen     }
5353c82aa56SChiichen }
5363c82aa56SChiichen 
5373c82aa56SChiichen ///
5383c82aa56SChiichen /// 定义了不同架构下实现 Signal 要实现的接口
5393c82aa56SChiichen ///
5403c82aa56SChiichen pub trait SignalArch {
5413c82aa56SChiichen     /// 信号处理函数
5423c82aa56SChiichen     ///
5433c82aa56SChiichen     /// ## 参数
5443c82aa56SChiichen     ///
5453c82aa56SChiichen     /// - `frame` 中断栈帧
do_signal(frame: &mut TrapFrame)5463c82aa56SChiichen     unsafe fn do_signal(frame: &mut TrapFrame);
5473c82aa56SChiichen 
sys_rt_sigreturn(trap_frame: &mut TrapFrame) -> u645483c82aa56SChiichen     fn sys_rt_sigreturn(trap_frame: &mut TrapFrame) -> u64;
5493c82aa56SChiichen }
550