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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/arch/cris/kernel/signal.c
  3.  *
  4.  *  Based on arch/i386/kernel/signal.c by
  5.  *     Copyright (C) 1991, 1992  Linus Torvalds
  6.  *     1997-11-28  Modified for POSIX.1b signals by Richard Henderson *
  7.  *
  8.  *  Ideas also taken from arch/arm.
  9.  *
  10.  *  Copyright (C) 2000, 2001, 2002 Axis Communications AB
  11.  *
  12.  *  Authors:  Bjorn Wesen (bjornw@axis.com)
  13.  *
  14.  */
  15. #include <linux/sched.h>
  16. #include <linux/mm.h>
  17. #include <linux/smp.h>
  18. #include <linux/smp_lock.h>
  19. #include <linux/kernel.h>
  20. #include <linux/signal.h>
  21. #include <linux/errno.h>
  22. #include <linux/wait.h>
  23. #include <linux/ptrace.h>
  24. #include <linux/unistd.h>
  25. #include <linux/stddef.h>
  26. #include <asm/processor.h>
  27. #include <asm/ucontext.h>
  28. #include <asm/uaccess.h>
  29. #define DEBUG_SIG 0
  30. #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
  31. /* a syscall in Linux/CRIS is a break 13 instruction which is 2 bytes */
  32. /* manipulate regs so that upon return, it will be re-executed */
  33. /* We rely on that pc points to the instruction after "break 13", so the
  34.  * library must never do strange things like putting it in a delay slot.
  35.  */
  36. #define RESTART_CRIS_SYS(regs) regs->r10 = regs->orig_r10; regs->irp -= 2;
  37. int do_signal(int canrestart, sigset_t *oldset, struct pt_regs *regs);
  38. int copy_siginfo_to_user(siginfo_t *to, siginfo_t *from)
  39. {
  40. if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t)))
  41. return -EFAULT;
  42. if (from->si_code < 0)
  43. return __copy_to_user(to, from, sizeof(siginfo_t));
  44. else {
  45. int err;
  46. /* If you change siginfo_t structure, please be sure
  47.    this code is fixed accordingly.
  48.    It should never copy any pad contained in the structure
  49.    to avoid security leaks, but must copy the generic
  50.    3 ints plus the relevant union member.  */
  51. err = __put_user(from->si_signo, &to->si_signo);
  52. err |= __put_user(from->si_errno, &to->si_errno);
  53. err |= __put_user((short)from->si_code, &to->si_code);
  54. /* First 32bits of unions are always present.  */
  55. err |= __put_user(from->si_pid, &to->si_pid);
  56. switch (from->si_code >> 16) {
  57. case __SI_FAULT >> 16:
  58.                         err |= __put_user(from->si_addr, &to->si_addr);
  59. break;
  60. case __SI_CHLD >> 16:
  61. err |= __put_user(from->si_utime, &to->si_utime);
  62. err |= __put_user(from->si_stime, &to->si_stime);
  63. err |= __put_user(from->si_status, &to->si_status);
  64. default:
  65. err |= __put_user(from->si_uid, &to->si_uid);
  66. break;
  67. /* case __SI_RT: This is not generated by the kernel as of now.  */
  68. }
  69. return err;
  70. }
  71. }
  72. /*
  73.  * Atomically swap in the new signal mask, and wait for a signal.  Define 
  74.  * dummy arguments to be able to reach the regs argument.  (Note that this
  75.  * arrangement relies on old_sigset_t occupying one register.)
  76.  */
  77. int
  78. sys_sigsuspend(old_sigset_t mask, long r11, long r12, long r13, long mof, 
  79.                long srp, struct pt_regs *regs)
  80. {
  81. sigset_t saveset;
  82. mask &= _BLOCKABLE;
  83. spin_lock_irq(&current->sigmask_lock);
  84. saveset = current->blocked;
  85. siginitset(&current->blocked, mask);
  86. recalc_sigpending(current);
  87. spin_unlock_irq(&current->sigmask_lock);
  88. regs->r10 = -EINTR;
  89. while (1) {
  90. current->state = TASK_INTERRUPTIBLE;
  91. schedule();
  92. if (do_signal(0, &saveset, regs))
  93. /* We will get here twice: once to call the signal
  94.    handler, then again to return from the
  95.    sigsuspend system call.  When calling the
  96.    signal handler, R10 holds the signal number as
  97.    set through do_signal.  The sigsuspend call
  98.    will return with the restored value set above;
  99.    always -EINTR.  */
  100. return regs->r10;
  101. }
  102. }
  103. /* Define dummy arguments to be able to reach the regs argument.  (Note that
  104.  * this arrangement relies on size_t occupying one register.)
  105.  */
  106. int
  107. sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize, long r12, long r13, 
  108.                   long mof, long srp, struct pt_regs *regs)
  109. {
  110. sigset_t saveset, newset;
  111. /* XXX: Don't preclude handling different sized sigset_t's.  */
  112. if (sigsetsize != sizeof(sigset_t))
  113. return -EINVAL;
  114. if (copy_from_user(&newset, unewset, sizeof(newset)))
  115. return -EFAULT;
  116. sigdelsetmask(&newset, ~_BLOCKABLE);
  117. spin_lock_irq(&current->sigmask_lock);
  118. saveset = current->blocked;
  119. current->blocked = newset;
  120. recalc_sigpending(current);
  121. spin_unlock_irq(&current->sigmask_lock);
  122. regs->r10 = -EINTR;
  123. while (1) {
  124. current->state = TASK_INTERRUPTIBLE;
  125. schedule();
  126. if (do_signal(0, &saveset, regs))
  127. /* We will get here twice: once to call the signal
  128.    handler, then again to return from the
  129.    sigsuspend system call.  When calling the
  130.    signal handler, R10 holds the signal number as
  131.    set through do_signal.  The sigsuspend call
  132.    will return with the restored value set above;
  133.    always -EINTR.  */
  134. return regs->r10;
  135. }
  136. }
  137. int 
  138. sys_sigaction(int sig, const struct old_sigaction *act,
  139.       struct old_sigaction *oact)
  140. {
  141. struct k_sigaction new_ka, old_ka;
  142. int ret;
  143. if (act) {
  144. old_sigset_t mask;
  145. if (verify_area(VERIFY_READ, act, sizeof(*act)) ||
  146.     __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
  147.     __get_user(new_ka.sa.sa_restorer, &act->sa_restorer))
  148. return -EFAULT;
  149. __get_user(new_ka.sa.sa_flags, &act->sa_flags);
  150. __get_user(mask, &act->sa_mask);
  151. siginitset(&new_ka.sa.sa_mask, mask);
  152. }
  153. ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
  154. if (!ret && oact) {
  155. if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) ||
  156.     __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
  157.     __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer))
  158. return -EFAULT;
  159. __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
  160. __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
  161. }
  162. return ret;
  163. }
  164. int
  165. sys_sigaltstack(const stack_t *uss, stack_t *uoss)
  166. {
  167. return do_sigaltstack(uss, uoss, rdusp());
  168. }
  169. /*
  170.  * Do a signal return; undo the signal stack.
  171.  */
  172. struct sigframe {
  173. struct sigcontext sc;
  174. unsigned long extramask[_NSIG_WORDS-1];
  175. unsigned char retcode[8];  /* trampoline code */
  176. };
  177. struct rt_sigframe {
  178. struct siginfo *pinfo;
  179. void *puc;
  180. struct siginfo info;
  181. struct ucontext uc;
  182. unsigned char retcode[8];  /* trampoline code */
  183. };
  184. static int
  185. restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc)
  186. {
  187. unsigned int err = 0;
  188. unsigned long old_usp;
  189. /* restore the regs from &sc->regs (same as sc, since regs is first)
  190.  * (sc is already checked for VERIFY_READ since the sigframe was
  191.  *  checked in sys_sigreturn previously)
  192.  */
  193. if (__copy_from_user(regs, sc, sizeof(struct pt_regs)))
  194.                 goto badframe;
  195. /* make sure the U-flag is set so user-mode cannot fool us */
  196. regs->dccr |= 1 << 8;
  197. /* restore the old USP as it was before we stacked the sc etc.
  198.  * (we cannot just pop the sigcontext since we aligned the sp and
  199.  *  stuff after pushing it)
  200.  */
  201. err |= __get_user(old_usp, &sc->usp);
  202. wrusp(old_usp);
  203. /* TODO: the other ports use regs->orig_XX to disable syscall checks
  204.  * after this completes, but we don't use that mechanism. maybe we can
  205.  * use it now ? 
  206.  */
  207. return err;
  208. badframe:
  209. return 1;
  210. }
  211. /* Define dummy arguments to be able to reach the regs argument.  */
  212. asmlinkage int sys_sigreturn(long r10, long r11, long r12, long r13, long mof, 
  213.                              long srp, struct pt_regs *regs)
  214. {
  215. struct sigframe *frame = (struct sigframe *)rdusp();
  216. sigset_t set;
  217.         /*
  218.          * Since we stacked the signal on a dword boundary,
  219.          * then frame should be dword aligned here.  If it's
  220.          * not, then the user is trying to mess with us.
  221.          */
  222.         if (((long)frame) & 3)
  223.                 goto badframe;
  224. if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
  225. goto badframe;
  226. if (__get_user(set.sig[0], &frame->sc.oldmask)
  227.     || (_NSIG_WORDS > 1
  228. && __copy_from_user(&set.sig[1], &frame->extramask,
  229.     sizeof(frame->extramask))))
  230. goto badframe;
  231. sigdelsetmask(&set, ~_BLOCKABLE);
  232. spin_lock_irq(&current->sigmask_lock);
  233. current->blocked = set;
  234. recalc_sigpending(current);
  235. spin_unlock_irq(&current->sigmask_lock);
  236. if (restore_sigcontext(regs, &frame->sc))
  237. goto badframe;
  238. /* TODO: SIGTRAP when single-stepping as in arm ? */
  239. return regs->r10;
  240. badframe:
  241. force_sig(SIGSEGV, current);
  242. return 0;
  243. }
  244. /* Define dummy arguments to be able to reach the regs argument.  */
  245. asmlinkage int sys_rt_sigreturn(long r10, long r11, long r12, long r13, 
  246.                                 long mof, long srp, struct pt_regs *regs)
  247. {
  248. struct rt_sigframe *frame = (struct rt_sigframe *)rdusp();
  249. sigset_t set;
  250. stack_t st;
  251.         /*
  252.          * Since we stacked the signal on a dword boundary,
  253.          * then frame should be dword aligned here.  If it's
  254.          * not, then the user is trying to mess with us.
  255.          */
  256.         if (((long)frame) & 3)
  257.                 goto badframe;
  258. if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
  259. goto badframe;
  260. if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
  261. goto badframe;
  262. sigdelsetmask(&set, ~_BLOCKABLE);
  263. spin_lock_irq(&current->sigmask_lock);
  264. current->blocked = set;
  265. recalc_sigpending(current);
  266. spin_unlock_irq(&current->sigmask_lock);
  267. if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
  268. goto badframe;
  269. if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st)))
  270. goto badframe;
  271. /* It is more difficult to avoid calling this function than to
  272.    call it and ignore errors.  */
  273. do_sigaltstack(&st, NULL, rdusp());
  274. return regs->r10;
  275. badframe:
  276. force_sig(SIGSEGV, current);
  277. return 0;
  278. }
  279. /*
  280.  * Set up a signal frame.
  281.  */
  282. static int
  283. setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs, unsigned long mask)
  284. {
  285. int err = 0;
  286. unsigned long usp = rdusp();
  287. /* copy the regs. they are first in sc so we can use sc directly */
  288. err |= __copy_to_user(sc, regs, sizeof(struct pt_regs));
  289.         /* Set the frametype to CRIS_FRAME_NORMAL for the execution of
  290.            the signal handler. The frametype will be restored to its previous
  291.            value in restore_sigcontext. */
  292.         regs->frametype = CRIS_FRAME_NORMAL;
  293. /* then some other stuff */
  294. err |= __put_user(mask, &sc->oldmask);
  295. err |= __put_user(usp, &sc->usp);
  296. return err;
  297. }
  298. /* figure out where we want to put the new signal frame - usually on the stack */
  299. static inline void *
  300. get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
  301. {
  302. unsigned long sp = rdusp();
  303. /* This is the X/Open sanctioned signal stack switching.  */
  304. if (ka->sa.sa_flags & SA_ONSTACK) {
  305. if (! on_sig_stack(sp))
  306. sp = current->sas_ss_sp + current->sas_ss_size;
  307. }
  308. /* make sure the frame is dword-aligned */
  309. sp &= ~3;
  310. return (void *)(sp - frame_size);
  311. }
  312. /* grab and setup a signal frame.
  313.  * 
  314.  * basically we stack a lot of state info, and arrange for the
  315.  * user-mode program to return to the kernel using either a
  316.  * trampoline which performs the syscall sigreturn, or a provided
  317.  * user-mode trampoline.
  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. unsigned long return_ip;
  324. int err = 0;
  325. frame = get_sigframe(ka, regs, sizeof(*frame));
  326. if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
  327. goto give_sigsegv;
  328. err |= setup_sigcontext(&frame->sc, regs, set->sig[0]);
  329. if (err)
  330. goto give_sigsegv;
  331. if (_NSIG_WORDS > 1) {
  332. err |= __copy_to_user(frame->extramask, &set->sig[1],
  333.       sizeof(frame->extramask));
  334. }
  335. if (err)
  336. goto give_sigsegv;
  337. /* Set up to return from userspace.  If provided, use a stub
  338.    already in userspace.  */
  339. if (ka->sa.sa_flags & SA_RESTORER) {
  340. return_ip = (unsigned long)ka->sa.sa_restorer;
  341. } else {
  342. /* trampoline - the desired return ip is the retcode itself */
  343. return_ip = (unsigned long)&frame->retcode;
  344. /* This is movu.w __NR_sigreturn, r9; break 13; */
  345. err |= __put_user(0x9c5f,         (short *)(frame->retcode+0));
  346. err |= __put_user(__NR_sigreturn, (short *)(frame->retcode+2));
  347. err |= __put_user(0xe93d,         (short *)(frame->retcode+4));
  348. }
  349. if (err)
  350. goto give_sigsegv;
  351. /* Set up registers for signal handler */
  352. regs->irp = (unsigned long) ka->sa.sa_handler;  /* what we enter NOW   */
  353. regs->srp = return_ip;                          /* what we enter LATER */
  354. regs->r10 = sig;                                /* first argument is signo */
  355. /* actually move the usp to reflect the stacked frame */
  356. wrusp((unsigned long)frame);
  357. return;
  358. give_sigsegv:
  359. if (sig == SIGSEGV)
  360. ka->sa.sa_handler = SIG_DFL;
  361. force_sig(SIGSEGV, current);
  362. }
  363. static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
  364.    sigset_t *set, struct pt_regs * regs)
  365. {
  366. struct rt_sigframe *frame;
  367. unsigned long return_ip;
  368. int err = 0;
  369. frame = get_sigframe(ka, regs, sizeof(*frame));
  370. if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
  371. goto give_sigsegv;
  372. err |= __put_user(&frame->info, &frame->pinfo);
  373. err |= __put_user(&frame->uc, &frame->puc);
  374. err |= copy_siginfo_to_user(&frame->info, info);
  375. if (err)
  376. goto give_sigsegv;
  377. /* Clear all the bits of the ucontext we don't use.  */
  378.         err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext));
  379. err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0]);
  380. err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
  381. if (err)
  382. goto give_sigsegv;
  383. /* Set up to return from userspace.  If provided, use a stub
  384.    already in userspace.  */
  385. if (ka->sa.sa_flags & SA_RESTORER) {
  386. return_ip = (unsigned long)ka->sa.sa_restorer;
  387. } else {
  388. /* trampoline - the desired return ip is the retcode itself */
  389. return_ip = (unsigned long)&frame->retcode;
  390. /* This is movu.w __NR_rt_sigreturn, r9; break 13; */
  391. err |= __put_user(0x9c5f,            (short *)(frame->retcode+0));
  392. err |= __put_user(__NR_rt_sigreturn, (short *)(frame->retcode+2));
  393. err |= __put_user(0xe93d,            (short *)(frame->retcode+4));
  394. }
  395. if (err)
  396. goto give_sigsegv;
  397. /* TODO what is the current->exec_domain stuff and invmap ? */
  398. /* Set up registers for signal handler */
  399. regs->irp = (unsigned long) ka->sa.sa_handler;  /* what we enter NOW   */
  400. regs->srp = return_ip;                          /* what we enter LATER */
  401. regs->r10 = sig;                                /* first argument is signo */
  402.         regs->r11 = (unsigned long) &frame->info;       /* second argument is (siginfo_t *) */
  403.         regs->r12 = 0;                                  /* third argument is unused */
  404. /* actually move the usp to reflect the stacked frame */
  405. wrusp((unsigned long)frame);
  406. return;
  407. give_sigsegv:
  408. if (sig == SIGSEGV)
  409. ka->sa.sa_handler = SIG_DFL;
  410. force_sig(SIGSEGV, current);
  411. }
  412. /*
  413.  * OK, we're invoking a handler
  414.  */
  415. static inline void
  416. handle_signal(int canrestart, unsigned long sig, struct k_sigaction *ka,
  417.       siginfo_t *info, sigset_t *oldset, struct pt_regs * regs)
  418. {
  419. /* Are we from a system call? */
  420. if (canrestart) {
  421. /* If so, check system call restarting.. */
  422. switch (regs->r10) {
  423. case -ERESTARTNOHAND:
  424. /* ERESTARTNOHAND means that the syscall should only be
  425.    restarted if there was no handler for the signal, and since
  426.    we only get here if there is a handler, we dont restart */
  427. regs->r10 = -EINTR;
  428. break;
  429. case -ERESTARTSYS:
  430. /* ERESTARTSYS means to restart the syscall if there is no
  431.    handler or the handler was registered with SA_RESTART */
  432. if (!(ka->sa.sa_flags & SA_RESTART)) {
  433. regs->r10 = -EINTR;
  434. break;
  435. }
  436. /* fallthrough */
  437. case -ERESTARTNOINTR:
  438. /* ERESTARTNOINTR means that the syscall should be called again
  439.    after the signal handler returns. */
  440. RESTART_CRIS_SYS(regs);
  441. }
  442. }
  443. /* Set up the stack frame */
  444. if (ka->sa.sa_flags & SA_SIGINFO)
  445. setup_rt_frame(sig, ka, info, oldset, regs);
  446. else
  447. setup_frame(sig, ka, oldset, regs);
  448. if (ka->sa.sa_flags & SA_ONESHOT)
  449. ka->sa.sa_handler = SIG_DFL;
  450. if (!(ka->sa.sa_flags & SA_NODEFER)) {
  451. spin_lock_irq(&current->sigmask_lock);
  452. sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
  453. sigaddset(&current->blocked,sig);
  454. recalc_sigpending(current);
  455. spin_unlock_irq(&current->sigmask_lock);
  456. }
  457. }
  458. /*
  459.  * Note that 'init' is a special process: it doesn't get signals it doesn't
  460.  * want to handle. Thus you cannot kill init even with a SIGKILL even by
  461.  * mistake.
  462.  *
  463.  * Also note that the regs structure given here as an argument, is the latest
  464.  * pushed pt_regs. It may or may not be the same as the first pushed registers
  465.  * when the initial usermode->kernelmode transition took place. Therefore
  466.  * we can use user_mode(regs) to see if we came directly from kernel or user
  467.  * mode below.
  468.  */
  469. int do_signal(int canrestart, sigset_t *oldset, struct pt_regs *regs)
  470. {
  471. siginfo_t info;
  472. struct k_sigaction *ka;
  473. /*
  474.  * We want the common case to go fast, which
  475.  * is why we may in certain cases get here from
  476.  * kernel mode. Just return without doing anything
  477.  * if so.
  478.  */
  479. if (!user_mode(regs))
  480. return 1;
  481. if (!oldset)
  482. oldset = &current->blocked;
  483. for (;;) {
  484. unsigned long signr;
  485. spin_lock_irq(&current->sigmask_lock);
  486. signr = dequeue_signal(&current->blocked, &info);
  487. spin_unlock_irq(&current->sigmask_lock);
  488. if (!signr)
  489. break;
  490. if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) {
  491. /* Let the debugger run.  */
  492. current->exit_code = signr;
  493. current->state = TASK_STOPPED;
  494. notify_parent(current, SIGCHLD);
  495. schedule();
  496. /* We're back.  Did the debugger cancel the sig?  */
  497. if (!(signr = current->exit_code))
  498. continue;
  499. current->exit_code = 0;
  500. /* The debugger continued.  Ignore SIGSTOP.  */
  501. if (signr == SIGSTOP)
  502. continue;
  503. /* Update the siginfo structure.  Is this good?  */
  504. if (signr != info.si_signo) {
  505. info.si_signo = signr;
  506. info.si_errno = 0;
  507. info.si_code = SI_USER;
  508. info.si_pid = current->p_pptr->pid;
  509. info.si_uid = current->p_pptr->uid;
  510. }
  511. /* If the (new) signal is now blocked, requeue it.  */
  512. if (sigismember(&current->blocked, signr)) {
  513. send_sig_info(signr, &info, current);
  514. continue;
  515. }
  516. }
  517. ka = &current->sig->action[signr-1];
  518. if (ka->sa.sa_handler == SIG_IGN) {
  519. if (signr != SIGCHLD)
  520. continue;
  521. /* Check for SIGCHLD: it's special.  */
  522. while (sys_wait4(-1, NULL, WNOHANG, NULL) > 0)
  523. /* nothing */;
  524. continue;
  525. }
  526. if (ka->sa.sa_handler == SIG_DFL) {
  527. int exit_code = signr;
  528. /* Init gets no signals it doesn't want.  */
  529. if (current->pid == 1)
  530. continue;
  531. switch (signr) {
  532. case SIGCONT: case SIGCHLD: case SIGWINCH:
  533. continue;
  534. case SIGTSTP: case SIGTTIN: case SIGTTOU:
  535. if (is_orphaned_pgrp(current->pgrp))
  536. continue;
  537. /* FALLTHRU */
  538. case SIGSTOP:
  539. current->state = TASK_STOPPED;
  540. current->exit_code = signr;
  541. if (!(current->p_pptr->sig->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDSTOP))
  542. notify_parent(current, SIGCHLD);
  543. schedule();
  544. continue;
  545. case SIGQUIT: case SIGILL: case SIGTRAP:
  546. case SIGABRT: case SIGFPE: case SIGSEGV:
  547. case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ:
  548. if (do_coredump(signr, regs))
  549. exit_code |= 0x80;
  550. /* FALLTHRU */
  551. default:
  552. lock_kernel();
  553. sig_exit(signr, exit_code, &info);
  554. /* NOTREACHED */
  555. }
  556. }
  557. /* Whee!  Actually deliver the signal.  */
  558. handle_signal(canrestart, signr, ka, &info, oldset, regs);
  559. return 1;
  560. }
  561. /* Did we come from a system call? */
  562. if (canrestart) {
  563. /* Restart the system call - no handlers present */
  564. if (regs->r10 == -ERESTARTNOHAND ||
  565.     regs->r10 == -ERESTARTSYS ||
  566.     regs->r10 == -ERESTARTNOINTR) {
  567. RESTART_CRIS_SYS(regs);
  568. }
  569. }
  570. return 0;
  571. }