13c82aa56SChiichen use core::{ffi::c_void, mem::size_of, sync::atomic::AtomicI64}; 23c82aa56SChiichen 33c82aa56SChiichen use alloc::vec::Vec; 4*91e9d4abSLoGin use system_error::SystemError; 53c82aa56SChiichen 63c82aa56SChiichen use crate::{ 73c82aa56SChiichen arch::{ 83c82aa56SChiichen asm::bitops::ffz, 93c82aa56SChiichen interrupt::TrapFrame, 103c82aa56SChiichen ipc::signal::{SigCode, SigFlags, SigSet, Signal, MAX_SIG_NUM}, 113c82aa56SChiichen }, 123c82aa56SChiichen mm::VirtAddr, 133c82aa56SChiichen process::Pid, 14*91e9d4abSLoGin syscall::user_access::UserBufferWriter, 153c82aa56SChiichen }; 163c82aa56SChiichen 173c82aa56SChiichen /// 用户态程序传入的SIG_DFL的值 183c82aa56SChiichen pub const USER_SIG_DFL: u64 = 0; 193c82aa56SChiichen /// 用户态程序传入的SIG_IGN的值 203c82aa56SChiichen pub const USER_SIG_IGN: u64 = 1; 213c82aa56SChiichen /// 用户态程序传入的SIG_ERR的值 223c82aa56SChiichen pub const USER_SIG_ERR: u64 = 2; 233c82aa56SChiichen 243c82aa56SChiichen // 因为 Rust 编译器不能在常量声明中正确识别级联的 "|" 运算符(experimental feature: https://github.com/rust-lang/rust/issues/67792),因此 253c82aa56SChiichen // 暂时只能通过这种方法来声明这些常量,这些常量暂时没有全部用到,但是都出现在 linux 的判断逻辑中,所以都保留下来了 263c82aa56SChiichen #[allow(dead_code)] 273c82aa56SChiichen pub const SIG_KERNEL_ONLY_MASK: SigSet = 283c82aa56SChiichen Signal::into_sigset(Signal::SIGSTOP).union(Signal::into_sigset(Signal::SIGKILL)); 293c82aa56SChiichen 303c82aa56SChiichen pub const SIG_KERNEL_STOP_MASK: SigSet = Signal::into_sigset(Signal::SIGSTOP) 313c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGTSTP)) 323c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGTTIN)) 333c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGTTOU)); 343c82aa56SChiichen #[allow(dead_code)] 353c82aa56SChiichen pub const SIG_KERNEL_COREDUMP_MASK: SigSet = Signal::into_sigset(Signal::SIGQUIT) 363c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGILL)) 373c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGTRAP)) 383c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGABRT_OR_IOT)) 393c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGFPE)) 403c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGSEGV)) 413c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGBUS)) 423c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGSYS)) 433c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGXCPU)) 443c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGXFSZ)); 453c82aa56SChiichen #[allow(dead_code)] 463c82aa56SChiichen pub const SIG_KERNEL_IGNORE_MASK: SigSet = Signal::into_sigset(Signal::SIGCONT) 473c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGFPE)) 483c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGSEGV)) 493c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGBUS)) 503c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGTRAP)) 513c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGCHLD)) 523c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGIO_OR_POLL)) 533c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGSYS)); 543c82aa56SChiichen 553c82aa56SChiichen /// SignalStruct 在 pcb 中加锁 563c82aa56SChiichen #[derive(Debug)] 573c82aa56SChiichen pub struct SignalStruct { 583c82aa56SChiichen pub cnt: AtomicI64, 593c82aa56SChiichen /// 如果对应linux,这部分会有一个引用计数,但是没发现在哪里有用到需要计算引用的地方,因此 603c82aa56SChiichen /// 暂时删掉,不然这个Arc会导致其他地方的代码十分丑陋 613c82aa56SChiichen pub handlers: [Sigaction; MAX_SIG_NUM as usize], 623c82aa56SChiichen } 633c82aa56SChiichen 643c82aa56SChiichen impl Default for SignalStruct { 653c82aa56SChiichen fn default() -> Self { 663c82aa56SChiichen Self { 673c82aa56SChiichen cnt: Default::default(), 683c82aa56SChiichen handlers: [Sigaction::default(); MAX_SIG_NUM as usize], 693c82aa56SChiichen } 703c82aa56SChiichen } 713c82aa56SChiichen } 723c82aa56SChiichen 733c82aa56SChiichen #[derive(Debug, Copy, Clone)] 743c82aa56SChiichen #[allow(dead_code)] 753c82aa56SChiichen pub enum SigactionType { 763c82aa56SChiichen SaHandler(SaHandlerType), 773c82aa56SChiichen SaSigaction( 783c82aa56SChiichen Option< 793c82aa56SChiichen unsafe extern "C" fn( 803c82aa56SChiichen sig: ::core::ffi::c_int, 813c82aa56SChiichen sinfo: *mut SigInfo, 823c82aa56SChiichen arg1: *mut ::core::ffi::c_void, 833c82aa56SChiichen ), 843c82aa56SChiichen >, 853c82aa56SChiichen ), // 暂时没有用上 863c82aa56SChiichen } 873c82aa56SChiichen 883c82aa56SChiichen impl SigactionType { 893c82aa56SChiichen /// Returns `true` if the sa handler type is [`SaHandler(SaHandlerType::SigIgnore)`]. 903c82aa56SChiichen /// 913c82aa56SChiichen /// [`SigIgnore`]: SaHandlerType::SigIgnore 923c82aa56SChiichen pub fn is_ignore(&self) -> bool { 933c82aa56SChiichen return matches!(self, Self::SaHandler(SaHandlerType::SigIgnore)); 943c82aa56SChiichen } 953c82aa56SChiichen /// Returns `true` if the sa handler type is [`SaHandler(SaHandlerType::SigCustomized(_))`]. 963c82aa56SChiichen /// 973c82aa56SChiichen /// [`SigCustomized`]: SaHandlerType::SigCustomized(_) 983c82aa56SChiichen pub fn is_customized(&self) -> bool { 993c82aa56SChiichen return matches!(self, Self::SaHandler(SaHandlerType::SigCustomized(_))); 1003c82aa56SChiichen } 1013c82aa56SChiichen } 1023c82aa56SChiichen 1033c82aa56SChiichen #[derive(Debug, Copy, Clone)] 1043c82aa56SChiichen #[allow(dead_code)] 1053c82aa56SChiichen pub enum SaHandlerType { 1063c82aa56SChiichen SigError, // 暂时没有用上 1073c82aa56SChiichen SigDefault, 1083c82aa56SChiichen SigIgnore, 1093c82aa56SChiichen SigCustomized(VirtAddr), 1103c82aa56SChiichen } 1113c82aa56SChiichen 1123c82aa56SChiichen impl Into<usize> for SaHandlerType { 1133c82aa56SChiichen fn into(self) -> usize { 1143c82aa56SChiichen match self { 1153c82aa56SChiichen Self::SigError => 2 as usize, 1163c82aa56SChiichen Self::SigIgnore => 1 as usize, 1173c82aa56SChiichen Self::SigDefault => 0 as usize, 1183c82aa56SChiichen Self::SigCustomized(handler) => handler.data(), 1193c82aa56SChiichen } 1203c82aa56SChiichen } 1213c82aa56SChiichen } 1223c82aa56SChiichen 1233c82aa56SChiichen impl SaHandlerType { 1243c82aa56SChiichen /// Returns `true` if the sa handler type is [`SigDefault`]. 1253c82aa56SChiichen /// 1263c82aa56SChiichen /// [`SigDefault`]: SaHandlerType::SigDefault 1273c82aa56SChiichen pub fn is_sig_default(&self) -> bool { 1283c82aa56SChiichen matches!(self, Self::SigDefault) 1293c82aa56SChiichen } 1303c82aa56SChiichen 1313c82aa56SChiichen /// Returns `true` if the sa handler type is [`SigIgnore`]. 1323c82aa56SChiichen /// 1333c82aa56SChiichen /// [`SigIgnore`]: SaHandlerType::SigIgnore 1343c82aa56SChiichen pub fn is_sig_ignore(&self) -> bool { 1353c82aa56SChiichen matches!(self, Self::SigIgnore) 1363c82aa56SChiichen } 1373c82aa56SChiichen 1383c82aa56SChiichen /// Returns `true` if the sa handler type is [`SigError`]. 1393c82aa56SChiichen /// 1403c82aa56SChiichen /// [`SigError`]: SaHandlerType::SigError 1413c82aa56SChiichen pub fn is_sig_error(&self) -> bool { 1423c82aa56SChiichen matches!(self, Self::SigError) 1433c82aa56SChiichen } 1443c82aa56SChiichen } 1453c82aa56SChiichen 1463c82aa56SChiichen /// 信号处理结构体 1473c82aa56SChiichen /// 1483c82aa56SChiichen #[derive(Debug, Copy, Clone)] 1493c82aa56SChiichen pub struct Sigaction { 1503c82aa56SChiichen action: SigactionType, 1513c82aa56SChiichen flags: SigFlags, 1523c82aa56SChiichen mask: SigSet, // 为了可扩展性而设置的sa_mask 1533c82aa56SChiichen /// 信号处理函数执行结束后,将会跳转到这个函数内进行执行,然后执行sigreturn系统调用 1543c82aa56SChiichen restorer: Option<VirtAddr>, 1553c82aa56SChiichen } 1563c82aa56SChiichen 1573c82aa56SChiichen impl Default for Sigaction { 1583c82aa56SChiichen fn default() -> Self { 1593c82aa56SChiichen Self { 1603c82aa56SChiichen action: SigactionType::SaHandler(SaHandlerType::SigDefault), 1613c82aa56SChiichen flags: Default::default(), 1623c82aa56SChiichen mask: Default::default(), 1633c82aa56SChiichen restorer: Default::default(), 1643c82aa56SChiichen } 1653c82aa56SChiichen } 1663c82aa56SChiichen } 1673c82aa56SChiichen 1683c82aa56SChiichen impl Sigaction { 1693c82aa56SChiichen /// 判断传入的信号是否被忽略 1703c82aa56SChiichen /// 1713c82aa56SChiichen /// ## 参数 1723c82aa56SChiichen /// 1733c82aa56SChiichen /// - `sig` 传入的信号 1743c82aa56SChiichen /// 1753c82aa56SChiichen /// ## 返回值 1763c82aa56SChiichen /// 1773c82aa56SChiichen /// - `true` 被忽略 1783c82aa56SChiichen /// - `false`未被忽略 1793c82aa56SChiichen pub fn is_ignore(&self) -> bool { 1803c82aa56SChiichen return self.action.is_ignore(); 1813c82aa56SChiichen } 1823c82aa56SChiichen pub fn new( 1833c82aa56SChiichen action: SigactionType, 1843c82aa56SChiichen flags: SigFlags, 1853c82aa56SChiichen mask: SigSet, 1863c82aa56SChiichen restorer: Option<VirtAddr>, 1873c82aa56SChiichen ) -> Self { 1883c82aa56SChiichen Self { 1893c82aa56SChiichen action, 1903c82aa56SChiichen flags, 1913c82aa56SChiichen mask, 1923c82aa56SChiichen restorer, 1933c82aa56SChiichen } 1943c82aa56SChiichen } 1953c82aa56SChiichen 1963c82aa56SChiichen pub fn action(&self) -> SigactionType { 1973c82aa56SChiichen self.action 1983c82aa56SChiichen } 1993c82aa56SChiichen 2003c82aa56SChiichen pub fn flags(&self) -> SigFlags { 2013c82aa56SChiichen self.flags 2023c82aa56SChiichen } 2033c82aa56SChiichen 2043c82aa56SChiichen pub fn restorer(&self) -> Option<VirtAddr> { 2053c82aa56SChiichen self.restorer 2063c82aa56SChiichen } 2073c82aa56SChiichen 2083c82aa56SChiichen pub fn flags_mut(&mut self) -> &mut SigFlags { 2093c82aa56SChiichen &mut self.flags 2103c82aa56SChiichen } 2113c82aa56SChiichen 2123c82aa56SChiichen pub fn set_action(&mut self, action: SigactionType) { 2133c82aa56SChiichen self.action = action; 2143c82aa56SChiichen } 2153c82aa56SChiichen 2163c82aa56SChiichen pub fn mask(&self) -> SigSet { 2173c82aa56SChiichen self.mask 2183c82aa56SChiichen } 2193c82aa56SChiichen 2203c82aa56SChiichen pub fn mask_mut(&mut self) -> &mut SigSet { 2213c82aa56SChiichen &mut self.mask 2223c82aa56SChiichen } 2233c82aa56SChiichen 2243c82aa56SChiichen pub fn set_restorer(&mut self, restorer: Option<VirtAddr>) { 2253c82aa56SChiichen self.restorer = restorer; 2263c82aa56SChiichen } 2273c82aa56SChiichen 2283c82aa56SChiichen /// 默认信号处理程序占位符(用于在sighand结构体中的action数组中占位) 2293c82aa56SChiichen pub const DEFAULT_SIGACTION: Sigaction = Sigaction { 2303c82aa56SChiichen action: SigactionType::SaHandler(SaHandlerType::SigDefault), 2313c82aa56SChiichen flags: SigFlags::empty(), 2323c82aa56SChiichen mask: SigSet::from_bits_truncate(0), 2333c82aa56SChiichen restorer: None, 2343c82aa56SChiichen }; 2353c82aa56SChiichen 2363c82aa56SChiichen /// 默认的“忽略信号”的sigaction 2373c82aa56SChiichen pub const DEFAULT_SIGACTION_IGNORE: Sigaction = Sigaction { 2383c82aa56SChiichen action: SigactionType::SaHandler(SaHandlerType::SigIgnore), 2393c82aa56SChiichen flags: SigFlags::empty(), 2403c82aa56SChiichen mask: SigSet::from_bits_truncate(0), 2413c82aa56SChiichen restorer: None, 2423c82aa56SChiichen }; 2433c82aa56SChiichen } 2443c82aa56SChiichen 2453c82aa56SChiichen /// 用户态传入的sigaction结构体(符合posix规范) 2463c82aa56SChiichen /// 请注意,我们会在sys_sigaction函数里面将其转换成内核使用的sigaction结构体 2473c82aa56SChiichen #[repr(C)] 2483c82aa56SChiichen #[derive(Debug, Clone, Copy)] 2493c82aa56SChiichen pub struct UserSigaction { 2503c82aa56SChiichen pub handler: *mut core::ffi::c_void, 2513c82aa56SChiichen pub flags: SigFlags, 2523c82aa56SChiichen pub restorer: *mut core::ffi::c_void, 2533c82aa56SChiichen pub mask: SigSet, 2543c82aa56SChiichen } 2553c82aa56SChiichen 2563c82aa56SChiichen /** 2573c82aa56SChiichen * siginfo中,根据signal的来源不同,该info中对应了不同的数据./= 2583c82aa56SChiichen * 请注意,该info最大占用16字节 2593c82aa56SChiichen */ 2603c82aa56SChiichen 2613c82aa56SChiichen #[repr(C)] 2623c82aa56SChiichen #[derive(Copy, Clone, Debug)] 2633c82aa56SChiichen pub struct SigInfo { 2643c82aa56SChiichen sig_no: i32, 2653c82aa56SChiichen sig_code: SigCode, 2663c82aa56SChiichen errno: i32, 2673c82aa56SChiichen sig_type: SigType, 2683c82aa56SChiichen } 2693c82aa56SChiichen 2703c82aa56SChiichen impl SigInfo { 2713c82aa56SChiichen pub fn sig_code(&self) -> SigCode { 2723c82aa56SChiichen self.sig_code 2733c82aa56SChiichen } 2743c82aa56SChiichen 2753c82aa56SChiichen pub fn set_sig_type(&mut self, sig_type: SigType) { 2763c82aa56SChiichen self.sig_type = sig_type; 2773c82aa56SChiichen } 2783c82aa56SChiichen /// @brief 将siginfo结构体拷贝到用户栈 2793c82aa56SChiichen /// ## 参数 2803c82aa56SChiichen /// 2813c82aa56SChiichen /// `to` 用户空间指针 2823c82aa56SChiichen /// 2833c82aa56SChiichen /// ## 注意 2843c82aa56SChiichen /// 2853c82aa56SChiichen /// 该函数对应Linux中的https://opengrok.ringotek.cn/xref/linux-6.1.9/kernel/signal.c#3323 2863c82aa56SChiichen /// Linux还提供了 https://opengrok.ringotek.cn/xref/linux-6.1.9/kernel/signal.c#3383 用来实现 2873c82aa56SChiichen /// kernel_siginfo 保存到 用户的 compact_siginfo 的功能,但是我们系统内还暂时没有对这两种 2883c82aa56SChiichen /// siginfo做区分,因此暂时不需要第二个函数 2893c82aa56SChiichen pub fn copy_siginfo_to_user(&self, to: *mut SigInfo) -> Result<i32, SystemError> { 2903c82aa56SChiichen // 验证目标地址是否为用户空间 2913c82aa56SChiichen let mut user_buffer = UserBufferWriter::new(to, size_of::<SigInfo>(), true)?; 2923c82aa56SChiichen 2933c82aa56SChiichen let retval: Result<i32, SystemError> = Ok(0); 2943c82aa56SChiichen 2953c82aa56SChiichen user_buffer.copy_one_to_user(self, 0)?; 2963c82aa56SChiichen return retval; 2973c82aa56SChiichen } 2983c82aa56SChiichen } 2993c82aa56SChiichen 3003c82aa56SChiichen #[derive(Copy, Clone, Debug)] 3013c82aa56SChiichen pub enum SigType { 3023c82aa56SChiichen Kill(Pid), 3033c82aa56SChiichen // 后续完善下列中的具体字段 3043c82aa56SChiichen // Timer, 3053c82aa56SChiichen // Rt, 3063c82aa56SChiichen // SigChild, 3073c82aa56SChiichen // SigFault, 3083c82aa56SChiichen // SigPoll, 3093c82aa56SChiichen // SigSys, 3103c82aa56SChiichen } 3113c82aa56SChiichen 3123c82aa56SChiichen impl SigInfo { 3133c82aa56SChiichen pub fn new(sig: Signal, sig_errno: i32, sig_code: SigCode, sig_type: SigType) -> Self { 3143c82aa56SChiichen Self { 3153c82aa56SChiichen sig_no: sig as i32, 3163c82aa56SChiichen sig_code, 3173c82aa56SChiichen errno: sig_errno, 3183c82aa56SChiichen sig_type, 3193c82aa56SChiichen } 3203c82aa56SChiichen } 3213c82aa56SChiichen } 3223c82aa56SChiichen 3233c82aa56SChiichen #[derive(Debug)] 3243c82aa56SChiichen pub struct SigPending { 3253c82aa56SChiichen signal: SigSet, 3263c82aa56SChiichen queue: SigQueue, 3273c82aa56SChiichen } 3283c82aa56SChiichen 3293c82aa56SChiichen impl Default for SigPending { 3303c82aa56SChiichen fn default() -> Self { 3313c82aa56SChiichen SigPending { 3323c82aa56SChiichen signal: SigSet::default(), 3333c82aa56SChiichen queue: SigQueue::default(), 3343c82aa56SChiichen } 3353c82aa56SChiichen } 3363c82aa56SChiichen } 3373c82aa56SChiichen 3383c82aa56SChiichen impl SigPending { 339bf4a4899SLoGin /// 判断是否有待处理的信号 340bf4a4899SLoGin pub fn has_pending(&self) -> bool { 341bf4a4899SLoGin return !self.signal.is_empty(); 342bf4a4899SLoGin } 343bf4a4899SLoGin 3443c82aa56SChiichen pub fn signal(&self) -> SigSet { 3453c82aa56SChiichen self.signal 3463c82aa56SChiichen } 3473c82aa56SChiichen 3483c82aa56SChiichen pub fn queue(&self) -> &SigQueue { 3493c82aa56SChiichen &self.queue 3503c82aa56SChiichen } 3513c82aa56SChiichen 3523c82aa56SChiichen pub fn queue_mut(&mut self) -> &mut SigQueue { 3533c82aa56SChiichen &mut self.queue 3543c82aa56SChiichen } 3553c82aa56SChiichen 3563c82aa56SChiichen pub fn signal_mut(&mut self) -> &mut SigSet { 3573c82aa56SChiichen &mut self.signal 3583c82aa56SChiichen } 3593c82aa56SChiichen /// @brief 获取下一个要处理的信号(sig number越小的信号,优先级越高) 3603c82aa56SChiichen /// 3613c82aa56SChiichen /// @param pending 等待处理的信号 3623c82aa56SChiichen /// @param sig_mask 屏蔽了的信号 3633c82aa56SChiichen /// @return i32 下一个要处理的信号的number. 如果为0,则无效 3643c82aa56SChiichen pub fn next_signal(&self, sig_mask: &SigSet) -> Signal { 3653c82aa56SChiichen let mut sig = Signal::INVALID; 3663c82aa56SChiichen 3673c82aa56SChiichen let s = self.signal(); 3683c82aa56SChiichen let m = *sig_mask; 3693c82aa56SChiichen m.is_empty(); 3703c82aa56SChiichen // 获取第一个待处理的信号的号码 3713c82aa56SChiichen let x = s & (!m); 3723c82aa56SChiichen if x.bits() != 0 { 3733c82aa56SChiichen sig = Signal::from(ffz(x.complement().bits()) + 1); 3743c82aa56SChiichen return sig; 3753c82aa56SChiichen } 3763c82aa56SChiichen 3773c82aa56SChiichen // 暂时只支持64种信号 3783c82aa56SChiichen assert_eq!(MAX_SIG_NUM, 64); 3793c82aa56SChiichen 3803c82aa56SChiichen return sig; 3813c82aa56SChiichen } 3823c82aa56SChiichen /// @brief 收集信号的信息 3833c82aa56SChiichen /// 3843c82aa56SChiichen /// @param sig 要收集的信号的信息 3853c82aa56SChiichen /// @param pending 信号的排队等待标志 3863c82aa56SChiichen /// @return SigInfo 信号的信息 3873c82aa56SChiichen pub fn collect_signal(&mut self, sig: Signal) -> SigInfo { 3883c82aa56SChiichen let (info, still_pending) = self.queue_mut().find_and_delete(sig); 3893c82aa56SChiichen 3903c82aa56SChiichen // 如果没有仍在等待的信号,则清除pending位 3913c82aa56SChiichen if !still_pending { 3923c82aa56SChiichen self.signal_mut().remove(sig.into()); 3933c82aa56SChiichen } 3943c82aa56SChiichen 3953c82aa56SChiichen if info.is_some() { 3963c82aa56SChiichen return info.unwrap(); 3973c82aa56SChiichen } else { 3983c82aa56SChiichen // 信号不在sigqueue中,这意味着当前信号是来自快速路径,因此直接把siginfo设置为0即可。 3993c82aa56SChiichen let mut ret = SigInfo::new(sig, 0, SigCode::User, SigType::Kill(Pid::from(0))); 4003c82aa56SChiichen ret.set_sig_type(SigType::Kill(Pid::new(0))); 4013c82aa56SChiichen return ret; 4023c82aa56SChiichen } 4033c82aa56SChiichen } 4043c82aa56SChiichen 4053c82aa56SChiichen /// @brief 从当前进程的sigpending中取出下一个待处理的signal,并返回给调用者。(调用者应当处理这个信号) 4063c82aa56SChiichen /// 请注意,进入本函数前,当前进程应当持有current_pcb().sighand.siglock 4073c82aa56SChiichen pub fn dequeue_signal(&mut self, sig_mask: &SigSet) -> (Signal, Option<SigInfo>) { 4083c82aa56SChiichen // kdebug!("dequeue signal"); 4093c82aa56SChiichen // 获取下一个要处理的信号的编号 4103c82aa56SChiichen let sig = self.next_signal(sig_mask); 4113c82aa56SChiichen 4123c82aa56SChiichen let info: Option<SigInfo>; 4133c82aa56SChiichen if sig != Signal::INVALID { 4143c82aa56SChiichen // 如果下一个要处理的信号是合法的,则收集其siginfo 4153c82aa56SChiichen info = Some(self.collect_signal(sig)); 4163c82aa56SChiichen } else { 4173c82aa56SChiichen info = None; 4183c82aa56SChiichen } 4193c82aa56SChiichen 4203c82aa56SChiichen // 当一个进程具有多个线程之后,在这里需要重新计算线程的flag中的TIF_SIGPENDING位 4213c82aa56SChiichen // recalc_sigpending(); 4223c82aa56SChiichen return (sig, info); 4233c82aa56SChiichen } 4243c82aa56SChiichen /// @brief 从sigpending中删除mask中被置位的信号。也就是说,比如mask的第1位被置为1,那么就从sigqueue中删除所有signum为2的信号的信息。 4253c82aa56SChiichen pub fn flush_by_mask(&mut self, mask: &SigSet) { 4263c82aa56SChiichen // 定义过滤器,从sigqueue中删除mask中被置位的信号 4271a72a751SLoGin let filter = |x: &SigInfo| !mask.contains(SigSet::from_bits_truncate(x.sig_no as u64)); 4281a72a751SLoGin self.queue.q.retain(filter); 4293c82aa56SChiichen } 4303c82aa56SChiichen } 4313c82aa56SChiichen 4323c82aa56SChiichen /// @brief 进程接收到的信号的队列 4333c82aa56SChiichen #[derive(Debug, Clone)] 4343c82aa56SChiichen pub struct SigQueue { 4353c82aa56SChiichen pub q: Vec<SigInfo>, 4363c82aa56SChiichen } 4373c82aa56SChiichen 4383c82aa56SChiichen #[allow(dead_code)] 4393c82aa56SChiichen impl SigQueue { 4403c82aa56SChiichen /// @brief 初始化一个新的信号队列 4413c82aa56SChiichen pub fn new(capacity: usize) -> Self { 4423c82aa56SChiichen SigQueue { 4433c82aa56SChiichen q: Vec::with_capacity(capacity), 4443c82aa56SChiichen } 4453c82aa56SChiichen } 4463c82aa56SChiichen 4473c82aa56SChiichen /// @brief 在信号队列中寻找第一个满足要求的siginfo, 并返回它的引用 4483c82aa56SChiichen /// 4493c82aa56SChiichen /// @return (第一个满足要求的siginfo的引用; 是否有多个满足条件的siginfo) 4503c82aa56SChiichen pub fn find(&self, sig: Signal) -> (Option<&SigInfo>, bool) { 4513c82aa56SChiichen // 是否存在多个满足条件的siginfo 4523c82aa56SChiichen let mut still_pending = false; 4533c82aa56SChiichen let mut info: Option<&SigInfo> = None; 4543c82aa56SChiichen 4553c82aa56SChiichen for x in self.q.iter() { 4563c82aa56SChiichen if x.sig_no == sig as i32 { 4573c82aa56SChiichen if info.is_some() { 4583c82aa56SChiichen still_pending = true; 4593c82aa56SChiichen break; 4603c82aa56SChiichen } else { 4613c82aa56SChiichen info = Some(x); 4623c82aa56SChiichen } 4633c82aa56SChiichen } 4643c82aa56SChiichen } 4653c82aa56SChiichen return (info, still_pending); 4663c82aa56SChiichen } 4673c82aa56SChiichen 4683c82aa56SChiichen /// @brief 在信号队列中寻找第一个满足要求的siginfo, 并将其从队列中删除,然后返回这个siginfo 4693c82aa56SChiichen /// 4703c82aa56SChiichen /// @return (第一个满足要求的siginfo; 从队列中删除前是否有多个满足条件的siginfo) 4713c82aa56SChiichen pub fn find_and_delete(&mut self, sig: Signal) -> (Option<SigInfo>, bool) { 4723c82aa56SChiichen // 是否存在多个满足条件的siginfo 4733c82aa56SChiichen let mut still_pending = false; 4743c82aa56SChiichen let mut first = true; // 标记变量,记录当前是否已经筛选出了一个元素 4753c82aa56SChiichen 4763c82aa56SChiichen let filter = |x: &mut SigInfo| { 4773c82aa56SChiichen if x.sig_no == sig as i32 { 4783c82aa56SChiichen if !first { 4793c82aa56SChiichen // 如果之前已经筛选出了一个元素,则不把当前元素删除 4803c82aa56SChiichen still_pending = true; 4813c82aa56SChiichen return false; 4823c82aa56SChiichen } else { 4833c82aa56SChiichen // 当前是第一个被筛选出来的元素 4843c82aa56SChiichen first = false; 4853c82aa56SChiichen return true; 4863c82aa56SChiichen } 4873c82aa56SChiichen } 4883c82aa56SChiichen return false; 4893c82aa56SChiichen }; 4903c82aa56SChiichen // 从sigqueue中过滤出结果 4911a72a751SLoGin let mut filter_result: Vec<SigInfo> = self.q.extract_if(filter).collect(); 4923c82aa56SChiichen // 筛选出的结果不能大于1个 4933c82aa56SChiichen assert!(filter_result.len() <= 1); 4943c82aa56SChiichen 4953c82aa56SChiichen return (filter_result.pop(), still_pending); 4963c82aa56SChiichen } 4973c82aa56SChiichen 4983c82aa56SChiichen /// @brief 从C的void*指针转换为static生命周期的可变引用 4993c82aa56SChiichen pub fn from_c_void(p: *mut c_void) -> &'static mut SigQueue { 5003c82aa56SChiichen let sq = p as *mut SigQueue; 5013c82aa56SChiichen let sq = unsafe { sq.as_mut::<'static>() }.unwrap(); 5023c82aa56SChiichen return sq; 5033c82aa56SChiichen } 5043c82aa56SChiichen } 5053c82aa56SChiichen 5063c82aa56SChiichen impl Default for SigQueue { 5073c82aa56SChiichen fn default() -> Self { 5083c82aa56SChiichen Self { 5093c82aa56SChiichen q: Default::default(), 5103c82aa56SChiichen } 5113c82aa56SChiichen } 5123c82aa56SChiichen } 5133c82aa56SChiichen 5143c82aa56SChiichen /// 5153c82aa56SChiichen /// 定义了不同架构下实现 Signal 要实现的接口 5163c82aa56SChiichen /// 5173c82aa56SChiichen pub trait SignalArch { 5183c82aa56SChiichen /// 信号处理函数 5193c82aa56SChiichen /// 5203c82aa56SChiichen /// ## 参数 5213c82aa56SChiichen /// 5223c82aa56SChiichen /// - `frame` 中断栈帧 5233c82aa56SChiichen unsafe fn do_signal(frame: &mut TrapFrame); 5243c82aa56SChiichen 5253c82aa56SChiichen fn sys_rt_sigreturn(trap_frame: &mut TrapFrame) -> u64; 5263c82aa56SChiichen } 527