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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*  $Id: signal.c,v 1.108 2001/01/24 21:05:12 davem Exp $
  2.  *  linux/arch/sparc/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.  */
  9. #include <linux/config.h>
  10. #include <linux/sched.h>
  11. #include <linux/kernel.h>
  12. #include <linux/signal.h>
  13. #include <linux/errno.h>
  14. #include <linux/wait.h>
  15. #include <linux/ptrace.h>
  16. #include <linux/unistd.h>
  17. #include <linux/mm.h>
  18. #include <linux/smp.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/pgalloc.h>
  25. #include <asm/pgtable.h>
  26. #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
  27. extern void fpsave(unsigned long *fpregs, unsigned long *fsr,
  28.    void *fpqueue, unsigned long *fpqdepth);
  29. extern void fpload(unsigned long *fpregs, unsigned long *fsr);
  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. /* Signal frames: the original one (compatible with SunOS):
  37.  *
  38.  * Set up a signal frame... Make the stack look the way SunOS
  39.  * expects it to look which is basically:
  40.  *
  41.  * ---------------------------------- <-- %sp at signal time
  42.  * Struct sigcontext
  43.  * Signal address
  44.  * Ptr to sigcontext area above
  45.  * Signal code
  46.  * The signal number itself
  47.  * One register window
  48.  * ---------------------------------- <-- New %sp
  49.  */
  50. struct signal_sframe {
  51. struct reg_window sig_window;
  52. int sig_num;
  53. int sig_code;
  54. struct sigcontext *sig_scptr;
  55. int sig_address;
  56. struct sigcontext sig_context;
  57. unsigned int extramask[_NSIG_WORDS - 1];
  58. };
  59. /* 
  60.  * And the new one, intended to be used for Linux applications only
  61.  * (we have enough in there to work with clone).
  62.  * All the interesting bits are in the info field.
  63.  */
  64. struct new_signal_frame {
  65. struct sparc_stackf ss;
  66. __siginfo_t info;
  67. __siginfo_fpu_t *fpu_save;
  68. unsigned long insns [2] __attribute__ ((aligned (8)));
  69. unsigned int extramask[_NSIG_WORDS - 1];
  70. unsigned int extra_size; /* Should be 0 */
  71. __siginfo_fpu_t fpu_state;
  72. };
  73. struct rt_signal_frame {
  74. struct sparc_stackf ss;
  75. siginfo_t info;
  76. struct pt_regs regs;
  77. sigset_t mask;
  78. __siginfo_fpu_t *fpu_save;
  79. unsigned int insns [2];
  80. stack_t stack;
  81. unsigned int extra_size; /* Should be 0 */
  82. __siginfo_fpu_t fpu_state;
  83. };
  84. int copy_siginfo_to_user(siginfo_t *to, siginfo_t *from)
  85. {
  86. if (!access_ok(VERIFY_WRITE, to, sizeof(siginfo_t)))
  87. return -EFAULT;
  88. if (from->si_code < 0)
  89. return __copy_to_user(to, from, sizeof(siginfo_t));
  90. else {
  91. int err;
  92. /* If you change siginfo_t structure, please be sure
  93.    this code is fixed accordingly.
  94.    It should never copy any pad contained in the structure
  95.    to avoid security leaks, but must copy the generic
  96.    3 ints plus the relevant union member.  */
  97. err = __put_user(from->si_signo, &to->si_signo);
  98. err |= __put_user(from->si_errno, &to->si_errno);
  99. err |= __put_user((short)from->si_code, &to->si_code);
  100. switch (from->si_code >> 16) {
  101. case __SI_CHLD >> 16:
  102. err |= __put_user(from->si_utime, &to->si_utime);
  103. err |= __put_user(from->si_stime, &to->si_stime);
  104. /* case __SI_RT: This is not generated by the kernel as of now.  */
  105. err |= __put_user(from->si_status, &to->si_status);
  106. default:
  107. err |= __put_user(from->si_uid, &to->si_uid);
  108. err |= __put_user(from->si_pid, &to->si_pid);
  109. break;
  110. }
  111. return err;
  112. }
  113. }
  114. /* Align macros */
  115. #define SF_ALIGNEDSZ  (((sizeof(struct signal_sframe) + 7) & (~7)))
  116. #define NF_ALIGNEDSZ  (((sizeof(struct new_signal_frame) + 7) & (~7)))
  117. #define RT_ALIGNEDSZ  (((sizeof(struct rt_signal_frame) + 7) & (~7)))
  118. /*
  119.  * atomically swap in the new signal mask, and wait for a signal.
  120.  * This is really tricky on the Sparc, watch out...
  121.  */
  122. asmlinkage void _sigpause_common(old_sigset_t set, struct pt_regs *regs)
  123. {
  124. sigset_t saveset;
  125. set &= _BLOCKABLE;
  126. spin_lock_irq(&current->sigmask_lock);
  127. saveset = current->blocked;
  128. siginitset(&current->blocked, set);
  129. recalc_sigpending(current);
  130. spin_unlock_irq(&current->sigmask_lock);
  131. regs->pc = regs->npc;
  132. regs->npc += 4;
  133. /* Condition codes and return value where set here for sigpause,
  134.  * and so got used by setup_frame, which again causes sigreturn()
  135.  * to return -EINTR.
  136.  */
  137. while (1) {
  138. current->state = TASK_INTERRUPTIBLE;
  139. schedule();
  140. /*
  141.  * Return -EINTR and set condition code here,
  142.  * so the interrupted system call actually returns
  143.  * these.
  144.  */
  145. regs->psr |= PSR_C;
  146. regs->u_regs[UREG_I0] = EINTR;
  147. if (do_signal(&saveset, regs, 0, 0))
  148. return;
  149. }
  150. }
  151. asmlinkage void do_sigpause(unsigned int set, struct pt_regs *regs)
  152. {
  153. _sigpause_common(set, regs);
  154. }
  155. asmlinkage void do_sigsuspend (struct pt_regs *regs)
  156. {
  157. _sigpause_common(regs->u_regs[UREG_I0], regs);
  158. }
  159. asmlinkage void do_rt_sigsuspend(sigset_t *uset, size_t sigsetsize,
  160.  struct pt_regs *regs)
  161. {
  162. sigset_t oldset, set;
  163. /* XXX: Don't preclude handling different sized sigset_t's.  */
  164. if (sigsetsize != sizeof(sigset_t)) {
  165. regs->psr |= PSR_C;
  166. regs->u_regs[UREG_I0] = EINVAL;
  167. return;
  168. }
  169. if (copy_from_user(&set, uset, sizeof(set))) {
  170. regs->psr |= PSR_C;
  171. regs->u_regs[UREG_I0] = EFAULT;
  172. return;
  173. }
  174. sigdelsetmask(&set, ~_BLOCKABLE);
  175. spin_lock_irq(&current->sigmask_lock);
  176. oldset = current->blocked;
  177. current->blocked = set;
  178. recalc_sigpending(current);
  179. spin_unlock_irq(&current->sigmask_lock);
  180. regs->pc = regs->npc;
  181. regs->npc += 4;
  182. /* Condition codes and return value where set here for sigpause,
  183.  * and so got used by setup_frame, which again causes sigreturn()
  184.  * to return -EINTR.
  185.  */
  186. while (1) {
  187. current->state = TASK_INTERRUPTIBLE;
  188. schedule();
  189. /*
  190.  * Return -EINTR and set condition code here,
  191.  * so the interrupted system call actually returns
  192.  * these.
  193.  */
  194. regs->psr |= PSR_C;
  195. regs->u_regs[UREG_I0] = EINTR;
  196. if (do_signal(&oldset, regs, 0, 0))
  197. return;
  198. }
  199. }
  200. static inline int
  201. restore_fpu_state(struct pt_regs *regs, __siginfo_fpu_t *fpu)
  202. {
  203. int err;
  204. #ifdef CONFIG_SMP
  205. if (current->flags & PF_USEDFPU)
  206. regs->psr &= ~PSR_EF;
  207. #else
  208. if (current == last_task_used_math) {
  209. last_task_used_math = 0;
  210. regs->psr &= ~PSR_EF;
  211. }
  212. #endif
  213. current->used_math = 1;
  214. current->flags &= ~PF_USEDFPU;
  215. if (verify_area (VERIFY_READ, fpu, sizeof(*fpu)))
  216. return -EFAULT;
  217. err = __copy_from_user(&current->thread.float_regs[0], &fpu->si_float_regs[0],
  218.        (sizeof(unsigned long) * 32));
  219. err |= __get_user(current->thread.fsr, &fpu->si_fsr);
  220. err |= __get_user(current->thread.fpqdepth, &fpu->si_fpqdepth);
  221. if (current->thread.fpqdepth != 0)
  222. err |= __copy_from_user(&current->thread.fpqueue[0],
  223. &fpu->si_fpqueue[0],
  224. ((sizeof(unsigned long) +
  225. (sizeof(unsigned long *)))*16));
  226. return err;
  227. }
  228. static inline void do_new_sigreturn (struct pt_regs *regs)
  229. {
  230. struct new_signal_frame *sf;
  231. unsigned long up_psr, pc, npc;
  232. sigset_t set;
  233. __siginfo_fpu_t *fpu_save;
  234. int err;
  235. sf = (struct new_signal_frame *) regs->u_regs [UREG_FP];
  236. /* 1. Make sure we are not getting garbage from the user */
  237. if (verify_area (VERIFY_READ, sf, sizeof (*sf)))
  238. goto segv_and_exit;
  239. if (((uint) sf) & 3)
  240. goto segv_and_exit;
  241. err = __get_user(pc,  &sf->info.si_regs.pc);
  242. err |= __get_user(npc, &sf->info.si_regs.npc);
  243. if ((pc | npc) & 3)
  244. goto segv_and_exit;
  245. /* 2. Restore the state */
  246. up_psr = regs->psr;
  247. err |= __copy_from_user(regs, &sf->info.si_regs, sizeof (struct pt_regs));
  248. /* User can only change condition codes and FPU enabling in %psr. */
  249. regs->psr = (up_psr & ~(PSR_ICC | PSR_EF))
  250.   | (regs->psr & (PSR_ICC | PSR_EF));
  251. err |= __get_user(fpu_save, &sf->fpu_save);
  252. if (fpu_save)
  253. err |= restore_fpu_state(regs, fpu_save);
  254. /* This is pretty much atomic, no amount locking would prevent
  255.  * the races which exist anyways.
  256.  */
  257. err |= __get_user(set.sig[0], &sf->info.si_mask);
  258. err |= __copy_from_user(&set.sig[1], &sf->extramask,
  259.         (_NSIG_WORDS-1) * sizeof(unsigned int));
  260.    
  261. if (err)
  262. goto segv_and_exit;
  263. sigdelsetmask(&set, ~_BLOCKABLE);
  264. spin_lock_irq(&current->sigmask_lock);
  265. current->blocked = set;
  266. recalc_sigpending(current);
  267. spin_unlock_irq(&current->sigmask_lock);
  268. return;
  269. segv_and_exit:
  270. do_exit(SIGSEGV);
  271. }
  272. asmlinkage void do_sigreturn(struct pt_regs *regs)
  273. {
  274. struct sigcontext *scptr;
  275. unsigned long pc, npc, psr;
  276. sigset_t set;
  277. int err;
  278. synchronize_user_stack();
  279. if (current->thread.new_signal)
  280. return do_new_sigreturn (regs);
  281. scptr = (struct sigcontext *) regs->u_regs[UREG_I0];
  282. /* Check sanity of the user arg. */
  283. if(verify_area(VERIFY_READ, scptr, sizeof(struct sigcontext)) ||
  284.    (((unsigned long) scptr) & 3))
  285. goto segv_and_exit;
  286. err = __get_user(pc, &scptr->sigc_pc);
  287. err |= __get_user(npc, &scptr->sigc_npc);
  288. if((pc | npc) & 3)
  289. goto segv_and_exit;
  290. /* This is pretty much atomic, no amount locking would prevent
  291.  * the races which exist anyways.
  292.  */
  293. err |= __get_user(set.sig[0], &scptr->sigc_mask);
  294. /* Note that scptr + 1 points to extramask */
  295. err |= __copy_from_user(&set.sig[1], scptr + 1,
  296. (_NSIG_WORDS - 1) * sizeof(unsigned int));
  297. if (err)
  298. goto segv_and_exit;
  299. sigdelsetmask(&set, ~_BLOCKABLE);
  300. spin_lock_irq(&current->sigmask_lock);
  301. current->blocked = set;
  302. recalc_sigpending(current);
  303. spin_unlock_irq(&current->sigmask_lock);
  304. regs->pc = pc;
  305. regs->npc = npc;
  306. err = __get_user(regs->u_regs[UREG_FP], &scptr->sigc_sp);
  307. err |= __get_user(regs->u_regs[UREG_I0], &scptr->sigc_o0);
  308. err |= __get_user(regs->u_regs[UREG_G1], &scptr->sigc_g1);
  309. /* User can only change condition codes in %psr. */
  310. err |= __get_user(psr, &scptr->sigc_psr);
  311. if (err)
  312. goto segv_and_exit;
  313. regs->psr &= ~(PSR_ICC);
  314. regs->psr |= (psr & PSR_ICC);
  315. return;
  316. segv_and_exit:
  317. send_sig(SIGSEGV, current, 1);
  318. }
  319. asmlinkage void do_rt_sigreturn(struct pt_regs *regs)
  320. {
  321. struct rt_signal_frame *sf;
  322. unsigned int psr, pc, npc;
  323. __siginfo_fpu_t *fpu_save;
  324. sigset_t set;
  325. stack_t st;
  326. int err;
  327. synchronize_user_stack();
  328. sf = (struct rt_signal_frame *) regs->u_regs[UREG_FP];
  329. if(verify_area(VERIFY_READ, sf, sizeof(*sf)) ||
  330.    (((unsigned long) sf) & 0x03))
  331. goto segv;
  332. err = __get_user(pc, &sf->regs.pc);
  333. err |= __get_user(npc, &sf->regs.npc);
  334. err |= ((pc | npc) & 0x03);
  335. err |= __get_user(regs->y, &sf->regs.y);
  336. err |= __get_user(psr, &sf->regs.psr);
  337. err |= __copy_from_user(&regs->u_regs[UREG_G1], &sf->regs.u_regs[UREG_G1], 15*sizeof(u32));
  338. regs->psr = (regs->psr & ~PSR_ICC) | (psr & PSR_ICC);
  339. err |= __get_user(fpu_save, &sf->fpu_save);
  340. if(fpu_save)
  341. err |= restore_fpu_state(regs, fpu_save);
  342. err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t));
  343. err |= __copy_from_user(&st, &sf->stack, sizeof(stack_t));
  344. if (err)
  345. goto segv;
  346. regs->pc = pc;
  347. regs->npc = npc;
  348. /* It is more difficult to avoid calling this function than to
  349.    call it and ignore errors.  */
  350. do_sigaltstack(&st, NULL, (unsigned long)sf);
  351. sigdelsetmask(&set, ~_BLOCKABLE);
  352. spin_lock_irq(&current->sigmask_lock);
  353. current->blocked = set;
  354. recalc_sigpending(current);
  355. spin_unlock_irq(&current->sigmask_lock);
  356. return;
  357. segv:
  358. send_sig(SIGSEGV, current, 1);
  359. }
  360. /* Checks if the fp is valid */
  361. static inline int invalid_frame_pointer (void *fp, int fplen)
  362. {
  363. if ((((unsigned long) fp) & 7) ||
  364.     !__access_ok((unsigned long)fp, fplen) ||
  365.     ((sparc_cpu_model == sun4 || sparc_cpu_model == sun4c) &&
  366.      ((unsigned long) fp < 0xe0000000 && (unsigned long) fp >= 0x20000000)))
  367. return 1;
  368. return 0;
  369. }
  370. static inline void *get_sigframe(struct sigaction *sa, struct pt_regs *regs, unsigned long framesize)
  371. {
  372. unsigned long sp;
  373. sp = regs->u_regs[UREG_FP];
  374. /* This is the X/Open sanctioned signal stack switching.  */
  375. if (sa->sa_flags & SA_ONSTACK) {
  376. if (!on_sig_stack(sp) && !((current->sas_ss_sp + current->sas_ss_size) & 7))
  377. sp = current->sas_ss_sp + current->sas_ss_size;
  378. }
  379. return (void *)(sp - framesize);
  380. }
  381. static inline void
  382. setup_frame(struct sigaction *sa, struct pt_regs *regs, int signr, sigset_t *oldset, siginfo_t *info)
  383. {
  384. struct signal_sframe *sframep;
  385. struct sigcontext *sc;
  386. int window = 0, err;
  387. unsigned long pc = regs->pc;
  388. unsigned long npc = regs->npc;
  389. void *sig_address;
  390. int sig_code;
  391. synchronize_user_stack();
  392. sframep = (struct signal_sframe *)get_sigframe(sa, regs, SF_ALIGNEDSZ);
  393. if (invalid_frame_pointer (sframep, sizeof(*sframep))){
  394. #ifdef DEBUG_SIGNALS /* fills up the console logs during crashme runs, yuck... */
  395. printk("%s [%d]: User has trashed signal stackn",
  396.        current->comm, current->pid);
  397. printk("Sigstack ptr %p handler at pc<%08lx> for sig<%d>n",
  398.        sframep, pc, signr);
  399. #endif
  400. /* Don't change signal code and address, so that
  401.  * post mortem debuggers can have a look.
  402.  */
  403. goto sigill_and_return;
  404. }
  405. sc = &sframep->sig_context;
  406. /* We've already made sure frame pointer isn't in kernel space... */
  407. err  = __put_user((sas_ss_flags(regs->u_regs[UREG_FP]) == SS_ONSTACK),
  408.  &sc->sigc_onstack);
  409. err |= __put_user(oldset->sig[0], &sc->sigc_mask);
  410. err |= __copy_to_user(sframep->extramask, &oldset->sig[1],
  411.       (_NSIG_WORDS - 1) * sizeof(unsigned int));
  412. err |= __put_user(regs->u_regs[UREG_FP], &sc->sigc_sp);
  413. err |= __put_user(pc, &sc->sigc_pc);
  414. err |= __put_user(npc, &sc->sigc_npc);
  415. err |= __put_user(regs->psr, &sc->sigc_psr);
  416. err |= __put_user(regs->u_regs[UREG_G1], &sc->sigc_g1);
  417. err |= __put_user(regs->u_regs[UREG_I0], &sc->sigc_o0);
  418. err |= __put_user(current->thread.w_saved, &sc->sigc_oswins);
  419. if(current->thread.w_saved)
  420. for(window = 0; window < current->thread.w_saved; window++) {
  421. sc->sigc_spbuf[window] =
  422. (char *)current->thread.rwbuf_stkptrs[window];
  423. err |= __copy_to_user(&sc->sigc_wbuf[window],
  424.       &current->thread.reg_window[window],
  425.       sizeof(struct reg_window));
  426. }
  427. else
  428. err |= __copy_to_user(sframep, (char *)regs->u_regs[UREG_FP],
  429.       sizeof(struct reg_window));
  430. current->thread.w_saved = 0; /* So process is allowed to execute. */
  431. err |= __put_user(signr, &sframep->sig_num);
  432. sig_address = NULL;
  433. sig_code = 0;
  434. if (SI_FROMKERNEL (info) && (info->si_code & __SI_MASK) == __SI_FAULT) {
  435. sig_address = info->si_addr;
  436. switch (signr) {
  437. case SIGSEGV:
  438. switch (info->si_code) {
  439. case SEGV_MAPERR: sig_code = SUBSIG_NOMAPPING; break;
  440. default: sig_code = SUBSIG_PROTECTION; break;
  441. }
  442. break;
  443. case SIGILL:
  444. switch (info->si_code) {
  445. case ILL_ILLOPC: sig_code = SUBSIG_ILLINST; break;
  446. case ILL_PRVOPC: sig_code = SUBSIG_PRIVINST; break;
  447. case ILL_ILLTRP: sig_code = SUBSIG_BADTRAP (info->si_trapno); break;
  448. default: sig_code = SUBSIG_STACK; break;
  449. }
  450. break;
  451. case SIGFPE:
  452. switch (info->si_code) {
  453. case FPE_INTDIV: sig_code = SUBSIG_IDIVZERO; break;
  454. case FPE_INTOVF: sig_code = SUBSIG_FPINTOVFL; break;
  455. case FPE_FLTDIV: sig_code = SUBSIG_FPDIVZERO; break;
  456. case FPE_FLTOVF: sig_code = SUBSIG_FPOVFLOW; break;
  457. case FPE_FLTUND: sig_code = SUBSIG_FPUNFLOW; break;
  458. case FPE_FLTRES: sig_code = SUBSIG_FPINEXACT; break;
  459. case FPE_FLTINV: sig_code = SUBSIG_FPOPERROR; break;
  460. default: sig_code = SUBSIG_FPERROR; break;
  461. }
  462. break;
  463. case SIGBUS:
  464. switch (info->si_code) {
  465. case BUS_ADRALN: sig_code = SUBSIG_ALIGNMENT; break;
  466. case BUS_ADRERR: sig_code = SUBSIG_MISCERROR; break;
  467. default: sig_code = SUBSIG_BUSTIMEOUT; break;
  468. }
  469. break;
  470. case SIGEMT:
  471. switch (info->si_code) {
  472. case EMT_TAGOVF: sig_code = SUBSIG_TAG; break;
  473. }
  474. break;
  475. case SIGSYS:
  476. if (info->si_code == (__SI_FAULT|0x100)) {
  477. /* See sys_sunos.c */
  478. sig_code = info->si_trapno;
  479. break;
  480. }
  481. default:
  482. sig_address = NULL;
  483. }
  484. }
  485. err |= __put_user((long)sig_address, &sframep->sig_address);
  486. err |= __put_user(sig_code, &sframep->sig_code);
  487. err |= __put_user(sc, &sframep->sig_scptr);
  488. if (err)
  489. goto sigsegv;
  490. regs->u_regs[UREG_FP] = (unsigned long) sframep;
  491. regs->pc = (unsigned long) sa->sa_handler;
  492. regs->npc = (regs->pc + 4);
  493. return;
  494. sigill_and_return:
  495. do_exit(SIGILL);
  496. sigsegv:
  497. do_exit(SIGSEGV);
  498. }
  499. static inline int
  500. save_fpu_state(struct pt_regs *regs, __siginfo_fpu_t *fpu)
  501. {
  502. int err = 0;
  503. #ifdef CONFIG_SMP
  504. if (current->flags & PF_USEDFPU) {
  505. put_psr(get_psr() | PSR_EF);
  506. fpsave(&current->thread.float_regs[0], &current->thread.fsr,
  507.        &current->thread.fpqueue[0], &current->thread.fpqdepth);
  508. regs->psr &= ~(PSR_EF);
  509. current->flags &= ~(PF_USEDFPU);
  510. }
  511. #else
  512. if (current == last_task_used_math) {
  513. put_psr(get_psr() | PSR_EF);
  514. fpsave(&current->thread.float_regs[0], &current->thread.fsr,
  515.        &current->thread.fpqueue[0], &current->thread.fpqdepth);
  516. last_task_used_math = 0;
  517. regs->psr &= ~(PSR_EF);
  518. }
  519. #endif
  520. err |= __copy_to_user(&fpu->si_float_regs[0], &current->thread.float_regs[0],
  521.       (sizeof(unsigned long) * 32));
  522. err |= __put_user(current->thread.fsr, &fpu->si_fsr);
  523. err |= __put_user(current->thread.fpqdepth, &fpu->si_fpqdepth);
  524. if (current->thread.fpqdepth != 0)
  525. err |= __copy_to_user(&fpu->si_fpqueue[0], &current->thread.fpqueue[0],
  526.       ((sizeof(unsigned long) +
  527.       (sizeof(unsigned long *)))*16));
  528. current->used_math = 0;
  529. return err;
  530. }
  531. static inline void
  532. new_setup_frame(struct k_sigaction *ka, struct pt_regs *regs,
  533. int signo, sigset_t *oldset)
  534. {
  535. struct new_signal_frame *sf;
  536. int sigframe_size, err;
  537. /* 1. Make sure everything is clean */
  538. synchronize_user_stack();
  539. sigframe_size = NF_ALIGNEDSZ;
  540. if (!current->used_math)
  541. sigframe_size -= sizeof(__siginfo_fpu_t);
  542. sf = (struct new_signal_frame *)get_sigframe(&ka->sa, regs, sigframe_size);
  543. if (invalid_frame_pointer (sf, sigframe_size))
  544. goto sigill_and_return;
  545. if (current->thread.w_saved != 0) {
  546. #ifdef DEBUG_SIGNALS 
  547. printk ("%s [%d]: Invalid user stack frame for "
  548. "signal delivery.n", current->comm, current->pid);
  549. #endif
  550. goto sigill_and_return;
  551. }
  552. /* 2. Save the current process state */
  553. err = __copy_to_user(&sf->info.si_regs, regs, sizeof (struct pt_regs));
  554. err |= __put_user(0, &sf->extra_size);
  555. if (current->used_math) {
  556. err |= save_fpu_state(regs, &sf->fpu_state);
  557. err |= __put_user(&sf->fpu_state, &sf->fpu_save);
  558. } else {
  559. err |= __put_user(0, &sf->fpu_save);
  560. }
  561. err |= __put_user(oldset->sig[0], &sf->info.si_mask);
  562. err |= __copy_to_user(sf->extramask, &oldset->sig[1],
  563.       (_NSIG_WORDS - 1) * sizeof(unsigned int));
  564. err |= __copy_to_user(sf, (char *) regs->u_regs [UREG_FP],
  565.       sizeof (struct reg_window));
  566. if (err)
  567. goto sigsegv;
  568. /* 3. signal handler back-trampoline and parameters */
  569. regs->u_regs[UREG_FP] = (unsigned long) sf;
  570. regs->u_regs[UREG_I0] = signo;
  571. regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
  572. regs->u_regs[UREG_I2] = (unsigned long) &sf->info;
  573. /* 4. signal handler */
  574. regs->pc = (unsigned long) ka->sa.sa_handler;
  575. regs->npc = (regs->pc + 4);
  576. /* 5. return to kernel instructions */
  577. if (ka->ka_restorer)
  578. regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer;
  579. else {
  580. regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2);
  581. /* mov __NR_sigreturn, %g1 */
  582. err |= __put_user(0x821020d8, &sf->insns[0]);
  583. /* t 0x10 */
  584. err |= __put_user(0x91d02010, &sf->insns[1]);
  585. if (err)
  586. goto sigsegv;
  587. /* Flush instruction space. */
  588. flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0]));
  589. }
  590. return;
  591. sigill_and_return:
  592. do_exit(SIGILL);
  593. sigsegv:
  594. do_exit(SIGSEGV);
  595. }
  596. static inline void
  597. new_setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
  598.    int signo, sigset_t *oldset, siginfo_t *info)
  599. {
  600. struct rt_signal_frame *sf;
  601. int sigframe_size;
  602. unsigned int psr;
  603. int err;
  604. synchronize_user_stack();
  605. sigframe_size = RT_ALIGNEDSZ;
  606. if(!current->used_math)
  607. sigframe_size -= sizeof(__siginfo_fpu_t);
  608. sf = (struct rt_signal_frame *)get_sigframe(&ka->sa, regs, sigframe_size);
  609. if(invalid_frame_pointer(sf, sigframe_size))
  610. goto sigill;
  611. if(current->thread.w_saved != 0)
  612. goto sigill;
  613. err  = __put_user(regs->pc, &sf->regs.pc);
  614. err |= __put_user(regs->npc, &sf->regs.npc);
  615. err |= __put_user(regs->y, &sf->regs.y);
  616. psr = regs->psr;
  617. if(current->used_math)
  618. psr |= PSR_EF;
  619. err |= __put_user(psr, &sf->regs.psr);
  620. err |= __copy_to_user(&sf->regs.u_regs, regs->u_regs, sizeof(regs->u_regs));
  621. err |= __put_user(0, &sf->extra_size);
  622. if(psr & PSR_EF) {
  623. err |= save_fpu_state(regs, &sf->fpu_state);
  624. err |= __put_user(&sf->fpu_state, &sf->fpu_save);
  625. } else {
  626. err |= __put_user(0, &sf->fpu_save);
  627. }
  628. err |= __copy_to_user(&sf->mask, &oldset->sig[0], sizeof(sigset_t));
  629. /* Setup sigaltstack */
  630. err |= __put_user(current->sas_ss_sp, &sf->stack.ss_sp);
  631. err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &sf->stack.ss_flags);
  632. err |= __put_user(current->sas_ss_size, &sf->stack.ss_size);
  633. err |= __copy_to_user(sf, (char *) regs->u_regs [UREG_FP],
  634.       sizeof (struct reg_window));
  635. err |= copy_siginfo_to_user(&sf->info, info);
  636. if (err)
  637. goto sigsegv;
  638. regs->u_regs[UREG_FP] = (unsigned long) sf;
  639. regs->u_regs[UREG_I0] = signo;
  640. regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
  641. regs->u_regs[UREG_I2] = (unsigned long) &sf->regs;
  642. regs->pc = (unsigned long) ka->sa.sa_handler;
  643. regs->npc = (regs->pc + 4);
  644. if(ka->ka_restorer)
  645. regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer;
  646. else {
  647. regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2);
  648. /* mov __NR_sigreturn, %g1 */
  649. err |= __put_user(0x821020d8, &sf->insns[0]);
  650. /* t 0x10 */
  651. err |= __put_user(0x91d02010, &sf->insns[1]);
  652. if (err)
  653. goto sigsegv;
  654. /* Flush instruction space. */
  655. flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0]));
  656. }
  657. return;
  658. sigill:
  659. do_exit(SIGILL);
  660. sigsegv:
  661. do_exit(SIGSEGV);
  662. }
  663. /* Setup a Solaris stack frame */
  664. static inline void
  665. setup_svr4_frame(struct sigaction *sa, unsigned long pc, unsigned long npc,
  666.  struct pt_regs *regs, int signr, sigset_t *oldset)
  667. {
  668. svr4_signal_frame_t *sfp;
  669. svr4_gregset_t  *gr;
  670. svr4_siginfo_t  *si;
  671. svr4_mcontext_t *mc;
  672. svr4_gwindows_t *gw;
  673. svr4_ucontext_t *uc;
  674. svr4_sigset_t setv;
  675. int window = 0, err;
  676. synchronize_user_stack();
  677. sfp = (svr4_signal_frame_t *) get_sigframe(sa, regs, SVR4_SF_ALIGNED + REGWIN_SZ);
  678. if (invalid_frame_pointer (sfp, sizeof (*sfp))){
  679. #ifdef DEBUG_SIGNALS
  680. printk ("Invalid stack framen");
  681. #endif
  682. goto sigill_and_return;
  683. }
  684. /* Start with a clean frame pointer and fill it */
  685. err = __clear_user(sfp, sizeof (*sfp));
  686. /* Setup convenience variables */
  687. si = &sfp->si;
  688. uc = &sfp->uc;
  689. gw = &sfp->gw;
  690. mc = &uc->mcontext;
  691. gr = &mc->greg;
  692. /* FIXME: where am I supposed to put this?
  693.  * sc->sigc_onstack = old_status;
  694.  * anyways, it does not look like it is used for anything at all.
  695.  */
  696. setv.sigbits[0] = oldset->sig[0];
  697. setv.sigbits[1] = oldset->sig[1];
  698. if (_NSIG_WORDS >= 4) {
  699. setv.sigbits[2] = oldset->sig[2];
  700. setv.sigbits[3] = oldset->sig[3];
  701. err |= __copy_to_user(&uc->sigmask, &setv, sizeof(svr4_sigset_t));
  702. } else
  703. err |= __copy_to_user(&uc->sigmask, &setv, 2 * sizeof(unsigned int));
  704. /* Store registers */
  705. err |= __put_user(regs->pc, &((*gr) [SVR4_PC]));
  706. err |= __put_user(regs->npc, &((*gr) [SVR4_NPC]));
  707. err |= __put_user(regs->psr, &((*gr) [SVR4_PSR]));
  708. err |= __put_user(regs->y, &((*gr) [SVR4_Y]));
  709. /* Copy g [1..7] and o [0..7] registers */
  710. err |= __copy_to_user(&(*gr)[SVR4_G1], &regs->u_regs [UREG_G1], sizeof (long) * 7);
  711. err |= __copy_to_user(&(*gr)[SVR4_O0], &regs->u_regs [UREG_I0], sizeof (long) * 8);
  712. /* Setup sigaltstack */
  713. err |= __put_user(current->sas_ss_sp, &uc->stack.sp);
  714. err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &uc->stack.flags);
  715. err |= __put_user(current->sas_ss_size, &uc->stack.size);
  716. /* Save the currently window file: */
  717. /* 1. Link sfp->uc->gwins to our windows */
  718. err |= __put_user(gw, &mc->gwin);
  719.     
  720. /* 2. Number of windows to restore at setcontext (): */
  721. err |= __put_user(current->thread.w_saved, &gw->count);
  722. /* 3. Save each valid window
  723.  *    Currently, it makes a copy of the windows from the kernel copy.
  724.  *    David's code for SunOS, makes the copy but keeps the pointer to
  725.  *    the kernel.  My version makes the pointer point to a userland 
  726.  *    copy of those.  Mhm, I wonder if I shouldn't just ignore those
  727.  *    on setcontext and use those that are on the kernel, the signal
  728.  *    handler should not be modyfing those, mhm.
  729.  *
  730.  *    These windows are just used in case synchronize_user_stack failed
  731.  *    to flush the user windows.
  732.  */
  733. for(window = 0; window < current->thread.w_saved; window++) {
  734. err |= __put_user((int *) &(gw->win [window]), &gw->winptr [window]);
  735. err |= __copy_to_user(&gw->win [window],
  736.       &current->thread.reg_window [window],
  737.       sizeof (svr4_rwindow_t));
  738. err |= __put_user(0, gw->winptr [window]);
  739. }
  740. /* 4. We just pay attention to the gw->count field on setcontext */
  741. current->thread.w_saved = 0; /* So process is allowed to execute. */
  742. /* Setup the signal information.  Solaris expects a bunch of
  743.  * information to be passed to the signal handler, we don't provide
  744.  * that much currently, should use siginfo.
  745.  */
  746. err |= __put_user(signr, &si->siginfo.signo);
  747. err |= __put_user(SVR4_SINOINFO, &si->siginfo.code);
  748. if (err)
  749. goto sigsegv;
  750. regs->u_regs[UREG_FP] = (unsigned long) sfp;
  751. regs->pc = (unsigned long) sa->sa_handler;
  752. regs->npc = (regs->pc + 4);
  753. #ifdef DEBUG_SIGNALS
  754. printk ("Solaris-frame: %x %xn", (int) regs->pc, (int) regs->npc);
  755. #endif
  756. /* Arguments passed to signal handler */
  757. if (regs->u_regs [14]){
  758. struct reg_window *rw = (struct reg_window *) regs->u_regs [14];
  759. err |= __put_user(signr, &rw->ins [0]);
  760. err |= __put_user(si, &rw->ins [1]);
  761. err |= __put_user(uc, &rw->ins [2]);
  762. err |= __put_user(sfp, &rw->ins [6]); /* frame pointer */
  763. if (err)
  764. goto sigsegv;
  765. regs->u_regs[UREG_I0] = signr;
  766. regs->u_regs[UREG_I1] = (uint) si;
  767. regs->u_regs[UREG_I2] = (uint) uc;
  768. }
  769. return;
  770. sigill_and_return:
  771. do_exit(SIGILL);
  772. sigsegv:
  773. do_exit(SIGSEGV);
  774. }
  775. asmlinkage int svr4_getcontext (svr4_ucontext_t *uc, struct pt_regs *regs)
  776. {
  777. svr4_gregset_t  *gr;
  778. svr4_mcontext_t *mc;
  779. svr4_sigset_t setv;
  780. int err = 0;
  781. synchronize_user_stack();
  782. if (current->thread.w_saved)
  783. goto sigsegv_and_return;
  784. err = clear_user(uc, sizeof (*uc));
  785. if (err)
  786. return -EFAULT;
  787. /* Setup convenience variables */
  788. mc = &uc->mcontext;
  789. gr = &mc->greg;
  790. setv.sigbits[0] = current->blocked.sig[0];
  791. setv.sigbits[1] = current->blocked.sig[1];
  792. if (_NSIG_WORDS >= 4) {
  793. setv.sigbits[2] = current->blocked.sig[2];
  794. setv.sigbits[3] = current->blocked.sig[3];
  795. err |= __copy_to_user(&uc->sigmask, &setv, sizeof(svr4_sigset_t));
  796. } else
  797. err |= __copy_to_user(&uc->sigmask, &setv, 2 * sizeof(unsigned int));
  798. /* Store registers */
  799. err |= __put_user(regs->pc, &uc->mcontext.greg [SVR4_PC]);
  800. err |= __put_user(regs->npc, &uc->mcontext.greg [SVR4_NPC]);
  801. err |= __put_user(regs->psr, &uc->mcontext.greg [SVR4_PSR]);
  802. err |= __put_user(regs->y, &uc->mcontext.greg [SVR4_Y]);
  803. /* Copy g [1..7] and o [0..7] registers */
  804. err |= __copy_to_user(&(*gr)[SVR4_G1], &regs->u_regs [UREG_G1], sizeof (uint) * 7);
  805. err |= __copy_to_user(&(*gr)[SVR4_O0], &regs->u_regs [UREG_I0], sizeof (uint) * 8);
  806. /* Setup sigaltstack */
  807. err |= __put_user(current->sas_ss_sp, &uc->stack.sp);
  808. err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &uc->stack.flags);
  809. err |= __put_user(current->sas_ss_size, &uc->stack.size);
  810. /* The register file is not saved
  811.  * we have already stuffed all of it with sync_user_stack
  812.  */
  813. return (err ? -EFAULT : 0);
  814. sigsegv_and_return:
  815. do_exit(SIGSEGV);
  816. }
  817. /* Set the context for a svr4 application, this is Solaris way to sigreturn */
  818. asmlinkage int svr4_setcontext (svr4_ucontext_t *c, struct pt_regs *regs)
  819. {
  820. struct thread_struct *tp = &current->thread;
  821. svr4_gregset_t  *gr;
  822. unsigned long pc, npc, psr;
  823. sigset_t set;
  824. svr4_sigset_t setv;
  825. int err;
  826. stack_t st;
  827. /* Fixme: restore windows, or is this already taken care of in
  828.  * svr4_setup_frame when sync_user_windows is done?
  829.  */
  830. flush_user_windows();
  831. if (tp->w_saved)
  832. goto sigsegv_and_return;
  833. if (((uint) c) & 3)
  834. goto sigsegv_and_return;
  835. if(!__access_ok((unsigned long)c, sizeof(*c)))
  836. goto sigsegv_and_return;
  837. /* Check for valid PC and nPC */
  838. gr = &c->mcontext.greg;
  839. err = __get_user(pc, &((*gr)[SVR4_PC]));
  840. err |= __get_user(npc, &((*gr)[SVR4_NPC]));
  841. if((pc | npc) & 3)
  842. goto sigsegv_and_return;
  843. /* Retrieve information from passed ucontext */
  844. /* note that nPC is ored a 1, this is used to inform entry.S */
  845. /* that we don't want it to mess with our PC and nPC */
  846. /* This is pretty much atomic, no amount locking would prevent
  847.  * the races which exist anyways.
  848.  */
  849. err |= __copy_from_user(&setv, &c->sigmask, sizeof(svr4_sigset_t));
  850. err |= __get_user(st.ss_sp, &c->stack.sp);
  851. err |= __get_user(st.ss_flags, &c->stack.flags);
  852. err |= __get_user(st.ss_size, &c->stack.size);
  853. if (err)
  854. goto sigsegv_and_return;
  855. /* It is more difficult to avoid calling this function than to
  856.    call it and ignore errors.  */
  857. do_sigaltstack(&st, NULL, regs->u_regs[UREG_I6]);
  858. set.sig[0] = setv.sigbits[0];
  859. set.sig[1] = setv.sigbits[1];
  860. if (_NSIG_WORDS >= 4) {
  861. set.sig[2] = setv.sigbits[2];
  862. set.sig[3] = setv.sigbits[3];
  863. }
  864. sigdelsetmask(&set, ~_BLOCKABLE);
  865. spin_lock_irq(&current->sigmask_lock);
  866. current->blocked = set;
  867. recalc_sigpending(current);
  868. spin_unlock_irq(&current->sigmask_lock);
  869. regs->pc = pc;
  870. regs->npc = npc | 1;
  871. err |= __get_user(regs->y, &((*gr) [SVR4_Y]));
  872. err |= __get_user(psr, &((*gr) [SVR4_PSR]));
  873. regs->psr &= ~(PSR_ICC);
  874. regs->psr |= (psr & PSR_ICC);
  875. /* Restore g[1..7] and o[0..7] registers */
  876. err |= __copy_from_user(&regs->u_regs [UREG_G1], &(*gr)[SVR4_G1],
  877.       sizeof (long) * 7);
  878. err |= __copy_from_user(&regs->u_regs [UREG_I0], &(*gr)[SVR4_O0],
  879.       sizeof (long) * 8);
  880. return (err ? -EFAULT : 0);
  881. sigsegv_and_return:
  882. do_exit(SIGSEGV);
  883. }
  884. static inline void
  885. handle_signal(unsigned long signr, struct k_sigaction *ka,
  886.       siginfo_t *info, sigset_t *oldset, struct pt_regs *regs,
  887.       int svr4_signal)
  888. {
  889. if (svr4_signal)
  890. setup_svr4_frame(&ka->sa, regs->pc, regs->npc, regs, signr, oldset);
  891. else {
  892. if (ka->sa.sa_flags & SA_SIGINFO)
  893. new_setup_rt_frame(ka, regs, signr, oldset, info);
  894. else if (current->thread.new_signal)
  895. new_setup_frame (ka, regs, signr, oldset);
  896. else
  897. setup_frame(&ka->sa, regs, signr, oldset, info);
  898. }
  899. if(ka->sa.sa_flags & SA_ONESHOT)
  900. ka->sa.sa_handler = SIG_DFL;
  901. if(!(ka->sa.sa_flags & SA_NOMASK)) {
  902. spin_lock_irq(&current->sigmask_lock);
  903. sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
  904. sigaddset(&current->blocked, signr);
  905. recalc_sigpending(current);
  906. spin_unlock_irq(&current->sigmask_lock);
  907. }
  908. }
  909. static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
  910.    struct sigaction *sa)
  911. {
  912. switch(regs->u_regs[UREG_I0]) {
  913. case ERESTARTNOHAND:
  914. no_system_call_restart:
  915. regs->u_regs[UREG_I0] = EINTR;
  916. regs->psr |= PSR_C;
  917. break;
  918. case ERESTARTSYS:
  919. if(!(sa->sa_flags & SA_RESTART))
  920. goto no_system_call_restart;
  921. /* fallthrough */
  922. case ERESTARTNOINTR:
  923. regs->u_regs[UREG_I0] = orig_i0;
  924. regs->pc -= 4;
  925. regs->npc -= 4;
  926. }
  927. }
  928. #ifdef DEBUG_SIGNALS_MAPS
  929. #define MAPS_LINE_FORMAT   "%08lx-%08lx %s %08lx %s %lu "
  930. static inline void read_maps (void)
  931. {
  932. struct vm_area_struct * map, * next;
  933. char * buffer;
  934. ssize_t i;
  935. buffer = (char*)__get_free_page(GFP_KERNEL);
  936. if (!buffer)
  937. return;
  938. for (map = current->mm->mmap ; map ; map = next ) {
  939. /* produce the next line */
  940. char *line;
  941. char str[5], *cp = str;
  942. int flags;
  943. kdev_t dev;
  944. unsigned long ino;
  945. /*
  946.  * Get the next vma now (but it won't be used if we sleep).
  947.  */
  948. next = map->vm_next;
  949. flags = map->vm_flags;
  950. *cp++ = flags & VM_READ ? 'r' : '-';
  951. *cp++ = flags & VM_WRITE ? 'w' : '-';
  952. *cp++ = flags & VM_EXEC ? 'x' : '-';
  953. *cp++ = flags & VM_MAYSHARE ? 's' : 'p';
  954. *cp++ = 0;
  955. dev = 0;
  956. ino = 0;
  957. if (map->vm_file != NULL) {
  958. dev = map->vm_file->f_dentry->d_inode->i_dev;
  959. ino = map->vm_file->f_dentry->d_inode->i_ino;
  960. line = d_path(map->vm_file->f_dentry,
  961.       map->vm_file->f_vfsmnt,
  962.       buffer, PAGE_SIZE);
  963. }
  964. printk(MAPS_LINE_FORMAT, map->vm_start, map->vm_end, str, map->vm_pgoff << PAGE_SHIFT,
  965.       kdevname(dev), ino);
  966. if (map->vm_file != NULL)
  967. printk("%sn", line);
  968. else
  969. printk("n");
  970. }
  971. free_page((unsigned long)buffer);
  972. return;
  973. }
  974. #endif
  975. /* Note that 'init' is a special process: it doesn't get signals it doesn't
  976.  * want to handle. Thus you cannot kill init even with a SIGKILL even by
  977.  * mistake.
  978.  */
  979. asmlinkage int do_signal(sigset_t *oldset, struct pt_regs * regs,
  980.  unsigned long orig_i0, int restart_syscall)
  981. {
  982. unsigned long signr;
  983. struct k_sigaction *ka;
  984. siginfo_t info;
  985. /*
  986.  * XXX Disable svr4 signal handling until solaris emulation works.
  987.  * It is buggy - Anton
  988.  */
  989. #define SVR4_SIGNAL_BROKEN 1
  990. #ifdef SVR4_SIGNAL_BROKEN
  991. int svr4_signal = 0;
  992. #else
  993. int svr4_signal = current->personality == PER_SVR4;
  994. #endif
  995. if (!oldset)
  996. oldset = &current->blocked;
  997. for (;;) {
  998. spin_lock_irq(&current->sigmask_lock);
  999. signr = dequeue_signal(&current->blocked, &info);
  1000. spin_unlock_irq(&current->sigmask_lock);
  1001. if (!signr)
  1002. break;
  1003. if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) {
  1004. /* Do the syscall restart before we let the debugger
  1005.  * look at the child registers.
  1006.  */
  1007. if (restart_syscall &&
  1008.     (regs->u_regs[UREG_I0] == ERESTARTNOHAND ||
  1009.      regs->u_regs[UREG_I0] == ERESTARTSYS ||
  1010.      regs->u_regs[UREG_I0] == ERESTARTNOINTR)) {
  1011. regs->u_regs[UREG_I0] = orig_i0;
  1012. regs->pc -= 4;
  1013. regs->npc -= 4;
  1014. restart_syscall = 0;
  1015. }
  1016. current->exit_code = signr;
  1017. current->state = TASK_STOPPED;
  1018. /* This happens to be SMP safe so no need to
  1019.  * grab master kernel lock even in this case.
  1020.  */
  1021. notify_parent(current, SIGCHLD);
  1022. schedule();
  1023. if (!(signr = current->exit_code))
  1024. continue;
  1025. current->exit_code = 0;
  1026. if (signr == SIGSTOP)
  1027. continue;
  1028. /* Update the siginfo structure.  Is this good?  */
  1029. if (signr != info.si_signo) {
  1030. info.si_signo = signr;
  1031. info.si_errno = 0;
  1032. info.si_code = SI_USER;
  1033. info.si_pid = current->p_pptr->pid;
  1034. info.si_uid = current->p_pptr->uid;
  1035. }
  1036. /* If the (new) signal is now blocked, requeue it.  */
  1037. if (sigismember(&current->blocked, signr)) {
  1038. send_sig_info(signr, &info, current);
  1039. continue;
  1040. }
  1041. }
  1042. ka = &current->sig->action[signr-1];
  1043. if (ka->sa.sa_handler == SIG_IGN) {
  1044. if (signr != SIGCHLD)
  1045. continue;
  1046. /* sys_wait4() grabs the master kernel lock, so
  1047.  * we need not do so, that sucker should be
  1048.  * threaded and would not be that difficult to
  1049.  * do anyways.
  1050.  */
  1051. while (sys_wait4(-1, NULL, WNOHANG, NULL) > 0)
  1052. ;
  1053. continue;
  1054. }
  1055. if (ka->sa.sa_handler == SIG_DFL) {
  1056. unsigned long exit_code = signr;
  1057. if (current->pid == 1)
  1058. continue;
  1059. switch (signr) {
  1060. case SIGCONT: case SIGCHLD: case SIGWINCH:
  1061. continue;
  1062. case SIGTSTP: case SIGTTIN: case SIGTTOU:
  1063. /* The operations performed by
  1064.  * is_orphaned_pgrp() are protected by
  1065.  * the tasklist_lock.
  1066.  */
  1067. if (is_orphaned_pgrp(current->pgrp))
  1068. continue;
  1069. case SIGSTOP:
  1070. if (current->ptrace & PT_PTRACED)
  1071. continue;
  1072. current->state = TASK_STOPPED;
  1073. current->exit_code = signr;
  1074. /* notify_parent() is SMP safe */
  1075. if (!(current->p_pptr->sig->action[SIGCHLD-1].sa.sa_flags &
  1076.       SA_NOCLDSTOP))
  1077. notify_parent(current, SIGCHLD);
  1078. schedule();
  1079. continue;
  1080. case SIGQUIT: case SIGILL: case SIGTRAP:
  1081. case SIGABRT: case SIGFPE: case SIGSEGV:
  1082. case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ:
  1083. if (do_coredump(signr, regs))
  1084. exit_code |= 0x80;
  1085. #ifdef DEBUG_SIGNALS
  1086. /* Very useful to debug dynamic linker problems */
  1087. printk ("Sig %ld going for %s[%d]...n", signr, current->comm, current->pid);
  1088. show_regs (regs);
  1089. #ifdef DEBUG_SIGNALS_TRACE
  1090. {
  1091. struct reg_window *rw = (struct reg_window *)regs->u_regs[UREG_FP];
  1092. unsigned int ins[8];
  1093. while (rw &&
  1094.        !(((unsigned long) rw) & 0x3)) {
  1095. copy_from_user(ins, &rw->ins[0], sizeof(ins));
  1096. printk("Caller[%08x](%08x,%08x,%08x,%08x,%08x,%08x)n", ins[7], ins[0], ins[1], ins[2], ins[3], ins[4], ins[5]);
  1097. rw = (struct reg_window *)(unsigned long)ins[6];
  1098. }
  1099. }
  1100. #endif
  1101. #ifdef DEBUG_SIGNALS_MAPS
  1102. printk("Maps:n");
  1103. read_maps();
  1104. #endif
  1105. #endif
  1106. /* fall through */
  1107. default:
  1108. sigaddset(&current->pending.signal, signr);
  1109. recalc_sigpending(current);
  1110. current->flags |= PF_SIGNALED;
  1111. do_exit(exit_code);
  1112. /* NOT REACHED */
  1113. }
  1114. }
  1115. if (restart_syscall)
  1116. syscall_restart(orig_i0, regs, &ka->sa);
  1117. handle_signal(signr, ka, &info, oldset, regs, svr4_signal);
  1118. return 1;
  1119. }
  1120. if (restart_syscall &&
  1121.     (regs->u_regs[UREG_I0] == ERESTARTNOHAND ||
  1122.      regs->u_regs[UREG_I0] == ERESTARTSYS ||
  1123.      regs->u_regs[UREG_I0] == ERESTARTNOINTR)) {
  1124. /* replay the system call when we are done */
  1125. regs->u_regs[UREG_I0] = orig_i0;
  1126. regs->pc -= 4;
  1127. regs->npc -= 4;
  1128. }
  1129. return 0;
  1130. }
  1131. asmlinkage int
  1132. do_sys_sigstack(struct sigstack *ssptr, struct sigstack *ossptr, unsigned long sp)
  1133. {
  1134. int ret = -EFAULT;
  1135. /* First see if old state is wanted. */
  1136. if (ossptr) {
  1137. if (put_user(current->sas_ss_sp + current->sas_ss_size, &ossptr->the_stack) ||
  1138.     __put_user(on_sig_stack(sp), &ossptr->cur_status))
  1139. goto out;
  1140. }
  1141. /* Now see if we want to update the new state. */
  1142. if (ssptr) {
  1143. void *ss_sp;
  1144. if (get_user((long)ss_sp, &ssptr->the_stack))
  1145. goto out;
  1146. /* If the current stack was set with sigaltstack, don't
  1147.    swap stacks while we are on it.  */
  1148. ret = -EPERM;
  1149. if (current->sas_ss_sp && on_sig_stack(sp))
  1150. goto out;
  1151. /* Since we don't know the extent of the stack, and we don't
  1152.    track onstack-ness, but rather calculate it, we must
  1153.    presume a size.  Ho hum this interface is lossy.  */
  1154. current->sas_ss_sp = (unsigned long)ss_sp - SIGSTKSZ;
  1155. current->sas_ss_size = SIGSTKSZ;
  1156. }
  1157. ret = 0;
  1158. out:
  1159. return ret;
  1160. }