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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*  $Id: signal.c,v 1.56 2001/03/21 11:46:20 davem Exp $
  2.  *  arch/sparc64/kernel/signal.c
  3.  *
  4.  *  Copyright (C) 1991, 1992  Linus Torvalds
  5.  *  Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
  6.  *  Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx)
  7.  *  Copyright (C) 1997 Eddie C. Dost   (ecd@skynet.be)
  8.  *  Copyright (C) 1997,1998 Jakub Jelinek   (jj@sunsite.mff.cuni.cz)
  9.  */
  10. #include <linux/config.h>
  11. #include <linux/sched.h>
  12. #include <linux/kernel.h>
  13. #include <linux/signal.h>
  14. #include <linux/errno.h>
  15. #include <linux/wait.h>
  16. #include <linux/ptrace.h>
  17. #include <linux/unistd.h>
  18. #include <linux/mm.h>
  19. #include <linux/smp_lock.h>
  20. #include <asm/uaccess.h>
  21. #include <asm/bitops.h>
  22. #include <asm/ptrace.h>
  23. #include <asm/svr4.h>
  24. #include <asm/pgtable.h>
  25. #include <asm/fpumacro.h>
  26. #include <asm/uctx.h>
  27. #include <asm/siginfo.h>
  28. #include <asm/visasm.h>
  29. #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
  30. asmlinkage int do_signal(sigset_t *oldset, struct pt_regs * regs,
  31.  unsigned long orig_o0, int ret_from_syscall);
  32. /* This turned off for production... */
  33. /* #define DEBUG_SIGNALS 1 */
  34. /* #define DEBUG_SIGNALS_TRACE 1 */
  35. /* #define DEBUG_SIGNALS_MAPS 1 */
  36. int copy_siginfo_to_user(siginfo_t *to, siginfo_t *from)
  37. {
  38. if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t)))
  39. return -EFAULT;
  40. if (from->si_code < 0)
  41. return __copy_to_user(to, from, sizeof(siginfo_t));
  42. else {
  43. int err;
  44. /* If you change siginfo_t structure, please be sure
  45.    this code is fixed accordingly.
  46.    It should never copy any pad contained in the structure
  47.    to avoid security leaks, but must copy the generic
  48.    3 ints plus the relevant union member.  */
  49. err = __put_user(*(long *)&from->si_signo, (long *)&to->si_signo);
  50. err |= __put_user((short)from->si_code, &to->si_code);
  51. switch (from->si_code >> 16) {
  52. case __SI_CHLD >> 16:
  53. err |= __put_user(from->si_utime, &to->si_utime);
  54. err |= __put_user(from->si_stime, &to->si_stime);
  55. case __SI_FAULT >> 16:
  56. case __SI_POLL >> 16:
  57. err |= __put_user(from->si_trapno, &to->si_trapno);
  58. default:
  59. err |= __put_user(from->si_addr, &to->si_addr);
  60. break;
  61. /* case __SI_RT: This is not generated by the kernel as of now.  */
  62. }
  63. return err;
  64. }
  65. }
  66. /* {set, get}context() needed for 64-bit SparcLinux userland. */
  67. asmlinkage void sparc64_set_context(struct pt_regs *regs)
  68. {
  69. struct ucontext *ucp = (struct ucontext *) regs->u_regs[UREG_I0];
  70. struct thread_struct *tp = &current->thread;
  71. mc_gregset_t *grp;
  72. unsigned long pc, npc, tstate;
  73. unsigned long fp, i7;
  74. unsigned char fenab;
  75. int err;
  76. flush_user_windows();
  77. if(tp->w_saved ||
  78.    (((unsigned long)ucp) & (sizeof(unsigned long)-1)) ||
  79.    (!__access_ok((unsigned long)ucp, sizeof(*ucp))))
  80. goto do_sigsegv;
  81. grp  = &ucp->uc_mcontext.mc_gregs;
  82. err  = __get_user(pc, &((*grp)[MC_PC]));
  83. err |= __get_user(npc, &((*grp)[MC_NPC]));
  84. if(err || ((pc | npc) & 3))
  85. goto do_sigsegv;
  86. if(regs->u_regs[UREG_I1]) {
  87. sigset_t set;
  88. if (_NSIG_WORDS == 1) {
  89. if (__get_user(set.sig[0], &ucp->uc_sigmask.sig[0]))
  90. goto do_sigsegv;
  91. } else {
  92. if (__copy_from_user(&set, &ucp->uc_sigmask, sizeof(sigset_t)))
  93. goto do_sigsegv;
  94. }
  95. sigdelsetmask(&set, ~_BLOCKABLE);
  96. spin_lock_irq(&current->sigmask_lock);
  97. current->blocked = set;
  98. recalc_sigpending(current);
  99. spin_unlock_irq(&current->sigmask_lock);
  100. }
  101. if ((tp->flags & SPARC_FLAG_32BIT) != 0) {
  102. pc &= 0xffffffff;
  103. npc &= 0xffffffff;
  104. }
  105. regs->tpc = pc;
  106. regs->tnpc = npc;
  107. err |= __get_user(regs->y, &((*grp)[MC_Y]));
  108. err |= __get_user(tstate, &((*grp)[MC_TSTATE]));
  109. regs->tstate &= ~(TSTATE_ICC | TSTATE_XCC);
  110. regs->tstate |= (tstate & (TSTATE_ICC | TSTATE_XCC));
  111. err |= __get_user(regs->u_regs[UREG_G1], (&(*grp)[MC_G1]));
  112. err |= __get_user(regs->u_regs[UREG_G2], (&(*grp)[MC_G2]));
  113. err |= __get_user(regs->u_regs[UREG_G3], (&(*grp)[MC_G3]));
  114. err |= __get_user(regs->u_regs[UREG_G4], (&(*grp)[MC_G4]));
  115. err |= __get_user(regs->u_regs[UREG_G5], (&(*grp)[MC_G5]));
  116. err |= __get_user(regs->u_regs[UREG_G6], (&(*grp)[MC_G6]));
  117. err |= __get_user(regs->u_regs[UREG_G7], (&(*grp)[MC_G7]));
  118. err |= __get_user(regs->u_regs[UREG_I0], (&(*grp)[MC_O0]));
  119. err |= __get_user(regs->u_regs[UREG_I1], (&(*grp)[MC_O1]));
  120. err |= __get_user(regs->u_regs[UREG_I2], (&(*grp)[MC_O2]));
  121. err |= __get_user(regs->u_regs[UREG_I3], (&(*grp)[MC_O3]));
  122. err |= __get_user(regs->u_regs[UREG_I4], (&(*grp)[MC_O4]));
  123. err |= __get_user(regs->u_regs[UREG_I5], (&(*grp)[MC_O5]));
  124. err |= __get_user(regs->u_regs[UREG_I6], (&(*grp)[MC_O6]));
  125. err |= __get_user(regs->u_regs[UREG_I7], (&(*grp)[MC_O7]));
  126. err |= __get_user(fp, &(ucp->uc_mcontext.mc_fp));
  127. err |= __get_user(i7, &(ucp->uc_mcontext.mc_i7));
  128. err |= __put_user(fp,
  129.       (&(((struct reg_window *)(STACK_BIAS+regs->u_regs[UREG_I6]))->ins[6])));
  130. err |= __put_user(i7,
  131.       (&(((struct reg_window *)(STACK_BIAS+regs->u_regs[UREG_I6]))->ins[7])));
  132. err |= __get_user(fenab, &(ucp->uc_mcontext.mc_fpregs.mcfpu_enab));
  133. if(fenab) {
  134. unsigned long *fpregs = (unsigned long *)(((char *)current) + AOFF_task_fpregs);
  135. unsigned long fprs;
  136. fprs_write(0);
  137. err |= __get_user(fprs, &(ucp->uc_mcontext.mc_fpregs.mcfpu_fprs));
  138. if (fprs & FPRS_DL)
  139. err |= copy_from_user(fpregs,
  140.       &(ucp->uc_mcontext.mc_fpregs.mcfpu_fregs),
  141.       (sizeof(unsigned int) * 32));
  142. if (fprs & FPRS_DU)
  143. err |= copy_from_user(fpregs+16,
  144.  ((unsigned long *)&(ucp->uc_mcontext.mc_fpregs.mcfpu_fregs))+16,
  145.  (sizeof(unsigned int) * 32));
  146. err |= __get_user(current->thread.xfsr[0],
  147.   &(ucp->uc_mcontext.mc_fpregs.mcfpu_fsr));
  148. err |= __get_user(current->thread.gsr[0],
  149.   &(ucp->uc_mcontext.mc_fpregs.mcfpu_gsr));
  150. regs->tstate &= ~TSTATE_PEF;
  151. }
  152. if (err)
  153. goto do_sigsegv;
  154. return;
  155. do_sigsegv:
  156. do_exit(SIGSEGV);
  157. }
  158. asmlinkage void sparc64_get_context(struct pt_regs *regs)
  159. {
  160. struct ucontext *ucp = (struct ucontext *) regs->u_regs[UREG_I0];
  161. struct thread_struct *tp = &current->thread;
  162. mc_gregset_t *grp;
  163. mcontext_t *mcp;
  164. unsigned long fp, i7;
  165. unsigned char fenab;
  166. int err;
  167. synchronize_user_stack();
  168. if(tp->w_saved || clear_user(ucp, sizeof(*ucp)))
  169. goto do_sigsegv;
  170. #if 1
  171. fenab = 0; /* IMO get_context is like any other system call, thus modifies FPU state -jj */
  172. #else
  173. fenab = (current->thread.fpsaved[0] & FPRS_FEF);
  174. #endif
  175. mcp = &ucp->uc_mcontext;
  176. grp = &mcp->mc_gregs;
  177. /* Skip over the trap instruction, first. */
  178. if ((tp->flags & SPARC_FLAG_32BIT) != 0) {
  179. regs->tpc   = (regs->tnpc & 0xffffffff);
  180. regs->tnpc  = (regs->tnpc + 4) & 0xffffffff;
  181. } else {
  182. regs->tpc   = regs->tnpc;
  183. regs->tnpc += 4;
  184. }
  185. err = 0;
  186. if (_NSIG_WORDS == 1)
  187. err |= __put_user(current->blocked.sig[0],
  188.   (unsigned long *)&ucp->uc_sigmask);
  189. else
  190. err |= __copy_to_user(&ucp->uc_sigmask, &current->blocked,
  191.       sizeof(sigset_t));
  192. err |= __put_user(regs->tstate, &((*grp)[MC_TSTATE]));
  193. err |= __put_user(regs->tpc, &((*grp)[MC_PC]));
  194. err |= __put_user(regs->tnpc, &((*grp)[MC_NPC]));
  195. err |= __put_user(regs->y, &((*grp)[MC_Y]));
  196. err |= __put_user(regs->u_regs[UREG_G1], &((*grp)[MC_G1]));
  197. err |= __put_user(regs->u_regs[UREG_G2], &((*grp)[MC_G2]));
  198. err |= __put_user(regs->u_regs[UREG_G3], &((*grp)[MC_G3]));
  199. err |= __put_user(regs->u_regs[UREG_G4], &((*grp)[MC_G4]));
  200. err |= __put_user(regs->u_regs[UREG_G5], &((*grp)[MC_G5]));
  201. err |= __put_user(regs->u_regs[UREG_G6], &((*grp)[MC_G6]));
  202. err |= __put_user(regs->u_regs[UREG_G6], &((*grp)[MC_G7]));
  203. err |= __put_user(regs->u_regs[UREG_I0], &((*grp)[MC_O0]));
  204. err |= __put_user(regs->u_regs[UREG_I1], &((*grp)[MC_O1]));
  205. err |= __put_user(regs->u_regs[UREG_I2], &((*grp)[MC_O2]));
  206. err |= __put_user(regs->u_regs[UREG_I3], &((*grp)[MC_O3]));
  207. err |= __put_user(regs->u_regs[UREG_I4], &((*grp)[MC_O4]));
  208. err |= __put_user(regs->u_regs[UREG_I5], &((*grp)[MC_O5]));
  209. err |= __put_user(regs->u_regs[UREG_I6], &((*grp)[MC_O6]));
  210. err |= __put_user(regs->u_regs[UREG_I7], &((*grp)[MC_O7]));
  211. err |= __get_user(fp,
  212.  (&(((struct reg_window *)(STACK_BIAS+regs->u_regs[UREG_I6]))->ins[6])));
  213. err |= __get_user(i7,
  214.  (&(((struct reg_window *)(STACK_BIAS+regs->u_regs[UREG_I6]))->ins[7])));
  215. err |= __put_user(fp, &(mcp->mc_fp));
  216. err |= __put_user(i7, &(mcp->mc_i7));
  217. err |= __put_user(fenab, &(mcp->mc_fpregs.mcfpu_enab));
  218. if(fenab) {
  219. unsigned long *fpregs = (unsigned long *)(((char *)current) + AOFF_task_fpregs);
  220. unsigned long fprs;
  221. fprs = current->thread.fpsaved[0];
  222. if (fprs & FPRS_DL)
  223. err |= copy_to_user(&(mcp->mc_fpregs.mcfpu_fregs), fpregs,
  224.     (sizeof(unsigned int) * 32));
  225. if (fprs & FPRS_DU)
  226. err |= copy_to_user(
  227.                           ((unsigned long *)&(mcp->mc_fpregs.mcfpu_fregs))+16, fpregs+16,
  228.   (sizeof(unsigned int) * 32));
  229. err |= __put_user(current->thread.xfsr[0], &(mcp->mc_fpregs.mcfpu_fsr));
  230. err |= __put_user(current->thread.gsr[0], &(mcp->mc_fpregs.mcfpu_gsr));
  231. err |= __put_user(fprs, &(mcp->mc_fpregs.mcfpu_fprs));
  232. }
  233. if (err)
  234. goto do_sigsegv;
  235. return;
  236. do_sigsegv:
  237. do_exit(SIGSEGV);
  238. }
  239. struct rt_signal_frame {
  240. struct sparc_stackf ss;
  241. siginfo_t info;
  242. struct pt_regs regs;
  243. __siginfo_fpu_t * fpu_save;
  244. stack_t stack;
  245. sigset_t mask;
  246. __siginfo_fpu_t fpu_state;
  247. };
  248. /* Align macros */
  249. #define RT_ALIGNEDSZ  (((sizeof(struct rt_signal_frame) + 7) & (~7)))
  250. /*
  251.  * atomically swap in the new signal mask, and wait for a signal.
  252.  * This is really tricky on the Sparc, watch out...
  253.  */
  254. asmlinkage void _sigpause_common(old_sigset_t set, struct pt_regs *regs)
  255. {
  256. sigset_t saveset;
  257. #ifdef CONFIG_SPARC32_COMPAT
  258. if (current->thread.flags & SPARC_FLAG_32BIT) {
  259. extern asmlinkage void _sigpause32_common(old_sigset_t32,
  260.   struct pt_regs *);
  261. _sigpause32_common(set, regs);
  262. return;
  263. }
  264. #endif
  265. set &= _BLOCKABLE;
  266. spin_lock_irq(&current->sigmask_lock);
  267. saveset = current->blocked;
  268. siginitset(&current->blocked, set);
  269. recalc_sigpending(current);
  270. spin_unlock_irq(&current->sigmask_lock);
  271. if ((current->thread.flags & SPARC_FLAG_32BIT) != 0) {
  272. regs->tpc = (regs->tnpc & 0xffffffff);
  273. regs->tnpc = (regs->tnpc + 4) & 0xffffffff;
  274. } else {
  275. regs->tpc = regs->tnpc;
  276. regs->tnpc += 4;
  277. }
  278. /* Condition codes and return value where set here for sigpause,
  279.  * and so got used by setup_frame, which again causes sigreturn()
  280.  * to return -EINTR.
  281.  */
  282. while (1) {
  283. current->state = TASK_INTERRUPTIBLE;
  284. schedule();
  285. /*
  286.  * Return -EINTR and set condition code here,
  287.  * so the interrupted system call actually returns
  288.  * these.
  289.  */
  290. regs->tstate |= (TSTATE_ICARRY|TSTATE_XCARRY);
  291. regs->u_regs[UREG_I0] = EINTR;
  292. if (do_signal(&saveset, regs, 0, 0))
  293. return;
  294. }
  295. }
  296. asmlinkage void do_sigpause(unsigned int set, struct pt_regs *regs)
  297. {
  298. _sigpause_common(set, regs);
  299. }
  300. asmlinkage void do_sigsuspend(struct pt_regs *regs)
  301. {
  302. _sigpause_common(regs->u_regs[UREG_I0], regs);
  303. }
  304. asmlinkage void do_rt_sigsuspend(sigset_t *uset, size_t sigsetsize, struct pt_regs *regs)
  305. {
  306. sigset_t oldset, set;
  307.         
  308. /* XXX: Don't preclude handling different sized sigset_t's.  */
  309. if (sigsetsize != sizeof(sigset_t)) {
  310. regs->tstate |= (TSTATE_ICARRY|TSTATE_XCARRY);
  311. regs->u_regs[UREG_I0] = EINVAL;
  312. return;
  313. }
  314. if (copy_from_user(&set, uset, sizeof(set))) {
  315. regs->tstate |= (TSTATE_ICARRY|TSTATE_XCARRY);
  316. regs->u_regs[UREG_I0] = EFAULT;
  317. return;
  318. }
  319.                                                                 
  320. sigdelsetmask(&set, ~_BLOCKABLE);
  321. spin_lock_irq(&current->sigmask_lock);
  322. oldset = current->blocked;
  323. current->blocked = set;
  324. recalc_sigpending(current);
  325. spin_unlock_irq(&current->sigmask_lock);
  326. if ((current->thread.flags & SPARC_FLAG_32BIT) != 0) {
  327. regs->tpc = (regs->tnpc & 0xffffffff);
  328. regs->tnpc = (regs->tnpc + 4) & 0xffffffff;
  329. } else {
  330. regs->tpc = regs->tnpc;
  331. regs->tnpc += 4;
  332. }
  333. /* Condition codes and return value where set here for sigpause,
  334.  * and so got used by setup_frame, which again causes sigreturn()
  335.  * to return -EINTR.
  336.  */
  337. while (1) {
  338. current->state = TASK_INTERRUPTIBLE;
  339. schedule();
  340. /*
  341.  * Return -EINTR and set condition code here,
  342.  * so the interrupted system call actually returns
  343.  * these.
  344.  */
  345. regs->tstate |= (TSTATE_ICARRY|TSTATE_XCARRY);
  346. regs->u_regs[UREG_I0] = EINTR;
  347. if (do_signal(&oldset, regs, 0, 0))
  348. return;
  349. }
  350. }
  351. static inline int
  352. restore_fpu_state(struct pt_regs *regs, __siginfo_fpu_t *fpu)
  353. {
  354. unsigned long *fpregs = (unsigned long *)(((char *)current) + AOFF_task_fpregs);
  355. unsigned long fprs;
  356. int err;
  357. err = __get_user(fprs, &fpu->si_fprs);
  358. fprs_write(0);
  359. regs->tstate &= ~TSTATE_PEF;
  360. if (fprs & FPRS_DL)
  361. err |= copy_from_user(fpregs, &fpu->si_float_regs[0],
  362.                (sizeof(unsigned int) * 32));
  363. if (fprs & FPRS_DU)
  364. err |= copy_from_user(fpregs+16, &fpu->si_float_regs[32],
  365.                (sizeof(unsigned int) * 32));
  366. err |= __get_user(current->thread.xfsr[0], &fpu->si_fsr);
  367. err |= __get_user(current->thread.gsr[0], &fpu->si_gsr);
  368. current->thread.fpsaved[0] |= fprs;
  369. return err;
  370. }
  371. void do_rt_sigreturn(struct pt_regs *regs)
  372. {
  373. struct rt_signal_frame *sf;
  374. unsigned long tpc, tnpc, tstate;
  375. __siginfo_fpu_t *fpu_save;
  376. mm_segment_t old_fs;
  377. sigset_t set;
  378. stack_t st;
  379. int err;
  380. synchronize_user_stack ();
  381. sf = (struct rt_signal_frame *)
  382. (regs->u_regs [UREG_FP] + STACK_BIAS);
  383. /* 1. Make sure we are not getting garbage from the user */
  384. if (((unsigned long) sf) & 3)
  385. goto segv;
  386. err = get_user(tpc, &sf->regs.tpc);
  387. err |= __get_user(tnpc, &sf->regs.tnpc);
  388. if ((current->thread.flags & SPARC_FLAG_32BIT) != 0) {
  389. tpc &= 0xffffffff;
  390. tnpc &= 0xffffffff;
  391. }
  392. err |= ((tpc | tnpc) & 3);
  393. /* 2. Restore the state */
  394. err |= __get_user(regs->y, &sf->regs.y);
  395. err |= __get_user(tstate, &sf->regs.tstate);
  396. err |= copy_from_user(regs->u_regs, sf->regs.u_regs, sizeof(regs->u_regs));
  397. /* User can only change condition codes in %tstate. */
  398. regs->tstate &= ~(TSTATE_ICC);
  399. regs->tstate |= (tstate & TSTATE_ICC);
  400. err |= __get_user(fpu_save, &sf->fpu_save);
  401. if (fpu_save)
  402. err |= restore_fpu_state(regs, &sf->fpu_state);
  403. err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t));
  404. err |= __copy_from_user(&st, &sf->stack, sizeof(stack_t));
  405. if (err)
  406. goto segv;
  407. regs->tpc = tpc;
  408. regs->tnpc = tnpc;
  409. /* It is more difficult to avoid calling this function than to
  410.    call it and ignore errors.  */
  411. old_fs = get_fs();
  412. set_fs(KERNEL_DS);
  413. do_sigaltstack(&st, NULL, (unsigned long)sf);
  414. set_fs(old_fs);
  415. sigdelsetmask(&set, ~_BLOCKABLE);
  416. spin_lock_irq(&current->sigmask_lock);
  417. current->blocked = set;
  418. recalc_sigpending(current);
  419. spin_unlock_irq(&current->sigmask_lock);
  420. return;
  421. segv:
  422. send_sig(SIGSEGV, current, 1);
  423. }
  424. /* Checks if the fp is valid */
  425. static int invalid_frame_pointer(void *fp, int fplen)
  426. {
  427. if (((unsigned long) fp) & 7)
  428. return 1;
  429. return 0;
  430. }
  431. static inline int
  432. save_fpu_state(struct pt_regs *regs, __siginfo_fpu_t *fpu)
  433. {
  434. unsigned long *fpregs = (unsigned long *)(regs+1);
  435. unsigned long fprs;
  436. int err = 0;
  437. fprs = current->thread.fpsaved[0];
  438. if (fprs & FPRS_DL)
  439. err |= copy_to_user(&fpu->si_float_regs[0], fpregs,
  440.     (sizeof(unsigned int) * 32));
  441. if (fprs & FPRS_DU)
  442. err |= copy_to_user(&fpu->si_float_regs[32], fpregs+16,
  443.     (sizeof(unsigned int) * 32));
  444. err |= __put_user(current->thread.xfsr[0], &fpu->si_fsr);
  445. err |= __put_user(current->thread.gsr[0], &fpu->si_gsr);
  446. err |= __put_user(fprs, &fpu->si_fprs);
  447. return err;
  448. }
  449. static inline void *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, unsigned long framesize)
  450. {
  451. unsigned long sp;
  452. sp = regs->u_regs[UREG_FP] + STACK_BIAS;
  453. /* This is the X/Open sanctioned signal stack switching.  */
  454. if (ka->sa.sa_flags & SA_ONSTACK) {
  455. if (!on_sig_stack(sp) &&
  456.     !((current->sas_ss_sp + current->sas_ss_size) & 7))
  457. sp = current->sas_ss_sp + current->sas_ss_size;
  458. }
  459. return (void *)(sp - framesize);
  460. }
  461. static inline void
  462. setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
  463.        int signo, sigset_t *oldset, siginfo_t *info)
  464. {
  465. struct rt_signal_frame *sf;
  466. int sigframe_size, err;
  467. /* 1. Make sure everything is clean */
  468. synchronize_user_stack();
  469. save_and_clear_fpu();
  470. sigframe_size = RT_ALIGNEDSZ;
  471. if (!(current->thread.fpsaved[0] & FPRS_FEF))
  472. sigframe_size -= sizeof(__siginfo_fpu_t);
  473. sf = (struct rt_signal_frame *)get_sigframe(ka, regs, sigframe_size);
  474. if (invalid_frame_pointer (sf, sigframe_size))
  475. goto sigill;
  476. if (current->thread.w_saved != 0) {
  477. #ifdef DEBUG_SIGNALS
  478. printk ("%s[%d]: Invalid user stack frame for "
  479. "signal delivery.n", current->comm, current->pid);
  480. #endif
  481. goto sigill;
  482. }
  483. /* 2. Save the current process state */
  484. err = copy_to_user(&sf->regs, regs, sizeof (*regs));
  485. if (current->thread.fpsaved[0] & FPRS_FEF) {
  486. err |= save_fpu_state(regs, &sf->fpu_state);
  487. err |= __put_user((u64)&sf->fpu_state, &sf->fpu_save);
  488. } else {
  489. err |= __put_user(0, &sf->fpu_save);
  490. }
  491. /* Setup sigaltstack */
  492. err |= __put_user(current->sas_ss_sp, &sf->stack.ss_sp);
  493. err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &sf->stack.ss_flags);
  494. err |= __put_user(current->sas_ss_size, &sf->stack.ss_size);
  495. err |= copy_to_user(&sf->mask, oldset, sizeof(sigset_t));
  496. err |= copy_in_user((u64 *)sf,
  497.     (u64 *)(regs->u_regs[UREG_FP]+STACK_BIAS),
  498.     sizeof(struct reg_window));
  499. if (info)
  500. err |= copy_siginfo_to_user(&sf->info, info);
  501. else {
  502. err |= __put_user(signo, &sf->info.si_signo);
  503. err |= __put_user(SI_NOINFO, &sf->info.si_code);
  504. }
  505. if (err)
  506. goto sigsegv;
  507. /* 3. signal handler back-trampoline and parameters */
  508. regs->u_regs[UREG_FP] = ((unsigned long) sf) - STACK_BIAS;
  509. regs->u_regs[UREG_I0] = signo;
  510. regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
  511. /* The sigcontext is passed in this way because of how it
  512.  * is defined in GLIBC's /usr/include/bits/sigcontext.h
  513.  * for sparc64.  It includes the 128 bytes of siginfo_t.
  514.  */
  515. regs->u_regs[UREG_I2] = (unsigned long) &sf->info;
  516. /* 5. signal handler */
  517. regs->tpc = (unsigned long) ka->sa.sa_handler;
  518. regs->tnpc = (regs->tpc + 4);
  519. if ((current->thread.flags & SPARC_FLAG_32BIT) != 0) {
  520. regs->tpc &= 0xffffffff;
  521. regs->tnpc &= 0xffffffff;
  522. }
  523. /* 4. return to kernel instructions */
  524. regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer;
  525. return;
  526. sigill:
  527. do_exit(SIGILL);
  528. sigsegv:
  529. do_exit(SIGSEGV);
  530. }
  531. static inline void handle_signal(unsigned long signr, struct k_sigaction *ka,
  532.  siginfo_t *info,
  533.  sigset_t *oldset, struct pt_regs *regs)
  534. {
  535. setup_rt_frame(ka, regs, signr, oldset, (ka->sa.sa_flags & SA_SIGINFO) ? info : NULL);
  536. if(ka->sa.sa_flags & SA_ONESHOT)
  537. ka->sa.sa_handler = SIG_DFL;
  538. if(!(ka->sa.sa_flags & SA_NOMASK)) {
  539. spin_lock_irq(&current->sigmask_lock);
  540. sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
  541. sigaddset(&current->blocked,signr);
  542. recalc_sigpending(current);
  543. spin_unlock_irq(&current->sigmask_lock);
  544. }
  545. }
  546. static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
  547.      struct sigaction *sa)
  548. {
  549. switch(regs->u_regs[UREG_I0]) {
  550. case ERESTARTNOHAND:
  551. no_system_call_restart:
  552. regs->u_regs[UREG_I0] = EINTR;
  553. regs->tstate |= (TSTATE_ICARRY|TSTATE_XCARRY);
  554. break;
  555. case ERESTARTSYS:
  556. if(!(sa->sa_flags & SA_RESTART))
  557. goto no_system_call_restart;
  558. /* fallthrough */
  559. case ERESTARTNOINTR:
  560. regs->u_regs[UREG_I0] = orig_i0;
  561. regs->tpc -= 4;
  562. regs->tnpc -= 4;
  563. }
  564. }
  565. #ifdef DEBUG_SIGNALS_MAPS
  566. #define MAPS_LINE_FORMAT   "%016lx-%016lx %s %016lx %s %lu "
  567. static inline void read_maps (void)
  568. {
  569. struct vm_area_struct * map, * next;
  570. char * buffer;
  571. ssize_t i;
  572. buffer = (char*)__get_free_page(GFP_KERNEL);
  573. if (!buffer)
  574. return;
  575. for (map = current->mm->mmap ; map ; map = next ) {
  576. /* produce the next line */
  577. char *line;
  578. char str[5], *cp = str;
  579. int flags;
  580. kdev_t dev;
  581. unsigned long ino;
  582. /*
  583.  * Get the next vma now (but it won't be used if we sleep).
  584.  */
  585. next = map->vm_next;
  586. flags = map->vm_flags;
  587. *cp++ = flags & VM_READ ? 'r' : '-';
  588. *cp++ = flags & VM_WRITE ? 'w' : '-';
  589. *cp++ = flags & VM_EXEC ? 'x' : '-';
  590. *cp++ = flags & VM_MAYSHARE ? 's' : 'p';
  591. *cp++ = 0;
  592. dev = 0;
  593. ino = 0;
  594. if (map->vm_file != NULL) {
  595. dev = map->vm_file->f_dentry->d_inode->i_dev;
  596. ino = map->vm_file->f_dentry->d_inode->i_ino;
  597. line = d_path(map->vm_file->f_dentry,
  598.       map->vm_file->f_vfsmnt,
  599.       buffer, PAGE_SIZE);
  600. }
  601. printk(MAPS_LINE_FORMAT, map->vm_start, map->vm_end, str, map->vm_pgoff << PAGE_SHIFT,
  602.       kdevname(dev), ino);
  603. if (map->vm_file != NULL)
  604. printk("%sn", line);
  605. else
  606. printk("n");
  607. }
  608. free_page((unsigned long)buffer);
  609. return;
  610. }
  611. #endif
  612. /* Note that 'init' is a special process: it doesn't get signals it doesn't
  613.  * want to handle. Thus you cannot kill init even with a SIGKILL even by
  614.  * mistake.
  615.  */
  616. asmlinkage int do_signal(sigset_t *oldset, struct pt_regs * regs,
  617.  unsigned long orig_i0, int restart_syscall)
  618. {
  619. unsigned long signr;
  620. siginfo_t info;
  621. struct k_sigaction *ka;
  622. if (!oldset)
  623. oldset = &current->blocked;
  624. #ifdef CONFIG_SPARC32_COMPAT
  625. if (current->thread.flags & SPARC_FLAG_32BIT) {
  626. extern asmlinkage int do_signal32(sigset_t *, struct pt_regs *,
  627.   unsigned long, int);
  628. return do_signal32(oldset, regs, orig_i0, restart_syscall);
  629. }
  630. #endif
  631. for (;;) {
  632. spin_lock_irq(&current->sigmask_lock);
  633. signr = dequeue_signal(&current->blocked, &info);
  634. spin_unlock_irq(&current->sigmask_lock);
  635. if (!signr)
  636. break;
  637. if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) {
  638. /* Do the syscall restart before we let the debugger
  639.  * look at the child registers.
  640.  */
  641. if (restart_syscall &&
  642.     (regs->u_regs[UREG_I0] == ERESTARTNOHAND ||
  643.      regs->u_regs[UREG_I0] == ERESTARTSYS ||
  644.      regs->u_regs[UREG_I0] == ERESTARTNOINTR)) {
  645. regs->u_regs[UREG_I0] = orig_i0;
  646. regs->tpc -= 4;
  647. regs->tnpc -= 4;
  648. restart_syscall = 0;
  649. }
  650. current->exit_code = signr;
  651. current->state = TASK_STOPPED;
  652. notify_parent(current, SIGCHLD);
  653. schedule();
  654. if (!(signr = current->exit_code))
  655. continue;
  656. current->exit_code = 0;
  657. if (signr == SIGSTOP)
  658. continue;
  659. /* Update the siginfo structure.  Is this good?  */
  660. if (signr != info.si_signo) {
  661. info.si_signo = signr;
  662. info.si_errno = 0;
  663. info.si_code = SI_USER;
  664. info.si_pid = current->p_pptr->pid;
  665. info.si_uid = current->p_pptr->uid;
  666. }
  667. /* If the (new) signal is now blocked, requeue it.  */
  668. if (sigismember(&current->blocked, signr)) {
  669. send_sig_info(signr, &info, current);
  670. continue;
  671. }
  672. }
  673. ka = &current->sig->action[signr-1];
  674. if (ka->sa.sa_handler == SIG_IGN) {
  675. if (signr != SIGCHLD)
  676. continue;
  677.                         /* sys_wait4() grabs the master kernel lock, so
  678.                          * we need not do so, that sucker should be
  679.                          * threaded and would not be that difficult to
  680.                          * do anyways.
  681.                          */
  682.                         while (sys_wait4(-1, NULL, WNOHANG, NULL) > 0)
  683.                                 ;
  684. continue;
  685. }
  686. if (ka->sa.sa_handler == SIG_DFL) {
  687. unsigned long exit_code = signr;
  688. if (current->pid == 1)
  689. continue;
  690. switch (signr) {
  691. case SIGCONT: case SIGCHLD: case SIGWINCH:
  692. continue;
  693. case SIGTSTP: case SIGTTIN: case SIGTTOU:
  694. if (is_orphaned_pgrp(current->pgrp))
  695. continue;
  696. case SIGSTOP:
  697. if (current->ptrace & PT_PTRACED)
  698. continue;
  699. current->state = TASK_STOPPED;
  700. current->exit_code = signr;
  701. if (!(current->p_pptr->sig->action[SIGCHLD-1].sa.sa_flags &
  702.       SA_NOCLDSTOP))
  703. notify_parent(current, SIGCHLD);
  704. schedule();
  705. continue;
  706. case SIGQUIT: case SIGILL: case SIGTRAP:
  707. case SIGABRT: case SIGFPE: case SIGSEGV:
  708. case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ:
  709. if (do_coredump(signr, regs))
  710. exit_code |= 0x80;
  711. #ifdef DEBUG_SIGNALS
  712. /* Very useful to debug the dynamic linker */
  713. printk ("Sig %d going...n", (int)signr);
  714. show_regs (regs);
  715. #ifdef DEBUG_SIGNALS_TRACE
  716. {
  717. struct reg_window *rw = (struct reg_window *)(regs->u_regs[UREG_FP] + STACK_BIAS);
  718. unsigned long ins[8];
  719.                                                 
  720. while (rw &&
  721.        !(((unsigned long) rw) & 0x3)) {
  722.         copy_from_user(ins, &rw->ins[0], sizeof(ins));
  723. printk("Caller[%016lx](%016lx,%016lx,%016lx,%016lx,%016lx,%016lx)n", ins[7], ins[0], ins[1], ins[2], ins[3], ins[4], ins[5]);
  724. rw = (struct reg_window *)(unsigned long)(ins[6] + STACK_BIAS);
  725. }
  726. }
  727. #endif
  728. #ifdef DEBUG_SIGNALS_MAPS
  729. printk("Maps:n");
  730. read_maps();
  731. #endif
  732. #endif
  733. /* fall through */
  734. default:
  735. sig_exit(signr, exit_code, &info);
  736. /* NOT REACHED */
  737. }
  738. }
  739. if (restart_syscall)
  740. syscall_restart(orig_i0, regs, &ka->sa);
  741. handle_signal(signr, ka, &info, oldset, regs);
  742. return 1;
  743. }
  744. if (restart_syscall &&
  745.     (regs->u_regs[UREG_I0] == ERESTARTNOHAND ||
  746.      regs->u_regs[UREG_I0] == ERESTARTSYS ||
  747.      regs->u_regs[UREG_I0] == ERESTARTNOINTR)) {
  748. /* replay the system call when we are done */
  749. regs->u_regs[UREG_I0] = orig_i0;
  750. regs->tpc -= 4;
  751. regs->tnpc -= 4;
  752. }
  753. return 0;
  754. }