signal.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629
  1. /*
  2. * linux/arch/sh/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. *
  8. * SuperH version: Copyright (C) 1999, 2000 Niibe Yutaka & Kaz Kojima
  9. *
  10. */
  11. #include <linux/sched.h>
  12. #include <linux/mm.h>
  13. #include <linux/smp.h>
  14. #include <linux/kernel.h>
  15. #include <linux/signal.h>
  16. #include <linux/errno.h>
  17. #include <linux/wait.h>
  18. #include <linux/ptrace.h>
  19. #include <linux/unistd.h>
  20. #include <linux/stddef.h>
  21. #include <linux/tty.h>
  22. #include <linux/elf.h>
  23. #include <linux/personality.h>
  24. #include <linux/binfmts.h>
  25. #include <linux/freezer.h>
  26. #include <linux/io.h>
  27. #include <asm/system.h>
  28. #include <asm/ucontext.h>
  29. #include <asm/uaccess.h>
  30. #include <asm/pgtable.h>
  31. #include <asm/cacheflush.h>
  32. #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
  33. /*
  34. * Atomically swap in the new signal mask, and wait for a signal.
  35. */
  36. asmlinkage int
  37. sys_sigsuspend(old_sigset_t mask,
  38. unsigned long r5, unsigned long r6, unsigned long r7,
  39. struct pt_regs __regs)
  40. {
  41. mask &= _BLOCKABLE;
  42. spin_lock_irq(&current->sighand->siglock);
  43. current->saved_sigmask = current->blocked;
  44. siginitset(&current->blocked, mask);
  45. recalc_sigpending();
  46. spin_unlock_irq(&current->sighand->siglock);
  47. current->state = TASK_INTERRUPTIBLE;
  48. schedule();
  49. set_thread_flag(TIF_RESTORE_SIGMASK);
  50. return -ERESTARTNOHAND;
  51. }
  52. asmlinkage int
  53. sys_sigaction(int sig, const struct old_sigaction __user *act,
  54. struct old_sigaction __user *oact)
  55. {
  56. struct k_sigaction new_ka, old_ka;
  57. int ret;
  58. if (act) {
  59. old_sigset_t mask;
  60. if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
  61. __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
  62. __get_user(new_ka.sa.sa_restorer, &act->sa_restorer))
  63. return -EFAULT;
  64. __get_user(new_ka.sa.sa_flags, &act->sa_flags);
  65. __get_user(mask, &act->sa_mask);
  66. siginitset(&new_ka.sa.sa_mask, mask);
  67. }
  68. ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
  69. if (!ret && oact) {
  70. if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
  71. __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
  72. __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer))
  73. return -EFAULT;
  74. __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
  75. __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
  76. }
  77. return ret;
  78. }
  79. asmlinkage int
  80. sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
  81. unsigned long r6, unsigned long r7,
  82. struct pt_regs __regs)
  83. {
  84. struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
  85. return do_sigaltstack(uss, uoss, regs->regs[15]);
  86. }
  87. /*
  88. * Do a signal return; undo the signal stack.
  89. */
  90. #define MOVW(n) (0x9300|((n)-2)) /* Move mem word at PC+n to R3 */
  91. #if defined(CONFIG_CPU_SH2)
  92. #define TRAP_NOARG 0xc320 /* Syscall w/no args (NR in R3) */
  93. #else
  94. #define TRAP_NOARG 0xc310 /* Syscall w/no args (NR in R3) */
  95. #endif
  96. #define OR_R0_R0 0x200b /* or r0,r0 (insert to avoid hardware bug) */
  97. struct sigframe
  98. {
  99. struct sigcontext sc;
  100. unsigned long extramask[_NSIG_WORDS-1];
  101. u16 retcode[8];
  102. };
  103. struct rt_sigframe
  104. {
  105. struct siginfo info;
  106. struct ucontext uc;
  107. u16 retcode[8];
  108. };
  109. #ifdef CONFIG_SH_FPU
  110. static inline int restore_sigcontext_fpu(struct sigcontext __user *sc)
  111. {
  112. struct task_struct *tsk = current;
  113. if (!(current_cpu_data.flags & CPU_HAS_FPU))
  114. return 0;
  115. set_used_math();
  116. return __copy_from_user(&tsk->thread.fpu.hard, &sc->sc_fpregs[0],
  117. sizeof(long)*(16*2+2));
  118. }
  119. static inline int save_sigcontext_fpu(struct sigcontext __user *sc,
  120. struct pt_regs *regs)
  121. {
  122. struct task_struct *tsk = current;
  123. if (!(current_cpu_data.flags & CPU_HAS_FPU))
  124. return 0;
  125. if (!used_math()) {
  126. __put_user(0, &sc->sc_ownedfp);
  127. return 0;
  128. }
  129. __put_user(1, &sc->sc_ownedfp);
  130. /* This will cause a "finit" to be triggered by the next
  131. attempted FPU operation by the 'current' process.
  132. */
  133. clear_used_math();
  134. unlazy_fpu(tsk, regs);
  135. return __copy_to_user(&sc->sc_fpregs[0], &tsk->thread.fpu.hard,
  136. sizeof(long)*(16*2+2));
  137. }
  138. #endif /* CONFIG_SH_FPU */
  139. static int
  140. restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, int *r0_p)
  141. {
  142. unsigned int err = 0;
  143. #define COPY(x) err |= __get_user(regs->x, &sc->sc_##x)
  144. COPY(regs[1]);
  145. COPY(regs[2]); COPY(regs[3]);
  146. COPY(regs[4]); COPY(regs[5]);
  147. COPY(regs[6]); COPY(regs[7]);
  148. COPY(regs[8]); COPY(regs[9]);
  149. COPY(regs[10]); COPY(regs[11]);
  150. COPY(regs[12]); COPY(regs[13]);
  151. COPY(regs[14]); COPY(regs[15]);
  152. COPY(gbr); COPY(mach);
  153. COPY(macl); COPY(pr);
  154. COPY(sr); COPY(pc);
  155. #undef COPY
  156. #ifdef CONFIG_SH_FPU
  157. if (current_cpu_data.flags & CPU_HAS_FPU) {
  158. int owned_fp;
  159. struct task_struct *tsk = current;
  160. regs->sr |= SR_FD; /* Release FPU */
  161. clear_fpu(tsk, regs);
  162. clear_used_math();
  163. __get_user (owned_fp, &sc->sc_ownedfp);
  164. if (owned_fp)
  165. err |= restore_sigcontext_fpu(sc);
  166. }
  167. #endif
  168. regs->tra = -1; /* disable syscall checks */
  169. err |= __get_user(*r0_p, &sc->sc_regs[0]);
  170. return err;
  171. }
  172. asmlinkage int sys_sigreturn(unsigned long r4, unsigned long r5,
  173. unsigned long r6, unsigned long r7,
  174. struct pt_regs __regs)
  175. {
  176. struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
  177. struct sigframe __user *frame = (struct sigframe __user *)regs->regs[15];
  178. sigset_t set;
  179. int r0;
  180. if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
  181. goto badframe;
  182. if (__get_user(set.sig[0], &frame->sc.oldmask)
  183. || (_NSIG_WORDS > 1
  184. && __copy_from_user(&set.sig[1], &frame->extramask,
  185. sizeof(frame->extramask))))
  186. goto badframe;
  187. sigdelsetmask(&set, ~_BLOCKABLE);
  188. spin_lock_irq(&current->sighand->siglock);
  189. current->blocked = set;
  190. recalc_sigpending();
  191. spin_unlock_irq(&current->sighand->siglock);
  192. if (restore_sigcontext(regs, &frame->sc, &r0))
  193. goto badframe;
  194. return r0;
  195. badframe:
  196. force_sig(SIGSEGV, current);
  197. return 0;
  198. }
  199. asmlinkage int sys_rt_sigreturn(unsigned long r4, unsigned long r5,
  200. unsigned long r6, unsigned long r7,
  201. struct pt_regs __regs)
  202. {
  203. struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
  204. struct rt_sigframe __user *frame = (struct rt_sigframe __user *)regs->regs[15];
  205. sigset_t set;
  206. stack_t st;
  207. int r0;
  208. if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
  209. goto badframe;
  210. if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
  211. goto badframe;
  212. sigdelsetmask(&set, ~_BLOCKABLE);
  213. spin_lock_irq(&current->sighand->siglock);
  214. current->blocked = set;
  215. recalc_sigpending();
  216. spin_unlock_irq(&current->sighand->siglock);
  217. if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &r0))
  218. goto badframe;
  219. if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st)))
  220. goto badframe;
  221. /* It is more difficult to avoid calling this function than to
  222. call it and ignore errors. */
  223. do_sigaltstack((const stack_t __user *)&st, NULL, (unsigned long)frame);
  224. return r0;
  225. badframe:
  226. force_sig(SIGSEGV, current);
  227. return 0;
  228. }
  229. /*
  230. * Set up a signal frame.
  231. */
  232. static int
  233. setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
  234. unsigned long mask)
  235. {
  236. int err = 0;
  237. #define COPY(x) err |= __put_user(regs->x, &sc->sc_##x)
  238. COPY(regs[0]); COPY(regs[1]);
  239. COPY(regs[2]); COPY(regs[3]);
  240. COPY(regs[4]); COPY(regs[5]);
  241. COPY(regs[6]); COPY(regs[7]);
  242. COPY(regs[8]); COPY(regs[9]);
  243. COPY(regs[10]); COPY(regs[11]);
  244. COPY(regs[12]); COPY(regs[13]);
  245. COPY(regs[14]); COPY(regs[15]);
  246. COPY(gbr); COPY(mach);
  247. COPY(macl); COPY(pr);
  248. COPY(sr); COPY(pc);
  249. #undef COPY
  250. #ifdef CONFIG_SH_FPU
  251. err |= save_sigcontext_fpu(sc, regs);
  252. #endif
  253. /* non-iBCS2 extensions.. */
  254. err |= __put_user(mask, &sc->oldmask);
  255. return err;
  256. }
  257. /*
  258. * Determine which stack to use..
  259. */
  260. static inline void __user *
  261. get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size)
  262. {
  263. if (ka->sa.sa_flags & SA_ONSTACK) {
  264. if (sas_ss_flags(sp) == 0)
  265. sp = current->sas_ss_sp + current->sas_ss_size;
  266. }
  267. return (void __user *)((sp - frame_size) & -8ul);
  268. }
  269. /* These symbols are defined with the addresses in the vsyscall page.
  270. See vsyscall-trapa.S. */
  271. extern void __user __kernel_sigreturn;
  272. extern void __user __kernel_rt_sigreturn;
  273. static int setup_frame(int sig, struct k_sigaction *ka,
  274. sigset_t *set, struct pt_regs *regs)
  275. {
  276. struct sigframe __user *frame;
  277. int err = 0;
  278. int signal;
  279. frame = get_sigframe(ka, regs->regs[15], sizeof(*frame));
  280. if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
  281. goto give_sigsegv;
  282. signal = current_thread_info()->exec_domain
  283. && current_thread_info()->exec_domain->signal_invmap
  284. && sig < 32
  285. ? current_thread_info()->exec_domain->signal_invmap[sig]
  286. : sig;
  287. err |= setup_sigcontext(&frame->sc, regs, set->sig[0]);
  288. if (_NSIG_WORDS > 1)
  289. err |= __copy_to_user(frame->extramask, &set->sig[1],
  290. sizeof(frame->extramask));
  291. /* Set up to return from userspace. If provided, use a stub
  292. already in userspace. */
  293. if (ka->sa.sa_flags & SA_RESTORER) {
  294. regs->pr = (unsigned long) ka->sa.sa_restorer;
  295. #ifdef CONFIG_VSYSCALL
  296. } else if (likely(current->mm->context.vdso)) {
  297. regs->pr = VDSO_SYM(&__kernel_sigreturn);
  298. #endif
  299. } else {
  300. /* Generate return code (system call to sigreturn) */
  301. err |= __put_user(MOVW(7), &frame->retcode[0]);
  302. err |= __put_user(TRAP_NOARG, &frame->retcode[1]);
  303. err |= __put_user(OR_R0_R0, &frame->retcode[2]);
  304. err |= __put_user(OR_R0_R0, &frame->retcode[3]);
  305. err |= __put_user(OR_R0_R0, &frame->retcode[4]);
  306. err |= __put_user(OR_R0_R0, &frame->retcode[5]);
  307. err |= __put_user(OR_R0_R0, &frame->retcode[6]);
  308. err |= __put_user((__NR_sigreturn), &frame->retcode[7]);
  309. regs->pr = (unsigned long) frame->retcode;
  310. }
  311. if (err)
  312. goto give_sigsegv;
  313. /* Set up registers for signal handler */
  314. regs->regs[15] = (unsigned long) frame;
  315. regs->regs[4] = signal; /* Arg for signal handler */
  316. regs->regs[5] = 0;
  317. regs->regs[6] = (unsigned long) &frame->sc;
  318. regs->pc = (unsigned long) ka->sa.sa_handler;
  319. set_fs(USER_DS);
  320. pr_debug("SIG deliver (%s:%d): sp=%p pc=%08lx pr=%08lx\n",
  321. current->comm, current->pid, frame, regs->pc, regs->pr);
  322. flush_cache_sigtramp(regs->pr);
  323. if ((-regs->pr & (L1_CACHE_BYTES-1)) < sizeof(frame->retcode))
  324. flush_cache_sigtramp(regs->pr + L1_CACHE_BYTES);
  325. return 0;
  326. give_sigsegv:
  327. force_sigsegv(sig, current);
  328. return -EFAULT;
  329. }
  330. static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
  331. sigset_t *set, struct pt_regs *regs)
  332. {
  333. struct rt_sigframe __user *frame;
  334. int err = 0;
  335. int signal;
  336. frame = get_sigframe(ka, regs->regs[15], sizeof(*frame));
  337. if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
  338. goto give_sigsegv;
  339. signal = current_thread_info()->exec_domain
  340. && current_thread_info()->exec_domain->signal_invmap
  341. && sig < 32
  342. ? current_thread_info()->exec_domain->signal_invmap[sig]
  343. : sig;
  344. err |= copy_siginfo_to_user(&frame->info, info);
  345. /* Create the ucontext. */
  346. err |= __put_user(0, &frame->uc.uc_flags);
  347. err |= __put_user(0, &frame->uc.uc_link);
  348. err |= __put_user((void *)current->sas_ss_sp,
  349. &frame->uc.uc_stack.ss_sp);
  350. err |= __put_user(sas_ss_flags(regs->regs[15]),
  351. &frame->uc.uc_stack.ss_flags);
  352. err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
  353. err |= setup_sigcontext(&frame->uc.uc_mcontext,
  354. regs, set->sig[0]);
  355. err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
  356. /* Set up to return from userspace. If provided, use a stub
  357. already in userspace. */
  358. if (ka->sa.sa_flags & SA_RESTORER) {
  359. regs->pr = (unsigned long) ka->sa.sa_restorer;
  360. #ifdef CONFIG_VSYSCALL
  361. } else if (likely(current->mm->context.vdso)) {
  362. regs->pr = VDSO_SYM(&__kernel_rt_sigreturn);
  363. #endif
  364. } else {
  365. /* Generate return code (system call to rt_sigreturn) */
  366. err |= __put_user(MOVW(7), &frame->retcode[0]);
  367. err |= __put_user(TRAP_NOARG, &frame->retcode[1]);
  368. err |= __put_user(OR_R0_R0, &frame->retcode[2]);
  369. err |= __put_user(OR_R0_R0, &frame->retcode[3]);
  370. err |= __put_user(OR_R0_R0, &frame->retcode[4]);
  371. err |= __put_user(OR_R0_R0, &frame->retcode[5]);
  372. err |= __put_user(OR_R0_R0, &frame->retcode[6]);
  373. err |= __put_user((__NR_rt_sigreturn), &frame->retcode[7]);
  374. regs->pr = (unsigned long) frame->retcode;
  375. }
  376. if (err)
  377. goto give_sigsegv;
  378. /* Set up registers for signal handler */
  379. regs->regs[15] = (unsigned long) frame;
  380. regs->regs[4] = signal; /* Arg for signal handler */
  381. regs->regs[5] = (unsigned long) &frame->info;
  382. regs->regs[6] = (unsigned long) &frame->uc;
  383. regs->pc = (unsigned long) ka->sa.sa_handler;
  384. set_fs(USER_DS);
  385. pr_debug("SIG deliver (%s:%d): sp=%p pc=%08lx pr=%08lx\n",
  386. current->comm, current->pid, frame, regs->pc, regs->pr);
  387. flush_cache_sigtramp(regs->pr);
  388. if ((-regs->pr & (L1_CACHE_BYTES-1)) < sizeof(frame->retcode))
  389. flush_cache_sigtramp(regs->pr + L1_CACHE_BYTES);
  390. return 0;
  391. give_sigsegv:
  392. force_sigsegv(sig, current);
  393. return -EFAULT;
  394. }
  395. /*
  396. * OK, we're invoking a handler
  397. */
  398. static int
  399. handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
  400. sigset_t *oldset, struct pt_regs *regs, unsigned int save_r0)
  401. {
  402. int ret;
  403. /* Are we from a system call? */
  404. if (regs->tra >= 0) {
  405. /* If so, check system call restarting.. */
  406. switch (regs->regs[0]) {
  407. case -ERESTART_RESTARTBLOCK:
  408. case -ERESTARTNOHAND:
  409. regs->regs[0] = -EINTR;
  410. break;
  411. case -ERESTARTSYS:
  412. if (!(ka->sa.sa_flags & SA_RESTART)) {
  413. regs->regs[0] = -EINTR;
  414. break;
  415. }
  416. /* fallthrough */
  417. case -ERESTARTNOINTR:
  418. regs->regs[0] = save_r0;
  419. regs->pc -= instruction_size(
  420. ctrl_inw(regs->pc - 4));
  421. break;
  422. }
  423. #ifdef CONFIG_GUSA
  424. } else {
  425. /* gUSA handling */
  426. preempt_disable();
  427. if (regs->regs[15] >= 0xc0000000) {
  428. int offset = (int)regs->regs[15];
  429. /* Reset stack pointer: clear critical region mark */
  430. regs->regs[15] = regs->regs[1];
  431. if (regs->pc < regs->regs[0])
  432. /* Go to rewind point #1 */
  433. regs->pc = regs->regs[0] + offset -
  434. instruction_size(ctrl_inw(regs->pc-4));
  435. }
  436. preempt_enable_no_resched();
  437. #endif
  438. }
  439. /* Set up the stack frame */
  440. if (ka->sa.sa_flags & SA_SIGINFO)
  441. ret = setup_rt_frame(sig, ka, info, oldset, regs);
  442. else
  443. ret = setup_frame(sig, ka, oldset, regs);
  444. if (ka->sa.sa_flags & SA_ONESHOT)
  445. ka->sa.sa_handler = SIG_DFL;
  446. if (ret == 0) {
  447. spin_lock_irq(&current->sighand->siglock);
  448. sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
  449. if (!(ka->sa.sa_flags & SA_NODEFER))
  450. sigaddset(&current->blocked,sig);
  451. recalc_sigpending();
  452. spin_unlock_irq(&current->sighand->siglock);
  453. }
  454. return ret;
  455. }
  456. /*
  457. * Note that 'init' is a special process: it doesn't get signals it doesn't
  458. * want to handle. Thus you cannot kill init even with a SIGKILL even by
  459. * mistake.
  460. *
  461. * Note that we go through the signals twice: once to check the signals that
  462. * the kernel can handle, and then we build all the user-level signal handling
  463. * stack-frames in one go after that.
  464. */
  465. static void do_signal(struct pt_regs *regs, unsigned int save_r0)
  466. {
  467. siginfo_t info;
  468. int signr;
  469. struct k_sigaction ka;
  470. sigset_t *oldset;
  471. /*
  472. * We want the common case to go fast, which
  473. * is why we may in certain cases get here from
  474. * kernel mode. Just return without doing anything
  475. * if so.
  476. */
  477. if (!user_mode(regs))
  478. return;
  479. if (try_to_freeze())
  480. goto no_signal;
  481. if (test_thread_flag(TIF_RESTORE_SIGMASK))
  482. oldset = &current->saved_sigmask;
  483. else
  484. oldset = &current->blocked;
  485. signr = get_signal_to_deliver(&info, &ka, regs, NULL);
  486. if (signr > 0) {
  487. /* Whee! Actually deliver the signal. */
  488. if (handle_signal(signr, &ka, &info, oldset,
  489. regs, save_r0) == 0) {
  490. /* a signal was successfully delivered; the saved
  491. * sigmask will have been stored in the signal frame,
  492. * and will be restored by sigreturn, so we can simply
  493. * clear the TIF_RESTORE_SIGMASK flag */
  494. if (test_thread_flag(TIF_RESTORE_SIGMASK))
  495. clear_thread_flag(TIF_RESTORE_SIGMASK);
  496. }
  497. return;
  498. }
  499. no_signal:
  500. /* Did we come from a system call? */
  501. if (regs->tra >= 0) {
  502. /* Restart the system call - no handlers present */
  503. if (regs->regs[0] == -ERESTARTNOHAND ||
  504. regs->regs[0] == -ERESTARTSYS ||
  505. regs->regs[0] == -ERESTARTNOINTR) {
  506. regs->regs[0] = save_r0;
  507. regs->pc -= instruction_size(ctrl_inw(regs->pc - 4));
  508. } else if (regs->regs[0] == -ERESTART_RESTARTBLOCK) {
  509. regs->pc -= instruction_size(ctrl_inw(regs->pc - 4));
  510. regs->regs[3] = __NR_restart_syscall;
  511. }
  512. }
  513. /* if there's no signal to deliver, we just put the saved sigmask
  514. * back */
  515. if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
  516. clear_thread_flag(TIF_RESTORE_SIGMASK);
  517. sigprocmask(SIG_SETMASK, &current->saved_sigmask, NULL);
  518. }
  519. }
  520. asmlinkage void do_notify_resume(struct pt_regs *regs, unsigned int save_r0,
  521. __u32 thread_info_flags)
  522. {
  523. /* deal with pending signal delivery */
  524. if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK))
  525. do_signal(regs, save_r0);
  526. }