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