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

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