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

Linux/Unix编程

开发平台:

Unix_Linux

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