signal.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:17k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/arch/arm/kernel/signal.c
  3.  *
  4.  *  Copyright (C) 1995-2001 Russell King
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License version 2 as
  8.  * published by the Free Software Foundation.
  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/errno.h>
  17. #include <linux/signal.h>
  18. #include <linux/wait.h>
  19. #include <linux/ptrace.h>
  20. #include <linux/stddef.h>
  21. #include <linux/unistd.h>
  22. #include <linux/personality.h>
  23. #include <linux/tty.h>
  24. #include <linux/elf.h>
  25. #include <asm/pgalloc.h>
  26. #include <asm/ucontext.h>
  27. #include <asm/uaccess.h>
  28. #include "ptrace.h"
  29. #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
  30. /*
  31.  * For ARM syscalls, we encode the syscall number into the instruction.
  32.  */
  33. #define SWI_SYS_SIGRETURN (0xef000000|(__NR_sigreturn))
  34. #define SWI_SYS_RT_SIGRETURN (0xef000000|(__NR_rt_sigreturn))
  35. /*
  36.  * For Thumb syscalls, we pass the syscall number via r7.  We therefore
  37.  * need two 16-bit instructions.
  38.  */
  39. #define SWI_THUMB_SIGRETURN (0xdf00 << 16 | 0x2700 | (__NR_sigreturn - __NR_SYSCALL_BASE))
  40. #define SWI_THUMB_RT_SIGRETURN (0xdf00 << 16 | 0x2700 | (__NR_rt_sigreturn - __NR_SYSCALL_BASE))
  41. static const unsigned long retcodes[4] = {
  42. SWI_SYS_SIGRETURN, SWI_THUMB_SIGRETURN,
  43. SWI_SYS_RT_SIGRETURN, SWI_THUMB_RT_SIGRETURN
  44. };
  45. asmlinkage int do_signal(sigset_t *oldset, struct pt_regs * regs, int syscall);
  46. int copy_siginfo_to_user(siginfo_t *to, siginfo_t *from)
  47. {
  48. int err = -EFAULT;;
  49. if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t)))
  50. goto out;
  51. if (from->si_code < 0)
  52. return __copy_to_user(to, from, sizeof(siginfo_t));
  53. /* If you change siginfo_t structure, please be sure
  54.    this code is fixed accordingly.
  55.    It should never copy any pad contained in the structure
  56.    to avoid security leaks, but must copy the generic
  57.    3 ints plus the relevant union member.  */
  58. err = __put_user(from->si_signo, &to->si_signo);
  59. err |= __put_user(from->si_errno, &to->si_errno);
  60. err |= __put_user((short)from->si_code, &to->si_code);
  61. /* First 32bits of unions are always present.  */
  62. err |= __put_user(from->si_pid, &to->si_pid);
  63. switch (from->si_code >> 16) {
  64. case __SI_FAULT >> 16:
  65. break;
  66. case __SI_CHLD >> 16:
  67. err |= __put_user(from->si_utime, &to->si_utime);
  68. err |= __put_user(from->si_stime, &to->si_stime);
  69. err |= __put_user(from->si_status, &to->si_status);
  70. default:
  71. err |= __put_user(from->si_uid, &to->si_uid);
  72. break;
  73. /* case __SI_RT: This is not generated by the kernel as of now.  */
  74. }
  75. out:
  76. return err;
  77. }
  78. /*
  79.  * atomically swap in the new signal mask, and wait for a signal.
  80.  */
  81. asmlinkage int sys_sigsuspend(int restart, unsigned long oldmask, old_sigset_t mask, struct pt_regs *regs)
  82. {
  83. sigset_t saveset;
  84. mask &= _BLOCKABLE;
  85. spin_lock_irq(&current->sigmask_lock);
  86. saveset = current->blocked;
  87. siginitset(&current->blocked, mask);
  88. recalc_sigpending(current);
  89. spin_unlock_irq(&current->sigmask_lock);
  90. regs->ARM_r0 = -EINTR;
  91. while (1) {
  92. current->state = TASK_INTERRUPTIBLE;
  93. schedule();
  94. if (do_signal(&saveset, regs, 0))
  95. return regs->ARM_r0;
  96. }
  97. }
  98. asmlinkage int
  99. sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize, struct pt_regs *regs)
  100. {
  101. sigset_t saveset, newset;
  102. /* XXX: Don't preclude handling different sized sigset_t's. */
  103. if (sigsetsize != sizeof(sigset_t))
  104. return -EINVAL;
  105. if (copy_from_user(&newset, unewset, sizeof(newset)))
  106. return -EFAULT;
  107. sigdelsetmask(&newset, ~_BLOCKABLE);
  108. spin_lock_irq(&current->sigmask_lock);
  109. saveset = current->blocked;
  110. current->blocked = newset;
  111. recalc_sigpending(current);
  112. spin_unlock_irq(&current->sigmask_lock);
  113. regs->ARM_r0 = -EINTR;
  114. while (1) {
  115. current->state = TASK_INTERRUPTIBLE;
  116. schedule();
  117. if (do_signal(&saveset, regs, 0))
  118. return regs->ARM_r0;
  119. }
  120. }
  121. asmlinkage int 
  122. sys_sigaction(int sig, const struct old_sigaction *act,
  123.       struct old_sigaction *oact)
  124. {
  125. struct k_sigaction new_ka, old_ka;
  126. int ret;
  127. if (act) {
  128. old_sigset_t mask;
  129. if (verify_area(VERIFY_READ, act, sizeof(*act)) ||
  130.     __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
  131.     __get_user(new_ka.sa.sa_restorer, &act->sa_restorer))
  132. return -EFAULT;
  133. __get_user(new_ka.sa.sa_flags, &act->sa_flags);
  134. __get_user(mask, &act->sa_mask);
  135. siginitset(&new_ka.sa.sa_mask, mask);
  136. }
  137. ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
  138. if (!ret && oact) {
  139. if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) ||
  140.     __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
  141.     __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer))
  142. return -EFAULT;
  143. __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
  144. __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
  145. }
  146. return ret;
  147. }
  148. /*
  149.  * Do a signal return; undo the signal stack.
  150.  */
  151. struct sigframe
  152. {
  153. struct sigcontext sc;
  154. unsigned long extramask[_NSIG_WORDS-1];
  155. unsigned long retcode;
  156. };
  157. struct rt_sigframe
  158. {
  159. struct siginfo *pinfo;
  160. void *puc;
  161. struct siginfo info;
  162. struct ucontext uc;
  163. unsigned long retcode;
  164. };
  165. static int
  166. restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc)
  167. {
  168. int err = 0;
  169. __get_user_error(regs->ARM_r0, &sc->arm_r0, err);
  170. __get_user_error(regs->ARM_r1, &sc->arm_r1, err);
  171. __get_user_error(regs->ARM_r2, &sc->arm_r2, err);
  172. __get_user_error(regs->ARM_r3, &sc->arm_r3, err);
  173. __get_user_error(regs->ARM_r4, &sc->arm_r4, err);
  174. __get_user_error(regs->ARM_r5, &sc->arm_r5, err);
  175. __get_user_error(regs->ARM_r6, &sc->arm_r6, err);
  176. __get_user_error(regs->ARM_r7, &sc->arm_r7, err);
  177. __get_user_error(regs->ARM_r8, &sc->arm_r8, err);
  178. __get_user_error(regs->ARM_r9, &sc->arm_r9, err);
  179. __get_user_error(regs->ARM_r10, &sc->arm_r10, err);
  180. __get_user_error(regs->ARM_fp, &sc->arm_fp, err);
  181. __get_user_error(regs->ARM_ip, &sc->arm_ip, err);
  182. __get_user_error(regs->ARM_sp, &sc->arm_sp, err);
  183. __get_user_error(regs->ARM_lr, &sc->arm_lr, err);
  184. __get_user_error(regs->ARM_pc, &sc->arm_pc, err);
  185. #ifdef CONFIG_CPU_32
  186. __get_user_error(regs->ARM_cpsr, &sc->arm_cpsr, err);
  187. #endif
  188. err |= !valid_user_regs(regs);
  189. return err;
  190. }
  191. asmlinkage int sys_sigreturn(struct pt_regs *regs)
  192. {
  193. struct sigframe *frame;
  194. sigset_t set;
  195. /*
  196.  * Since we stacked the signal on a 64-bit boundary,
  197.  * then 'sp' should be word aligned here.  If it's
  198.  * not, then the user is trying to mess with us.
  199.  */
  200. if (regs->ARM_sp & 7)
  201. goto badframe;
  202. frame = (struct sigframe *)regs->ARM_sp;
  203. if (verify_area(VERIFY_READ, frame, sizeof (*frame)))
  204. goto badframe;
  205. if (__get_user(set.sig[0], &frame->sc.oldmask)
  206.     || (_NSIG_WORDS > 1
  207.         && __copy_from_user(&set.sig[1], &frame->extramask,
  208.     sizeof(frame->extramask))))
  209. goto badframe;
  210. sigdelsetmask(&set, ~_BLOCKABLE);
  211. spin_lock_irq(&current->sigmask_lock);
  212. current->blocked = set;
  213. recalc_sigpending(current);
  214. spin_unlock_irq(&current->sigmask_lock);
  215. if (restore_sigcontext(regs, &frame->sc))
  216. goto badframe;
  217. /* Send SIGTRAP if we're single-stepping */
  218. if (ptrace_cancel_bpt(current))
  219. send_sig(SIGTRAP, current, 1);
  220. return regs->ARM_r0;
  221. badframe:
  222. force_sig(SIGSEGV, current);
  223. return 0;
  224. }
  225. asmlinkage int sys_rt_sigreturn(struct pt_regs *regs)
  226. {
  227. struct rt_sigframe *frame;
  228. sigset_t set;
  229. /*
  230.  * Since we stacked the signal on a 64-bit boundary,
  231.  * then 'sp' should be word aligned here.  If it's
  232.  * not, then the user is trying to mess with us.
  233.  */
  234. if (regs->ARM_sp & 7)
  235. goto badframe;
  236. frame = (struct rt_sigframe *)regs->ARM_sp;
  237. if (verify_area(VERIFY_READ, frame, sizeof (*frame)))
  238. goto badframe;
  239. if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
  240. goto badframe;
  241. sigdelsetmask(&set, ~_BLOCKABLE);
  242. spin_lock_irq(&current->sigmask_lock);
  243. current->blocked = set;
  244. recalc_sigpending(current);
  245. spin_unlock_irq(&current->sigmask_lock);
  246. if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
  247. goto badframe;
  248. /* Send SIGTRAP if we're single-stepping */
  249. if (ptrace_cancel_bpt(current))
  250. send_sig(SIGTRAP, current, 1);
  251. return regs->ARM_r0;
  252. badframe:
  253. force_sig(SIGSEGV, current);
  254. return 0;
  255. }
  256. static int
  257. setup_sigcontext(struct sigcontext *sc, /*struct _fpstate *fpstate,*/
  258.  struct pt_regs *regs, unsigned long mask)
  259. {
  260. int err = 0;
  261. __put_user_error(regs->ARM_r0, &sc->arm_r0, err);
  262. __put_user_error(regs->ARM_r1, &sc->arm_r1, err);
  263. __put_user_error(regs->ARM_r2, &sc->arm_r2, err);
  264. __put_user_error(regs->ARM_r3, &sc->arm_r3, err);
  265. __put_user_error(regs->ARM_r4, &sc->arm_r4, err);
  266. __put_user_error(regs->ARM_r5, &sc->arm_r5, err);
  267. __put_user_error(regs->ARM_r6, &sc->arm_r6, err);
  268. __put_user_error(regs->ARM_r7, &sc->arm_r7, err);
  269. __put_user_error(regs->ARM_r8, &sc->arm_r8, err);
  270. __put_user_error(regs->ARM_r9, &sc->arm_r9, err);
  271. __put_user_error(regs->ARM_r10, &sc->arm_r10, err);
  272. __put_user_error(regs->ARM_fp, &sc->arm_fp, err);
  273. __put_user_error(regs->ARM_ip, &sc->arm_ip, err);
  274. __put_user_error(regs->ARM_sp, &sc->arm_sp, err);
  275. __put_user_error(regs->ARM_lr, &sc->arm_lr, err);
  276. __put_user_error(regs->ARM_pc, &sc->arm_pc, err);
  277. #ifdef CONFIG_CPU_32
  278. __put_user_error(regs->ARM_cpsr, &sc->arm_cpsr, err);
  279. #endif
  280. __put_user_error(current->thread.trap_no, &sc->trap_no, err);
  281. __put_user_error(current->thread.error_code, &sc->error_code, err);
  282. __put_user_error(current->thread.address, &sc->fault_address, err);
  283. __put_user_error(mask, &sc->oldmask, err);
  284. return err;
  285. }
  286. static inline void *
  287. get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, int framesize)
  288. {
  289. unsigned long sp = regs->ARM_sp;
  290. /*
  291.  * This is the X/Open sanctioned signal stack switching.
  292.  */
  293. if ((ka->sa.sa_flags & SA_ONSTACK) && !sas_ss_flags(sp))
  294. sp = current->sas_ss_sp + current->sas_ss_size;
  295. /*
  296.  * ATPCS B01 mandates 8-byte alignment
  297.  */
  298. return (void *)((sp - framesize) & ~7);
  299. }
  300. static int
  301. setup_return(struct pt_regs *regs, struct k_sigaction *ka,
  302.      unsigned long *rc, void *frame, int usig)
  303. {
  304. unsigned long handler = (unsigned long)ka->sa.sa_handler;
  305. unsigned long retcode;
  306. int thumb = 0;
  307. #ifdef CONFIG_CPU_32
  308. unsigned long cpsr = regs->ARM_cpsr;
  309. /*
  310.  * Maybe we need to deliver a 32-bit signal to a 26-bit task.
  311.  */
  312. if (ka->sa.sa_flags & SA_THIRTYTWO)
  313. cpsr = (cpsr & ~MODE_MASK) | USR_MODE;
  314. #ifdef CONFIG_ARM_THUMB
  315. if (elf_hwcap & HWCAP_THUMB) {
  316. /*
  317.  * The LSB of the handler determines if we're going to
  318.  * be using THUMB or ARM mode for this signal handler.
  319.  */
  320. thumb = handler & 1;
  321. if (thumb)
  322. cpsr |= T_BIT;
  323. else
  324. cpsr &= ~T_BIT;
  325. }
  326. #endif
  327. #endif
  328. if (ka->sa.sa_flags & SA_RESTORER) {
  329. retcode = (unsigned long)ka->sa.sa_restorer;
  330. } else {
  331. unsigned int idx = thumb;
  332. if (ka->sa.sa_flags & SA_SIGINFO)
  333. idx += 2;
  334. if (__put_user(retcodes[idx], rc))
  335. return 1;
  336. flush_icache_range((unsigned long)rc,
  337.    (unsigned long)(rc + 1));
  338. retcode = ((unsigned long)rc) + thumb;
  339. }
  340. regs->ARM_r0 = usig;
  341. regs->ARM_sp = (unsigned long)frame;
  342. regs->ARM_lr = retcode;
  343. regs->ARM_pc = handler & (thumb ? ~1 : ~3);
  344. #ifdef CONFIG_CPU_32
  345. regs->ARM_cpsr = cpsr;
  346. #endif
  347. return 0;
  348. }
  349. static int
  350. setup_frame(int usig, struct k_sigaction *ka, sigset_t *set, struct pt_regs *regs)
  351. {
  352. struct sigframe *frame = get_sigframe(ka, regs, sizeof(*frame));
  353. int err = 0;
  354. if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
  355. return 1;
  356. err |= setup_sigcontext(&frame->sc, /*&frame->fpstate,*/ regs, set->sig[0]);
  357. if (_NSIG_WORDS > 1) {
  358. err |= __copy_to_user(frame->extramask, &set->sig[1],
  359.       sizeof(frame->extramask));
  360. }
  361. if (err == 0)
  362. err = setup_return(regs, ka, &frame->retcode, frame, usig);
  363. return err;
  364. }
  365. static int
  366. setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
  367.        sigset_t *set, struct pt_regs *regs)
  368. {
  369. struct rt_sigframe *frame = get_sigframe(ka, regs, sizeof(*frame));
  370. int err = 0;
  371. if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
  372. return 1;
  373. __put_user_error(&frame->info, &frame->pinfo, err);
  374. __put_user_error(&frame->uc, &frame->puc, err);
  375. err |= copy_siginfo_to_user(&frame->info, info);
  376. /* Clear all the bits of the ucontext we don't use.  */
  377. err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext));
  378. err |= setup_sigcontext(&frame->uc.uc_mcontext, /*&frame->fpstate,*/
  379. regs, set->sig[0]);
  380. err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
  381. if (err == 0)
  382. err = setup_return(regs, ka, &frame->retcode, frame, usig);
  383. if (err == 0) {
  384. /*
  385.  * For realtime signals we must also set the second and third
  386.  * arguments for the signal handler.
  387.  *   -- Peter Maydell <pmaydell@chiark.greenend.org.uk> 2000-12-06
  388.  */
  389. regs->ARM_r1 = (unsigned long)frame->pinfo;
  390. regs->ARM_r2 = (unsigned long)frame->puc;
  391. }
  392. return err;
  393. }
  394. /*
  395.  * OK, we're invoking a handler
  396.  */
  397. static void
  398. handle_signal(unsigned long sig, struct k_sigaction *ka,
  399.       siginfo_t *info, sigset_t *oldset, struct pt_regs * regs)
  400. {
  401. struct task_struct *tsk = current;
  402. int usig = sig;
  403. int ret;
  404. /*
  405.  * translate the signal
  406.  */
  407. if (usig < 32 && tsk->exec_domain && tsk->exec_domain->signal_invmap)
  408. usig = tsk->exec_domain->signal_invmap[usig];
  409. /*
  410.  * Set up the stack frame
  411.  */
  412. if (ka->sa.sa_flags & SA_SIGINFO)
  413. ret = setup_rt_frame(usig, ka, info, oldset, regs);
  414. else
  415. ret = setup_frame(usig, ka, oldset, regs);
  416. /*
  417.  * Check that the resulting registers are actually sane.
  418.  */
  419. ret |= !valid_user_regs(regs);
  420. if (ret == 0) {
  421. if (ka->sa.sa_flags & SA_ONESHOT)
  422. ka->sa.sa_handler = SIG_DFL;
  423. if (!(ka->sa.sa_flags & SA_NODEFER)) {
  424. spin_lock_irq(&tsk->sigmask_lock);
  425. sigorsets(&tsk->blocked, &tsk->blocked,
  426.   &ka->sa.sa_mask);
  427. sigaddset(&tsk->blocked, sig);
  428. recalc_sigpending(tsk);
  429. spin_unlock_irq(&tsk->sigmask_lock);
  430. }
  431. return;
  432. }
  433. if (sig == SIGSEGV)
  434. ka->sa.sa_handler = SIG_DFL;
  435. force_sig(SIGSEGV, tsk);
  436. }
  437. /*
  438.  * Note that 'init' is a special process: it doesn't get signals it doesn't
  439.  * want to handle. Thus you cannot kill init even with a SIGKILL even by
  440.  * mistake.
  441.  *
  442.  * Note that we go through the signals twice: once to check the signals that
  443.  * the kernel can handle, and then we build all the user-level signal handling
  444.  * stack-frames in one go after that.
  445.  */
  446. asmlinkage int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall)
  447. {
  448. struct k_sigaction *ka;
  449. siginfo_t info;
  450. int single_stepping;
  451. /*
  452.  * We want the common case to go fast, which
  453.  * is why we may in certain cases get here from
  454.  * kernel mode. Just return without doing anything
  455.  * if so.
  456.  */
  457. if (!user_mode(regs))
  458. return 0;
  459. if (!oldset)
  460. oldset = &current->blocked;
  461. single_stepping = ptrace_cancel_bpt(current);
  462. for (;;) {
  463. unsigned long signr;
  464. spin_lock_irq (&current->sigmask_lock);
  465. signr = dequeue_signal(&current->blocked, &info);
  466. spin_unlock_irq (&current->sigmask_lock);
  467. if (!signr)
  468. break;
  469. if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) {
  470. /* Let the debugger run.  */
  471. current->exit_code = signr;
  472. current->state = TASK_STOPPED;
  473. notify_parent(current, SIGCHLD);
  474. schedule();
  475. single_stepping |= ptrace_cancel_bpt(current);
  476. /* We're back.  Did the debugger cancel the sig?  */
  477. if (!(signr = current->exit_code))
  478. continue;
  479. current->exit_code = 0;
  480. /* The debugger continued.  Ignore SIGSTOP.  */
  481. if (signr == SIGSTOP)
  482. continue;
  483. /* Update the siginfo structure.  Is this good? */
  484. if (signr != info.si_signo) {
  485. info.si_signo = signr;
  486. info.si_errno = 0;
  487. info.si_code = SI_USER;
  488. info.si_pid = current->p_pptr->pid;
  489. info.si_uid = current->p_pptr->uid;
  490. }
  491. /* If the (new) signal is now blocked, requeue it.  */
  492. if (sigismember(&current->blocked, signr)) {
  493. send_sig_info(signr, &info, current);
  494. continue;
  495. }
  496. }
  497. ka = &current->sig->action[signr-1];
  498. if (ka->sa.sa_handler == SIG_IGN) {
  499. if (signr != SIGCHLD)
  500. continue;
  501. /* Check for SIGCHLD: it's special.  */
  502. while (sys_wait4(-1, NULL, WNOHANG, NULL) > 0)
  503. /* nothing */;
  504. continue;
  505. }
  506. if (ka->sa.sa_handler == SIG_DFL) {
  507. int exit_code = signr;
  508. /* Init gets no signals it doesn't want.  */
  509. if (current->pid == 1)
  510. continue;
  511. switch (signr) {
  512. case SIGCONT: case SIGCHLD: case SIGWINCH:
  513. continue;
  514. case SIGTSTP: case SIGTTIN: case SIGTTOU:
  515. if (is_orphaned_pgrp(current->pgrp))
  516. continue;
  517. /* FALLTHRU */
  518. case SIGSTOP:
  519. current->state = TASK_STOPPED;
  520. current->exit_code = signr;
  521. if (!(current->p_pptr->sig->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDSTOP))
  522. notify_parent(current, SIGCHLD);
  523. schedule();
  524. continue;
  525. case SIGQUIT: case SIGILL: case SIGTRAP:
  526. case SIGABRT: case SIGFPE: case SIGSEGV:
  527. case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ:
  528. if (do_coredump(signr, regs))
  529. exit_code |= 0x80;
  530. /* FALLTHRU */
  531. default:
  532. sigaddset(&current->pending.signal, signr);
  533. recalc_sigpending(current);
  534. current->flags |= PF_SIGNALED;
  535. do_exit(exit_code);
  536. /* NOTREACHED */
  537. }
  538. }
  539. /* Are we from a system call? */
  540. if (syscall) {
  541. switch (regs->ARM_r0) {
  542. case -ERESTARTNOHAND:
  543. regs->ARM_r0 = -EINTR;
  544. break;
  545. case -ERESTARTSYS:
  546. if (!(ka->sa.sa_flags & SA_RESTART)) {
  547. regs->ARM_r0 = -EINTR;
  548. break;
  549. }
  550. /* fallthrough */
  551. case -ERESTARTNOINTR:
  552. regs->ARM_r0 = regs->ARM_ORIG_r0;
  553. regs->ARM_pc -= 4;
  554. }
  555. }
  556. /* Whee!  Actually deliver the signal.  */
  557. handle_signal(signr, ka, &info, oldset, regs);
  558. if (single_stepping)
  559.      ptrace_set_bpt(current);
  560. return 1;
  561. }
  562. if (syscall &&
  563.     (regs->ARM_r0 == -ERESTARTNOHAND ||
  564.      regs->ARM_r0 == -ERESTARTSYS ||
  565.      regs->ARM_r0 == -ERESTARTNOINTR)) {
  566. regs->ARM_r0 = regs->ARM_ORIG_r0;
  567. regs->ARM_pc -= 4;
  568. }
  569. if (single_stepping)
  570. ptrace_set_bpt(current);
  571. return 0;
  572. }