xref: /DragonOS/kernel/src/arch/riscv64/ipc/signal.rs (revision 2eab6dd743e94a86a685f1f3c01e599adf86610a)
1*2eab6dd7S曾俊 use log::error;
2*2eab6dd7S曾俊 
34fda81ceSLoGin use crate::{
44fda81ceSLoGin     arch::{sched::sched, CurrentIrqArch},
54fda81ceSLoGin     exception::InterruptArch,
64fda81ceSLoGin     process::ProcessManager,
74fda81ceSLoGin };
84fda81ceSLoGin 
94fda81ceSLoGin /// 信号最大值
104fda81ceSLoGin pub const MAX_SIG_NUM: usize = 64;
114fda81ceSLoGin #[allow(dead_code)]
124fda81ceSLoGin #[derive(Eq)]
134fda81ceSLoGin #[repr(usize)]
144fda81ceSLoGin #[allow(non_camel_case_types)]
154fda81ceSLoGin #[atomic_enum]
164fda81ceSLoGin pub enum Signal {
174fda81ceSLoGin     INVALID = 0,
184fda81ceSLoGin     SIGHUP = 1,
194fda81ceSLoGin     SIGINT,
204fda81ceSLoGin     SIGQUIT,
214fda81ceSLoGin     SIGILL,
224fda81ceSLoGin     SIGTRAP,
234fda81ceSLoGin     /// SIGABRT和SIGIOT共用这个号码
244fda81ceSLoGin     SIGABRT_OR_IOT,
254fda81ceSLoGin     SIGBUS,
264fda81ceSLoGin     SIGFPE,
274fda81ceSLoGin     SIGKILL,
284fda81ceSLoGin     SIGUSR1,
294fda81ceSLoGin 
304fda81ceSLoGin     SIGSEGV = 11,
314fda81ceSLoGin     SIGUSR2,
324fda81ceSLoGin     SIGPIPE,
334fda81ceSLoGin     SIGALRM,
344fda81ceSLoGin     SIGTERM,
354fda81ceSLoGin     SIGSTKFLT,
364fda81ceSLoGin     SIGCHLD,
374fda81ceSLoGin     SIGCONT,
384fda81ceSLoGin     SIGSTOP,
394fda81ceSLoGin     SIGTSTP,
404fda81ceSLoGin 
414fda81ceSLoGin     SIGTTIN = 21,
424fda81ceSLoGin     SIGTTOU,
434fda81ceSLoGin     SIGURG,
444fda81ceSLoGin     SIGXCPU,
454fda81ceSLoGin     SIGXFSZ,
464fda81ceSLoGin     SIGVTALRM,
474fda81ceSLoGin     SIGPROF,
484fda81ceSLoGin     SIGWINCH,
494fda81ceSLoGin     /// SIGIO和SIGPOLL共用这个号码
504fda81ceSLoGin     SIGIO_OR_POLL,
514fda81ceSLoGin     SIGPWR,
524fda81ceSLoGin 
534fda81ceSLoGin     SIGSYS = 31,
544fda81ceSLoGin 
554fda81ceSLoGin     SIGRTMIN = 32,
564fda81ceSLoGin     SIGRTMAX = 64,
574fda81ceSLoGin }
584fda81ceSLoGin 
594fda81ceSLoGin /// 为Signal实现判断相等的trait
604fda81ceSLoGin impl PartialEq for Signal {
eq(&self, other: &Signal) -> bool614fda81ceSLoGin     fn eq(&self, other: &Signal) -> bool {
624fda81ceSLoGin         *self as usize == *other as usize
634fda81ceSLoGin     }
644fda81ceSLoGin }
654fda81ceSLoGin 
664fda81ceSLoGin impl From<usize> for Signal {
from(value: usize) -> Self674fda81ceSLoGin     fn from(value: usize) -> Self {
684fda81ceSLoGin         if value <= MAX_SIG_NUM {
694fda81ceSLoGin             let ret: Signal = unsafe { core::mem::transmute(value) };
704fda81ceSLoGin             return ret;
714fda81ceSLoGin         } else {
72*2eab6dd7S曾俊             error!("Try to convert an invalid number to Signal");
734fda81ceSLoGin             return Signal::INVALID;
744fda81ceSLoGin         }
754fda81ceSLoGin     }
764fda81ceSLoGin }
774fda81ceSLoGin 
784fda81ceSLoGin impl Into<usize> for Signal {
into(self) -> usize794fda81ceSLoGin     fn into(self) -> usize {
804fda81ceSLoGin         self as usize
814fda81ceSLoGin     }
824fda81ceSLoGin }
834fda81ceSLoGin 
844fda81ceSLoGin impl From<i32> for Signal {
from(value: i32) -> Self854fda81ceSLoGin     fn from(value: i32) -> Self {
864fda81ceSLoGin         if value < 0 {
87*2eab6dd7S曾俊             error!("Try to convert an invalid number to Signal");
884fda81ceSLoGin             return Signal::INVALID;
894fda81ceSLoGin         } else {
904fda81ceSLoGin             return Self::from(value as usize);
914fda81ceSLoGin         }
924fda81ceSLoGin     }
934fda81ceSLoGin }
944fda81ceSLoGin 
954fda81ceSLoGin impl Into<SigSet> for Signal {
into(self) -> SigSet964fda81ceSLoGin     fn into(self) -> SigSet {
974fda81ceSLoGin         SigSet {
984fda81ceSLoGin             bits: (1 << (self as usize - 1) as u64),
994fda81ceSLoGin         }
1004fda81ceSLoGin     }
1014fda81ceSLoGin }
1024fda81ceSLoGin impl Signal {
1034fda81ceSLoGin     /// 判断一个数字是否为可用的信号
1044fda81ceSLoGin     #[inline]
is_valid(&self) -> bool1054fda81ceSLoGin     pub fn is_valid(&self) -> bool {
1064fda81ceSLoGin         return (*self) as usize <= MAX_SIG_NUM;
1074fda81ceSLoGin     }
1084fda81ceSLoGin 
1094fda81ceSLoGin     /// const convertor between `Signal` and `SigSet`
into_sigset(self) -> SigSet1104fda81ceSLoGin     pub const fn into_sigset(self) -> SigSet {
1114fda81ceSLoGin         SigSet {
1124fda81ceSLoGin             bits: (1 << (self as usize - 1) as u64),
1134fda81ceSLoGin         }
1144fda81ceSLoGin     }
1154fda81ceSLoGin 
1164fda81ceSLoGin     /// 判断一个信号是不是实时信号
1174fda81ceSLoGin     ///
1184fda81ceSLoGin     /// ## 返回值
1194fda81ceSLoGin     ///
1204fda81ceSLoGin     /// - `true` 这个信号是实时信号
1214fda81ceSLoGin     /// - `false` 这个信号不是实时信号
1224fda81ceSLoGin     #[inline]
is_rt_signal(&self) -> bool1234fda81ceSLoGin     pub fn is_rt_signal(&self) -> bool {
1244fda81ceSLoGin         return (*self) as usize >= Signal::SIGRTMIN.into();
1254fda81ceSLoGin     }
1264fda81ceSLoGin 
1274fda81ceSLoGin     /// 调用信号的默认处理函数
handle_default(&self)1284fda81ceSLoGin     pub fn handle_default(&self) {
1294fda81ceSLoGin         match self {
1304fda81ceSLoGin             Signal::INVALID => {
131*2eab6dd7S曾俊                 error!("attempting to handler an Invalid");
1324fda81ceSLoGin             }
1334fda81ceSLoGin             Signal::SIGHUP => sig_terminate(self.clone()),
1344fda81ceSLoGin             Signal::SIGINT => sig_terminate(self.clone()),
1354fda81ceSLoGin             Signal::SIGQUIT => sig_terminate_dump(self.clone()),
1364fda81ceSLoGin             Signal::SIGILL => sig_terminate_dump(self.clone()),
1374fda81ceSLoGin             Signal::SIGTRAP => sig_terminate_dump(self.clone()),
1384fda81ceSLoGin             Signal::SIGABRT_OR_IOT => sig_terminate_dump(self.clone()),
1394fda81ceSLoGin             Signal::SIGBUS => sig_terminate_dump(self.clone()),
1404fda81ceSLoGin             Signal::SIGFPE => sig_terminate_dump(self.clone()),
1414fda81ceSLoGin             Signal::SIGKILL => sig_terminate(self.clone()),
1424fda81ceSLoGin             Signal::SIGUSR1 => sig_terminate(self.clone()),
1434fda81ceSLoGin             Signal::SIGSEGV => sig_terminate_dump(self.clone()),
1444fda81ceSLoGin             Signal::SIGUSR2 => sig_terminate(self.clone()),
1454fda81ceSLoGin             Signal::SIGPIPE => sig_terminate(self.clone()),
1464fda81ceSLoGin             Signal::SIGALRM => sig_terminate(self.clone()),
1474fda81ceSLoGin             Signal::SIGTERM => sig_terminate(self.clone()),
1484fda81ceSLoGin             Signal::SIGSTKFLT => sig_terminate(self.clone()),
1494fda81ceSLoGin             Signal::SIGCHLD => sig_ignore(self.clone()),
1504fda81ceSLoGin             Signal::SIGCONT => sig_continue(self.clone()),
1514fda81ceSLoGin             Signal::SIGSTOP => sig_stop(self.clone()),
1524fda81ceSLoGin             Signal::SIGTSTP => sig_stop(self.clone()),
1534fda81ceSLoGin             Signal::SIGTTIN => sig_stop(self.clone()),
1544fda81ceSLoGin             Signal::SIGTTOU => sig_stop(self.clone()),
1554fda81ceSLoGin             Signal::SIGURG => sig_ignore(self.clone()),
1564fda81ceSLoGin             Signal::SIGXCPU => sig_terminate_dump(self.clone()),
1574fda81ceSLoGin             Signal::SIGXFSZ => sig_terminate_dump(self.clone()),
1584fda81ceSLoGin             Signal::SIGVTALRM => sig_terminate(self.clone()),
1594fda81ceSLoGin             Signal::SIGPROF => sig_terminate(self.clone()),
1604fda81ceSLoGin             Signal::SIGWINCH => sig_ignore(self.clone()),
1614fda81ceSLoGin             Signal::SIGIO_OR_POLL => sig_terminate(self.clone()),
1624fda81ceSLoGin             Signal::SIGPWR => sig_terminate(self.clone()),
1634fda81ceSLoGin             Signal::SIGSYS => sig_terminate(self.clone()),
1644fda81ceSLoGin             Signal::SIGRTMIN => sig_terminate(self.clone()),
1654fda81ceSLoGin             Signal::SIGRTMAX => sig_terminate(self.clone()),
1664fda81ceSLoGin         }
1674fda81ceSLoGin     }
1684fda81ceSLoGin }
1694fda81ceSLoGin 
1704fda81ceSLoGin /// siginfo中的si_code的可选值
1714fda81ceSLoGin /// 请注意,当这个值小于0时,表示siginfo来自用户态,否则来自内核态
1724fda81ceSLoGin #[derive(Copy, Debug, Clone)]
1734fda81ceSLoGin #[repr(i32)]
1744fda81ceSLoGin pub enum SigCode {
1754fda81ceSLoGin     /// sent by kill, sigsend, raise
1764fda81ceSLoGin     User = 0,
1774fda81ceSLoGin     /// sent by kernel from somewhere
1784fda81ceSLoGin     Kernel = 0x80,
1794fda81ceSLoGin     /// 通过sigqueue发送
1804fda81ceSLoGin     Queue = -1,
1814fda81ceSLoGin     /// 定时器过期时发送
1824fda81ceSLoGin     Timer = -2,
1834fda81ceSLoGin     /// 当实时消息队列的状态发生改变时发送
1844fda81ceSLoGin     Mesgq = -3,
1854fda81ceSLoGin     /// 当异步IO完成时发送
1864fda81ceSLoGin     AsyncIO = -4,
1874fda81ceSLoGin     /// sent by queued SIGIO
1884fda81ceSLoGin     SigIO = -5,
1894fda81ceSLoGin }
1904fda81ceSLoGin 
1914fda81ceSLoGin impl SigCode {
1924fda81ceSLoGin     /// 为SigCode这个枚举类型实现从i32转换到枚举类型的转换函数
1934fda81ceSLoGin     #[allow(dead_code)]
from_i32(x: i32) -> SigCode1944fda81ceSLoGin     pub fn from_i32(x: i32) -> SigCode {
1954fda81ceSLoGin         match x {
1964fda81ceSLoGin             0 => Self::User,
1974fda81ceSLoGin             0x80 => Self::Kernel,
1984fda81ceSLoGin             -1 => Self::Queue,
1994fda81ceSLoGin             -2 => Self::Timer,
2004fda81ceSLoGin             -3 => Self::Mesgq,
2014fda81ceSLoGin             -4 => Self::AsyncIO,
2024fda81ceSLoGin             -5 => Self::SigIO,
2034fda81ceSLoGin             _ => panic!("signal code not valid"),
2044fda81ceSLoGin         }
2054fda81ceSLoGin     }
2064fda81ceSLoGin }
2074fda81ceSLoGin 
2084fda81ceSLoGin bitflags! {
2094fda81ceSLoGin     #[repr(C,align(8))]
2104fda81ceSLoGin     #[derive(Default)]
2114fda81ceSLoGin     pub struct SigFlags:u32{
2124fda81ceSLoGin         const SA_NOCLDSTOP =  1;
2134fda81ceSLoGin         const SA_NOCLDWAIT = 2;
2144fda81ceSLoGin         const SA_SIGINFO   = 4;
2154fda81ceSLoGin         const SA_ONSTACK   = 0x08000000;
2164fda81ceSLoGin         const SA_RESTART   = 0x10000000;
2174fda81ceSLoGin         const SA_NODEFER  = 0x40000000;
2184fda81ceSLoGin         const SA_RESETHAND = 0x80000000;
2194fda81ceSLoGin         const SA_RESTORER   =0x04000000;
2204fda81ceSLoGin         const SA_ALL = Self::SA_NOCLDSTOP.bits()|Self::SA_NOCLDWAIT.bits()|Self::SA_NODEFER.bits()|Self::SA_ONSTACK.bits()|Self::SA_RESETHAND.bits()|Self::SA_RESTART.bits()|Self::SA_SIGINFO.bits()|Self::SA_RESTORER.bits();
2214fda81ceSLoGin     }
2224fda81ceSLoGin 
2234fda81ceSLoGin     /// 请注意,sigset 这个bitmap, 第0位表示sig=1的信号。也就是说,Signal-1才是sigset_t中对应的位
2244fda81ceSLoGin     #[derive(Default)]
2254fda81ceSLoGin     pub struct SigSet:u64{
2264fda81ceSLoGin         const SIGHUP   =  1<<0;
2274fda81ceSLoGin         const SIGINT   =  1<<1;
2284fda81ceSLoGin         const SIGQUIT  =  1<<2;
2294fda81ceSLoGin         const SIGILL   =  1<<3;
2304fda81ceSLoGin         const SIGTRAP  =  1<<4;
2314fda81ceSLoGin         /// SIGABRT和SIGIOT共用这个号码
2324fda81ceSLoGin         const SIGABRT_OR_IOT    =    1<<5;
2334fda81ceSLoGin         const SIGBUS   =  1<<6;
2344fda81ceSLoGin         const SIGFPE   =  1<<7;
2354fda81ceSLoGin         const SIGKILL  =  1<<8;
2364fda81ceSLoGin         const SIGUSR   =  1<<9;
2374fda81ceSLoGin         const SIGSEGV  =  1<<10;
2384fda81ceSLoGin         const SIGUSR2  =  1<<11;
2394fda81ceSLoGin         const SIGPIPE  =  1<<12;
2404fda81ceSLoGin         const SIGALRM  =  1<<13;
2414fda81ceSLoGin         const SIGTERM  =  1<<14;
2424fda81ceSLoGin         const SIGSTKFLT=  1<<15;
2434fda81ceSLoGin         const SIGCHLD  =  1<<16;
2444fda81ceSLoGin         const SIGCONT  =  1<<17;
2454fda81ceSLoGin         const SIGSTOP  =  1<<18;
2464fda81ceSLoGin         const SIGTSTP  =  1<<19;
2474fda81ceSLoGin         const SIGTTIN  =  1<<20;
2484fda81ceSLoGin         const SIGTTOU  =  1<<21;
2494fda81ceSLoGin         const SIGURG   =  1<<22;
2504fda81ceSLoGin         const SIGXCPU  =  1<<23;
2514fda81ceSLoGin         const SIGXFSZ  =  1<<24;
2524fda81ceSLoGin         const SIGVTALRM=  1<<25;
2534fda81ceSLoGin         const SIGPROF  =  1<<26;
2544fda81ceSLoGin         const SIGWINCH =  1<<27;
2554fda81ceSLoGin         /// SIGIO和SIGPOLL共用这个号码
2564fda81ceSLoGin         const SIGIO_OR_POLL    =   1<<28;
2574fda81ceSLoGin         const SIGPWR   =  1<<29;
2584fda81ceSLoGin         const SIGSYS   =  1<<30;
2594fda81ceSLoGin         const SIGRTMIN =  1<<31;
2604fda81ceSLoGin         // TODO 写上实时信号
2614fda81ceSLoGin         const SIGRTMAX =  1<<MAX_SIG_NUM-1;
2624fda81ceSLoGin     }
2634fda81ceSLoGin }
2644fda81ceSLoGin 
2654fda81ceSLoGin /// SIGCHLD si_codes
2664fda81ceSLoGin #[derive(Debug, Clone, Copy, PartialEq, Eq, ToPrimitive)]
2674fda81ceSLoGin #[allow(dead_code)]
2684fda81ceSLoGin pub enum SigChildCode {
2694fda81ceSLoGin     /// child has exited
2704fda81ceSLoGin     ///
2714fda81ceSLoGin     /// CLD_EXITED
2724fda81ceSLoGin     Exited = 1,
2734fda81ceSLoGin     /// child was killed
2744fda81ceSLoGin     ///
2754fda81ceSLoGin     /// CLD_KILLED
2764fda81ceSLoGin     Killed = 2,
2774fda81ceSLoGin     /// child terminated abnormally
2784fda81ceSLoGin     ///
2794fda81ceSLoGin     /// CLD_DUMPED
2804fda81ceSLoGin     Dumped = 3,
2814fda81ceSLoGin     /// traced child has trapped
2824fda81ceSLoGin     ///
2834fda81ceSLoGin     /// CLD_TRAPPED
2844fda81ceSLoGin     Trapped = 4,
2854fda81ceSLoGin     /// child has stopped
2864fda81ceSLoGin     ///
2874fda81ceSLoGin     /// CLD_STOPPED
2884fda81ceSLoGin     Stopped = 5,
2894fda81ceSLoGin     /// stopped child has continued
2904fda81ceSLoGin     ///
2914fda81ceSLoGin     /// CLD_CONTINUED
2924fda81ceSLoGin     Continued = 6,
2934fda81ceSLoGin }
2944fda81ceSLoGin 
2954fda81ceSLoGin impl Into<i32> for SigChildCode {
into(self) -> i322964fda81ceSLoGin     fn into(self) -> i32 {
2974fda81ceSLoGin         self as i32
2984fda81ceSLoGin     }
2994fda81ceSLoGin }
3004fda81ceSLoGin 
3014fda81ceSLoGin /// 信号默认处理函数——终止进程
sig_terminate(sig: Signal)3024fda81ceSLoGin fn sig_terminate(sig: Signal) {
3034fda81ceSLoGin     ProcessManager::exit(sig as usize);
3044fda81ceSLoGin }
3054fda81ceSLoGin 
3064fda81ceSLoGin /// 信号默认处理函数——终止进程并生成 core dump
sig_terminate_dump(sig: Signal)3074fda81ceSLoGin fn sig_terminate_dump(sig: Signal) {
3084fda81ceSLoGin     ProcessManager::exit(sig as usize);
3094fda81ceSLoGin     // TODO 生成 coredump 文件
3104fda81ceSLoGin }
3114fda81ceSLoGin 
3124fda81ceSLoGin /// 信号默认处理函数——暂停进程
sig_stop(sig: Signal)3134fda81ceSLoGin fn sig_stop(sig: Signal) {
3144fda81ceSLoGin     let guard = unsafe { CurrentIrqArch::save_and_disable_irq() };
3154fda81ceSLoGin     ProcessManager::mark_stop().unwrap_or_else(|e| {
316*2eab6dd7S曾俊         error!(
3174fda81ceSLoGin             "sleep error :{:?},failed to sleep process :{:?}, with signal :{:?}",
3184fda81ceSLoGin             e,
3194fda81ceSLoGin             ProcessManager::current_pcb(),
3204fda81ceSLoGin             sig
3214fda81ceSLoGin         );
3224fda81ceSLoGin     });
3234fda81ceSLoGin     drop(guard);
3244fda81ceSLoGin     sched();
3254fda81ceSLoGin     // TODO 暂停进程
3264fda81ceSLoGin }
3274fda81ceSLoGin 
3284fda81ceSLoGin /// 信号默认处理函数——继续进程
sig_continue(sig: Signal)3294fda81ceSLoGin fn sig_continue(sig: Signal) {
3304fda81ceSLoGin     ProcessManager::wakeup_stop(&ProcessManager::current_pcb()).unwrap_or_else(|_| {
331*2eab6dd7S曾俊         error!(
3324fda81ceSLoGin             "Failed to wake up process pid = {:?} with signal :{:?}",
3334fda81ceSLoGin             ProcessManager::current_pcb().pid(),
3344fda81ceSLoGin             sig
3354fda81ceSLoGin         );
3364fda81ceSLoGin     });
3374fda81ceSLoGin }
3384fda81ceSLoGin /// 信号默认处理函数——忽略
sig_ignore(_sig: Signal)3394fda81ceSLoGin fn sig_ignore(_sig: Signal) {
3404fda81ceSLoGin     return;
3414fda81ceSLoGin }
342