signal.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:24k
源码类别:

嵌入式Linux

开发平台:

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. sigset_t set;
  377. stack_t st;
  378. int err;
  379. synchronize_user_stack ();
  380. sf = (struct rt_signal_frame *)
  381. (regs->u_regs [UREG_FP] + STACK_BIAS);
  382. /* 1. Make sure we are not getting garbage from the user */
  383. if (((unsigned long) sf) & 3)
  384. goto segv;
  385. err = get_user(tpc, &sf->regs.tpc);
  386. err |= __get_user(tnpc, &sf->regs.tnpc);
  387. if ((current->thread.flags & SPARC_FLAG_32BIT) != 0) {
  388. tpc &= 0xffffffff;
  389. tnpc &= 0xffffffff;
  390. }
  391. err |= ((tpc | tnpc) & 3);
  392. /* 2. Restore the state */
  393. err |= __get_user(regs->y, &sf->regs.y);
  394. err |= __get_user(tstate, &sf->regs.tstate);
  395. err |= copy_from_user(regs->u_regs, sf->regs.u_regs, sizeof(regs->u_regs));
  396. /* User can only change condition codes in %tstate. */
  397. regs->tstate &= ~(TSTATE_ICC);
  398. regs->tstate |= (tstate & TSTATE_ICC);
  399. err |= __get_user(fpu_save, &sf->fpu_save);
  400. if (fpu_save)
  401. err |= restore_fpu_state(regs, &sf->fpu_state);
  402. err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t));
  403. err |= __copy_from_user(&st, &sf->stack, sizeof(stack_t));
  404. if (err)
  405. goto segv;
  406. regs->tpc = tpc;
  407. regs->tnpc = tnpc;
  408. /* It is more difficult to avoid calling this function than to
  409.    call it and ignore errors.  */
  410. do_sigaltstack(&st, NULL, (unsigned long)sf);
  411. sigdelsetmask(&set, ~_BLOCKABLE);
  412. spin_lock_irq(&current->sigmask_lock);
  413. current->blocked = set;
  414. recalc_sigpending(current);
  415. spin_unlock_irq(&current->sigmask_lock);
  416. return;
  417. segv:
  418. send_sig(SIGSEGV, current, 1);
  419. }
  420. /* Checks if the fp is valid */
  421. static int invalid_frame_pointer(void *fp, int fplen)
  422. {
  423. if (((unsigned long) fp) & 7)
  424. return 1;
  425. return 0;
  426. }
  427. static inline int
  428. save_fpu_state(struct pt_regs *regs, __siginfo_fpu_t *fpu)
  429. {
  430. unsigned long *fpregs = (unsigned long *)(regs+1);
  431. unsigned long fprs;
  432. int err = 0;
  433. fprs = current->thread.fpsaved[0];
  434. if (fprs & FPRS_DL)
  435. err |= copy_to_user(&fpu->si_float_regs[0], fpregs,
  436.     (sizeof(unsigned int) * 32));
  437. if (fprs & FPRS_DU)
  438. err |= copy_to_user(&fpu->si_float_regs[32], fpregs+16,
  439.     (sizeof(unsigned int) * 32));
  440. err |= __put_user(current->thread.xfsr[0], &fpu->si_fsr);
  441. err |= __put_user(current->thread.gsr[0], &fpu->si_gsr);
  442. err |= __put_user(fprs, &fpu->si_fprs);
  443. return err;
  444. }
  445. static inline void *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, unsigned long framesize)
  446. {
  447. unsigned long sp;
  448. sp = regs->u_regs[UREG_FP] + STACK_BIAS;
  449. /* This is the X/Open sanctioned signal stack switching.  */
  450. if (ka->sa.sa_flags & SA_ONSTACK) {
  451. if (!on_sig_stack(sp) &&
  452.     !((current->sas_ss_sp + current->sas_ss_size) & 7))
  453. sp = current->sas_ss_sp + current->sas_ss_size;
  454. }
  455. return (void *)(sp - framesize);
  456. }
  457. static inline void
  458. setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
  459.        int signo, sigset_t *oldset, siginfo_t *info)
  460. {
  461. struct rt_signal_frame *sf;
  462. int sigframe_size, err;
  463. /* 1. Make sure everything is clean */
  464. synchronize_user_stack();
  465. save_and_clear_fpu();
  466. sigframe_size = RT_ALIGNEDSZ;
  467. if (!(current->thread.fpsaved[0] & FPRS_FEF))
  468. sigframe_size -= sizeof(__siginfo_fpu_t);
  469. sf = (struct rt_signal_frame *)get_sigframe(ka, regs, sigframe_size);
  470. if (invalid_frame_pointer (sf, sigframe_size))
  471. goto sigill;
  472. if (current->thread.w_saved != 0) {
  473. #ifdef DEBUG_SIGNALS
  474. printk ("%s[%d]: Invalid user stack frame for "
  475. "signal delivery.n", current->comm, current->pid);
  476. #endif
  477. goto sigill;
  478. }
  479. /* 2. Save the current process state */
  480. err = copy_to_user(&sf->regs, regs, sizeof (*regs));
  481. if (current->thread.fpsaved[0] & FPRS_FEF) {
  482. err |= save_fpu_state(regs, &sf->fpu_state);
  483. err |= __put_user((u64)&sf->fpu_state, &sf->fpu_save);
  484. } else {
  485. err |= __put_user(0, &sf->fpu_save);
  486. }
  487. /* Setup sigaltstack */
  488. err |= __put_user(current->sas_ss_sp, &sf->stack.ss_sp);
  489. err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &sf->stack.ss_flags);
  490. err |= __put_user(current->sas_ss_size, &sf->stack.ss_size);
  491. err |= copy_to_user(&sf->mask, oldset, sizeof(sigset_t));
  492. err |= copy_in_user((u64 *)sf,
  493.     (u64 *)(regs->u_regs[UREG_FP]+STACK_BIAS),
  494.     sizeof(struct reg_window));
  495. if (info)
  496. err |= copy_siginfo_to_user(&sf->info, info);
  497. else {
  498. err |= __put_user(signo, &sf->info.si_signo);
  499. err |= __put_user(SI_NOINFO, &sf->info.si_code);
  500. }
  501. if (err)
  502. goto sigsegv;
  503. /* 3. signal handler back-trampoline and parameters */
  504. regs->u_regs[UREG_FP] = ((unsigned long) sf) - STACK_BIAS;
  505. regs->u_regs[UREG_I0] = signo;
  506. regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
  507. /* 5. signal handler */
  508. regs->tpc = (unsigned long) ka->sa.sa_handler;
  509. regs->tnpc = (regs->tpc + 4);
  510. if ((current->thread.flags & SPARC_FLAG_32BIT) != 0) {
  511. regs->tpc &= 0xffffffff;
  512. regs->tnpc &= 0xffffffff;
  513. }
  514. /* 4. return to kernel instructions */
  515. regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer;
  516. return;
  517. sigill:
  518. do_exit(SIGILL);
  519. sigsegv:
  520. do_exit(SIGSEGV);
  521. }
  522. static inline void handle_signal(unsigned long signr, struct k_sigaction *ka,
  523.  siginfo_t *info,
  524.  sigset_t *oldset, struct pt_regs *regs)
  525. {
  526. setup_rt_frame(ka, regs, signr, oldset, (ka->sa.sa_flags & SA_SIGINFO) ? info : NULL);
  527. if(ka->sa.sa_flags & SA_ONESHOT)
  528. ka->sa.sa_handler = SIG_DFL;
  529. if(!(ka->sa.sa_flags & SA_NOMASK)) {
  530. spin_lock_irq(&current->sigmask_lock);
  531. sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
  532. sigaddset(&current->blocked,signr);
  533. recalc_sigpending(current);
  534. spin_unlock_irq(&current->sigmask_lock);
  535. }
  536. }
  537. static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
  538.      struct sigaction *sa)
  539. {
  540. switch(regs->u_regs[UREG_I0]) {
  541. case ERESTARTNOHAND:
  542. no_system_call_restart:
  543. regs->u_regs[UREG_I0] = EINTR;
  544. regs->tstate |= (TSTATE_ICARRY|TSTATE_XCARRY);
  545. break;
  546. case ERESTARTSYS:
  547. if(!(sa->sa_flags & SA_RESTART))
  548. goto no_system_call_restart;
  549. /* fallthrough */
  550. case ERESTARTNOINTR:
  551. regs->u_regs[UREG_I0] = orig_i0;
  552. regs->tpc -= 4;
  553. regs->tnpc -= 4;
  554. }
  555. }
  556. #ifdef DEBUG_SIGNALS_MAPS
  557. #define MAPS_LINE_FORMAT   "%016lx-%016lx %s %016lx %s %lu "
  558. static inline void read_maps (void)
  559. {
  560. struct vm_area_struct * map, * next;
  561. char * buffer;
  562. ssize_t i;
  563. buffer = (char*)__get_free_page(GFP_KERNEL);
  564. if (!buffer)
  565. return;
  566. for (map = current->mm->mmap ; map ; map = next ) {
  567. /* produce the next line */
  568. char *line;
  569. char str[5], *cp = str;
  570. int flags;
  571. kdev_t dev;
  572. unsigned long ino;
  573. /*
  574.  * Get the next vma now (but it won't be used if we sleep).
  575.  */
  576. next = map->vm_next;
  577. flags = map->vm_flags;
  578. *cp++ = flags & VM_READ ? 'r' : '-';
  579. *cp++ = flags & VM_WRITE ? 'w' : '-';
  580. *cp++ = flags & VM_EXEC ? 'x' : '-';
  581. *cp++ = flags & VM_MAYSHARE ? 's' : 'p';
  582. *cp++ = 0;
  583. dev = 0;
  584. ino = 0;
  585. if (map->vm_file != NULL) {
  586. dev = map->vm_file->f_dentry->d_inode->i_dev;
  587. ino = map->vm_file->f_dentry->d_inode->i_ino;
  588. line = d_path(map->vm_file->f_dentry,
  589.       map->vm_file->f_vfsmnt,
  590.       buffer, PAGE_SIZE);
  591. }
  592. printk(MAPS_LINE_FORMAT, map->vm_start, map->vm_end, str, map->vm_pgoff << PAGE_SHIFT,
  593.       kdevname(dev), ino);
  594. if (map->vm_file != NULL)
  595. printk("%sn", line);
  596. else
  597. printk("n");
  598. }
  599. free_page((unsigned long)buffer);
  600. return;
  601. }
  602. #endif
  603. /* Note that 'init' is a special process: it doesn't get signals it doesn't
  604.  * want to handle. Thus you cannot kill init even with a SIGKILL even by
  605.  * mistake.
  606.  */
  607. asmlinkage int do_signal(sigset_t *oldset, struct pt_regs * regs,
  608.  unsigned long orig_i0, int restart_syscall)
  609. {
  610. unsigned long signr;
  611. siginfo_t info;
  612. struct k_sigaction *ka;
  613. if (!oldset)
  614. oldset = &current->blocked;
  615. #ifdef CONFIG_SPARC32_COMPAT
  616. if (current->thread.flags & SPARC_FLAG_32BIT) {
  617. extern asmlinkage int do_signal32(sigset_t *, struct pt_regs *,
  618.   unsigned long, int);
  619. return do_signal32(oldset, regs, orig_i0, restart_syscall);
  620. }
  621. #endif
  622. for (;;) {
  623. spin_lock_irq(&current->sigmask_lock);
  624. signr = dequeue_signal(&current->blocked, &info);
  625. spin_unlock_irq(&current->sigmask_lock);
  626. if (!signr) break;
  627. if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) {
  628. current->exit_code = signr;
  629. current->state = TASK_STOPPED;
  630. notify_parent(current, SIGCHLD);
  631. schedule();
  632. if (!(signr = current->exit_code))
  633. continue;
  634. current->exit_code = 0;
  635. if (signr == SIGSTOP)
  636. continue;
  637. /* Update the siginfo structure.  Is this good?  */
  638. if (signr != info.si_signo) {
  639. info.si_signo = signr;
  640. info.si_errno = 0;
  641. info.si_code = SI_USER;
  642. info.si_pid = current->p_pptr->pid;
  643. info.si_uid = current->p_pptr->uid;
  644. }
  645. /* If the (new) signal is now blocked, requeue it.  */
  646. if (sigismember(&current->blocked, signr)) {
  647. send_sig_info(signr, &info, current);
  648. continue;
  649. }
  650. }
  651. ka = &current->sig->action[signr-1];
  652. if(ka->sa.sa_handler == SIG_IGN) {
  653. if(signr != SIGCHLD)
  654. continue;
  655.                         /* sys_wait4() grabs the master kernel lock, so
  656.                          * we need not do so, that sucker should be
  657.                          * threaded and would not be that difficult to
  658.                          * do anyways.
  659.                          */
  660.                         while(sys_wait4(-1, NULL, WNOHANG, NULL) > 0)
  661.                                 ;
  662. continue;
  663. }
  664. if(ka->sa.sa_handler == SIG_DFL) {
  665. unsigned long exit_code = signr;
  666. if(current->pid == 1)
  667. continue;
  668. switch(signr) {
  669. case SIGCONT: case SIGCHLD: case SIGWINCH:
  670. continue;
  671. case SIGTSTP: case SIGTTIN: case SIGTTOU:
  672. if (is_orphaned_pgrp(current->pgrp))
  673. continue;
  674. case SIGSTOP:
  675. if (current->ptrace & PT_PTRACED)
  676. continue;
  677. current->state = TASK_STOPPED;
  678. current->exit_code = signr;
  679. if(!(current->p_pptr->sig->action[SIGCHLD-1].sa.sa_flags &
  680.      SA_NOCLDSTOP))
  681. notify_parent(current, SIGCHLD);
  682. schedule();
  683. continue;
  684. case SIGQUIT: case SIGILL: case SIGTRAP:
  685. case SIGABRT: case SIGFPE: case SIGSEGV:
  686. case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ:
  687. if (do_coredump(signr, regs))
  688. exit_code |= 0x80;
  689. #ifdef DEBUG_SIGNALS
  690. /* Very useful to debug the dynamic linker */
  691. printk ("Sig %d going...n", (int)signr);
  692. show_regs (regs);
  693. #ifdef DEBUG_SIGNALS_TRACE
  694. {
  695. struct reg_window *rw = (struct reg_window *)(regs->u_regs[UREG_FP] + STACK_BIAS);
  696. unsigned long ins[8];
  697.                                                 
  698. while(rw &&
  699.       !(((unsigned long) rw) & 0x3)) {
  700.         copy_from_user(ins, &rw->ins[0], sizeof(ins));
  701. printk("Caller[%016lx](%016lx,%016lx,%016lx,%016lx,%016lx,%016lx)n", ins[7], ins[0], ins[1], ins[2], ins[3], ins[4], ins[5]);
  702. rw = (struct reg_window *)(unsigned long)(ins[6] + STACK_BIAS);
  703. }
  704. }
  705. #endif
  706. #ifdef DEBUG_SIGNALS_MAPS
  707. printk("Maps:n");
  708. read_maps();
  709. #endif
  710. #endif
  711. /* fall through */
  712. default:
  713. sigaddset(&current->pending.signal, signr);
  714. recalc_sigpending(current);
  715. current->flags |= PF_SIGNALED;
  716. do_exit(exit_code);
  717. /* NOT REACHED */
  718. }
  719. }
  720. if(restart_syscall)
  721. syscall_restart(orig_i0, regs, &ka->sa);
  722. handle_signal(signr, ka, &info, oldset, regs);
  723. return 1;
  724. }
  725. if(restart_syscall &&
  726.    (regs->u_regs[UREG_I0] == ERESTARTNOHAND ||
  727.     regs->u_regs[UREG_I0] == ERESTARTSYS ||
  728.     regs->u_regs[UREG_I0] == ERESTARTNOINTR)) {
  729. /* replay the system call when we are done */
  730. regs->u_regs[UREG_I0] = orig_i0;
  731. regs->tpc -= 4;
  732. regs->tnpc -= 4;
  733. }
  734. return 0;
  735. }