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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/arch/i386/kernel/signal.c
  3.  *
  4.  *  Copyright (C) 1991, 1992  Linus Torvalds
  5.  *
  6.  *  1997-11-28  Modified for POSIX.1b signals by Richard Henderson
  7.  *  2000-06-20  Pentium III FXSR, SSE support by Gareth Hughes
  8.  */
  9. #include <linux/sched.h>
  10. #include <linux/mm.h>
  11. #include <linux/smp.h>
  12. #include <linux/smp_lock.h>
  13. #include <linux/kernel.h>
  14. #include <linux/signal.h>
  15. #include <linux/errno.h>
  16. #include <linux/wait.h>
  17. #include <linux/ptrace.h>
  18. #include <linux/unistd.h>
  19. #include <linux/stddef.h>
  20. #include <linux/tty.h>
  21. #include <linux/personality.h>
  22. #include <asm/ucontext.h>
  23. #include <asm/uaccess.h>
  24. #include <asm/i387.h>
  25. #define DEBUG_SIG 0
  26. #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
  27. int FASTCALL(do_signal(struct pt_regs *regs, sigset_t *oldset));
  28. int copy_siginfo_to_user(siginfo_t *to, siginfo_t *from)
  29. {
  30. if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t)))
  31. return -EFAULT;
  32. if (from->si_code < 0)
  33. return __copy_to_user(to, from, sizeof(siginfo_t));
  34. else {
  35. int err;
  36. /* If you change siginfo_t structure, please be sure
  37.    this code is fixed accordingly.
  38.    It should never copy any pad contained in the structure
  39.    to avoid security leaks, but must copy the generic
  40.    3 ints plus the relevant union member.  */
  41. err = __put_user(from->si_signo, &to->si_signo);
  42. err |= __put_user(from->si_errno, &to->si_errno);
  43. err |= __put_user((short)from->si_code, &to->si_code);
  44. /* First 32bits of unions are always present.  */
  45. err |= __put_user(from->si_pid, &to->si_pid);
  46. switch (from->si_code >> 16) {
  47. case __SI_FAULT >> 16:
  48. break;
  49. case __SI_CHLD >> 16:
  50. err |= __put_user(from->si_utime, &to->si_utime);
  51. err |= __put_user(from->si_stime, &to->si_stime);
  52. err |= __put_user(from->si_status, &to->si_status);
  53. default:
  54. err |= __put_user(from->si_uid, &to->si_uid);
  55. break;
  56. /* case __SI_RT: This is not generated by the kernel as of now.  */
  57. }
  58. return err;
  59. }
  60. }
  61. /*
  62.  * Atomically swap in the new signal mask, and wait for a signal.
  63.  */
  64. asmlinkage int
  65. sys_sigsuspend(int history0, int history1, old_sigset_t mask)
  66. {
  67. struct pt_regs * regs = (struct pt_regs *) &history0;
  68. sigset_t saveset;
  69. mask &= _BLOCKABLE;
  70. spin_lock_irq(&current->sigmask_lock);
  71. saveset = current->blocked;
  72. siginitset(&current->blocked, mask);
  73. recalc_sigpending(current);
  74. spin_unlock_irq(&current->sigmask_lock);
  75. regs->eax = -EINTR;
  76. while (1) {
  77. current->state = TASK_INTERRUPTIBLE;
  78. schedule();
  79. if (do_signal(regs, &saveset))
  80. return -EINTR;
  81. }
  82. }
  83. asmlinkage int
  84. sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize)
  85. {
  86. struct pt_regs * regs = (struct pt_regs *) &unewset;
  87. sigset_t saveset, newset;
  88. /* XXX: Don't preclude handling different sized sigset_t's.  */
  89. if (sigsetsize != sizeof(sigset_t))
  90. return -EINVAL;
  91. if (copy_from_user(&newset, unewset, sizeof(newset)))
  92. return -EFAULT;
  93. sigdelsetmask(&newset, ~_BLOCKABLE);
  94. spin_lock_irq(&current->sigmask_lock);
  95. saveset = current->blocked;
  96. current->blocked = newset;
  97. recalc_sigpending(current);
  98. spin_unlock_irq(&current->sigmask_lock);
  99. regs->eax = -EINTR;
  100. while (1) {
  101. current->state = TASK_INTERRUPTIBLE;
  102. schedule();
  103. if (do_signal(regs, &saveset))
  104. return -EINTR;
  105. }
  106. }
  107. asmlinkage int 
  108. sys_sigaction(int sig, const struct old_sigaction *act,
  109.       struct old_sigaction *oact)
  110. {
  111. struct k_sigaction new_ka, old_ka;
  112. int ret;
  113. if (act) {
  114. old_sigset_t mask;
  115. if (verify_area(VERIFY_READ, act, sizeof(*act)) ||
  116.     __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
  117.     __get_user(new_ka.sa.sa_restorer, &act->sa_restorer))
  118. return -EFAULT;
  119. __get_user(new_ka.sa.sa_flags, &act->sa_flags);
  120. __get_user(mask, &act->sa_mask);
  121. siginitset(&new_ka.sa.sa_mask, mask);
  122. }
  123. ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
  124. if (!ret && oact) {
  125. if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) ||
  126.     __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
  127.     __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer))
  128. return -EFAULT;
  129. __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
  130. __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
  131. }
  132. return ret;
  133. }
  134. asmlinkage int
  135. sys_sigaltstack(const stack_t *uss, stack_t *uoss)
  136. {
  137. struct pt_regs *regs = (struct pt_regs *) &uss;
  138. return do_sigaltstack(uss, uoss, regs->esp);
  139. }
  140. /*
  141.  * Do a signal return; undo the signal stack.
  142.  */
  143. struct sigframe
  144. {
  145. char *pretcode;
  146. int sig;
  147. struct sigcontext sc;
  148. struct _fpstate fpstate;
  149. unsigned long extramask[_NSIG_WORDS-1];
  150. char retcode[8];
  151. };
  152. struct rt_sigframe
  153. {
  154. char *pretcode;
  155. int sig;
  156. struct siginfo *pinfo;
  157. void *puc;
  158. struct siginfo info;
  159. struct ucontext uc;
  160. struct _fpstate fpstate;
  161. char retcode[8];
  162. };
  163. static int
  164. restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc, int *peax)
  165. {
  166. unsigned int err = 0;
  167. #define COPY(x) err |= __get_user(regs->x, &sc->x)
  168. #define COPY_SEG(seg)
  169. { unsigned short tmp;
  170.   err |= __get_user(tmp, &sc->seg);
  171.   regs->x##seg = tmp; }
  172. #define COPY_SEG_STRICT(seg)
  173. { unsigned short tmp;
  174.   err |= __get_user(tmp, &sc->seg);
  175.   regs->x##seg = tmp|3; }
  176. #define GET_SEG(seg)
  177. { unsigned short tmp;
  178.   err |= __get_user(tmp, &sc->seg);
  179.   loadsegment(seg,tmp); }
  180. GET_SEG(gs);
  181. GET_SEG(fs);
  182. COPY_SEG(es);
  183. COPY_SEG(ds);
  184. COPY(edi);
  185. COPY(esi);
  186. COPY(ebp);
  187. COPY(esp);
  188. COPY(ebx);
  189. COPY(edx);
  190. COPY(ecx);
  191. COPY(eip);
  192. COPY_SEG_STRICT(cs);
  193. COPY_SEG_STRICT(ss);
  194. {
  195. unsigned int tmpflags;
  196. err |= __get_user(tmpflags, &sc->eflags);
  197. regs->eflags = (regs->eflags & ~0x40DD5) | (tmpflags & 0x40DD5);
  198. regs->orig_eax = -1; /* disable syscall checks */
  199. }
  200. {
  201. struct _fpstate * buf;
  202. err |= __get_user(buf, &sc->fpstate);
  203. if (buf) {
  204. if (verify_area(VERIFY_READ, buf, sizeof(*buf)))
  205. goto badframe;
  206. err |= restore_i387(buf);
  207. }
  208. }
  209. err |= __get_user(*peax, &sc->eax);
  210. return err;
  211. badframe:
  212. return 1;
  213. }
  214. asmlinkage int sys_sigreturn(unsigned long __unused)
  215. {
  216. struct pt_regs *regs = (struct pt_regs *) &__unused;
  217. struct sigframe *frame = (struct sigframe *)(regs->esp - 8);
  218. sigset_t set;
  219. int eax;
  220. if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
  221. goto badframe;
  222. if (__get_user(set.sig[0], &frame->sc.oldmask)
  223.     || (_NSIG_WORDS > 1
  224. && __copy_from_user(&set.sig[1], &frame->extramask,
  225.     sizeof(frame->extramask))))
  226. goto badframe;
  227. sigdelsetmask(&set, ~_BLOCKABLE);
  228. spin_lock_irq(&current->sigmask_lock);
  229. current->blocked = set;
  230. recalc_sigpending(current);
  231. spin_unlock_irq(&current->sigmask_lock);
  232. if (restore_sigcontext(regs, &frame->sc, &eax))
  233. goto badframe;
  234. return eax;
  235. badframe:
  236. force_sig(SIGSEGV, current);
  237. return 0;
  238. }
  239. asmlinkage int sys_rt_sigreturn(unsigned long __unused)
  240. {
  241. struct pt_regs *regs = (struct pt_regs *) &__unused;
  242. struct rt_sigframe *frame = (struct rt_sigframe *)(regs->esp - 4);
  243. sigset_t set;
  244. stack_t st;
  245. int eax;
  246. if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
  247. goto badframe;
  248. if (__copy_from_user(&set, &frame->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->uc.uc_mcontext, &eax))
  256. goto badframe;
  257. if (__copy_from_user(&st, &frame->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->esp);
  262. return eax;
  263. badframe:
  264. force_sig(SIGSEGV, current);
  265. return 0;
  266. }
  267. /*
  268.  * Set up a signal frame.
  269.  */
  270. static int
  271. setup_sigcontext(struct sigcontext *sc, struct _fpstate *fpstate,
  272.  struct pt_regs *regs, unsigned long mask)
  273. {
  274. int tmp, err = 0;
  275. tmp = 0;
  276. __asm__("movl %%gs,%0" : "=r"(tmp): "0"(tmp));
  277. err |= __put_user(tmp, (unsigned int *)&sc->gs);
  278. __asm__("movl %%fs,%0" : "=r"(tmp): "0"(tmp));
  279. err |= __put_user(tmp, (unsigned int *)&sc->fs);
  280. err |= __put_user(regs->xes, (unsigned int *)&sc->es);
  281. err |= __put_user(regs->xds, (unsigned int *)&sc->ds);
  282. err |= __put_user(regs->edi, &sc->edi);
  283. err |= __put_user(regs->esi, &sc->esi);
  284. err |= __put_user(regs->ebp, &sc->ebp);
  285. err |= __put_user(regs->esp, &sc->esp);
  286. err |= __put_user(regs->ebx, &sc->ebx);
  287. err |= __put_user(regs->edx, &sc->edx);
  288. err |= __put_user(regs->ecx, &sc->ecx);
  289. err |= __put_user(regs->eax, &sc->eax);
  290. err |= __put_user(current->thread.trap_no, &sc->trapno);
  291. err |= __put_user(current->thread.error_code, &sc->err);
  292. err |= __put_user(regs->eip, &sc->eip);
  293. err |= __put_user(regs->xcs, (unsigned int *)&sc->cs);
  294. err |= __put_user(regs->eflags, &sc->eflags);
  295. err |= __put_user(regs->esp, &sc->esp_at_signal);
  296. err |= __put_user(regs->xss, (unsigned int *)&sc->ss);
  297. tmp = save_i387(fpstate);
  298. if (tmp < 0)
  299.   err = 1;
  300. else
  301.   err |= __put_user(tmp ? fpstate : NULL, &sc->fpstate);
  302. /* non-iBCS2 extensions.. */
  303. err |= __put_user(mask, &sc->oldmask);
  304. err |= __put_user(current->thread.cr2, &sc->cr2);
  305. return err;
  306. }
  307. /*
  308.  * Determine which stack to use..
  309.  */
  310. static inline void *
  311. get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
  312. {
  313. unsigned long esp;
  314. /* Default to using normal stack */
  315. esp = regs->esp;
  316. /* This is the X/Open sanctioned signal stack switching.  */
  317. if (ka->sa.sa_flags & SA_ONSTACK) {
  318. if (sas_ss_flags(esp) == 0)
  319. esp = current->sas_ss_sp + current->sas_ss_size;
  320. }
  321. /* This is the legacy signal stack switching. */
  322. else if ((regs->xss & 0xffff) != __USER_DS &&
  323.  !(ka->sa.sa_flags & SA_RESTORER) &&
  324.  ka->sa.sa_restorer) {
  325. esp = (unsigned long) ka->sa.sa_restorer;
  326. }
  327. return (void *)((esp - frame_size) & -8ul);
  328. }
  329. static void setup_frame(int sig, struct k_sigaction *ka,
  330. sigset_t *set, struct pt_regs * regs)
  331. {
  332. struct sigframe *frame;
  333. int err = 0;
  334. frame = get_sigframe(ka, regs, sizeof(*frame));
  335. if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
  336. goto give_sigsegv;
  337. err |= __put_user((current->exec_domain
  338.            && current->exec_domain->signal_invmap
  339.            && sig < 32
  340.            ? current->exec_domain->signal_invmap[sig]
  341.            : sig),
  342.           &frame->sig);
  343. if (err)
  344. goto give_sigsegv;
  345. err |= setup_sigcontext(&frame->sc, &frame->fpstate, regs, set->sig[0]);
  346. if (err)
  347. goto give_sigsegv;
  348. if (_NSIG_WORDS > 1) {
  349. err |= __copy_to_user(frame->extramask, &set->sig[1],
  350.       sizeof(frame->extramask));
  351. }
  352. if (err)
  353. goto give_sigsegv;
  354. /* Set up to return from userspace.  If provided, use a stub
  355.    already in userspace.  */
  356. if (ka->sa.sa_flags & SA_RESTORER) {
  357. err |= __put_user(ka->sa.sa_restorer, &frame->pretcode);
  358. } else {
  359. err |= __put_user(frame->retcode, &frame->pretcode);
  360. /* This is popl %eax ; movl $,%eax ; int $0x80 */
  361. err |= __put_user(0xb858, (short *)(frame->retcode+0));
  362. err |= __put_user(__NR_sigreturn, (int *)(frame->retcode+2));
  363. err |= __put_user(0x80cd, (short *)(frame->retcode+6));
  364. }
  365. if (err)
  366. goto give_sigsegv;
  367. /* Set up registers for signal handler */
  368. regs->esp = (unsigned long) frame;
  369. regs->eip = (unsigned long) ka->sa.sa_handler;
  370. set_fs(USER_DS);
  371. regs->xds = __USER_DS;
  372. regs->xes = __USER_DS;
  373. regs->xss = __USER_DS;
  374. regs->xcs = __USER_CS;
  375. regs->eflags &= ~TF_MASK;
  376. #if DEBUG_SIG
  377. printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%pn",
  378. current->comm, current->pid, frame, regs->eip, frame->pretcode);
  379. #endif
  380. return;
  381. give_sigsegv:
  382. if (sig == SIGSEGV)
  383. ka->sa.sa_handler = SIG_DFL;
  384. force_sig(SIGSEGV, current);
  385. }
  386. static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
  387.    sigset_t *set, struct pt_regs * regs)
  388. {
  389. struct rt_sigframe *frame;
  390. int err = 0;
  391. frame = get_sigframe(ka, regs, sizeof(*frame));
  392. if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
  393. goto give_sigsegv;
  394. err |= __put_user((current->exec_domain
  395.         && current->exec_domain->signal_invmap
  396.         && sig < 32
  397.         ? current->exec_domain->signal_invmap[sig]
  398.    : sig),
  399.   &frame->sig);
  400. err |= __put_user(&frame->info, &frame->pinfo);
  401. err |= __put_user(&frame->uc, &frame->puc);
  402. err |= copy_siginfo_to_user(&frame->info, info);
  403. if (err)
  404. goto give_sigsegv;
  405. /* Create the ucontext.  */
  406. err |= __put_user(0, &frame->uc.uc_flags);
  407. err |= __put_user(0, &frame->uc.uc_link);
  408. err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
  409. err |= __put_user(sas_ss_flags(regs->esp),
  410.   &frame->uc.uc_stack.ss_flags);
  411. err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
  412. err |= setup_sigcontext(&frame->uc.uc_mcontext, &frame->fpstate,
  413.         regs, set->sig[0]);
  414. err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
  415. if (err)
  416. goto give_sigsegv;
  417. /* Set up to return from userspace.  If provided, use a stub
  418.    already in userspace.  */
  419. if (ka->sa.sa_flags & SA_RESTORER) {
  420. err |= __put_user(ka->sa.sa_restorer, &frame->pretcode);
  421. } else {
  422. err |= __put_user(frame->retcode, &frame->pretcode);
  423. /* This is movl $,%eax ; int $0x80 */
  424. err |= __put_user(0xb8, (char *)(frame->retcode+0));
  425. err |= __put_user(__NR_rt_sigreturn, (int *)(frame->retcode+1));
  426. err |= __put_user(0x80cd, (short *)(frame->retcode+5));
  427. }
  428. if (err)
  429. goto give_sigsegv;
  430. /* Set up registers for signal handler */
  431. regs->esp = (unsigned long) frame;
  432. regs->eip = (unsigned long) ka->sa.sa_handler;
  433. set_fs(USER_DS);
  434. regs->xds = __USER_DS;
  435. regs->xes = __USER_DS;
  436. regs->xss = __USER_DS;
  437. regs->xcs = __USER_CS;
  438. regs->eflags &= ~TF_MASK;
  439. #if DEBUG_SIG
  440. printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%pn",
  441. current->comm, current->pid, frame, regs->eip, frame->pretcode);
  442. #endif
  443. return;
  444. give_sigsegv:
  445. if (sig == SIGSEGV)
  446. ka->sa.sa_handler = SIG_DFL;
  447. force_sig(SIGSEGV, current);
  448. }
  449. /*
  450.  * OK, we're invoking a handler
  451.  */
  452. static void
  453. handle_signal(unsigned long sig, struct k_sigaction *ka,
  454.       siginfo_t *info, sigset_t *oldset, struct pt_regs * regs)
  455. {
  456. /* Are we from a system call? */
  457. if (regs->orig_eax >= 0) {
  458. /* If so, check system call restarting.. */
  459. switch (regs->eax) {
  460. case -ERESTARTNOHAND:
  461. regs->eax = -EINTR;
  462. break;
  463. case -ERESTARTSYS:
  464. if (!(ka->sa.sa_flags & SA_RESTART)) {
  465. regs->eax = -EINTR;
  466. break;
  467. }
  468. /* fallthrough */
  469. case -ERESTARTNOINTR:
  470. regs->eax = regs->orig_eax;
  471. regs->eip -= 2;
  472. }
  473. }
  474. /* Set up the stack frame */
  475. if (ka->sa.sa_flags & SA_SIGINFO)
  476. setup_rt_frame(sig, ka, info, oldset, regs);
  477. else
  478. setup_frame(sig, ka, oldset, regs);
  479. if (ka->sa.sa_flags & SA_ONESHOT)
  480. ka->sa.sa_handler = SIG_DFL;
  481. if (!(ka->sa.sa_flags & SA_NODEFER)) {
  482. spin_lock_irq(&current->sigmask_lock);
  483. sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
  484. sigaddset(&current->blocked,sig);
  485. recalc_sigpending(current);
  486. spin_unlock_irq(&current->sigmask_lock);
  487. }
  488. }
  489. /*
  490.  * Note that 'init' is a special process: it doesn't get signals it doesn't
  491.  * want to handle. Thus you cannot kill init even with a SIGKILL even by
  492.  * mistake.
  493.  */
  494. int do_signal(struct pt_regs *regs, sigset_t *oldset)
  495. {
  496. siginfo_t info;
  497. struct k_sigaction *ka;
  498. /*
  499.  * We want the common case to go fast, which
  500.  * is why we may in certain cases get here from
  501.  * kernel mode. Just return without doing anything
  502.  * if so.
  503.  */
  504. if ((regs->xcs & 3) != 3)
  505. return 1;
  506. if (!oldset)
  507. oldset = &current->blocked;
  508. for (;;) {
  509. unsigned long signr;
  510. spin_lock_irq(&current->sigmask_lock);
  511. signr = dequeue_signal(&current->blocked, &info);
  512. spin_unlock_irq(&current->sigmask_lock);
  513. if (!signr)
  514. break;
  515. if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) {
  516. /* Let the debugger run.  */
  517. current->exit_code = signr;
  518. current->state = TASK_STOPPED;
  519. notify_parent(current, SIGCHLD);
  520. schedule();
  521. /* We're back.  Did the debugger cancel the sig?  */
  522. if (!(signr = current->exit_code))
  523. continue;
  524. current->exit_code = 0;
  525. /* The debugger continued.  Ignore SIGSTOP.  */
  526. if (signr == SIGSTOP)
  527. continue;
  528. /* Update the siginfo structure.  Is this good?  */
  529. if (signr != info.si_signo) {
  530. info.si_signo = signr;
  531. info.si_errno = 0;
  532. info.si_code = SI_USER;
  533. info.si_pid = current->p_pptr->pid;
  534. info.si_uid = current->p_pptr->uid;
  535. }
  536. /* If the (new) signal is now blocked, requeue it.  */
  537. if (sigismember(&current->blocked, signr)) {
  538. send_sig_info(signr, &info, current);
  539. continue;
  540. }
  541. }
  542. ka = &current->sig->action[signr-1];
  543. if (ka->sa.sa_handler == SIG_IGN) {
  544. if (signr != SIGCHLD)
  545. continue;
  546. /* Check for SIGCHLD: it's special.  */
  547. while (sys_wait4(-1, NULL, WNOHANG, NULL) > 0)
  548. /* nothing */;
  549. continue;
  550. }
  551. if (ka->sa.sa_handler == SIG_DFL) {
  552. int exit_code = signr;
  553. /* Init gets no signals it doesn't want.  */
  554. if (current->pid == 1)
  555. continue;
  556. switch (signr) {
  557. case SIGCONT: case SIGCHLD: case SIGWINCH:
  558. continue;
  559. case SIGTSTP: case SIGTTIN: case SIGTTOU:
  560. if (is_orphaned_pgrp(current->pgrp))
  561. continue;
  562. /* FALLTHRU */
  563. case SIGSTOP: {
  564. struct signal_struct *sig;
  565. current->state = TASK_STOPPED;
  566. current->exit_code = signr;
  567. sig = current->p_pptr->sig;
  568. if (sig && !(sig->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDSTOP))
  569. notify_parent(current, SIGCHLD);
  570. schedule();
  571. continue;
  572. }
  573. case SIGQUIT: case SIGILL: case SIGTRAP:
  574. case SIGABRT: case SIGFPE: case SIGSEGV:
  575. case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ:
  576. if (do_coredump(signr, regs))
  577. exit_code |= 0x80;
  578. /* FALLTHRU */
  579. default:
  580. sigaddset(&current->pending.signal, signr);
  581. recalc_sigpending(current);
  582. current->flags |= PF_SIGNALED;
  583. do_exit(exit_code);
  584. /* NOTREACHED */
  585. }
  586. }
  587. /* Reenable any watchpoints before delivering the
  588.  * signal to user space. The processor register will
  589.  * have been cleared if the watchpoint triggered
  590.  * inside the kernel.
  591.  */
  592. __asm__("movl %0,%%db7" : : "r" (current->thread.debugreg[7]));
  593. /* Whee!  Actually deliver the signal.  */
  594. handle_signal(signr, ka, &info, oldset, regs);
  595. return 1;
  596. }
  597. /* Did we come from a system call? */
  598. if (regs->orig_eax >= 0) {
  599. /* Restart the system call - no handlers present */
  600. if (regs->eax == -ERESTARTNOHAND ||
  601.     regs->eax == -ERESTARTSYS ||
  602.     regs->eax == -ERESTARTNOINTR) {
  603. regs->eax = regs->orig_eax;
  604. regs->eip -= 2;
  605. }
  606. }
  607. return 0;
  608. }