signal.rs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734
  1. use core::{ffi::c_void, intrinsics::unlikely, mem::size_of};
  2. use log::error;
  3. use system_error::SystemError;
  4. use crate::{
  5. arch::{
  6. fpu::FpState,
  7. interrupt::TrapFrame,
  8. process::table::{USER_CS, USER_DS},
  9. CurrentIrqArch, MMArch,
  10. },
  11. exception::InterruptArch,
  12. ipc::{
  13. signal::set_current_sig_blocked,
  14. signal_types::{SaHandlerType, SigInfo, Sigaction, SigactionType, SignalArch},
  15. },
  16. mm::MemoryManagementArch,
  17. process::ProcessManager,
  18. sched::{schedule, SchedMode},
  19. syscall::{user_access::UserBufferWriter, Syscall},
  20. };
  21. /// 信号处理的栈的栈指针的最小对齐数量
  22. pub const STACK_ALIGN: u64 = 16;
  23. /// 信号最大值
  24. pub const MAX_SIG_NUM: usize = 64;
  25. #[allow(dead_code)]
  26. #[derive(Eq)]
  27. #[repr(usize)]
  28. #[allow(non_camel_case_types)]
  29. #[atomic_enum]
  30. pub enum Signal {
  31. INVALID = 0,
  32. SIGHUP = 1,
  33. SIGINT,
  34. SIGQUIT,
  35. SIGILL,
  36. SIGTRAP,
  37. /// SIGABRT和SIGIOT共用这个号码
  38. SIGABRT_OR_IOT,
  39. SIGBUS,
  40. SIGFPE,
  41. SIGKILL,
  42. SIGUSR1,
  43. SIGSEGV = 11,
  44. SIGUSR2,
  45. SIGPIPE,
  46. SIGALRM,
  47. SIGTERM,
  48. SIGSTKFLT,
  49. SIGCHLD,
  50. SIGCONT,
  51. SIGSTOP,
  52. SIGTSTP,
  53. SIGTTIN = 21,
  54. SIGTTOU,
  55. SIGURG,
  56. SIGXCPU,
  57. SIGXFSZ,
  58. SIGVTALRM,
  59. SIGPROF,
  60. SIGWINCH,
  61. /// SIGIO和SIGPOLL共用这个号码
  62. SIGIO_OR_POLL,
  63. SIGPWR,
  64. SIGSYS = 31,
  65. SIGRTMIN = 32,
  66. SIGRTMAX = 64,
  67. }
  68. /// 为Signal实现判断相等的trait
  69. impl PartialEq for Signal {
  70. fn eq(&self, other: &Signal) -> bool {
  71. *self as usize == *other as usize
  72. }
  73. }
  74. impl From<usize> for Signal {
  75. fn from(value: usize) -> Self {
  76. if value <= MAX_SIG_NUM {
  77. let ret: Signal = unsafe { core::mem::transmute(value) };
  78. return ret;
  79. } else {
  80. error!("Try to convert an invalid number to Signal");
  81. return Signal::INVALID;
  82. }
  83. }
  84. }
  85. impl From<Signal> for usize {
  86. fn from(val: Signal) -> Self {
  87. val as usize
  88. }
  89. }
  90. impl From<i32> for Signal {
  91. fn from(value: i32) -> Self {
  92. if value < 0 {
  93. error!("Try to convert an invalid number to Signal");
  94. return Signal::INVALID;
  95. } else {
  96. return Self::from(value as usize);
  97. }
  98. }
  99. }
  100. impl From<Signal> for SigSet {
  101. fn from(val: Signal) -> Self {
  102. SigSet {
  103. bits: (1 << (val as usize - 1) as u64),
  104. }
  105. }
  106. }
  107. impl Signal {
  108. /// 判断一个数字是否为可用的信号
  109. #[inline]
  110. pub fn is_valid(&self) -> bool {
  111. return (*self) as usize <= MAX_SIG_NUM;
  112. }
  113. /// const convertor between `Signal` and `SigSet`
  114. pub const fn into_sigset(self) -> SigSet {
  115. SigSet {
  116. bits: (1 << (self as usize - 1) as u64),
  117. }
  118. }
  119. /// 判断一个信号是不是实时信号
  120. ///
  121. /// ## 返回值
  122. ///
  123. /// - `true` 这个信号是实时信号
  124. /// - `false` 这个信号不是实时信号
  125. #[inline]
  126. pub fn is_rt_signal(&self) -> bool {
  127. return (*self) as usize >= Signal::SIGRTMIN.into();
  128. }
  129. /// 调用信号的默认处理函数
  130. pub fn handle_default(&self) {
  131. match self {
  132. Signal::INVALID => {
  133. error!("attempting to handler an Invalid");
  134. }
  135. Signal::SIGHUP => sig_terminate(*self),
  136. Signal::SIGINT => sig_terminate(*self),
  137. Signal::SIGQUIT => sig_terminate_dump(*self),
  138. Signal::SIGILL => sig_terminate_dump(*self),
  139. Signal::SIGTRAP => sig_terminate_dump(*self),
  140. Signal::SIGABRT_OR_IOT => sig_terminate_dump(*self),
  141. Signal::SIGBUS => sig_terminate_dump(*self),
  142. Signal::SIGFPE => sig_terminate_dump(*self),
  143. Signal::SIGKILL => sig_terminate(*self),
  144. Signal::SIGUSR1 => sig_terminate(*self),
  145. Signal::SIGSEGV => sig_terminate_dump(*self),
  146. Signal::SIGUSR2 => sig_terminate(*self),
  147. Signal::SIGPIPE => sig_terminate(*self),
  148. Signal::SIGALRM => sig_terminate(*self),
  149. Signal::SIGTERM => sig_terminate(*self),
  150. Signal::SIGSTKFLT => sig_terminate(*self),
  151. Signal::SIGCHLD => sig_ignore(*self),
  152. Signal::SIGCONT => sig_continue(*self),
  153. Signal::SIGSTOP => sig_stop(*self),
  154. Signal::SIGTSTP => sig_stop(*self),
  155. Signal::SIGTTIN => sig_stop(*self),
  156. Signal::SIGTTOU => sig_stop(*self),
  157. Signal::SIGURG => sig_ignore(*self),
  158. Signal::SIGXCPU => sig_terminate_dump(*self),
  159. Signal::SIGXFSZ => sig_terminate_dump(*self),
  160. Signal::SIGVTALRM => sig_terminate(*self),
  161. Signal::SIGPROF => sig_terminate(*self),
  162. Signal::SIGWINCH => sig_ignore(*self),
  163. Signal::SIGIO_OR_POLL => sig_terminate(*self),
  164. Signal::SIGPWR => sig_terminate(*self),
  165. Signal::SIGSYS => sig_terminate(*self),
  166. Signal::SIGRTMIN => sig_terminate(*self),
  167. Signal::SIGRTMAX => sig_terminate(*self),
  168. }
  169. }
  170. }
  171. /// siginfo中的si_code的可选值
  172. /// 请注意,当这个值小于0时,表示siginfo来自用户态,否则来自内核态
  173. #[derive(Copy, Debug, Clone)]
  174. #[repr(i32)]
  175. pub enum SigCode {
  176. /// sent by kill, sigsend, raise
  177. User = 0,
  178. /// sent by kernel from somewhere
  179. Kernel = 0x80,
  180. /// 通过sigqueue发送
  181. Queue = -1,
  182. /// 定时器过期时发送
  183. Timer = -2,
  184. /// 当实时消息队列的状态发生改变时发送
  185. Mesgq = -3,
  186. /// 当异步IO完成时发送
  187. AsyncIO = -4,
  188. /// sent by queued SIGIO
  189. SigIO = -5,
  190. }
  191. impl SigCode {
  192. /// 为SigCode这个枚举类型实现从i32转换到枚举类型的转换函数
  193. #[allow(dead_code)]
  194. pub fn from_i32(x: i32) -> SigCode {
  195. match x {
  196. 0 => Self::User,
  197. 0x80 => Self::Kernel,
  198. -1 => Self::Queue,
  199. -2 => Self::Timer,
  200. -3 => Self::Mesgq,
  201. -4 => Self::AsyncIO,
  202. -5 => Self::SigIO,
  203. _ => panic!("signal code not valid"),
  204. }
  205. }
  206. }
  207. bitflags! {
  208. #[repr(C,align(8))]
  209. #[derive(Default)]
  210. pub struct SigFlags:u32{
  211. const SA_NOCLDSTOP = 1;
  212. const SA_NOCLDWAIT = 2;
  213. const SA_SIGINFO = 4;
  214. const SA_ONSTACK = 0x08000000;
  215. const SA_RESTART = 0x10000000;
  216. const SA_NODEFER = 0x40000000;
  217. const SA_RESETHAND = 0x80000000;
  218. const SA_RESTORER =0x04000000;
  219. 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();
  220. }
  221. /// 请注意,sigset 这个bitmap, 第0位表示sig=1的信号。也就是说,Signal-1才是sigset_t中对应的位
  222. #[derive(Default)]
  223. pub struct SigSet:u64{
  224. const SIGHUP = 1<<0;
  225. const SIGINT = 1<<1;
  226. const SIGQUIT = 1<<2;
  227. const SIGILL = 1<<3;
  228. const SIGTRAP = 1<<4;
  229. /// SIGABRT和SIGIOT共用这个号码
  230. const SIGABRT_OR_IOT = 1<<5;
  231. const SIGBUS = 1<<6;
  232. const SIGFPE = 1<<7;
  233. const SIGKILL = 1<<8;
  234. const SIGUSR = 1<<9;
  235. const SIGSEGV = 1<<10;
  236. const SIGUSR2 = 1<<11;
  237. const SIGPIPE = 1<<12;
  238. const SIGALRM = 1<<13;
  239. const SIGTERM = 1<<14;
  240. const SIGSTKFLT= 1<<15;
  241. const SIGCHLD = 1<<16;
  242. const SIGCONT = 1<<17;
  243. const SIGSTOP = 1<<18;
  244. const SIGTSTP = 1<<19;
  245. const SIGTTIN = 1<<20;
  246. const SIGTTOU = 1<<21;
  247. const SIGURG = 1<<22;
  248. const SIGXCPU = 1<<23;
  249. const SIGXFSZ = 1<<24;
  250. const SIGVTALRM= 1<<25;
  251. const SIGPROF = 1<<26;
  252. const SIGWINCH = 1<<27;
  253. /// SIGIO和SIGPOLL共用这个号码
  254. const SIGIO_OR_POLL = 1<<28;
  255. const SIGPWR = 1<<29;
  256. const SIGSYS = 1<<30;
  257. const SIGRTMIN = 1<<31;
  258. // TODO 写上实时信号
  259. const SIGRTMAX = 1 << (MAX_SIG_NUM-1);
  260. }
  261. }
  262. /// SIGCHLD si_codes
  263. #[derive(Debug, Clone, Copy, PartialEq, Eq, ToPrimitive)]
  264. #[allow(dead_code)]
  265. pub enum SigChildCode {
  266. /// child has exited
  267. ///
  268. /// CLD_EXITED
  269. Exited = 1,
  270. /// child was killed
  271. ///
  272. /// CLD_KILLED
  273. Killed = 2,
  274. /// child terminated abnormally
  275. ///
  276. /// CLD_DUMPED
  277. Dumped = 3,
  278. /// traced child has trapped
  279. ///
  280. /// CLD_TRAPPED
  281. Trapped = 4,
  282. /// child has stopped
  283. ///
  284. /// CLD_STOPPED
  285. Stopped = 5,
  286. /// stopped child has continued
  287. ///
  288. /// CLD_CONTINUED
  289. Continued = 6,
  290. }
  291. impl From<SigChildCode> for i32 {
  292. fn from(value: SigChildCode) -> Self {
  293. value as i32
  294. }
  295. }
  296. #[repr(C, align(16))]
  297. #[derive(Debug, Clone, Copy)]
  298. pub struct SigFrame {
  299. // pub pedding: u64,
  300. /// 指向restorer的地址的指针。(该变量必须放在sigframe的第一位,因为这样才能在handler返回的时候,跳转到对应的代码,执行sigreturn)
  301. pub ret_code_ptr: *mut core::ffi::c_void,
  302. pub handler: *mut c_void,
  303. pub info: SigInfo,
  304. pub context: SigContext,
  305. }
  306. #[repr(C, align(16))]
  307. #[derive(Debug, Clone, Copy)]
  308. pub struct SigContext {
  309. /// sigcontext的标志位
  310. pub sc_flags: u64,
  311. pub sc_stack: SigStack, // 信号处理程序备用栈信息
  312. pub frame: TrapFrame, // 暂存的系统调用/中断返回时,原本要弹出的内核栈帧
  313. // pub trap_num: u64, // 用来保存线程结构体中的trap_num字段
  314. pub oldmask: SigSet, // 暂存的执行信号处理函数之前的,被设置block的信号
  315. pub cr2: u64, // 用来保存线程结构体中的cr2字段
  316. // pub err_code: u64, // 用来保存线程结构体中的err_code字段
  317. pub reserved_for_x87_state: Option<FpState>,
  318. pub reserved: [u64; 8],
  319. }
  320. impl SigContext {
  321. /// 设置sigcontext
  322. ///
  323. /// ## 参数
  324. ///
  325. /// - `mask` 要被暂存的信号mask标志位
  326. /// - `regs` 进入信号处理流程前,Restore all要弹出的内核栈栈帧
  327. ///
  328. /// ## 返回值
  329. ///
  330. /// - `Ok(0)`
  331. /// - `Err(Systemerror)` (暂时不会返回错误)
  332. pub fn setup_sigcontext(
  333. &mut self,
  334. mask: &SigSet,
  335. frame: &TrapFrame,
  336. ) -> Result<i32, SystemError> {
  337. //TODO 引入线程后补上
  338. // let current_thread = ProcessManager::current_pcb().thread;
  339. let pcb = ProcessManager::current_pcb();
  340. let mut archinfo_guard = pcb.arch_info_irqsave();
  341. self.oldmask = *mask;
  342. self.frame = *frame;
  343. // context.trap_num = unsafe { (*current_thread).trap_num };
  344. // context.err_code = unsafe { (*current_thread).err_code };
  345. // context.cr2 = unsafe { (*current_thread).cr2 };
  346. self.reserved_for_x87_state = *archinfo_guard.fp_state();
  347. // 保存完毕后,清空fp_state,以免下次save的时候,出现SIMD exception
  348. archinfo_guard.clear_fp_state();
  349. return Ok(0);
  350. }
  351. /// 指定的sigcontext恢复到当前进程的内核栈帧中,并将当前线程结构体的几个参数进行恢复
  352. ///
  353. /// ## 参数
  354. /// - `frame` 目标栈帧(也就是把context恢复到这个栈帧中)
  355. ///
  356. /// ##返回值
  357. /// - `true` -> 成功恢复
  358. /// - `false` -> 执行失败
  359. pub fn restore_sigcontext(&mut self, frame: &mut TrapFrame) -> bool {
  360. let guard = ProcessManager::current_pcb();
  361. let mut arch_info = guard.arch_info_irqsave();
  362. (*frame) = self.frame;
  363. // (*current_thread).trap_num = (*context).trap_num;
  364. *arch_info.cr2_mut() = self.cr2 as usize;
  365. // (*current_thread).err_code = (*context).err_code;
  366. // 如果当前进程有fpstate,则将其恢复到pcb的fp_state中
  367. *arch_info.fp_state_mut() = self.reserved_for_x87_state;
  368. arch_info.restore_fp_state();
  369. return true;
  370. }
  371. }
  372. /// @brief 信号处理备用栈的信息
  373. #[derive(Debug, Clone, Copy)]
  374. pub struct SigStack {
  375. pub sp: *mut c_void,
  376. pub flags: u32,
  377. pub size: u32,
  378. pub fpstate: FpState,
  379. }
  380. #[no_mangle]
  381. unsafe extern "C" fn do_signal(frame: &mut TrapFrame) {
  382. X86_64SignalArch::do_signal(frame);
  383. return;
  384. }
  385. pub struct X86_64SignalArch;
  386. impl SignalArch for X86_64SignalArch {
  387. unsafe fn do_signal(frame: &mut TrapFrame) {
  388. let pcb = ProcessManager::current_pcb();
  389. let siginfo = pcb.try_siginfo_irqsave(5);
  390. if unlikely(siginfo.is_none()) {
  391. return;
  392. }
  393. let siginfo_read_guard = siginfo.unwrap();
  394. // 检查sigpending是否为0
  395. if siginfo_read_guard.sig_pending().signal().bits() == 0 || !frame.is_from_user() {
  396. // 若没有正在等待处理的信号,或者将要返回到的是内核态,则返回
  397. return;
  398. }
  399. let pcb = ProcessManager::current_pcb();
  400. let mut sig_number: Signal;
  401. let mut info: Option<SigInfo>;
  402. let mut sigaction: Sigaction;
  403. let sig_block: SigSet = *siginfo_read_guard.sig_block();
  404. drop(siginfo_read_guard);
  405. let sig_guard = pcb.try_sig_struct_irqsave(5);
  406. if unlikely(sig_guard.is_none()) {
  407. return;
  408. }
  409. let siginfo_mut = pcb.try_siginfo_mut(5);
  410. if unlikely(siginfo_mut.is_none()) {
  411. return;
  412. }
  413. let sig_guard = sig_guard.unwrap();
  414. let mut siginfo_mut_guard = siginfo_mut.unwrap();
  415. loop {
  416. (sig_number, info) = siginfo_mut_guard.dequeue_signal(&sig_block);
  417. // 如果信号非法,则直接返回
  418. if sig_number == Signal::INVALID {
  419. return;
  420. }
  421. sigaction = sig_guard.handlers[sig_number as usize - 1];
  422. match sigaction.action() {
  423. SigactionType::SaHandler(action_type) => match action_type {
  424. SaHandlerType::Error => {
  425. error!("Trying to handle a Sigerror on Process:{:?}", pcb.pid());
  426. return;
  427. }
  428. SaHandlerType::Default => {
  429. sigaction = Sigaction::default();
  430. break;
  431. }
  432. SaHandlerType::Ignore => continue,
  433. SaHandlerType::Customized(_) => {
  434. break;
  435. }
  436. },
  437. SigactionType::SaSigaction(_) => todo!(),
  438. }
  439. // 如果当前动作是忽略这个信号,就继续循环。
  440. }
  441. let oldset = *siginfo_mut_guard.sig_block();
  442. //避免死锁
  443. drop(siginfo_mut_guard);
  444. drop(sig_guard);
  445. // 做完上面的检查后,开中断
  446. CurrentIrqArch::interrupt_enable();
  447. let res: Result<i32, SystemError> =
  448. handle_signal(sig_number, &mut sigaction, &info.unwrap(), &oldset, frame);
  449. if res.is_err() {
  450. error!(
  451. "Error occurred when handling signal: {}, pid={:?}, errcode={:?}",
  452. sig_number as i32,
  453. ProcessManager::current_pcb().pid(),
  454. res.as_ref().unwrap_err()
  455. );
  456. }
  457. }
  458. fn sys_rt_sigreturn(trap_frame: &mut TrapFrame) -> u64 {
  459. let frame = (trap_frame.rsp as usize - size_of::<u64>()) as *mut SigFrame;
  460. // 如果当前的rsp不来自用户态,则认为产生了错误(或被SROP攻击)
  461. if UserBufferWriter::new(frame, size_of::<SigFrame>(), true).is_err() {
  462. error!("rsp doesn't from user level");
  463. let _r = Syscall::kill(ProcessManager::current_pcb().pid(), Signal::SIGSEGV as i32)
  464. .map_err(|e| e.to_posix_errno());
  465. return trap_frame.rax;
  466. }
  467. let mut sigmask: SigSet = unsafe { (*frame).context.oldmask };
  468. set_current_sig_blocked(&mut sigmask);
  469. // 从用户栈恢复sigcontext
  470. if !unsafe { &mut (*frame).context }.restore_sigcontext(trap_frame) {
  471. error!("unable to restore sigcontext");
  472. let _r = Syscall::kill(ProcessManager::current_pcb().pid(), Signal::SIGSEGV as i32)
  473. .map_err(|e| e.to_posix_errno());
  474. // 如果这里返回 err 值的话会丢失上一个系统调用的返回值
  475. }
  476. // 由于系统调用的返回值会被系统调用模块被存放在rax寄存器,因此,为了还原原来的那个系统调用的返回值,我们需要在这里返回恢复后的rax的值
  477. return trap_frame.rax;
  478. }
  479. }
  480. /// @brief 真正发送signal,执行自定义的处理函数
  481. ///
  482. /// @param sig 信号number
  483. /// @param sigaction 信号响应动作
  484. /// @param info 信号信息
  485. /// @param oldset
  486. /// @param regs 之前的系统调用将要返回的时候,要弹出的栈帧的拷贝
  487. ///
  488. /// @return Result<0,SystemError> 若Error, 则返回错误码,否则返回Ok(0)
  489. fn handle_signal(
  490. sig: Signal,
  491. sigaction: &mut Sigaction,
  492. info: &SigInfo,
  493. oldset: &SigSet,
  494. frame: &mut TrapFrame,
  495. ) -> Result<i32, SystemError> {
  496. // TODO 这里要补充一段逻辑,好像是为了保证引入线程之后的地址空间不会出问题。详见https://code.dragonos.org.cn/xref/linux-6.1.9/arch/mips/kernel/signal.c#830
  497. // 设置栈帧
  498. return setup_frame(sig, sigaction, info, oldset, frame);
  499. }
  500. /// @brief 在用户栈上开辟一块空间,并且把内核栈的栈帧以及需要在用户态执行的代码给保存进去。
  501. ///
  502. /// @param regs 进入信号处理流程前,Restore all要弹出的内核栈栈帧
  503. fn setup_frame(
  504. sig: Signal,
  505. sigaction: &mut Sigaction,
  506. info: &SigInfo,
  507. oldset: &SigSet,
  508. trap_frame: &mut TrapFrame,
  509. ) -> Result<i32, SystemError> {
  510. let ret_code_ptr: *mut c_void;
  511. let temp_handler: *mut c_void;
  512. match sigaction.action() {
  513. SigactionType::SaHandler(handler_type) => match handler_type {
  514. SaHandlerType::Default => {
  515. sig.handle_default();
  516. return Ok(0);
  517. }
  518. SaHandlerType::Customized(handler) => {
  519. // 如果handler位于内核空间
  520. if handler >= MMArch::USER_END_VADDR {
  521. // 如果当前是SIGSEGV,则采用默认函数处理
  522. if sig == Signal::SIGSEGV {
  523. sig.handle_default();
  524. return Ok(0);
  525. } else {
  526. error!("attempting to execute a signal handler from kernel");
  527. sig.handle_default();
  528. return Err(SystemError::EINVAL);
  529. }
  530. } else {
  531. // 为了与Linux的兼容性,64位程序必须由用户自行指定restorer
  532. if sigaction.flags().contains(SigFlags::SA_RESTORER) {
  533. ret_code_ptr = sigaction.restorer().unwrap().data() as *mut c_void;
  534. } else {
  535. error!(
  536. "pid-{:?} forgot to set SA_FLAG_RESTORER for signal {:?}",
  537. ProcessManager::current_pcb().pid(),
  538. sig as i32
  539. );
  540. let r = Syscall::kill(
  541. ProcessManager::current_pcb().pid(),
  542. Signal::SIGSEGV as i32,
  543. );
  544. if r.is_err() {
  545. error!("In setup_sigcontext: generate SIGSEGV signal failed");
  546. }
  547. return Err(SystemError::EINVAL);
  548. }
  549. if sigaction.restorer().is_none() {
  550. error!(
  551. "restorer in process:{:?} is not defined",
  552. ProcessManager::current_pcb().pid()
  553. );
  554. return Err(SystemError::EINVAL);
  555. }
  556. temp_handler = handler.data() as *mut c_void;
  557. }
  558. }
  559. SaHandlerType::Ignore => {
  560. return Ok(0);
  561. }
  562. _ => {
  563. return Err(SystemError::EINVAL);
  564. }
  565. },
  566. SigactionType::SaSigaction(_) => {
  567. //TODO 这里应该是可以恢复栈的,等后续来做
  568. error!("trying to recover from sigaction type instead of handler");
  569. return Err(SystemError::EINVAL);
  570. }
  571. }
  572. let frame: *mut SigFrame = get_stack(trap_frame, size_of::<SigFrame>());
  573. // debug!("frame=0x{:016x}", frame as usize);
  574. // 要求这个frame的地址位于用户空间,因此进行校验
  575. let r: Result<UserBufferWriter<'_>, SystemError> =
  576. UserBufferWriter::new(frame, size_of::<SigFrame>(), true);
  577. if r.is_err() {
  578. // 如果地址区域位于内核空间,则直接报错
  579. // todo: 生成一个sigsegv
  580. let r = Syscall::kill(ProcessManager::current_pcb().pid(), Signal::SIGSEGV as i32);
  581. if r.is_err() {
  582. error!("In setup frame: generate SIGSEGV signal failed");
  583. }
  584. error!("In setup frame: access check failed");
  585. return Err(SystemError::EFAULT);
  586. }
  587. // 将siginfo拷贝到用户栈
  588. info.copy_siginfo_to_user(unsafe { &mut ((*frame).info) as *mut SigInfo })
  589. .map_err(|e| -> SystemError {
  590. let r = Syscall::kill(ProcessManager::current_pcb().pid(), Signal::SIGSEGV as i32);
  591. if r.is_err() {
  592. error!("In copy_siginfo_to_user: generate SIGSEGV signal failed");
  593. }
  594. return e;
  595. })?;
  596. // todo: 拷贝处理程序备用栈的地址、大小、ss_flags
  597. unsafe {
  598. (*frame)
  599. .context
  600. .setup_sigcontext(oldset, trap_frame)
  601. .map_err(|e: SystemError| -> SystemError {
  602. let r = Syscall::kill(ProcessManager::current_pcb().pid(), Signal::SIGSEGV as i32);
  603. if r.is_err() {
  604. error!("In setup_sigcontext: generate SIGSEGV signal failed");
  605. }
  606. return e;
  607. })?
  608. };
  609. unsafe {
  610. // 在开头检验过sigaction.restorer是否为空了,实际上libc会保证 restorer始终不为空
  611. (*frame).ret_code_ptr = ret_code_ptr;
  612. }
  613. unsafe { (*frame).handler = temp_handler };
  614. // 传入信号处理函数的第一个参数
  615. trap_frame.rdi = sig as u64;
  616. trap_frame.rsi = unsafe { &(*frame).info as *const SigInfo as u64 };
  617. trap_frame.rsp = frame as u64;
  618. trap_frame.rip = unsafe { (*frame).handler as u64 };
  619. // 设置cs和ds寄存器
  620. trap_frame.cs = (USER_CS.bits() | 0x3) as u64;
  621. trap_frame.ds = (USER_DS.bits() | 0x3) as u64;
  622. // 禁用中断
  623. // trap_frame.rflags &= !(0x200);
  624. return Ok(0);
  625. }
  626. #[inline(always)]
  627. fn get_stack(frame: &TrapFrame, size: usize) -> *mut SigFrame {
  628. // TODO:在 linux 中会根据 Sigaction 中的一个flag 的值来确定是否使用pcb中的 signal 处理程序备用堆栈,现在的
  629. // pcb中也没有这个备用堆栈
  630. // 默认使用 用户栈的栈顶指针-128字节的红区-sigframe的大小 并且16字节对齐
  631. let mut rsp: usize = (frame.rsp as usize) - 128 - size;
  632. // 按照要求进行对齐,别问为什么减8,不减8就是错的,可以看
  633. // https://sourcegraph.com/github.com/torvalds/linux@dd72f9c7e512da377074d47d990564959b772643/-/blob/arch/x86/kernel/signal.c?L124
  634. // 我猜测是跟x86汇编的某些弹栈行为有关系,它可能会出于某种原因递增 rsp
  635. rsp &= (!(STACK_ALIGN - 1)) as usize - 8;
  636. // rsp &= (!(STACK_ALIGN - 1)) as usize;
  637. return rsp as *mut SigFrame;
  638. }
  639. /// 信号默认处理函数——终止进程
  640. fn sig_terminate(sig: Signal) {
  641. ProcessManager::exit(sig as usize);
  642. }
  643. /// 信号默认处理函数——终止进程并生成 core dump
  644. fn sig_terminate_dump(sig: Signal) {
  645. ProcessManager::exit(sig as usize);
  646. // TODO 生成 coredump 文件
  647. }
  648. /// 信号默认处理函数——暂停进程
  649. fn sig_stop(sig: Signal) {
  650. let guard = unsafe { CurrentIrqArch::save_and_disable_irq() };
  651. ProcessManager::mark_stop().unwrap_or_else(|e| {
  652. error!(
  653. "sleep error :{:?},failed to sleep process :{:?}, with signal :{:?}",
  654. e,
  655. ProcessManager::current_pcb(),
  656. sig
  657. );
  658. });
  659. drop(guard);
  660. schedule(SchedMode::SM_NONE);
  661. // TODO 暂停进程
  662. }
  663. /// 信号默认处理函数——继续进程
  664. fn sig_continue(sig: Signal) {
  665. ProcessManager::wakeup_stop(&ProcessManager::current_pcb()).unwrap_or_else(|_| {
  666. error!(
  667. "Failed to wake up process pid = {:?} with signal :{:?}",
  668. ProcessManager::current_pcb().pid(),
  669. sig
  670. );
  671. });
  672. }
  673. /// 信号默认处理函数——忽略
  674. fn sig_ignore(_sig: Signal) {
  675. return;
  676. }