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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * This file is subject to the terms and conditions of the GNU General Public
  3.  * License.  See the file "COPYING" in the main directory of this archive
  4.  * for more details.
  5.  *
  6.  * Copyright (C) 1991, 1992  Linus Torvalds
  7.  * Copyright (C) 1994 - 1999  Ralf Baechle
  8.  * Copyright (C) 1999 Silicon Graphics, Inc.
  9.  */
  10. #include <linux/config.h>
  11. #include <linux/sched.h>
  12. #include <linux/mm.h>
  13. #include <linux/smp.h>
  14. #include <linux/smp_lock.h>
  15. #include <linux/kernel.h>
  16. #include <linux/personality.h>
  17. #include <linux/signal.h>
  18. #include <linux/errno.h>
  19. #include <linux/wait.h>
  20. #include <linux/unistd.h>
  21. #include <asm/asm.h>
  22. #include <asm/bitops.h>
  23. #include <asm/cpu.h>
  24. #include <asm/offset.h>
  25. #include <asm/pgalloc.h>
  26. #include <asm/ptrace.h>
  27. #include <asm/uaccess.h>
  28. #include <asm/ucontext.h>
  29. #define DEBUG_SIG 0
  30. #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
  31. extern asmlinkage int do_signal(sigset_t *oldset, struct pt_regs *regs);
  32. extern asmlinkage int (*save_fp_context)(struct sigcontext *sc);
  33. extern asmlinkage int (*restore_fp_context)(struct sigcontext *sc);
  34. extern asmlinkage void syscall_trace(void);
  35. int copy_siginfo_to_user(siginfo_t *to, siginfo_t *from)
  36. {
  37. if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t)))
  38. return -EFAULT;
  39. if (from->si_code < 0)
  40. return __copy_to_user(to, from, sizeof(siginfo_t));
  41. else {
  42. int err;
  43. /* If you change siginfo_t structure, please be sure
  44.    this code is fixed accordingly.
  45.    It should never copy any pad contained in the structure
  46.    to avoid security leaks, but must copy the generic
  47.    3 ints plus the relevant union member.  */
  48. err = __put_user(from->si_signo, &to->si_signo);
  49. err |= __put_user(from->si_errno, &to->si_errno);
  50. err |= __put_user((short)from->si_code, &to->si_code);
  51. /* First 32bits of unions are always present.  */
  52. err |= __put_user(from->si_pid, &to->si_pid);
  53. switch (from->si_code >> 16) {
  54. case __SI_FAULT >> 16:
  55. break;
  56. case __SI_CHLD >> 16:
  57. err |= __put_user(from->si_utime, &to->si_utime);
  58. err |= __put_user(from->si_stime, &to->si_stime);
  59. err |= __put_user(from->si_status, &to->si_status);
  60. default:
  61. err |= __put_user(from->si_uid, &to->si_uid);
  62. break;
  63. /* case __SI_RT: This is not generated by the kernel as of now.  */
  64. }
  65. return err;
  66. }
  67. }
  68. /*
  69.  * Atomically swap in the new signal mask, and wait for a signal.
  70.  */
  71. save_static_function(sys_sigsuspend);
  72. static_unused int _sys_sigsuspend(struct pt_regs regs)
  73. {
  74. sigset_t *uset, saveset, newset;
  75. uset = (sigset_t *) regs.regs[4];
  76. if (copy_from_user(&newset, uset, sizeof(sigset_t)))
  77. return -EFAULT;
  78. sigdelsetmask(&newset, ~_BLOCKABLE);
  79. spin_lock_irq(&current->sigmask_lock);
  80. saveset = current->blocked;
  81. current->blocked = newset;
  82. recalc_sigpending(current);
  83. spin_unlock_irq(&current->sigmask_lock);
  84. regs.regs[2] = EINTR;
  85. regs.regs[7] = 1;
  86. while (1) {
  87. current->state = TASK_INTERRUPTIBLE;
  88. schedule();
  89. if (do_signal(&saveset, &regs))
  90. return -EINTR;
  91. }
  92. }
  93. save_static_function(sys_rt_sigsuspend);
  94. static_unused int _sys_rt_sigsuspend(struct pt_regs regs)
  95. {
  96. sigset_t *unewset, saveset, newset;
  97.         size_t sigsetsize;
  98. /* XXX Don't preclude handling different sized sigset_t's.  */
  99. sigsetsize = regs.regs[5];
  100. if (sigsetsize != sizeof(sigset_t))
  101. return -EINVAL;
  102. unewset = (sigset_t *) regs.regs[4];
  103. if (copy_from_user(&newset, unewset, sizeof(newset)))
  104. return -EFAULT;
  105. sigdelsetmask(&newset, ~_BLOCKABLE);
  106. spin_lock_irq(&current->sigmask_lock);
  107. saveset = current->blocked;
  108. current->blocked = newset;
  109.         recalc_sigpending(current);
  110. spin_unlock_irq(&current->sigmask_lock);
  111. regs.regs[2] = EINTR;
  112. regs.regs[7] = 1;
  113. while (1) {
  114. current->state = TASK_INTERRUPTIBLE;
  115. schedule();
  116. if (do_signal(&saveset, &regs))
  117. return -EINTR;
  118. }
  119. }
  120. asmlinkage int sys_sigaction(int sig, const struct sigaction *act,
  121. struct sigaction *oact)
  122. {
  123. struct k_sigaction new_ka, old_ka;
  124. int ret;
  125. int err = 0;
  126. if (act) {
  127. old_sigset_t mask;
  128. if (!access_ok(VERIFY_READ, act, sizeof(*act)))
  129. return -EFAULT;
  130. err |= __get_user(new_ka.sa.sa_handler, &act->sa_handler);
  131. err |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
  132. err |= __get_user(mask, &act->sa_mask.sig[0]);
  133. err |= __get_user(new_ka.sa.sa_restorer, &act->sa_restorer);
  134. if (err)
  135. return -EFAULT;
  136. siginitset(&new_ka.sa.sa_mask, mask);
  137. }
  138. ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
  139. if (!ret && oact) {
  140. if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)))
  141.                         return -EFAULT;
  142. err |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
  143. err |= __put_user(old_ka.sa.sa_handler, &oact->sa_handler);
  144. err |= __put_user(old_ka.sa.sa_mask.sig[0], oact->sa_mask.sig);
  145.                 err |= __put_user(0, &oact->sa_mask.sig[1]);
  146.                 err |= __put_user(0, &oact->sa_mask.sig[2]);
  147.                 err |= __put_user(0, &oact->sa_mask.sig[3]);
  148. err |= __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer);
  149.                 if (err)
  150. return -EFAULT;
  151. }
  152. return ret;
  153. }
  154. asmlinkage int sys_sigaltstack(struct pt_regs regs)
  155. {
  156. const stack_t *uss = (const stack_t *) regs.regs[4];
  157. stack_t *uoss = (stack_t *) regs.regs[5];
  158. unsigned long usp = regs.regs[29];
  159. return do_sigaltstack(uss, uoss, usp);
  160. }
  161. static inline int restore_thread_fp_context(struct sigcontext *sc)
  162. {
  163. u64 *pfreg = &current->thread.fpu.soft.regs[0];
  164. int err = 0;
  165. /*
  166.  * Copy all 32 64-bit values, for two reasons.  First, the R3000 and
  167.  * R4000/MIPS32 kernels use the thread FP register storage differently,
  168.  * such that a full copy is essentially necessary to support both.
  169.  */
  170. #define restore_fpr(i) 
  171. do { err |= __get_user(pfreg[i], &sc->sc_fpregs[i]); } while(0)
  172. restore_fpr( 0); restore_fpr( 1); restore_fpr( 2); restore_fpr( 3);
  173. restore_fpr( 4); restore_fpr( 5); restore_fpr( 6); restore_fpr( 7);
  174. restore_fpr( 8); restore_fpr( 9); restore_fpr(10); restore_fpr(11);
  175. restore_fpr(12); restore_fpr(13); restore_fpr(14); restore_fpr(15);
  176. restore_fpr(16); restore_fpr(17); restore_fpr(18); restore_fpr(19);
  177. restore_fpr(20); restore_fpr(21); restore_fpr(22); restore_fpr(23);
  178. restore_fpr(24); restore_fpr(25); restore_fpr(26); restore_fpr(27);
  179. restore_fpr(28); restore_fpr(29); restore_fpr(30); restore_fpr(31);
  180. err |= __get_user(current->thread.fpu.soft.sr, &sc->sc_fpc_csr);
  181. return err;
  182. }
  183. static inline int save_thread_fp_context(struct sigcontext *sc)
  184. {
  185. u64 *pfreg = &current->thread.fpu.soft.regs[0];
  186. int err = 0;
  187. #define save_fpr(i) 
  188. do { err |= __put_user(pfreg[i], &sc->sc_fpregs[i]); } while(0)
  189. save_fpr( 0); save_fpr( 1); save_fpr( 2); save_fpr( 3);
  190. save_fpr( 4); save_fpr( 5); save_fpr( 6); save_fpr( 7);
  191. save_fpr( 8); save_fpr( 9); save_fpr(10); save_fpr(11);
  192. save_fpr(12); save_fpr(13); save_fpr(14); save_fpr(15);
  193. save_fpr(16); save_fpr(17); save_fpr(18); save_fpr(19);
  194. save_fpr(20); save_fpr(21); save_fpr(22); save_fpr(23);
  195. save_fpr(24); save_fpr(25); save_fpr(26); save_fpr(27);
  196. save_fpr(28); save_fpr(29); save_fpr(30); save_fpr(31);
  197. err |= __put_user(current->thread.fpu.soft.sr, &sc->sc_fpc_csr);
  198. return err;
  199. }
  200. static int restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc)
  201. {
  202. int owned_fp;
  203. int err = 0;
  204. u64 reg;
  205. err |= __get_user(regs->cp0_epc, &sc->sc_pc);
  206. err |= __get_user(reg, &sc->sc_mdhi);
  207. regs->hi = (int) reg;
  208. err |= __get_user(reg, &sc->sc_mdlo);
  209. regs->lo = (int) reg;
  210. #define restore_gp_reg(i) do {
  211. err |= __get_user(reg, &sc->sc_regs[i]);
  212. regs->regs[i] = reg;
  213. } while(0)
  214. restore_gp_reg( 1); restore_gp_reg( 2); restore_gp_reg( 3);
  215. restore_gp_reg( 4); restore_gp_reg( 5); restore_gp_reg( 6);
  216. restore_gp_reg( 7); restore_gp_reg( 8); restore_gp_reg( 9);
  217. restore_gp_reg(10); restore_gp_reg(11); restore_gp_reg(12);
  218. restore_gp_reg(13); restore_gp_reg(14); restore_gp_reg(15);
  219. restore_gp_reg(16); restore_gp_reg(17); restore_gp_reg(18);
  220. restore_gp_reg(19); restore_gp_reg(20); restore_gp_reg(21);
  221. restore_gp_reg(22); restore_gp_reg(23); restore_gp_reg(24);
  222. restore_gp_reg(25); restore_gp_reg(26); restore_gp_reg(27);
  223. restore_gp_reg(28); restore_gp_reg(29); restore_gp_reg(30);
  224. restore_gp_reg(31);
  225. #undef restore_gp_reg
  226. err |= __get_user(owned_fp, &sc->sc_ownedfp);
  227. err |= __get_user(current->used_math, &sc->sc_used_math);
  228. if (owned_fp) {
  229. err |= restore_fp_context(sc);
  230. goto out;
  231. }
  232. if (current == last_task_used_math) {
  233. /* Signal handler acquired FPU - give it back */
  234. last_task_used_math = NULL;
  235. regs->cp0_status &= ~ST0_CU1;
  236. }
  237. if (current->used_math) {
  238. /* Undo possible contamination of thread state */
  239. err |= restore_thread_fp_context(sc);
  240. }
  241. out:
  242. return err;
  243. }
  244. struct sigframe {
  245. u32 sf_ass[4]; /* argument save space for o32 */
  246. u32 sf_code[2]; /* signal trampoline */
  247. struct sigcontext sf_sc;
  248. sigset_t sf_mask;
  249. };
  250. struct rt_sigframe {
  251. u32 rs_ass[4]; /* argument save space for o32 */
  252. u32 rs_code[2]; /* signal trampoline */
  253. struct siginfo rs_info;
  254. struct ucontext rs_uc;
  255. };
  256. asmlinkage void sys_sigreturn(struct pt_regs regs)
  257. {
  258. struct sigframe *frame;
  259. sigset_t blocked;
  260. frame = (struct sigframe *) regs.regs[29];
  261. if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
  262. goto badframe;
  263. if (__copy_from_user(&blocked, &frame->sf_mask, sizeof(blocked)))
  264. goto badframe;
  265. sigdelsetmask(&blocked, ~_BLOCKABLE);
  266. spin_lock_irq(&current->sigmask_lock);
  267. current->blocked = blocked;
  268. recalc_sigpending(current);
  269. spin_unlock_irq(&current->sigmask_lock);
  270. if (restore_sigcontext(&regs, &frame->sf_sc))
  271. goto badframe;
  272. /*
  273.  * Don't let your children do this ...
  274.  */
  275. if (current->ptrace & PT_TRACESYS)
  276. syscall_trace();
  277. __asm__ __volatile__(
  278. "movet$29, %0nt"
  279. "jtret_from_sys_call"
  280. :/* no outputs */
  281. :"r" (&regs));
  282. /* Unreached */
  283. badframe:
  284. force_sig(SIGSEGV, current);
  285. }
  286. asmlinkage void sys_rt_sigreturn(struct pt_regs regs)
  287. {
  288. struct rt_sigframe *frame;
  289. sigset_t set;
  290. stack_t st;
  291. frame = (struct rt_sigframe *) regs.regs[29];
  292. if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
  293. goto badframe;
  294. if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set)))
  295. goto badframe;
  296. sigdelsetmask(&set, ~_BLOCKABLE);
  297. spin_lock_irq(&current->sigmask_lock);
  298. current->blocked = set;
  299. recalc_sigpending(current);
  300. spin_unlock_irq(&current->sigmask_lock);
  301. if (restore_sigcontext(&regs, &frame->rs_uc.uc_mcontext))
  302. goto badframe;
  303. if (__copy_from_user(&st, &frame->rs_uc.uc_stack, sizeof(st)))
  304. goto badframe;
  305. /* It is more difficult to avoid calling this function than to
  306.    call it and ignore errors.  */
  307. do_sigaltstack(&st, NULL, regs.regs[29]);
  308. /*
  309.  * Don't let your children do this ...
  310.  */
  311. __asm__ __volatile__(
  312. "movet$29, %0nt"
  313. "jtret_from_sys_call"
  314. :/* no outputs */
  315. :"r" (&regs));
  316. /* Unreached */
  317. badframe:
  318. force_sig(SIGSEGV, current);
  319. }
  320. static int inline setup_sigcontext(struct pt_regs *regs, struct sigcontext *sc)
  321. {
  322. int owned_fp;
  323. int err = 0;
  324. u64 reg;
  325. reg = regs->cp0_epc; err |= __put_user(reg, &sc->sc_pc);
  326. err |= __put_user(regs->cp0_status, &sc->sc_status);
  327. #define save_gp_reg(i) {
  328. reg = regs->regs[i];
  329. err |= __put_user(reg, &sc->sc_regs[i]);
  330. } while(0)
  331. reg = 0; err |= __put_user(reg, &sc->sc_regs[0]);
  332. save_gp_reg(1); save_gp_reg(2);
  333. save_gp_reg(3); save_gp_reg(4); save_gp_reg(5); save_gp_reg(6);
  334. save_gp_reg(7); save_gp_reg(8); save_gp_reg(9); save_gp_reg(10);
  335. save_gp_reg(11); save_gp_reg(12); save_gp_reg(13); save_gp_reg(14);
  336. save_gp_reg(15); save_gp_reg(16); save_gp_reg(17); save_gp_reg(18);
  337. save_gp_reg(19); save_gp_reg(20); save_gp_reg(21); save_gp_reg(22);
  338. save_gp_reg(23); save_gp_reg(24); save_gp_reg(25); save_gp_reg(26);
  339. save_gp_reg(27); save_gp_reg(28); save_gp_reg(29); save_gp_reg(30);
  340. save_gp_reg(31);
  341. #undef save_gp_reg
  342. reg = regs->hi; err |= __put_user(reg, &sc->sc_mdhi);
  343. reg = regs->lo; err |= __put_user(reg, &sc->sc_mdlo);
  344. err |= __put_user(regs->cp0_cause, &sc->sc_cause);
  345. err |= __put_user(regs->cp0_badvaddr, &sc->sc_badvaddr);
  346. owned_fp = (current == last_task_used_math);
  347. err |= __put_user(owned_fp, &sc->sc_ownedfp);
  348. err |= __put_user(current->used_math, &sc->sc_used_math);
  349. if (!current->used_math)
  350. goto out;
  351. /* There exists FP thread state that may be trashed by signal */
  352. if (owned_fp) {
  353. /* fp is active.  Save context from FPU */
  354. err |= save_fp_context(sc);
  355. goto out;
  356. }
  357. /*
  358.  * Someone else has FPU.
  359.  * Copy Thread context into signal context
  360.  */
  361. err |= save_thread_fp_context(sc);
  362. out:
  363. return err;
  364. }
  365. /*
  366.  * Determine which stack to use..
  367.  */
  368. static inline void * get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
  369. size_t frame_size)
  370. {
  371. unsigned long sp;
  372. /* Default to using normal stack */
  373. sp = regs->regs[29];
  374. /*
  375.    * FPU emulator may have it's own trampoline active just
  376.    * above the user stack, 16-bytes before the next lowest
  377.    * 16 byte boundary.  Try to avoid trashing it.
  378.    */
  379.   sp -= 32;
  380. /* This is the X/Open sanctioned signal stack switching.  */
  381. if ((ka->sa.sa_flags & SA_ONSTACK) && ! on_sig_stack(sp))
  382.                 sp = current->sas_ss_sp + current->sas_ss_size;
  383. return (void *)((sp - frame_size) & ALMASK);
  384. }
  385. static void inline setup_frame(struct k_sigaction * ka, struct pt_regs *regs,
  386. int signr, sigset_t *set)
  387. {
  388. struct sigframe *frame;
  389. int err = 0;
  390. frame = get_sigframe(ka, regs, sizeof(*frame));
  391. if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
  392. goto give_sigsegv;
  393. /* Set up to return from userspace.  If provided, use a stub already
  394.    in userspace.  */
  395. if (ka->sa.sa_flags & SA_RESTORER)
  396. regs->regs[31] = (unsigned long) ka->sa.sa_restorer;
  397. else {
  398. /*
  399.  * Set up the return code ...
  400.  *
  401.  *         li      v0, __NR_sigreturn
  402.  *         syscall
  403.  */
  404. err |= __put_user(0x24020000 + __NR_sigreturn,
  405.                   frame->sf_code + 0);
  406. err |= __put_user(0x0000000c                 ,
  407.                   frame->sf_code + 1);
  408. flush_cache_sigtramp((unsigned long) frame->sf_code);
  409. }
  410. err |= setup_sigcontext(regs, &frame->sf_sc);
  411. err |= __copy_to_user(&frame->sf_mask, set, sizeof(*set));
  412. if (err)
  413. goto give_sigsegv;
  414. /*
  415.  * Arguments to signal handler:
  416.  *
  417.  *   a0 = signal number
  418.  *   a1 = 0 (should be cause)
  419.  *   a2 = pointer to struct sigcontext
  420.  *
  421.  * $25 and c0_epc point to the signal handler, $29 points to the
  422.  * struct sigframe.
  423.  */
  424. regs->regs[ 4] = signr;
  425. regs->regs[ 5] = 0;
  426. regs->regs[ 6] = (unsigned long) &frame->sf_sc;
  427. regs->regs[29] = (unsigned long) frame;
  428. regs->regs[31] = (unsigned long) frame->sf_code;
  429. regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
  430. #if DEBUG_SIG
  431. printk("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%pn",
  432.        current->comm, current->pid,
  433.        frame, regs->cp0_epc, frame->sf_code);
  434. #endif
  435.         return;
  436. give_sigsegv:
  437. if (signr == SIGSEGV)
  438. ka->sa.sa_handler = SIG_DFL;
  439. force_sig(SIGSEGV, current);
  440. }
  441. static void inline setup_rt_frame(struct k_sigaction * ka, struct pt_regs *regs,
  442. int signr, sigset_t *set, siginfo_t *info)
  443. {
  444. struct rt_sigframe *frame;
  445. int err = 0;
  446. frame = get_sigframe(ka, regs, sizeof(*frame));
  447. if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
  448. goto give_sigsegv;
  449. /* Set up to return from userspace.  If provided, use a stub already
  450.    in userspace.  */
  451. if (ka->sa.sa_flags & SA_RESTORER)
  452. regs->regs[31] = (unsigned long) ka->sa.sa_restorer;
  453. else {
  454. /*
  455.  * Set up the return code ...
  456.  *
  457.  *         li      v0, __NR_rt_sigreturn
  458.  *         syscall
  459.  */
  460. err |= __put_user(0x24020000 + __NR_rt_sigreturn,
  461.                   frame->rs_code + 0);
  462. err |= __put_user(0x0000000c                 ,
  463.                   frame->rs_code + 1);
  464. flush_cache_sigtramp((unsigned long) frame->rs_code);
  465. }
  466. /* Create siginfo.  */
  467. err |= copy_siginfo_to_user(&frame->rs_info, info);
  468. /* Create the ucontext.  */
  469. err |= __put_user(0, &frame->rs_uc.uc_flags);
  470. err |= __put_user(0, &frame->rs_uc.uc_link);
  471. err |= __put_user((void *)current->sas_ss_sp,
  472.                   &frame->rs_uc.uc_stack.ss_sp);
  473. err |= __put_user(sas_ss_flags(regs->regs[29]),
  474.                   &frame->rs_uc.uc_stack.ss_flags);
  475. err |= __put_user(current->sas_ss_size,
  476.                   &frame->rs_uc.uc_stack.ss_size);
  477. err |= setup_sigcontext(regs, &frame->rs_uc.uc_mcontext);
  478. err |= __copy_to_user(&frame->rs_uc.uc_sigmask, set, sizeof(*set));
  479. if (err)
  480. goto give_sigsegv;
  481. /*
  482.  * Arguments to signal handler:
  483.  *
  484.  *   a0 = signal number
  485.  *   a1 = 0 (should be cause)
  486.  *   a2 = pointer to ucontext
  487.  *
  488.  * $25 and c0_epc point to the signal handler, $29 points to
  489.  * the struct rt_sigframe.
  490.  */
  491. regs->regs[ 4] = signr;
  492. regs->regs[ 5] = (unsigned long) &frame->rs_info;
  493. regs->regs[ 6] = (unsigned long) &frame->rs_uc;
  494. regs->regs[29] = (unsigned long) frame;
  495. regs->regs[31] = (unsigned long) frame->rs_code;
  496. regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
  497. #if DEBUG_SIG
  498. printk("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%pn",
  499.        current->comm, current->pid,
  500.        frame, regs->cp0_epc, frame->rs_code);
  501. #endif
  502. return;
  503. give_sigsegv:
  504. if (signr == SIGSEGV)
  505. ka->sa.sa_handler = SIG_DFL;
  506. force_sig(SIGSEGV, current);
  507. }
  508. static inline void handle_signal(unsigned long sig, struct k_sigaction *ka,
  509. siginfo_t *info, sigset_t *oldset, struct pt_regs * regs)
  510. {
  511. if (ka->sa.sa_flags & SA_SIGINFO)
  512. setup_rt_frame(ka, regs, sig, oldset, info);
  513. else
  514. setup_frame(ka, regs, sig, oldset);
  515. if (ka->sa.sa_flags & SA_ONESHOT)
  516. ka->sa.sa_handler = SIG_DFL;
  517. if (!(ka->sa.sa_flags & SA_NODEFER)) {
  518. spin_lock_irq(&current->sigmask_lock);
  519. sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
  520. sigaddset(&current->blocked,sig);
  521. recalc_sigpending(current);
  522. spin_unlock_irq(&current->sigmask_lock);
  523. }
  524. }
  525. static inline void syscall_restart(struct pt_regs *regs, struct k_sigaction *ka)
  526. {
  527. switch(regs->regs[0]) {
  528. case ERESTARTNOHAND:
  529. regs->regs[2] = EINTR;
  530. break;
  531. case ERESTARTSYS:
  532. if(!(ka->sa.sa_flags & SA_RESTART)) {
  533. regs->regs[2] = EINTR;
  534. break;
  535. }
  536. /* fallthrough */
  537. case ERESTARTNOINTR: /* Userland will reload $v0.  */
  538. regs->regs[7] = regs->regs[26];
  539. regs->cp0_epc -= 8;
  540. }
  541. regs->regs[0] = 0; /* Don't deal with this again.  */
  542. }
  543. extern int do_irix_signal(sigset_t *oldset, struct pt_regs *regs);
  544. asmlinkage int do_signal(sigset_t *oldset, struct pt_regs *regs)
  545. {
  546. struct k_sigaction *ka;
  547. siginfo_t info;
  548. #ifdef CONFIG_BINFMT_IRIX
  549. if (current->personality != PER_LINUX)
  550. return do_irix_signal(oldset, regs);
  551. #endif
  552. if (!oldset)
  553. oldset = &current->blocked;
  554. for (;;) {
  555. unsigned long signr;
  556. spin_lock_irq(&current->sigmask_lock);
  557. signr = dequeue_signal(&current->blocked, &info);
  558. spin_unlock_irq(&current->sigmask_lock);
  559. if (!signr)
  560. break;
  561. if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) {
  562. /* Let the debugger run.  */
  563. current->exit_code = signr;
  564. current->state = TASK_STOPPED;
  565. notify_parent(current, SIGCHLD);
  566. schedule();
  567. /* We're back.  Did the debugger cancel the sig?  */
  568. if (!(signr = current->exit_code))
  569. continue;
  570. current->exit_code = 0;
  571. /* The debugger continued.  Ignore SIGSTOP.  */
  572. if (signr == SIGSTOP)
  573. continue;
  574. /* Update the siginfo structure.  Is this good?  */
  575. if (signr != info.si_signo) {
  576. info.si_signo = signr;
  577. info.si_errno = 0;
  578. info.si_code = SI_USER;
  579. info.si_pid = current->p_pptr->pid;
  580. info.si_uid = current->p_pptr->uid;
  581. }
  582. /* If the (new) signal is now blocked, requeue it.  */
  583. if (sigismember(&current->blocked, signr)) {
  584. send_sig_info(signr, &info, current);
  585. continue;
  586. }
  587. }
  588. ka = &current->sig->action[signr-1];
  589. if (ka->sa.sa_handler == SIG_IGN) {
  590. if (signr != SIGCHLD)
  591. continue;
  592. /* Check for SIGCHLD: it's special.  */
  593. while (sys_wait4(-1, NULL, WNOHANG, NULL) > 0)
  594. /* nothing */;
  595. continue;
  596. }
  597. if (ka->sa.sa_handler == SIG_DFL) {
  598. int exit_code = signr;
  599. /* Init gets no signals it doesn't want.  */
  600. if (current->pid == 1)
  601. continue;
  602. switch (signr) {
  603. case SIGCONT: case SIGCHLD: case SIGWINCH: case SIGURG:
  604. continue;
  605. case SIGTSTP: case SIGTTIN: case SIGTTOU:
  606. if (is_orphaned_pgrp(current->pgrp))
  607. continue;
  608. /* FALLTHRU */
  609. case SIGSTOP:
  610. current->state = TASK_STOPPED;
  611. current->exit_code = signr;
  612. if (!(current->p_pptr->sig->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDSTOP))
  613. notify_parent(current, SIGCHLD);
  614. schedule();
  615. continue;
  616. case SIGQUIT: case SIGILL: case SIGTRAP:
  617. case SIGABRT: case SIGFPE: case SIGSEGV:
  618. case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ:
  619. if (do_coredump(signr, regs))
  620. exit_code |= 0x80;
  621. /* FALLTHRU */
  622. default:
  623. sig_exit(signr, exit_code, &info);
  624. /* NOTREACHED */
  625. }
  626. }
  627. if (regs->regs[0])
  628. syscall_restart(regs, ka);
  629. /* Whee!  Actually deliver the signal.  */
  630. handle_signal(signr, ka, &info, oldset, regs);
  631. return 1;
  632. }
  633. /*
  634.  * Who's code doesn't conform to the restartable syscall convention
  635.  * dies here!!!  The li instruction, a single machine instruction,
  636.  * must directly be followed by the syscall instruction.
  637.  */
  638. if (regs->regs[0]) {
  639. if (regs->regs[2] == ERESTARTNOHAND ||
  640.     regs->regs[2] == ERESTARTSYS ||
  641.     regs->regs[2] == ERESTARTNOINTR) {
  642. regs->regs[7] = regs->regs[26];
  643. regs->cp0_epc -= 8;
  644. }
  645. }
  646. return 0;
  647. }