signal.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671
  1. /*
  2. * linux/arch/alpha/kernel/signal.c
  3. *
  4. * Copyright (C) 1995 Linus Torvalds
  5. *
  6. * 1997-11-02 Modified for POSIX.1b signals by Richard Henderson
  7. */
  8. #include <linux/sched.h>
  9. #include <linux/kernel.h>
  10. #include <linux/signal.h>
  11. #include <linux/errno.h>
  12. #include <linux/wait.h>
  13. #include <linux/ptrace.h>
  14. #include <linux/unistd.h>
  15. #include <linux/mm.h>
  16. #include <linux/smp.h>
  17. #include <linux/smp_lock.h>
  18. #include <linux/stddef.h>
  19. #include <linux/tty.h>
  20. #include <linux/binfmts.h>
  21. #include <linux/bitops.h>
  22. #include <asm/uaccess.h>
  23. #include <asm/sigcontext.h>
  24. #include <asm/ucontext.h>
  25. #include "proto.h"
  26. #define DEBUG_SIG 0
  27. #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
  28. asmlinkage void ret_from_sys_call(void);
  29. static int do_signal(sigset_t *, struct pt_regs *, struct switch_stack *,
  30. unsigned long, unsigned long);
  31. /*
  32. * The OSF/1 sigprocmask calling sequence is different from the
  33. * C sigprocmask() sequence..
  34. *
  35. * how:
  36. * 1 - SIG_BLOCK
  37. * 2 - SIG_UNBLOCK
  38. * 3 - SIG_SETMASK
  39. *
  40. * We change the range to -1 .. 1 in order to let gcc easily
  41. * use the conditional move instructions.
  42. *
  43. * Note that we don't need to acquire the kernel lock for SMP
  44. * operation, as all of this is local to this thread.
  45. */
  46. asmlinkage unsigned long
  47. do_osf_sigprocmask(int how, unsigned long newmask, struct pt_regs *regs)
  48. {
  49. unsigned long oldmask = -EINVAL;
  50. if ((unsigned long)how-1 <= 2) {
  51. long sign = how-2; /* -1 .. 1 */
  52. unsigned long block, unblock;
  53. newmask &= _BLOCKABLE;
  54. spin_lock_irq(&current->sighand->siglock);
  55. oldmask = current->blocked.sig[0];
  56. unblock = oldmask & ~newmask;
  57. block = oldmask | newmask;
  58. if (!sign)
  59. block = unblock;
  60. if (sign <= 0)
  61. newmask = block;
  62. if (_NSIG_WORDS > 1 && sign > 0)
  63. sigemptyset(&current->blocked);
  64. current->blocked.sig[0] = newmask;
  65. recalc_sigpending();
  66. spin_unlock_irq(&current->sighand->siglock);
  67. regs->r0 = 0; /* special no error return */
  68. }
  69. return oldmask;
  70. }
  71. asmlinkage int
  72. osf_sigaction(int sig, const struct osf_sigaction __user *act,
  73. struct osf_sigaction __user *oact)
  74. {
  75. struct k_sigaction new_ka, old_ka;
  76. int ret;
  77. if (act) {
  78. old_sigset_t mask;
  79. if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
  80. __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
  81. __get_user(new_ka.sa.sa_flags, &act->sa_flags))
  82. return -EFAULT;
  83. __get_user(mask, &act->sa_mask);
  84. siginitset(&new_ka.sa.sa_mask, mask);
  85. new_ka.ka_restorer = NULL;
  86. }
  87. ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
  88. if (!ret && oact) {
  89. if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
  90. __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
  91. __put_user(old_ka.sa.sa_flags, &oact->sa_flags))
  92. return -EFAULT;
  93. __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
  94. }
  95. return ret;
  96. }
  97. asmlinkage long
  98. sys_rt_sigaction(int sig, const struct sigaction __user *act,
  99. struct sigaction __user *oact,
  100. size_t sigsetsize, void __user *restorer)
  101. {
  102. struct k_sigaction new_ka, old_ka;
  103. int ret;
  104. /* XXX: Don't preclude handling different sized sigset_t's. */
  105. if (sigsetsize != sizeof(sigset_t))
  106. return -EINVAL;
  107. if (act) {
  108. new_ka.ka_restorer = restorer;
  109. if (copy_from_user(&new_ka.sa, act, sizeof(*act)))
  110. return -EFAULT;
  111. }
  112. ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
  113. if (!ret && oact) {
  114. if (copy_to_user(oact, &old_ka.sa, sizeof(*oact)))
  115. return -EFAULT;
  116. }
  117. return ret;
  118. }
  119. /*
  120. * Atomically swap in the new signal mask, and wait for a signal.
  121. */
  122. asmlinkage int
  123. do_sigsuspend(old_sigset_t mask, struct pt_regs *regs, struct switch_stack *sw)
  124. {
  125. sigset_t oldset;
  126. mask &= _BLOCKABLE;
  127. spin_lock_irq(&current->sighand->siglock);
  128. oldset = current->blocked;
  129. siginitset(&current->blocked, mask);
  130. recalc_sigpending();
  131. spin_unlock_irq(&current->sighand->siglock);
  132. /* Indicate EINTR on return from any possible signal handler,
  133. which will not come back through here, but via sigreturn. */
  134. regs->r0 = EINTR;
  135. regs->r19 = 1;
  136. while (1) {
  137. current->state = TASK_INTERRUPTIBLE;
  138. schedule();
  139. if (do_signal(&oldset, regs, sw, 0, 0))
  140. return -EINTR;
  141. }
  142. }
  143. asmlinkage int
  144. do_rt_sigsuspend(sigset_t __user *uset, size_t sigsetsize,
  145. struct pt_regs *regs, struct switch_stack *sw)
  146. {
  147. sigset_t oldset, set;
  148. /* XXX: Don't preclude handling different sized sigset_t's. */
  149. if (sigsetsize != sizeof(sigset_t))
  150. return -EINVAL;
  151. if (copy_from_user(&set, uset, sizeof(set)))
  152. return -EFAULT;
  153. sigdelsetmask(&set, ~_BLOCKABLE);
  154. spin_lock_irq(&current->sighand->siglock);
  155. oldset = current->blocked;
  156. current->blocked = set;
  157. recalc_sigpending();
  158. spin_unlock_irq(&current->sighand->siglock);
  159. /* Indicate EINTR on return from any possible signal handler,
  160. which will not come back through here, but via sigreturn. */
  161. regs->r0 = EINTR;
  162. regs->r19 = 1;
  163. while (1) {
  164. current->state = TASK_INTERRUPTIBLE;
  165. schedule();
  166. if (do_signal(&oldset, regs, sw, 0, 0))
  167. return -EINTR;
  168. }
  169. }
  170. asmlinkage int
  171. sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss)
  172. {
  173. return do_sigaltstack(uss, uoss, rdusp());
  174. }
  175. /*
  176. * Do a signal return; undo the signal stack.
  177. */
  178. #if _NSIG_WORDS > 1
  179. # error "Non SA_SIGINFO frame needs rearranging"
  180. #endif
  181. struct sigframe
  182. {
  183. struct sigcontext sc;
  184. unsigned int retcode[3];
  185. };
  186. struct rt_sigframe
  187. {
  188. struct siginfo info;
  189. struct ucontext uc;
  190. unsigned int retcode[3];
  191. };
  192. /* If this changes, userland unwinders that Know Things about our signal
  193. frame will break. Do not undertake lightly. It also implies an ABI
  194. change wrt the size of siginfo_t, which may cause some pain. */
  195. extern char compile_time_assert
  196. [offsetof(struct rt_sigframe, uc.uc_mcontext) == 176 ? 1 : -1];
  197. #define INSN_MOV_R30_R16 0x47fe0410
  198. #define INSN_LDI_R0 0x201f0000
  199. #define INSN_CALLSYS 0x00000083
  200. static long
  201. restore_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
  202. struct switch_stack *sw)
  203. {
  204. unsigned long usp;
  205. long i, err = __get_user(regs->pc, &sc->sc_pc);
  206. sw->r26 = (unsigned long) ret_from_sys_call;
  207. err |= __get_user(regs->r0, sc->sc_regs+0);
  208. err |= __get_user(regs->r1, sc->sc_regs+1);
  209. err |= __get_user(regs->r2, sc->sc_regs+2);
  210. err |= __get_user(regs->r3, sc->sc_regs+3);
  211. err |= __get_user(regs->r4, sc->sc_regs+4);
  212. err |= __get_user(regs->r5, sc->sc_regs+5);
  213. err |= __get_user(regs->r6, sc->sc_regs+6);
  214. err |= __get_user(regs->r7, sc->sc_regs+7);
  215. err |= __get_user(regs->r8, sc->sc_regs+8);
  216. err |= __get_user(sw->r9, sc->sc_regs+9);
  217. err |= __get_user(sw->r10, sc->sc_regs+10);
  218. err |= __get_user(sw->r11, sc->sc_regs+11);
  219. err |= __get_user(sw->r12, sc->sc_regs+12);
  220. err |= __get_user(sw->r13, sc->sc_regs+13);
  221. err |= __get_user(sw->r14, sc->sc_regs+14);
  222. err |= __get_user(sw->r15, sc->sc_regs+15);
  223. err |= __get_user(regs->r16, sc->sc_regs+16);
  224. err |= __get_user(regs->r17, sc->sc_regs+17);
  225. err |= __get_user(regs->r18, sc->sc_regs+18);
  226. err |= __get_user(regs->r19, sc->sc_regs+19);
  227. err |= __get_user(regs->r20, sc->sc_regs+20);
  228. err |= __get_user(regs->r21, sc->sc_regs+21);
  229. err |= __get_user(regs->r22, sc->sc_regs+22);
  230. err |= __get_user(regs->r23, sc->sc_regs+23);
  231. err |= __get_user(regs->r24, sc->sc_regs+24);
  232. err |= __get_user(regs->r25, sc->sc_regs+25);
  233. err |= __get_user(regs->r26, sc->sc_regs+26);
  234. err |= __get_user(regs->r27, sc->sc_regs+27);
  235. err |= __get_user(regs->r28, sc->sc_regs+28);
  236. err |= __get_user(regs->gp, sc->sc_regs+29);
  237. err |= __get_user(usp, sc->sc_regs+30);
  238. wrusp(usp);
  239. for (i = 0; i < 31; i++)
  240. err |= __get_user(sw->fp[i], sc->sc_fpregs+i);
  241. err |= __get_user(sw->fp[31], &sc->sc_fpcr);
  242. return err;
  243. }
  244. /* Note that this syscall is also used by setcontext(3) to install
  245. a given sigcontext. This because it's impossible to set *all*
  246. registers and transfer control from userland. */
  247. asmlinkage void
  248. do_sigreturn(struct sigcontext __user *sc, struct pt_regs *regs,
  249. struct switch_stack *sw)
  250. {
  251. sigset_t set;
  252. /* Verify that it's a good sigcontext before using it */
  253. if (!access_ok(VERIFY_READ, sc, sizeof(*sc)))
  254. goto give_sigsegv;
  255. if (__get_user(set.sig[0], &sc->sc_mask))
  256. goto give_sigsegv;
  257. sigdelsetmask(&set, ~_BLOCKABLE);
  258. spin_lock_irq(&current->sighand->siglock);
  259. current->blocked = set;
  260. recalc_sigpending();
  261. spin_unlock_irq(&current->sighand->siglock);
  262. if (restore_sigcontext(sc, regs, sw))
  263. goto give_sigsegv;
  264. /* Send SIGTRAP if we're single-stepping: */
  265. if (ptrace_cancel_bpt (current)) {
  266. siginfo_t info;
  267. info.si_signo = SIGTRAP;
  268. info.si_errno = 0;
  269. info.si_code = TRAP_BRKPT;
  270. info.si_addr = (void __user *) regs->pc;
  271. info.si_trapno = 0;
  272. send_sig_info(SIGTRAP, &info, current);
  273. }
  274. return;
  275. give_sigsegv:
  276. force_sig(SIGSEGV, current);
  277. }
  278. asmlinkage void
  279. do_rt_sigreturn(struct rt_sigframe __user *frame, struct pt_regs *regs,
  280. struct switch_stack *sw)
  281. {
  282. sigset_t set;
  283. /* Verify that it's a good ucontext_t before using it */
  284. if (!access_ok(VERIFY_READ, &frame->uc, sizeof(frame->uc)))
  285. goto give_sigsegv;
  286. if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
  287. goto give_sigsegv;
  288. sigdelsetmask(&set, ~_BLOCKABLE);
  289. spin_lock_irq(&current->sighand->siglock);
  290. current->blocked = set;
  291. recalc_sigpending();
  292. spin_unlock_irq(&current->sighand->siglock);
  293. if (restore_sigcontext(&frame->uc.uc_mcontext, regs, sw))
  294. goto give_sigsegv;
  295. /* Send SIGTRAP if we're single-stepping: */
  296. if (ptrace_cancel_bpt (current)) {
  297. siginfo_t info;
  298. info.si_signo = SIGTRAP;
  299. info.si_errno = 0;
  300. info.si_code = TRAP_BRKPT;
  301. info.si_addr = (void __user *) regs->pc;
  302. info.si_trapno = 0;
  303. send_sig_info(SIGTRAP, &info, current);
  304. }
  305. return;
  306. give_sigsegv:
  307. force_sig(SIGSEGV, current);
  308. }
  309. /*
  310. * Set up a signal frame.
  311. */
  312. static inline void __user *
  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 __user *)((sp - frame_size) & -32ul);
  318. }
  319. static long
  320. setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
  321. struct switch_stack *sw, unsigned long mask, unsigned long sp)
  322. {
  323. long i, err = 0;
  324. err |= __put_user(on_sig_stack((unsigned long)sc), &sc->sc_onstack);
  325. err |= __put_user(mask, &sc->sc_mask);
  326. err |= __put_user(regs->pc, &sc->sc_pc);
  327. err |= __put_user(8, &sc->sc_ps);
  328. err |= __put_user(regs->r0 , sc->sc_regs+0);
  329. err |= __put_user(regs->r1 , sc->sc_regs+1);
  330. err |= __put_user(regs->r2 , sc->sc_regs+2);
  331. err |= __put_user(regs->r3 , sc->sc_regs+3);
  332. err |= __put_user(regs->r4 , sc->sc_regs+4);
  333. err |= __put_user(regs->r5 , sc->sc_regs+5);
  334. err |= __put_user(regs->r6 , sc->sc_regs+6);
  335. err |= __put_user(regs->r7 , sc->sc_regs+7);
  336. err |= __put_user(regs->r8 , sc->sc_regs+8);
  337. err |= __put_user(sw->r9 , sc->sc_regs+9);
  338. err |= __put_user(sw->r10 , sc->sc_regs+10);
  339. err |= __put_user(sw->r11 , sc->sc_regs+11);
  340. err |= __put_user(sw->r12 , sc->sc_regs+12);
  341. err |= __put_user(sw->r13 , sc->sc_regs+13);
  342. err |= __put_user(sw->r14 , sc->sc_regs+14);
  343. err |= __put_user(sw->r15 , sc->sc_regs+15);
  344. err |= __put_user(regs->r16, sc->sc_regs+16);
  345. err |= __put_user(regs->r17, sc->sc_regs+17);
  346. err |= __put_user(regs->r18, sc->sc_regs+18);
  347. err |= __put_user(regs->r19, sc->sc_regs+19);
  348. err |= __put_user(regs->r20, sc->sc_regs+20);
  349. err |= __put_user(regs->r21, sc->sc_regs+21);
  350. err |= __put_user(regs->r22, sc->sc_regs+22);
  351. err |= __put_user(regs->r23, sc->sc_regs+23);
  352. err |= __put_user(regs->r24, sc->sc_regs+24);
  353. err |= __put_user(regs->r25, sc->sc_regs+25);
  354. err |= __put_user(regs->r26, sc->sc_regs+26);
  355. err |= __put_user(regs->r27, sc->sc_regs+27);
  356. err |= __put_user(regs->r28, sc->sc_regs+28);
  357. err |= __put_user(regs->gp , sc->sc_regs+29);
  358. err |= __put_user(sp, sc->sc_regs+30);
  359. err |= __put_user(0, sc->sc_regs+31);
  360. for (i = 0; i < 31; i++)
  361. err |= __put_user(sw->fp[i], sc->sc_fpregs+i);
  362. err |= __put_user(0, sc->sc_fpregs+31);
  363. err |= __put_user(sw->fp[31], &sc->sc_fpcr);
  364. err |= __put_user(regs->trap_a0, &sc->sc_traparg_a0);
  365. err |= __put_user(regs->trap_a1, &sc->sc_traparg_a1);
  366. err |= __put_user(regs->trap_a2, &sc->sc_traparg_a2);
  367. return err;
  368. }
  369. static void
  370. setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
  371. struct pt_regs *regs, struct switch_stack * sw)
  372. {
  373. unsigned long oldsp, r26, err = 0;
  374. struct sigframe __user *frame;
  375. oldsp = rdusp();
  376. frame = get_sigframe(ka, oldsp, sizeof(*frame));
  377. if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
  378. goto give_sigsegv;
  379. err |= setup_sigcontext(&frame->sc, regs, sw, set->sig[0], oldsp);
  380. if (err)
  381. goto give_sigsegv;
  382. /* Set up to return from userspace. If provided, use a stub
  383. already in userspace. */
  384. if (ka->ka_restorer) {
  385. r26 = (unsigned long) ka->ka_restorer;
  386. } else {
  387. err |= __put_user(INSN_MOV_R30_R16, frame->retcode+0);
  388. err |= __put_user(INSN_LDI_R0+__NR_sigreturn, frame->retcode+1);
  389. err |= __put_user(INSN_CALLSYS, frame->retcode+2);
  390. imb();
  391. r26 = (unsigned long) frame->retcode;
  392. }
  393. /* Check that everything was written properly. */
  394. if (err)
  395. goto give_sigsegv;
  396. /* "Return" to the handler */
  397. regs->r26 = r26;
  398. regs->r27 = regs->pc = (unsigned long) ka->sa.sa_handler;
  399. regs->r16 = sig; /* a0: signal number */
  400. regs->r17 = 0; /* a1: exception code */
  401. regs->r18 = (unsigned long) &frame->sc; /* a2: sigcontext pointer */
  402. wrusp((unsigned long) frame);
  403. #if DEBUG_SIG
  404. printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n",
  405. current->comm, current->pid, frame, regs->pc, regs->r26);
  406. #endif
  407. return;
  408. give_sigsegv:
  409. force_sigsegv(sig, current);
  410. }
  411. static void
  412. setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
  413. sigset_t *set, struct pt_regs *regs, struct switch_stack * sw)
  414. {
  415. unsigned long oldsp, r26, err = 0;
  416. struct rt_sigframe __user *frame;
  417. oldsp = rdusp();
  418. frame = get_sigframe(ka, oldsp, sizeof(*frame));
  419. if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
  420. goto give_sigsegv;
  421. err |= copy_siginfo_to_user(&frame->info, info);
  422. /* Create the ucontext. */
  423. err |= __put_user(0, &frame->uc.uc_flags);
  424. err |= __put_user(0, &frame->uc.uc_link);
  425. err |= __put_user(set->sig[0], &frame->uc.uc_osf_sigmask);
  426. err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
  427. err |= __put_user(sas_ss_flags(oldsp), &frame->uc.uc_stack.ss_flags);
  428. err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
  429. err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, sw,
  430. set->sig[0], oldsp);
  431. err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
  432. if (err)
  433. goto give_sigsegv;
  434. /* Set up to return from userspace. If provided, use a stub
  435. already in userspace. */
  436. if (ka->ka_restorer) {
  437. r26 = (unsigned long) ka->ka_restorer;
  438. } else {
  439. err |= __put_user(INSN_MOV_R30_R16, frame->retcode+0);
  440. err |= __put_user(INSN_LDI_R0+__NR_rt_sigreturn,
  441. frame->retcode+1);
  442. err |= __put_user(INSN_CALLSYS, frame->retcode+2);
  443. imb();
  444. r26 = (unsigned long) frame->retcode;
  445. }
  446. if (err)
  447. goto give_sigsegv;
  448. /* "Return" to the handler */
  449. regs->r26 = r26;
  450. regs->r27 = regs->pc = (unsigned long) ka->sa.sa_handler;
  451. regs->r16 = sig; /* a0: signal number */
  452. regs->r17 = (unsigned long) &frame->info; /* a1: siginfo pointer */
  453. regs->r18 = (unsigned long) &frame->uc; /* a2: ucontext pointer */
  454. wrusp((unsigned long) frame);
  455. #if DEBUG_SIG
  456. printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n",
  457. current->comm, current->pid, frame, regs->pc, regs->r26);
  458. #endif
  459. return;
  460. give_sigsegv:
  461. force_sigsegv(sig, current);
  462. }
  463. /*
  464. * OK, we're invoking a handler.
  465. */
  466. static inline void
  467. handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info,
  468. sigset_t *oldset, struct pt_regs * regs, struct switch_stack *sw)
  469. {
  470. if (ka->sa.sa_flags & SA_SIGINFO)
  471. setup_rt_frame(sig, ka, info, oldset, regs, sw);
  472. else
  473. setup_frame(sig, ka, oldset, regs, sw);
  474. if (ka->sa.sa_flags & SA_RESETHAND)
  475. ka->sa.sa_handler = SIG_DFL;
  476. spin_lock_irq(&current->sighand->siglock);
  477. sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
  478. if (!(ka->sa.sa_flags & SA_NODEFER))
  479. sigaddset(&current->blocked,sig);
  480. recalc_sigpending();
  481. spin_unlock_irq(&current->sighand->siglock);
  482. }
  483. static inline void
  484. syscall_restart(unsigned long r0, unsigned long r19,
  485. struct pt_regs *regs, struct k_sigaction *ka)
  486. {
  487. switch (regs->r0) {
  488. case ERESTARTSYS:
  489. if (!(ka->sa.sa_flags & SA_RESTART)) {
  490. case ERESTARTNOHAND:
  491. regs->r0 = EINTR;
  492. break;
  493. }
  494. /* fallthrough */
  495. case ERESTARTNOINTR:
  496. regs->r0 = r0; /* reset v0 and a3 and replay syscall */
  497. regs->r19 = r19;
  498. regs->pc -= 4;
  499. break;
  500. case ERESTART_RESTARTBLOCK:
  501. current_thread_info()->restart_block.fn = do_no_restart_syscall;
  502. regs->r0 = EINTR;
  503. break;
  504. }
  505. }
  506. /*
  507. * Note that 'init' is a special process: it doesn't get signals it doesn't
  508. * want to handle. Thus you cannot kill init even with a SIGKILL even by
  509. * mistake.
  510. *
  511. * Note that we go through the signals twice: once to check the signals that
  512. * the kernel can handle, and then we build all the user-level signal handling
  513. * stack-frames in one go after that.
  514. *
  515. * "r0" and "r19" are the registers we need to restore for system call
  516. * restart. "r0" is also used as an indicator whether we can restart at
  517. * all (if we get here from anything but a syscall return, it will be 0)
  518. */
  519. static int
  520. do_signal(sigset_t *oldset, struct pt_regs * regs, struct switch_stack * sw,
  521. unsigned long r0, unsigned long r19)
  522. {
  523. siginfo_t info;
  524. int signr;
  525. unsigned long single_stepping = ptrace_cancel_bpt(current);
  526. struct k_sigaction ka;
  527. if (!oldset)
  528. oldset = &current->blocked;
  529. /* This lets the debugger run, ... */
  530. signr = get_signal_to_deliver(&info, &ka, regs, NULL);
  531. /* ... so re-check the single stepping. */
  532. single_stepping |= ptrace_cancel_bpt(current);
  533. if (signr > 0) {
  534. /* Whee! Actually deliver the signal. */
  535. if (r0) syscall_restart(r0, r19, regs, &ka);
  536. handle_signal(signr, &ka, &info, oldset, regs, sw);
  537. if (single_stepping)
  538. ptrace_set_bpt(current); /* re-set bpt */
  539. return 1;
  540. }
  541. if (r0) {
  542. switch (regs->r0) {
  543. case ERESTARTNOHAND:
  544. case ERESTARTSYS:
  545. case ERESTARTNOINTR:
  546. /* Reset v0 and a3 and replay syscall. */
  547. regs->r0 = r0;
  548. regs->r19 = r19;
  549. regs->pc -= 4;
  550. break;
  551. case ERESTART_RESTARTBLOCK:
  552. /* Force v0 to the restart syscall and reply. */
  553. regs->r0 = __NR_restart_syscall;
  554. regs->pc -= 4;
  555. break;
  556. }
  557. }
  558. if (single_stepping)
  559. ptrace_set_bpt(current); /* re-set breakpoint */
  560. return 0;
  561. }
  562. void
  563. do_notify_resume(sigset_t *oldset, struct pt_regs *regs,
  564. struct switch_stack *sw, unsigned long r0,
  565. unsigned long r19, unsigned long thread_info_flags)
  566. {
  567. if (thread_info_flags & _TIF_SIGPENDING)
  568. do_signal(oldset, regs, sw, r0, r19);
  569. }