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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  arch/s390/kernel/signal32.c
  3.  *
  4.  *  S390 version
  5.  *    Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
  6.  *    Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
  7.  *               Gerhard Tonn (ton@de.ibm.com)                  
  8.  *
  9.  *  Copyright (C) 1991, 1992  Linus Torvalds
  10.  *
  11.  *  1997-11-28  Modified for POSIX.1b signals by Richard Henderson
  12.  */
  13. #include <linux/config.h>
  14. #include <linux/sched.h>
  15. #include <linux/mm.h>
  16. #include <linux/smp.h>
  17. #include <linux/smp_lock.h>
  18. #include <linux/kernel.h>
  19. #include <linux/signal.h>
  20. #include <linux/errno.h>
  21. #include <linux/wait.h>
  22. #include <linux/ptrace.h>
  23. #include <linux/unistd.h>
  24. #include <linux/stddef.h>
  25. #include <linux/personality.h>
  26. #include <asm/ucontext.h>
  27. #include <asm/uaccess.h>
  28. #include "linux32.h"
  29. #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
  30. #define _USER_PSW_MASK32 0x0705C00080000000
  31. typedef struct 
  32. {
  33. __u8 callee_used_stack[__SIGNAL_FRAMESIZE32];
  34. struct sigcontext32 sc;
  35. _sigregs32 sregs;
  36. __u8 retcode[S390_SYSCALL_SIZE];
  37. } sigframe32;
  38. typedef struct 
  39. {
  40. __u8 callee_used_stack[__SIGNAL_FRAMESIZE32];
  41. __u8 retcode[S390_SYSCALL_SIZE];
  42. struct siginfo32 info;
  43. struct ucontext32 uc;
  44. } rt_sigframe32;
  45. asmlinkage int FASTCALL(do_signal(struct pt_regs *regs, sigset_t *oldset));
  46. int do_signal32(struct pt_regs *regs, sigset_t *oldset);
  47. int copy_siginfo_to_user32(siginfo_t32 *to, siginfo_t *from)
  48. {
  49. int err;
  50. if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t32)))
  51. return -EFAULT;
  52. /* If you change siginfo_t structure, please be sure
  53.    this code is fixed accordingly.
  54.    It should never copy any pad contained in the structure
  55.    to avoid security leaks, but must copy the generic
  56.    3 ints plus the relevant union member.  
  57.    This routine must convert siginfo from 64bit to 32bit as well
  58.    at the same time.  */
  59. err = __put_user(from->si_signo, &to->si_signo);
  60. err |= __put_user(from->si_errno, &to->si_errno);
  61. err |= __put_user((short)from->si_code, &to->si_code);
  62. if (from->si_code < 0)
  63. err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
  64. else {
  65. switch (from->si_code >> 16) {
  66. case __SI_KILL >> 16:
  67. err |= __put_user(from->si_pid, &to->si_pid);
  68. err |= __put_user(from->si_uid, &to->si_uid);
  69. break;
  70. case __SI_CHLD >> 16:
  71. err |= __put_user(from->si_pid, &to->si_pid);
  72. err |= __put_user(from->si_uid, &to->si_uid);
  73. err |= __put_user(from->si_utime, &to->si_utime);
  74. err |= __put_user(from->si_stime, &to->si_stime);
  75. err |= __put_user(from->si_status, &to->si_status);
  76. break;
  77. case __SI_FAULT >> 16:
  78. err |= __put_user(from->si_addr, &to->si_addr);
  79. break;
  80. case __SI_POLL >> 16:
  81. case __SI_TIMER >> 16:
  82. err |= __put_user(from->si_band, &to->si_band);
  83. err |= __put_user(from->si_fd, &to->si_fd);
  84. break;
  85. default:
  86. break;
  87. /* case __SI_RT: This is not generated by the kernel as of now.  */
  88. }
  89. }
  90. return err;
  91. }
  92. /*
  93.  * Atomically swap in the new signal mask, and wait for a signal.
  94.  */
  95. asmlinkage int
  96. sys32_sigsuspend(struct pt_regs * regs,int history0, int history1, old_sigset_t mask)
  97. {
  98. sigset_t saveset;
  99. mask &= _BLOCKABLE;
  100. spin_lock_irq(&current->sigmask_lock);
  101. saveset = current->blocked;
  102. siginitset(&current->blocked, mask);
  103. recalc_sigpending(current);
  104. spin_unlock_irq(&current->sigmask_lock);
  105. regs->gprs[2] = -EINTR;
  106. while (1) {
  107. set_current_state(TASK_INTERRUPTIBLE);
  108. schedule();
  109. if (do_signal32(regs, &saveset))
  110. return -EINTR;
  111. }
  112. }
  113. asmlinkage int
  114. sys32_rt_sigsuspend(struct pt_regs * regs,sigset_t32 *unewset, size_t sigsetsize)
  115. {
  116. sigset_t saveset, newset;
  117. sigset_t32 set32;
  118. /* XXX: Don't preclude handling different sized sigset_t's.  */
  119. if (sigsetsize != sizeof(sigset_t))
  120. return -EINVAL;
  121. if (copy_from_user(&set32, unewset, sizeof(set32)))
  122. return -EFAULT;
  123. switch (_NSIG_WORDS) {
  124. case 4: newset.sig[3] = set32.sig[6] + (((long)set32.sig[7]) << 32);
  125. case 3: newset.sig[2] = set32.sig[4] + (((long)set32.sig[5]) << 32);
  126. case 2: newset.sig[1] = set32.sig[2] + (((long)set32.sig[3]) << 32);
  127. case 1: newset.sig[0] = set32.sig[0] + (((long)set32.sig[1]) << 32);
  128. }
  129.         sigdelsetmask(&newset, ~_BLOCKABLE);
  130.         spin_lock_irq(&current->sigmask_lock);
  131.         saveset = current->blocked;
  132.         current->blocked = newset;
  133.         recalc_sigpending(current);
  134.         spin_unlock_irq(&current->sigmask_lock);
  135.         regs->gprs[2] = -EINTR;
  136.         while (1) {
  137.                 set_current_state(TASK_INTERRUPTIBLE);
  138.                 schedule();
  139.                 if (do_signal32(regs, &saveset))
  140.                         return -EINTR;
  141.         }
  142. }                                                         
  143. asmlinkage int
  144. sys32_sigaction(int sig, const struct old_sigaction32 *act,
  145.  struct old_sigaction32 *oact)
  146. {
  147.         struct k_sigaction new_ka, old_ka;
  148.         int ret;
  149.         if (act) {
  150. old_sigset_t32 mask;
  151. if (verify_area(VERIFY_READ, act, sizeof(*act)) ||
  152.     __get_user((unsigned long)new_ka.sa.sa_handler, &act->sa_handler) ||
  153.     __get_user((unsigned long)new_ka.sa.sa_restorer, &act->sa_restorer))
  154. return -EFAULT;
  155. __get_user(new_ka.sa.sa_flags, &act->sa_flags);
  156. __get_user(mask, &act->sa_mask);
  157. siginitset(&new_ka.sa.sa_mask, mask);
  158.         }
  159.         ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
  160. if (!ret && oact) {
  161. if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) ||
  162.     __put_user((unsigned long)old_ka.sa.sa_handler, &oact->sa_handler) ||
  163.     __put_user((unsigned long)old_ka.sa.sa_restorer, &oact->sa_restorer))
  164. return -EFAULT;
  165. __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
  166. __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
  167.         }
  168. return ret;
  169. }
  170. int
  171. do_sigaction(int sig, const struct k_sigaction *act, struct k_sigaction *oact);
  172. asmlinkage long 
  173. sys32_rt_sigaction(int sig, const struct sigaction32 *act,
  174.    struct sigaction32 *oact,  size_t sigsetsize)
  175. {
  176. struct k_sigaction new_ka, old_ka;
  177. int ret;
  178. sigset_t32 set32;
  179. /* XXX: Don't preclude handling different sized sigset_t's.  */
  180. if (sigsetsize != sizeof(sigset_t32))
  181. return -EINVAL;
  182. if (act) {
  183. ret = get_user((unsigned long)new_ka.sa.sa_handler, &act->sa_handler);
  184. ret |= __copy_from_user(&set32, &act->sa_mask,
  185. sizeof(sigset_t32));
  186. switch (_NSIG_WORDS) {
  187. case 4: new_ka.sa.sa_mask.sig[3] = set32.sig[6]
  188. | (((long)set32.sig[7]) << 32);
  189. case 3: new_ka.sa.sa_mask.sig[2] = set32.sig[4]
  190. | (((long)set32.sig[5]) << 32);
  191. case 2: new_ka.sa.sa_mask.sig[1] = set32.sig[2]
  192. | (((long)set32.sig[3]) << 32);
  193. case 1: new_ka.sa.sa_mask.sig[0] = set32.sig[0]
  194. | (((long)set32.sig[1]) << 32);
  195. }
  196. ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
  197. if (ret)
  198. return -EFAULT;
  199. }
  200. ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
  201. if (!ret && oact) {
  202. switch (_NSIG_WORDS) {
  203. case 4:
  204. set32.sig[7] = (old_ka.sa.sa_mask.sig[3] >> 32);
  205. set32.sig[6] = old_ka.sa.sa_mask.sig[3];
  206. case 3:
  207. set32.sig[5] = (old_ka.sa.sa_mask.sig[2] >> 32);
  208. set32.sig[4] = old_ka.sa.sa_mask.sig[2];
  209. case 2:
  210. set32.sig[3] = (old_ka.sa.sa_mask.sig[1] >> 32);
  211. set32.sig[2] = old_ka.sa.sa_mask.sig[1];
  212. case 1:
  213. set32.sig[1] = (old_ka.sa.sa_mask.sig[0] >> 32);
  214. set32.sig[0] = old_ka.sa.sa_mask.sig[0];
  215. }
  216. ret = put_user((unsigned long)old_ka.sa.sa_handler, &oact->sa_handler);
  217. ret |= __copy_to_user(&oact->sa_mask, &set32,
  218.       sizeof(sigset_t32));
  219. ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
  220. }
  221. return ret;
  222. }
  223. asmlinkage int
  224. sys32_sigaltstack(const stack_t32 *uss, stack_t32 *uoss, struct pt_regs *regs)
  225. {
  226. stack_t kss, koss;
  227. int ret, err = 0;
  228. mm_segment_t old_fs = get_fs();
  229. if (uss) {
  230. if (!access_ok(VERIFY_READ, uss, sizeof(*uss)))
  231. return -EFAULT;
  232. err |= __get_user(kss.ss_sp, &uss->ss_sp);
  233. err |= __get_user(kss.ss_size, &uss->ss_size);
  234. err |= __get_user(kss.ss_flags, &uss->ss_flags);
  235. if (err)
  236. return -EFAULT;
  237. }
  238. set_fs (KERNEL_DS);
  239. ret = do_sigaltstack(uss ? &kss : NULL , uoss ? &koss : NULL, regs->gprs[15]);
  240. set_fs (old_fs);
  241. if (!ret && uoss) {
  242. if (!access_ok(VERIFY_WRITE, uoss, sizeof(*uoss)))
  243. return -EFAULT;
  244. err |= __put_user(koss.ss_sp, &uoss->ss_sp);
  245. err |= __put_user(koss.ss_size, &uoss->ss_size);
  246. err |= __put_user(koss.ss_flags, &uoss->ss_flags);
  247. if (err)
  248. return -EFAULT;
  249. }
  250. return ret;
  251. }
  252. static int save_sigregs32(struct pt_regs *regs,_sigregs32 *sregs)
  253. {
  254. int err = 0;
  255. s390_fp_regs fpregs;
  256. int i;
  257. for(i=0; i<NUM_GPRS; i++) 
  258. err |= __put_user(regs->gprs[i], &sregs->regs.gprs[i]);  
  259. for(i=0; i<NUM_ACRS; i++)
  260. err |= __put_user(regs->acrs[i], &sregs->regs.acrs[i]);  
  261. err |= __copy_to_user(&sregs->regs.psw.mask, &regs->psw.mask, 4);
  262. err |= __copy_to_user(&sregs->regs.psw.addr, ((char*)&regs->psw.addr)+4, 4);
  263. if(!err)
  264. {
  265. save_fp_regs(&fpregs);
  266. __put_user(fpregs.fpc, &sregs->fpregs.fpc);
  267. for(i=0; i<NUM_FPRS; i++)
  268. err |= __put_user(fpregs.fprs[i].d, &sregs->fpregs.fprs[i].d);  
  269. }
  270. return(err);
  271. }
  272. static int restore_sigregs32(struct pt_regs *regs,_sigregs32 *sregs)
  273. {
  274. int err = 0;
  275. s390_fp_regs fpregs;
  276. psw_t saved_psw=regs->psw;
  277. int i;
  278. for(i=0; i<NUM_GPRS; i++)
  279. err |= __get_user(regs->gprs[i], &sregs->regs.gprs[i]);  
  280. for(i=0; i<NUM_ACRS; i++)
  281. err |= __get_user(regs->acrs[i], &sregs->regs.acrs[i]);  
  282. err |= __copy_from_user(&regs->psw.mask, &sregs->regs.psw.mask, 4);
  283. err |= __copy_from_user(((char*)&regs->psw.addr)+4, &sregs->regs.psw.addr, 4);
  284. if(!err)
  285. {
  286. regs->trap = -1; /* disable syscall checks */
  287. regs->psw.mask=(saved_psw.mask&~PSW_MASK_DEBUGCHANGE)|
  288. (regs->psw.mask&PSW_MASK_DEBUGCHANGE);
  289. regs->psw.addr=(saved_psw.addr&~PSW_ADDR_DEBUGCHANGE)|
  290. (regs->psw.addr&PSW_ADDR_DEBUGCHANGE);
  291. __get_user(fpregs.fpc, &sregs->fpregs.fpc);
  292.                 for(i=0; i<NUM_FPRS; i++)
  293.                         err |= __get_user(fpregs.fprs[i].d, &sregs->fpregs.fprs[i].d);              
  294. if(!err)
  295. restore_fp_regs(&fpregs);
  296. }
  297. return(err);
  298. }
  299. asmlinkage long sys32_sigreturn(struct pt_regs *regs)
  300. {
  301. sigframe32 *frame = (sigframe32 *)regs->gprs[15];
  302. sigset_t set;
  303. if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
  304. goto badframe;
  305. if (__copy_from_user(&set.sig, &frame->sc.oldmask, _SIGMASK_COPY_SIZE32))
  306. goto badframe;
  307. sigdelsetmask(&set, ~_BLOCKABLE);
  308. spin_lock_irq(&current->sigmask_lock);
  309. current->blocked = set;
  310. recalc_sigpending(current);
  311. spin_unlock_irq(&current->sigmask_lock);
  312. if (restore_sigregs32(regs, &frame->sregs))
  313. goto badframe;
  314. return regs->gprs[2];
  315. badframe:
  316. force_sig(SIGSEGV, current);
  317. return 0;
  318. }
  319. asmlinkage long sys32_rt_sigreturn(struct pt_regs *regs)
  320. {
  321. rt_sigframe32 *frame = (rt_sigframe32 *)regs->gprs[15];
  322. sigset_t set;
  323. stack_t st;
  324. int err;
  325. mm_segment_t old_fs = get_fs();
  326. if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
  327. goto badframe;
  328. if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
  329. goto badframe;
  330. sigdelsetmask(&set, ~_BLOCKABLE);
  331. spin_lock_irq(&current->sigmask_lock);
  332. current->blocked = set;
  333. recalc_sigpending(current);
  334. spin_unlock_irq(&current->sigmask_lock);
  335. if (restore_sigregs32(regs, &frame->uc.uc_mcontext))
  336. goto badframe;
  337. err = __get_user(st.ss_sp, &frame->uc.uc_stack.ss_sp);
  338. st.ss_sp = (void *) A((unsigned long)st.ss_sp);
  339. err |= __get_user(st.ss_size, &frame->uc.uc_stack.ss_size);
  340. err |= __get_user(st.ss_flags, &frame->uc.uc_stack.ss_flags);
  341. if (err)
  342. goto badframe; 
  343. /* It is more difficult to avoid calling this function than to
  344.    call it and ignore errors.  */
  345. set_fs (KERNEL_DS);   
  346. do_sigaltstack(&st, NULL, regs->gprs[15]);
  347. set_fs (old_fs);
  348. return regs->gprs[2];
  349. badframe:
  350.         force_sig(SIGSEGV, current);
  351.         return 0;
  352. }
  353. /*
  354.  * Set up a signal frame.
  355.  */
  356. /*
  357.  * Determine which stack to use..
  358.  */
  359. static inline void *
  360. get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
  361. {
  362. unsigned long sp;
  363. /* Default to using normal stack */
  364. sp = (unsigned long) A(regs->gprs[15]);
  365. /* This is the X/Open sanctioned signal stack switching.  */
  366. if (ka->sa.sa_flags & SA_ONSTACK) {
  367. if (! on_sig_stack(sp))
  368. sp = current->sas_ss_sp + current->sas_ss_size;
  369. }
  370. /* This is the legacy signal stack switching. */
  371. else if (!user_mode(regs) &&
  372.  !(ka->sa.sa_flags & SA_RESTORER) &&
  373.  ka->sa.sa_restorer) {
  374. sp = (unsigned long) ka->sa.sa_restorer;
  375. }
  376. return (void *)((sp - frame_size) & -8ul);
  377. }
  378. static inline int map_signal(int sig)
  379. {
  380. if (current->exec_domain
  381.     && current->exec_domain->signal_invmap
  382.     && sig < 32)
  383. return current->exec_domain->signal_invmap[sig];
  384.         else
  385. return sig;
  386. }
  387. static void setup_frame32(int sig, struct k_sigaction *ka,
  388. sigset_t *set, struct pt_regs * regs)
  389. {
  390. sigframe32 *frame = get_sigframe(ka, regs, sizeof(sigframe32));
  391. if (!access_ok(VERIFY_WRITE, frame, sizeof(sigframe32)))
  392. goto give_sigsegv;
  393. if (__copy_to_user(&frame->sc.oldmask, &set->sig, _SIGMASK_COPY_SIZE32))
  394. goto give_sigsegv;
  395. if (save_sigregs32(regs, &frame->sregs))
  396. goto give_sigsegv;
  397. if (__put_user(&frame->sregs, &frame->sc.sregs))
  398. goto give_sigsegv;
  399. /* Set up to return from userspace.  If provided, use a stub
  400.    already in userspace.  */
  401. if (ka->sa.sa_flags & SA_RESTORER) {
  402. regs->gprs[14] = FIX_PSW(ka->sa.sa_restorer);
  403. } else {
  404. regs->gprs[14] = FIX_PSW(frame->retcode);
  405. if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn,
  406.                (u16 *)(frame->retcode)))
  407. goto give_sigsegv;
  408.         }
  409. /* Set up registers for signal handler */
  410. regs->gprs[15] = (addr_t)frame;
  411. regs->psw.addr = FIX_PSW(ka->sa.sa_handler);
  412. regs->psw.mask = _USER_PSW_MASK32;
  413. regs->gprs[2] = map_signal(sig);
  414. regs->gprs[3] = (addr_t)&frame->sc;
  415. /* We forgot to include these in the sigcontext.
  416.    To avoid breaking binary compatibility, they are passed as args. */
  417. regs->gprs[4] = current->thread.trap_no;
  418. regs->gprs[5] = current->thread.prot_addr;
  419. return;
  420. give_sigsegv:
  421. if (sig == SIGSEGV)
  422. ka->sa.sa_handler = SIG_DFL;
  423. force_sig(SIGSEGV, current);
  424. }
  425. static void setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info,
  426.    sigset_t *set, struct pt_regs * regs)
  427. {
  428. int err = 0;
  429. rt_sigframe32 *frame = get_sigframe(ka, regs, sizeof(rt_sigframe32));
  430. if (!access_ok(VERIFY_WRITE, frame, sizeof(rt_sigframe32)))
  431. goto give_sigsegv;
  432. if (copy_siginfo_to_user32(&frame->info, info))
  433. goto give_sigsegv;
  434. /* Create the ucontext.  */
  435. err |= __put_user(0, &frame->uc.uc_flags);
  436. err |= __put_user(0, &frame->uc.uc_link);
  437. err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
  438. err |= __put_user(sas_ss_flags(regs->gprs[15]),
  439.                   &frame->uc.uc_stack.ss_flags);
  440. err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
  441. err |= save_sigregs32(regs, &frame->uc.uc_mcontext);
  442. err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
  443. if (err)
  444. goto give_sigsegv;
  445. /* Set up to return from userspace.  If provided, use a stub
  446.    already in userspace.  */
  447. if (ka->sa.sa_flags & SA_RESTORER) {
  448. regs->gprs[14] = FIX_PSW(ka->sa.sa_restorer);
  449. } else {
  450. regs->gprs[14] = FIX_PSW(frame->retcode);
  451. err |= __put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn,
  452.                   (u16 *)(frame->retcode));
  453. }
  454. /* Set up registers for signal handler */
  455. regs->gprs[15] = (addr_t)frame;
  456. regs->psw.addr = FIX_PSW(ka->sa.sa_handler);
  457. regs->psw.mask = _USER_PSW_MASK32;
  458. regs->gprs[2] = map_signal(sig);
  459. regs->gprs[3] = (addr_t)&frame->info;
  460. regs->gprs[4] = (addr_t)&frame->uc;
  461. return;
  462. give_sigsegv:
  463. if (sig == SIGSEGV)
  464. ka->sa.sa_handler = SIG_DFL;
  465. force_sig(SIGSEGV, current);
  466. }
  467. /*
  468.  * OK, we're invoking a handler
  469.  */
  470. static void
  471. handle_signal32(unsigned long sig, struct k_sigaction *ka,
  472.       siginfo_t *info, sigset_t *oldset, struct pt_regs * regs)
  473. {
  474. /* Are we from a system call? */
  475. if (regs->trap == __LC_SVC_OLD_PSW) {
  476. /* If so, check system call restarting.. */
  477. switch (regs->gprs[2]) {
  478. case -ERESTARTNOHAND:
  479. regs->gprs[2] = -EINTR;
  480. break;
  481. case -ERESTARTSYS:
  482. if (!(ka->sa.sa_flags & SA_RESTART)) {
  483. regs->gprs[2] = -EINTR;
  484. break;
  485. }
  486. /* fallthrough */
  487. case -ERESTARTNOINTR:
  488. regs->gprs[2] = regs->orig_gpr2;
  489. regs->psw.addr -= 2;
  490. }
  491. }
  492. /* Set up the stack frame */
  493. if (ka->sa.sa_flags & SA_SIGINFO)
  494. setup_rt_frame32(sig, ka, info, oldset, regs);
  495. else
  496. setup_frame32(sig, ka, oldset, regs);
  497. if (ka->sa.sa_flags & SA_ONESHOT)
  498. ka->sa.sa_handler = SIG_DFL;
  499. if (!(ka->sa.sa_flags & SA_NODEFER)) {
  500. spin_lock_irq(&current->sigmask_lock);
  501. sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
  502. sigaddset(&current->blocked,sig);
  503. recalc_sigpending(current);
  504. spin_unlock_irq(&current->sigmask_lock);
  505. }
  506. }
  507. /*
  508.  * Note that 'init' is a special process: it doesn't get signals it doesn't
  509.  * want to handle. Thus you cannot kill init even with a SIGKILL even by
  510.  * mistake.
  511.  *
  512.  * Note that we go through the signals twice: once to check the signals that
  513.  * the kernel can handle, and then we build all the user-level signal handling
  514.  * stack-frames in one go after that.
  515.  */
  516. int do_signal32(struct pt_regs *regs, sigset_t *oldset)
  517. {
  518. siginfo_t info;
  519. struct k_sigaction *ka;
  520. /*
  521.  * We want the common case to go fast, which
  522.  * is why we may in certain cases get here from
  523.  * kernel mode. Just return without doing anything
  524.  * if so.
  525.  */
  526. if (!user_mode(regs))
  527. return 1;
  528. if (!oldset)
  529. oldset = &current->blocked;
  530. for (;;) {
  531. unsigned long signr;
  532. spin_lock_irq(&current->sigmask_lock);
  533. signr = dequeue_signal(&current->blocked, &info);
  534. spin_unlock_irq(&current->sigmask_lock);
  535. if (!signr)
  536. break;
  537. if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) {
  538. /* Let the debugger run.  */
  539. current->exit_code = signr;
  540. set_current_state(TASK_STOPPED);
  541. notify_parent(current, SIGCHLD);
  542. schedule();
  543. /* We're back.  Did the debugger cancel the sig?  */
  544. if (!(signr = current->exit_code))
  545. continue;
  546. current->exit_code = 0;
  547. /* The debugger continued.  Ignore SIGSTOP.  */
  548. if (signr == SIGSTOP)
  549. continue;
  550. /* Update the siginfo structure.  Is this good?  */
  551. if (signr != info.si_signo) {
  552. info.si_signo = signr;
  553. info.si_errno = 0;
  554. info.si_code = SI_USER;
  555. info.si_pid = current->p_pptr->pid;
  556. info.si_uid = current->p_pptr->uid;
  557. }
  558. /* If the (new) signal is now blocked, requeue it.  */
  559. if (sigismember(&current->blocked, signr)) {
  560. send_sig_info(signr, &info, current);
  561. continue;
  562. }
  563. }
  564. ka = &current->sig->action[signr-1];
  565. if (ka->sa.sa_handler == SIG_IGN) {
  566. if (signr != SIGCHLD)
  567. continue;
  568. /* Check for SIGCHLD: it's special.  */
  569. while (sys_wait4(-1, NULL, WNOHANG, NULL) > 0)
  570. /* nothing */;
  571. continue;
  572. }
  573. if (ka->sa.sa_handler == SIG_DFL) {
  574. int exit_code = signr;
  575. /* Init gets no signals it doesn't want.  */
  576. if (current->pid == 1)
  577. continue;
  578. switch (signr) {
  579. case SIGCONT: case SIGCHLD: case SIGWINCH:
  580. continue;
  581. case SIGTSTP: case SIGTTIN: case SIGTTOU:
  582. if (is_orphaned_pgrp(current->pgrp))
  583. continue;
  584. /* FALLTHRU */
  585. case SIGSTOP:
  586. set_current_state(TASK_STOPPED);
  587. current->exit_code = signr;
  588. if (!(current->p_pptr->sig->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDSTOP))
  589. notify_parent(current, SIGCHLD);
  590. schedule();
  591. continue;
  592. case SIGQUIT: case SIGILL: case SIGTRAP:
  593. case SIGABRT: case SIGFPE: case SIGSEGV:
  594. case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ:
  595.                                 if (do_coredump(signr, regs))
  596.                                         exit_code |= 0x80;
  597.                                 /* FALLTHRU */
  598. default:
  599. sig_exit(signr, exit_code, &info);
  600. /* NOTREACHED */
  601. }
  602. }
  603. /* Whee!  Actually deliver the signal.  */
  604. handle_signal32(signr, ka, &info, oldset, regs);
  605. return 1;
  606. }
  607. /* Did we come from a system call? */
  608. if ( regs->trap == __LC_SVC_OLD_PSW /* System Call! */ ) {
  609. /* Restart the system call - no handlers present */
  610. if (regs->gprs[2] == -ERESTARTNOHAND ||
  611.     regs->gprs[2] == -ERESTARTSYS ||
  612.     regs->gprs[2] == -ERESTARTNOINTR) {
  613. regs->gprs[2] = regs->orig_gpr2;
  614. regs->psw.addr -= 2;
  615. }
  616. }
  617. return 0;
  618. }