signal.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:19k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * This file is subject to the terms and conditions of the GNU General Public
  3.  * License.  See the file "COPYING" in the main directory of this archive
  4.  * for more details.
  5.  *
  6.  * Copyright (C) 1991, 1992  Linus Torvalds
  7.  * Copyright (C) 1994 - 2000  Ralf Baechle
  8.  * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
  9.  */
  10. #include <linux/config.h>
  11. #include <linux/sched.h>
  12. #include <linux/mm.h>
  13. #include <linux/smp.h>
  14. #include <linux/smp_lock.h>
  15. #include <linux/kernel.h>
  16. #include <linux/signal.h>
  17. #include <linux/errno.h>
  18. #include <linux/wait.h>
  19. #include <linux/ptrace.h>
  20. #include <linux/unistd.h>
  21. #include <asm/asm.h>
  22. #include <asm/bitops.h>
  23. #include <asm/pgalloc.h>
  24. #include <asm/stackframe.h>
  25. #include <asm/uaccess.h>
  26. #include <asm/ucontext.h>
  27. #include <asm/system.h>
  28. #define DEBUG_SIG 0
  29. #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
  30. extern asmlinkage int do_signal(sigset_t *oldset, struct pt_regs *regs);
  31. extern asmlinkage int save_fp_context(struct sigcontext *sc);
  32. extern asmlinkage int restore_fp_context(struct sigcontext *sc);
  33. extern asmlinkage void syscall_trace(void);
  34. int copy_siginfo_to_user(siginfo_t *to, siginfo_t *from)
  35. {
  36. if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t)))
  37. return -EFAULT;
  38. if (from->si_code < 0)
  39. return __copy_to_user(to, from, sizeof(siginfo_t));
  40. else {
  41. int err;
  42. /* If you change siginfo_t structure, please be sure
  43.    this code is fixed accordingly.
  44.    It should never copy any pad contained in the structure
  45.    to avoid security leaks, but must copy the generic
  46.    3 ints plus the relevant union member.  */
  47. err = __put_user(from->si_signo, &to->si_signo);
  48. err |= __put_user(from->si_errno, &to->si_errno);
  49. err |= __put_user((short)from->si_code, &to->si_code);
  50. switch (from->si_code >> 16) {
  51. case __SI_FAULT >> 16:
  52. err |= __put_user((long)from->si_addr, &to->si_addr);
  53. break;
  54. case __SI_CHLD >> 16:
  55. err |= __put_user(from->si_utime, &to->si_utime);
  56. err |= __put_user(from->si_stime, &to->si_stime);
  57. err |= __put_user(from->si_status, &to->si_status);
  58. default:
  59. err |= __put_user(from->si_pid, &to->si_pid);
  60. err |= __put_user(from->si_uid, &to->si_uid);
  61. break;
  62. /* case __SI_RT: This is not generated by the kernel as of now.  */
  63. }
  64. return err;
  65. }
  66. }
  67. static inline int store_fp_context(struct sigcontext *sc)
  68. {
  69. unsigned int fcr0;
  70. int err = 0;
  71. err |= __copy_to_user(&sc->sc_fpregs[0], 
  72. &current->thread.fpu.hard.fp_regs[0], NUM_FPU_REGS * 
  73. sizeof(unsigned long));
  74. err |= __copy_to_user(&sc->sc_fpc_csr, &current->thread.fpu.hard.control,
  75. sizeof(unsigned int));
  76. __asm__ __volatile__("cfc1 %0, $0nt" : "=r" (fcr0));
  77. err |= __copy_to_user(&sc->sc_fpc_eir, &fcr0, sizeof(unsigned int));
  78. return err;
  79. }
  80. static inline int refill_fp_context(struct sigcontext *sc)
  81. {
  82. int err = 0;
  83. if (verify_area(VERIFY_READ, sc, sizeof(*sc)))
  84. return -EFAULT;
  85. err |= __copy_from_user(&current->thread.fpu.hard.fp_regs[0], 
  86. &sc->sc_fpregs[0], NUM_FPU_REGS * sizeof(unsigned long));
  87. err |= __copy_from_user(&current->thread.fpu.hard.control, &sc->sc_fpc_csr,
  88. sizeof(unsigned int));
  89. return err;
  90. }
  91. /*
  92.  * Atomically swap in the new signal mask, and wait for a signal.
  93.  */
  94. asmlinkage inline int
  95. sys_sigsuspend(abi64_no_regargs, struct pt_regs regs)
  96. {
  97. sigset_t *uset, saveset, newset;
  98. save_static(&regs);
  99. uset = (sigset_t *) regs.regs[4];
  100. if (copy_from_user(&newset, uset, sizeof(sigset_t)))
  101. return -EFAULT;
  102. sigdelsetmask(&newset, ~_BLOCKABLE);
  103. spin_lock_irq(&current->sigmask_lock);
  104. saveset = current->blocked;
  105. current->blocked = newset;
  106. recalc_sigpending(current);
  107. spin_unlock_irq(&current->sigmask_lock);
  108. regs.regs[2] = EINTR;
  109. regs.regs[7] = 1;
  110. while (1) {
  111. current->state = TASK_INTERRUPTIBLE;
  112. schedule();
  113. if (do_signal(&saveset, &regs))
  114. return -EINTR;
  115. }
  116. }
  117. asmlinkage int
  118. sys_rt_sigsuspend(abi64_no_regargs, struct pt_regs regs)
  119. {
  120. sigset_t *unewset, saveset, newset;
  121.         size_t sigsetsize;
  122. save_static(&regs);
  123. /* XXX Don't preclude handling different sized sigset_t's.  */
  124. sigsetsize = regs.regs[5];
  125. if (sigsetsize != sizeof(sigset_t))
  126. return -EINVAL;
  127. unewset = (sigset_t *) regs.regs[4];
  128. if (copy_from_user(&newset, unewset, sizeof(newset)))
  129. return -EFAULT;
  130. sigdelsetmask(&newset, ~_BLOCKABLE);
  131. spin_lock_irq(&current->sigmask_lock);
  132. saveset = current->blocked;
  133. current->blocked = newset;
  134.         recalc_sigpending(current);
  135. spin_unlock_irq(&current->sigmask_lock);
  136. regs.regs[2] = EINTR;
  137. regs.regs[7] = 1;
  138. while (1) {
  139. current->state = TASK_INTERRUPTIBLE;
  140. schedule();
  141. if (do_signal(&saveset, &regs))
  142. return -EINTR;
  143. }
  144. }
  145. asmlinkage int 
  146. sys_sigaction(int sig, const struct sigaction *act, struct sigaction *oact)
  147. {
  148. struct k_sigaction new_ka, old_ka;
  149. int ret;
  150. int err = 0;
  151. if (act) {
  152. old_sigset_t mask;
  153. if (!access_ok(VERIFY_READ, act, sizeof(*act)))
  154. return -EFAULT;
  155. err |= __get_user(new_ka.sa.sa_handler, &act->sa_handler);
  156. err |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
  157. err |= __get_user(mask, &act->sa_mask.sig[0]);
  158. err |= __get_user(new_ka.sa.sa_restorer, &act->sa_restorer);
  159. if (err)
  160. return -EFAULT;
  161. siginitset(&new_ka.sa.sa_mask, mask);
  162. }
  163. ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
  164. if (!ret && oact) {
  165. if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)))
  166.                         return -EFAULT;
  167. err |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
  168. err |= __put_user(old_ka.sa.sa_handler, &oact->sa_handler);
  169. err |= __put_user(old_ka.sa.sa_mask.sig[0], oact->sa_mask.sig);
  170.                 err |= __put_user(0, &oact->sa_mask.sig[1]);
  171. err |= __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer);
  172.                 if (err)
  173. return -EFAULT;
  174. }
  175. return ret;
  176. }
  177. asmlinkage int
  178. sys_sigaltstack(abi64_no_regargs, struct pt_regs regs)
  179. {
  180. const stack_t *uss = (const stack_t *) regs.regs[4];
  181. stack_t *uoss = (stack_t *) regs.regs[5];
  182. unsigned long usp = regs.regs[29];
  183. return do_sigaltstack(uss, uoss, usp);
  184. }
  185. asmlinkage int
  186. restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc)
  187. {
  188. int owned_fp;
  189. int err = 0;
  190. err |= __get_user(regs->cp0_epc, &sc->sc_pc);
  191. err |= __get_user(regs->hi, &sc->sc_mdhi);
  192. err |= __get_user(regs->lo, &sc->sc_mdlo);
  193. #define restore_gp_reg(i) do {
  194. err |= __get_user(regs->regs[i], &sc->sc_regs[i]);
  195. } while(0)
  196. restore_gp_reg( 1); restore_gp_reg( 2); restore_gp_reg( 3);
  197. restore_gp_reg( 4); restore_gp_reg( 5); restore_gp_reg( 6);
  198. restore_gp_reg( 7); restore_gp_reg( 8); restore_gp_reg( 9);
  199. restore_gp_reg(10); restore_gp_reg(11); restore_gp_reg(12);
  200. restore_gp_reg(13); restore_gp_reg(14); restore_gp_reg(15);
  201. restore_gp_reg(16); restore_gp_reg(17); restore_gp_reg(18);
  202. restore_gp_reg(19); restore_gp_reg(20); restore_gp_reg(21);
  203. restore_gp_reg(22); restore_gp_reg(23); restore_gp_reg(24);
  204. restore_gp_reg(25); restore_gp_reg(26); restore_gp_reg(27);
  205. restore_gp_reg(28); restore_gp_reg(29); restore_gp_reg(30);
  206. restore_gp_reg(31);
  207. #undef restore_gp_reg
  208. err |= __get_user(owned_fp, &sc->sc_ownedfp);
  209. if (owned_fp) {
  210. if (IS_FPU_OWNER()) {
  211. CLEAR_FPU_OWNER();
  212. regs->cp0_status &= ~ST0_CU1;
  213. }
  214. current->used_math = 1;
  215. err |= refill_fp_context(sc);
  216. }
  217. return err;
  218. }
  219. struct sigframe {
  220. u32 sf_ass[4]; /* argument save space for o32 */
  221. u32 sf_code[2]; /* signal trampoline */
  222. struct sigcontext sf_sc;
  223. sigset_t sf_mask;
  224. };
  225. struct rt_sigframe {
  226. u32 rs_ass[4]; /* argument save space for o32 */
  227. u32 rs_code[2]; /* signal trampoline */
  228. struct siginfo rs_info;
  229. struct ucontext rs_uc;
  230. };
  231. asmlinkage void sys_sigreturn(abi64_no_regargs, struct pt_regs regs)
  232. {
  233. struct sigframe *frame;
  234. sigset_t blocked;
  235. frame = (struct sigframe *) regs.regs[29];
  236. if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
  237. goto badframe;
  238. if (__copy_from_user(&blocked, &frame->sf_mask, sizeof(blocked)))
  239. goto badframe;
  240. sigdelsetmask(&blocked, ~_BLOCKABLE);
  241. spin_lock_irq(&current->sigmask_lock);
  242. current->blocked = blocked;
  243. recalc_sigpending(current);
  244. spin_unlock_irq(&current->sigmask_lock);
  245. if (restore_sigcontext(&regs, &frame->sf_sc))
  246. goto badframe;
  247. /*
  248.  * Don't let your children do this ...
  249.  */
  250. if (current->ptrace & PT_TRACESYS)
  251. syscall_trace();
  252. __asm__ __volatile__(
  253. "movet$29, %0nt"
  254. "jtret_from_sys_call"
  255. :/* no outputs */
  256. :"r" (&regs));
  257. /* Unreached */
  258. badframe:
  259. force_sig(SIGSEGV, current);
  260. }
  261. asmlinkage void sys_rt_sigreturn(abi64_no_regargs, struct pt_regs regs)
  262. {
  263. struct rt_sigframe *frame;
  264. sigset_t set;
  265. stack_t st;
  266. frame = (struct rt_sigframe *) regs.regs[29];
  267. if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
  268. goto badframe;
  269. if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set)))
  270. goto badframe;
  271. sigdelsetmask(&set, ~_BLOCKABLE);
  272. spin_lock_irq(&current->sigmask_lock);
  273. current->blocked = set;
  274. recalc_sigpending(current);
  275. spin_unlock_irq(&current->sigmask_lock);
  276. if (restore_sigcontext(&regs, &frame->rs_uc.uc_mcontext))
  277. goto badframe;
  278. if (__copy_from_user(&st, &frame->rs_uc.uc_stack, sizeof(st)))
  279. goto badframe;
  280. /* It is more difficult to avoid calling this function than to
  281.    call it and ignore errors.  */
  282. do_sigaltstack(&st, NULL, regs.regs[29]);
  283. /*
  284.  * Don't let your children do this ...
  285.  */
  286. __asm__ __volatile__(
  287. "movet$29, %0nt"
  288. "jtret_from_sys_call"
  289. :/* no outputs */
  290. :"r" (&regs));
  291. /* Unreached */
  292. badframe:
  293. force_sig(SIGSEGV, current);
  294. }
  295. static int inline setup_sigcontext(struct pt_regs *regs,
  296.    struct sigcontext *sc)
  297. {
  298. int err = 0;
  299. err |= __put_user(regs->cp0_epc, &sc->sc_pc);
  300. #define save_gp_reg(i) do {
  301. err |= __put_user(regs->regs[i], &sc->sc_regs[i]);
  302. } while(0)
  303. __put_user(0, &sc->sc_regs[0]); save_gp_reg(1); save_gp_reg(2);
  304. save_gp_reg(3); save_gp_reg(4); save_gp_reg(5); save_gp_reg(6);
  305. save_gp_reg(7); save_gp_reg(8); save_gp_reg(9); save_gp_reg(10);
  306. save_gp_reg(11); save_gp_reg(12); save_gp_reg(13); save_gp_reg(14);
  307. save_gp_reg(15); save_gp_reg(16); save_gp_reg(17); save_gp_reg(18);
  308. save_gp_reg(19); save_gp_reg(20); save_gp_reg(21); save_gp_reg(22);
  309. save_gp_reg(23); save_gp_reg(24); save_gp_reg(25); save_gp_reg(26);
  310. save_gp_reg(27); save_gp_reg(28); save_gp_reg(29); save_gp_reg(30);
  311. save_gp_reg(31);
  312. #undef save_gp_reg
  313. err |= __put_user(regs->hi, &sc->sc_mdhi);
  314. err |= __put_user(regs->lo, &sc->sc_mdlo);
  315. err |= __put_user(regs->cp0_cause, &sc->sc_cause);
  316. err |= __put_user(regs->cp0_badvaddr, &sc->sc_badvaddr);
  317. if (current->used_math) { /* fp is active.  */
  318. if (IS_FPU_OWNER()) {
  319. lazy_fpu_switch(current, 0);
  320. CLEAR_FPU_OWNER();
  321. regs->cp0_status &= ~ST0_CU1;
  322. }
  323. err |= __put_user(1, &sc->sc_ownedfp);
  324. err |= store_fp_context(sc);
  325. current->used_math = 0;
  326. } else {
  327. err |= __put_user(0, &sc->sc_ownedfp);
  328. }
  329. err |= __put_user(regs->cp0_status, &sc->sc_status);
  330. return err;
  331. }
  332. /*
  333.  * Determine which stack to use..
  334.  */
  335. static inline void *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
  336.  size_t frame_size)
  337. {
  338. unsigned long sp;
  339. /* Default to using normal stack */
  340. sp = regs->regs[29];
  341. /* This is the X/Open sanctioned signal stack switching.  */
  342. if ((ka->sa.sa_flags & SA_ONSTACK) && ! on_sig_stack(sp))
  343. sp = current->sas_ss_sp + current->sas_ss_size;
  344. return (void *)((sp - frame_size) & ALMASK);
  345. }
  346. static void inline setup_frame(struct k_sigaction * ka, struct pt_regs *regs,
  347.        int signr, sigset_t *set)
  348. {
  349. struct sigframe *frame;
  350. int err = 0;
  351. frame = get_sigframe(ka, regs, sizeof(*frame));
  352. if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
  353. goto give_sigsegv;
  354. /* Set up to return from userspace.  If provided, use a stub already
  355.    in userspace.  */
  356. if (ka->sa.sa_flags & SA_RESTORER)
  357. regs->regs[31] = (unsigned long) ka->sa.sa_restorer;
  358. else {
  359. /*
  360.  * Set up the return code ...
  361.  *
  362.  *         li      v0, __NR_sigreturn
  363.  *         syscall
  364.  */
  365. err |= __put_user(0x24020000 + __NR_sigreturn,
  366.                   frame->sf_code + 0);
  367. err |= __put_user(0x0000000c                 ,
  368.                   frame->sf_code + 1);
  369. flush_cache_sigtramp((unsigned long) frame->sf_code);
  370. }
  371. err |= setup_sigcontext(regs, &frame->sf_sc);
  372. err |= __copy_to_user(&frame->sf_mask, set, sizeof(*set));
  373. if (err)
  374. goto give_sigsegv;
  375. /*
  376.  * Arguments to signal handler:
  377.  *
  378.  *   a0 = signal number
  379.  *   a1 = 0 (should be cause)
  380.  *   a2 = pointer to struct sigcontext
  381.  *
  382.  * $25 and c0_epc point to the signal handler, $29 points to the
  383.  * struct sigframe.
  384.  */
  385. regs->regs[ 4] = signr;
  386. regs->regs[ 5] = 0;
  387. regs->regs[ 6] = (unsigned long) &frame->sf_sc;
  388. regs->regs[29] = (unsigned long) frame;
  389. regs->regs[31] = (unsigned long) frame->sf_code;
  390. regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
  391. #if DEBUG_SIG
  392. printk("SIG deliver (%s:%d): sp=0x%p pc=0x%p ra=0x%pn",
  393.        current->comm, current->pid, frame, regs->cp0_epc, frame->code);
  394. #endif
  395.         return;
  396. give_sigsegv:
  397. if (signr == SIGSEGV)
  398. ka->sa.sa_handler = SIG_DFL;
  399. force_sig(SIGSEGV, current);
  400. }
  401. static void inline setup_rt_frame(struct k_sigaction * ka,
  402.   struct pt_regs *regs, int signr,
  403.   sigset_t *set, siginfo_t *info)
  404. {
  405. struct rt_sigframe *frame;
  406. int err = 0;
  407. frame = get_sigframe(ka, regs, sizeof(*frame));
  408. if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
  409. goto give_sigsegv;
  410. /* Set up to return from userspace.  If provided, use a stub already
  411.    in userspace.  */
  412. if (ka->sa.sa_flags & SA_RESTORER)
  413. regs->regs[31] = (unsigned long) ka->sa.sa_restorer;
  414. else {
  415. /*
  416.  * Set up the return code ...
  417.  *
  418.  *         li      v0, __NR_rt_sigreturn
  419.  *         syscall
  420.  */
  421. err |= __put_user(0x24020000 + __NR_rt_sigreturn,
  422.                   frame->rs_code + 0);
  423. err |= __put_user(0x0000000c                 ,
  424.                   frame->rs_code + 1);
  425. flush_cache_sigtramp((unsigned long) frame->rs_code);
  426. }
  427. /* Create siginfo.  */
  428. err |= copy_siginfo_to_user(&frame->rs_info, info);
  429. /* Create the ucontext.  */
  430. err |= __put_user(0, &frame->rs_uc.uc_flags);
  431. err |= __put_user(0, &frame->rs_uc.uc_link);
  432. err |= __put_user((void *)current->sas_ss_sp,
  433.                   &frame->rs_uc.uc_stack.ss_sp);
  434. err |= __put_user(sas_ss_flags(regs->regs[29]),
  435.                   &frame->rs_uc.uc_stack.ss_flags);
  436. err |= __put_user(current->sas_ss_size,
  437.                   &frame->rs_uc.uc_stack.ss_size);
  438. err |= setup_sigcontext(regs, &frame->rs_uc.uc_mcontext);
  439. err |= __copy_to_user(&frame->rs_uc.uc_sigmask, set, sizeof(*set));
  440. if (err)
  441. goto give_sigsegv;
  442. /*
  443.  * Arguments to signal handler:
  444.  *
  445.  *   a0 = signal number
  446.  *   a1 = 0 (should be cause)
  447.  *   a2 = pointer to ucontext
  448.  *
  449.  * $25 and c0_epc point to the signal handler, $29 points to
  450.  * the struct rt_sigframe.
  451.  */
  452. regs->regs[ 4] = signr;
  453. regs->regs[ 5] = (unsigned long) &frame->rs_info;
  454. regs->regs[ 6] = (unsigned long) &frame->rs_uc;
  455. regs->regs[29] = (unsigned long) frame;
  456. regs->regs[31] = (unsigned long) frame->rs_code;
  457. regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
  458. #if DEBUG_SIG
  459. printk("SIG deliver (%s:%d): sp=0x%p pc=0x%p ra=0x%pn",
  460.        current->comm, current->pid, frame, regs->cp0_epc, frame->code);
  461. #endif
  462. return;
  463. give_sigsegv:
  464. if (signr == SIGSEGV)
  465. ka->sa.sa_handler = SIG_DFL;
  466. force_sig(SIGSEGV, current);
  467. }
  468. static inline void handle_signal(unsigned long sig, struct k_sigaction *ka,
  469.  siginfo_t *info, sigset_t *oldset,
  470.  struct pt_regs *regs)
  471. {
  472. if (ka->sa.sa_flags & SA_SIGINFO)
  473. setup_rt_frame(ka, regs, sig, oldset, info);
  474. else
  475. setup_frame(ka, regs, sig, oldset);
  476. if (ka->sa.sa_flags & SA_ONESHOT)
  477. ka->sa.sa_handler = SIG_DFL;
  478. if (!(ka->sa.sa_flags & SA_NODEFER)) {
  479. spin_lock_irq(&current->sigmask_lock);
  480. sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
  481. sigaddset(&current->blocked,sig);
  482. recalc_sigpending(current);
  483. spin_unlock_irq(&current->sigmask_lock);
  484. }
  485. }
  486. static inline void syscall_restart(struct pt_regs *regs,
  487.    struct k_sigaction *ka)
  488. {
  489. switch(regs->regs[0]) {
  490. case ERESTARTNOHAND:
  491. regs->regs[2] = EINTR;
  492. break;
  493. case ERESTARTSYS:
  494. if(!(ka->sa.sa_flags & SA_RESTART)) {
  495. regs->regs[2] = EINTR;
  496. break;
  497. }
  498. /* fallthrough */
  499. case ERESTARTNOINTR: /* Userland will reload $v0.  */
  500. regs->regs[7] = regs->regs[26];
  501. regs->cp0_epc -= 8;
  502. }
  503. regs->regs[0] = 0; /* Don't deal with this again.  */
  504. }
  505. extern int do_irix_signal(sigset_t *oldset, struct pt_regs *regs);
  506. extern int do_signal32(sigset_t *oldset, struct pt_regs *regs);
  507. asmlinkage int do_signal(sigset_t *oldset, struct pt_regs *regs)
  508. {
  509. struct k_sigaction *ka;
  510. siginfo_t info;
  511. #ifdef CONFIG_BINFMT_ELF32
  512. if (current->thread.mflags & MF_32BIT) {
  513. return do_signal32(oldset, regs);
  514. }
  515. #endif
  516. if (!oldset)
  517. oldset = &current->blocked;
  518. for (;;) {
  519. unsigned long signr;
  520. spin_lock_irq(&current->sigmask_lock);
  521. signr = dequeue_signal(&current->blocked, &info);
  522. spin_unlock_irq(&current->sigmask_lock);
  523. if (!signr)
  524. break;
  525. if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) {
  526. /* Let the debugger run.  */
  527. current->exit_code = signr;
  528. current->state = TASK_STOPPED;
  529. notify_parent(current, SIGCHLD);
  530. schedule();
  531. /* We're back.  Did the debugger cancel the sig?  */
  532. if (!(signr = current->exit_code))
  533. continue;
  534. current->exit_code = 0;
  535. /* The debugger continued.  Ignore SIGSTOP.  */
  536. if (signr == SIGSTOP)
  537. continue;
  538. /* Update the siginfo structure.  Is this good?  */
  539. if (signr != info.si_signo) {
  540. info.si_signo = signr;
  541. info.si_errno = 0;
  542. info.si_code = SI_USER;
  543. info.si_pid = current->p_pptr->pid;
  544. info.si_uid = current->p_pptr->uid;
  545. }
  546. /* If the (new) signal is now blocked, requeue it.  */
  547. if (sigismember(&current->blocked, signr)) {
  548. send_sig_info(signr, &info, current);
  549. continue;
  550. }
  551. }
  552. ka = &current->sig->action[signr-1];
  553. if (ka->sa.sa_handler == SIG_IGN) {
  554. if (signr != SIGCHLD)
  555. continue;
  556. /* Check for SIGCHLD: it's special.  */
  557. while (sys_wait4(-1, NULL, WNOHANG, NULL) > 0)
  558. /* nothing */;
  559. continue;
  560. }
  561. if (ka->sa.sa_handler == SIG_DFL) {
  562. int exit_code = signr;
  563. /* Init gets no signals it doesn't want.  */
  564. if (current->pid == 1)
  565. continue;
  566. switch (signr) {
  567. case SIGCONT: case SIGCHLD: case SIGWINCH:
  568. continue;
  569. case SIGTSTP: case SIGTTIN: case SIGTTOU:
  570. if (is_orphaned_pgrp(current->pgrp))
  571. continue;
  572. /* FALLTHRU */
  573. case SIGSTOP:
  574. current->state = TASK_STOPPED;
  575. current->exit_code = signr;
  576. if (!(current->p_pptr->sig->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDSTOP))
  577. notify_parent(current, SIGCHLD);
  578. schedule();
  579. continue;
  580. case SIGQUIT: case SIGILL: case SIGTRAP:
  581. case SIGABRT: case SIGFPE: case SIGSEGV:
  582. case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ:
  583. if (do_coredump(signr, regs))
  584. exit_code |= 0x80;
  585. /* FALLTHRU */
  586. default:
  587. sigaddset(&current->pending.signal, signr);
  588. recalc_sigpending(current);
  589. current->flags |= PF_SIGNALED;
  590. do_exit(exit_code);
  591. /* NOTREACHED */
  592. }
  593. }
  594. if (regs->regs[0])
  595. syscall_restart(regs, ka);
  596. /* Whee!  Actually deliver the signal.  */
  597. handle_signal(signr, ka, &info, oldset, regs);
  598. return 1;
  599. }
  600. /*
  601.  * Who's code doesn't conform to the restartable syscall convention
  602.  * dies here!!!  The li instruction, a single machine instruction,
  603.  * must directly be followed by the syscall instruction.
  604.  */
  605. if (regs->regs[0]) {
  606. if (regs->regs[2] == ERESTARTNOHAND ||
  607.     regs->regs[2] == ERESTARTSYS ||
  608.     regs->regs[2] == ERESTARTNOINTR) {
  609. regs->regs[7] = regs->regs[26];
  610. regs->cp0_epc -= 8;
  611. }
  612. }
  613. return 0;
  614. }