signal.c 18 KB

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