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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*  $Id: signal32.c,v 1.70 2001/04/24 01:09:12 davem Exp $
  2.  *  arch/sparc64/kernel/signal32.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/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_lock.h>
  19. #include <asm/uaccess.h>
  20. #include <asm/bitops.h>
  21. #include <asm/ptrace.h>
  22. #include <asm/svr4.h>
  23. #include <asm/pgtable.h>
  24. #include <asm/psrcompat.h>
  25. #include <asm/fpumacro.h>
  26. #include <asm/visasm.h>
  27. #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
  28. asmlinkage int do_signal32(sigset_t *oldset, struct pt_regs *regs,
  29.  unsigned long orig_o0, int ret_from_syscall);
  30. /* This turned off for production... */
  31. /* #define DEBUG_SIGNALS 1 */
  32. /* #define DEBUG_SIGNALS_TRACE 1 */
  33. /* #define DEBUG_SIGNALS_MAPS 1 */
  34. /* #define DEBUG_SIGNALS_TLB 1 */
  35. /* Signal frames: the original one (compatible with SunOS):
  36.  *
  37.  * Set up a signal frame... Make the stack look the way SunOS
  38.  * expects it to look which is basically:
  39.  *
  40.  * ---------------------------------- <-- %sp at signal time
  41.  * Struct sigcontext
  42.  * Signal address
  43.  * Ptr to sigcontext area above
  44.  * Signal code
  45.  * The signal number itself
  46.  * One register window
  47.  * ---------------------------------- <-- New %sp
  48.  */
  49. struct signal_sframe32 {
  50. struct reg_window32 sig_window;
  51. int sig_num;
  52. int sig_code;
  53. /* struct sigcontext32 * */ u32 sig_scptr;
  54. int sig_address;
  55. struct sigcontext32 sig_context;
  56. unsigned extramask[_NSIG_WORDS32 - 1];
  57. };
  58. /* 
  59.  * And the new one, intended to be used for Linux applications only
  60.  * (we have enough in there to work with clone).
  61.  * All the interesting bits are in the info field.
  62.  */
  63. struct new_signal_frame32 {
  64. struct sparc_stackf32 ss;
  65. __siginfo32_t info;
  66. /* __siginfo_fpu32_t * */ u32 fpu_save;
  67. unsigned int insns [2];
  68. unsigned extramask[_NSIG_WORDS32 - 1];
  69. unsigned extra_size; /* Should be sizeof(siginfo_extra_v8plus_t) */
  70. /* Only valid if (info.si_regs.psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS */
  71. siginfo_extra_v8plus_t v8plus;
  72. __siginfo_fpu_t fpu_state;
  73. };
  74. struct rt_signal_frame32 {
  75. struct sparc_stackf32 ss;
  76. siginfo_t32 info;
  77. struct pt_regs32 regs;
  78. sigset_t32 mask;
  79. /* __siginfo_fpu32_t * */ u32 fpu_save;
  80. unsigned int insns [2];
  81. stack_t32 stack;
  82. unsigned extra_size; /* Should be sizeof(siginfo_extra_v8plus_t) */
  83. /* Only valid if (regs.psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS */
  84. siginfo_extra_v8plus_t v8plus;
  85. __siginfo_fpu_t fpu_state;
  86. };
  87. /* Align macros */
  88. #define SF_ALIGNEDSZ  (((sizeof(struct signal_sframe32) + 7) & (~7)))
  89. #define NF_ALIGNEDSZ  (((sizeof(struct new_signal_frame32) + 7) & (~7)))
  90. #define RT_ALIGNEDSZ  (((sizeof(struct rt_signal_frame32) + 7) & (~7)))
  91. int copy_siginfo_to_user32(siginfo_t32 *to, siginfo_t *from)
  92. {
  93. int err;
  94. if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t32)))
  95. return -EFAULT;
  96. /* If you change siginfo_t structure, please be sure
  97.    this code is fixed accordingly.
  98.    It should never copy any pad contained in the structure
  99.    to avoid security leaks, but must copy the generic
  100.    3 ints plus the relevant union member.
  101.    This routine must convert siginfo from 64bit to 32bit as well
  102.    at the same time.  */
  103. err = __put_user(from->si_signo, &to->si_signo);
  104. err |= __put_user(from->si_errno, &to->si_errno);
  105. err |= __put_user((short)from->si_code, &to->si_code);
  106. if (from->si_code < 0)
  107. err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
  108. else {
  109. switch (from->si_code >> 16) {
  110. case __SI_CHLD >> 16:
  111. err |= __put_user(from->si_utime, &to->si_utime);
  112. err |= __put_user(from->si_stime, &to->si_stime);
  113. err |= __put_user(from->si_status, &to->si_status);
  114. default:
  115. err |= __put_user(from->si_pid, &to->si_pid);
  116. err |= __put_user(from->si_uid, &to->si_uid);
  117. break;
  118. case __SI_FAULT >> 16:
  119. case __SI_POLL >> 16:
  120. err |= __put_user(from->si_trapno, &to->si_trapno);
  121. err |= __put_user((long)from->si_addr, &to->si_addr);
  122. break;
  123. /* case __SI_RT: This is not generated by the kernel as of now.  */
  124. }
  125. }
  126. return err;
  127. }
  128. /*
  129.  * atomically swap in the new signal mask, and wait for a signal.
  130.  * This is really tricky on the Sparc, watch out...
  131.  */
  132. asmlinkage void _sigpause32_common(old_sigset_t32 set, struct pt_regs *regs)
  133. {
  134. sigset_t saveset;
  135. set &= _BLOCKABLE;
  136. spin_lock_irq(&current->sigmask_lock);
  137. saveset = current->blocked;
  138. siginitset(&current->blocked, set);
  139. recalc_sigpending(current);
  140. spin_unlock_irq(&current->sigmask_lock);
  141. regs->tpc = regs->tnpc;
  142. regs->tnpc += 4;
  143. if ((current->thread.flags & SPARC_FLAG_32BIT) != 0) {
  144. regs->tpc &= 0xffffffff;
  145. regs->tnpc &= 0xffffffff;
  146. }
  147. /* Condition codes and return value where set here for sigpause,
  148.  * and so got used by setup_frame, which again causes sigreturn()
  149.  * to return -EINTR.
  150.  */
  151. while (1) {
  152. current->state = TASK_INTERRUPTIBLE;
  153. schedule();
  154. /*
  155.  * Return -EINTR and set condition code here,
  156.  * so the interrupted system call actually returns
  157.  * these.
  158.  */
  159. regs->tstate |= TSTATE_ICARRY;
  160. regs->u_regs[UREG_I0] = EINTR;
  161. if (do_signal32(&saveset, regs, 0, 0))
  162. return;
  163. }
  164. }
  165. asmlinkage void do_rt_sigsuspend32(u32 uset, size_t sigsetsize, struct pt_regs *regs)
  166. {
  167. sigset_t oldset, set;
  168. sigset_t32 set32;
  169.         
  170. /* XXX: Don't preclude handling different sized sigset_t's.  */
  171. if (((__kernel_size_t32)sigsetsize) != sizeof(sigset_t)) {
  172. regs->tstate |= TSTATE_ICARRY;
  173. regs->u_regs[UREG_I0] = EINVAL;
  174. return;
  175. }
  176. if (copy_from_user(&set32, (void *)(long)uset, sizeof(set32))) {
  177. regs->tstate |= TSTATE_ICARRY;
  178. regs->u_regs[UREG_I0] = EFAULT;
  179. return;
  180. }
  181. switch (_NSIG_WORDS) {
  182. case 4: set.sig[3] = set32.sig[6] + (((long)set32.sig[7]) << 32);
  183. case 3: set.sig[2] = set32.sig[4] + (((long)set32.sig[5]) << 32);
  184. case 2: set.sig[1] = set32.sig[2] + (((long)set32.sig[3]) << 32);
  185. case 1: set.sig[0] = set32.sig[0] + (((long)set32.sig[1]) << 32);
  186. }
  187. sigdelsetmask(&set, ~_BLOCKABLE);
  188. spin_lock_irq(&current->sigmask_lock);
  189. oldset = current->blocked;
  190. current->blocked = set;
  191. recalc_sigpending(current);
  192. spin_unlock_irq(&current->sigmask_lock);
  193. regs->tpc = regs->tnpc;
  194. regs->tnpc += 4;
  195. if ((current->thread.flags & SPARC_FLAG_32BIT) != 0) {
  196. regs->tpc &= 0xffffffff;
  197. regs->tnpc &= 0xffffffff;
  198. }
  199. /* Condition codes and return value where set here for sigpause,
  200.  * and so got used by setup_frame, which again causes sigreturn()
  201.  * to return -EINTR.
  202.  */
  203. while (1) {
  204. current->state = TASK_INTERRUPTIBLE;
  205. schedule();
  206. /*
  207.  * Return -EINTR and set condition code here,
  208.  * so the interrupted system call actually returns
  209.  * these.
  210.  */
  211. regs->tstate |= TSTATE_ICARRY;
  212. regs->u_regs[UREG_I0] = EINTR;
  213. if (do_signal32(&oldset, regs, 0, 0))
  214. return;
  215. }
  216. }
  217. static inline int restore_fpu_state32(struct pt_regs *regs, __siginfo_fpu_t *fpu)
  218. {
  219. unsigned long *fpregs = (unsigned long *)(((char *)current) + AOFF_task_fpregs);
  220. unsigned long fprs;
  221. int err;
  222. err = __get_user(fprs, &fpu->si_fprs);
  223. fprs_write(0);
  224. regs->tstate &= ~TSTATE_PEF;
  225. if (fprs & FPRS_DL)
  226. err |= copy_from_user(fpregs, &fpu->si_float_regs[0], (sizeof(unsigned int) * 32));
  227. if (fprs & FPRS_DU)
  228. err |= copy_from_user(fpregs+16, &fpu->si_float_regs[32], (sizeof(unsigned int) * 32));
  229. err |= __get_user(current->thread.xfsr[0], &fpu->si_fsr);
  230. err |= __get_user(current->thread.gsr[0], &fpu->si_gsr);
  231. current->thread.fpsaved[0] |= fprs;
  232. return err;
  233. }
  234. void do_new_sigreturn32(struct pt_regs *regs)
  235. {
  236. struct new_signal_frame32 *sf;
  237. unsigned int psr;
  238. unsigned pc, npc, fpu_save;
  239. sigset_t set;
  240. unsigned seta[_NSIG_WORDS32];
  241. int err, i;
  242. regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
  243. sf = (struct new_signal_frame32 *) regs->u_regs [UREG_FP];
  244. /* 1. Make sure we are not getting garbage from the user */
  245. if (verify_area (VERIFY_READ, sf, sizeof (*sf)) ||
  246.     (((unsigned long) sf) & 3))
  247. goto segv;
  248. get_user(pc, &sf->info.si_regs.pc);
  249. __get_user(npc, &sf->info.si_regs.npc);
  250. if ((pc | npc) & 3)
  251. goto segv;
  252. if ((current->thread.flags & SPARC_FLAG_32BIT) != 0) {
  253. pc &= 0xffffffff;
  254. npc &= 0xffffffff;
  255. }
  256. regs->tpc = pc;
  257. regs->tnpc = npc;
  258. /* 2. Restore the state */
  259. err = __get_user(regs->y, &sf->info.si_regs.y);
  260. err |= __get_user(psr, &sf->info.si_regs.psr);
  261. for (i = UREG_G1; i <= UREG_I7; i++)
  262. err |= __get_user(regs->u_regs[i], &sf->info.si_regs.u_regs[i]);
  263. if ((psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS) {
  264. err |= __get_user(i, &sf->v8plus.g_upper[0]);
  265. if (i == SIGINFO_EXTRA_V8PLUS_MAGIC) {
  266. for (i = UREG_G1; i <= UREG_I7; i++)
  267. err |= __get_user(((u32 *)regs->u_regs)[2*i], &sf->v8plus.g_upper[i]);
  268. }
  269. }
  270. /* User can only change condition codes in %tstate. */
  271. regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC);
  272. regs->tstate |= psr_to_tstate_icc(psr);
  273. err |= __get_user(fpu_save, &sf->fpu_save);
  274. if (fpu_save)
  275. err |= restore_fpu_state32(regs, &sf->fpu_state);
  276. err |= __get_user(seta[0], &sf->info.si_mask);
  277. err |= copy_from_user(seta+1, &sf->extramask, (_NSIG_WORDS32 - 1) * sizeof(unsigned));
  278. if (err)
  279.      goto segv;
  280. switch (_NSIG_WORDS) {
  281. case 4: set.sig[3] = seta[6] + (((long)seta[7]) << 32);
  282. case 3: set.sig[2] = seta[4] + (((long)seta[5]) << 32);
  283. case 2: set.sig[1] = seta[2] + (((long)seta[3]) << 32);
  284. case 1: set.sig[0] = seta[0] + (((long)seta[1]) << 32);
  285. }
  286. sigdelsetmask(&set, ~_BLOCKABLE);
  287. spin_lock_irq(&current->sigmask_lock);
  288. current->blocked = set;
  289. recalc_sigpending(current);
  290. spin_unlock_irq(&current->sigmask_lock);
  291. return;
  292. segv:
  293. do_exit(SIGSEGV);
  294. }
  295. asmlinkage void do_sigreturn32(struct pt_regs *regs)
  296. {
  297. struct sigcontext32 *scptr;
  298. unsigned pc, npc, psr;
  299. sigset_t set;
  300. unsigned seta[_NSIG_WORDS32];
  301. int err;
  302. synchronize_user_stack();
  303. if (current->thread.flags & SPARC_FLAG_NEWSIGNALS)
  304. return do_new_sigreturn32(regs);
  305. scptr = (struct sigcontext32 *)
  306. (regs->u_regs[UREG_I0] & 0x00000000ffffffffUL);
  307. /* Check sanity of the user arg. */
  308. if(verify_area(VERIFY_READ, scptr, sizeof(struct sigcontext32)) ||
  309.    (((unsigned long) scptr) & 3))
  310. goto segv;
  311. err = __get_user(pc, &scptr->sigc_pc);
  312. err |= __get_user(npc, &scptr->sigc_npc);
  313. if((pc | npc) & 3)
  314. goto segv; /* Nice try. */
  315. err |= __get_user(seta[0], &scptr->sigc_mask);
  316. /* Note that scptr + 1 points to extramask */
  317. err |= copy_from_user(seta+1, scptr + 1, (_NSIG_WORDS32 - 1) * sizeof(unsigned));
  318. if (err)
  319.      goto segv;
  320. switch (_NSIG_WORDS) {
  321. case 4: set.sig[3] = seta[6] + (((long)seta[7]) << 32);
  322. case 3: set.sig[2] = seta[4] + (((long)seta[5]) << 32);
  323. case 2: set.sig[1] = seta[2] + (((long)seta[3]) << 32);
  324. case 1: set.sig[0] = seta[0] + (((long)seta[1]) << 32);
  325. }
  326. sigdelsetmask(&set, ~_BLOCKABLE);
  327. spin_lock_irq(&current->sigmask_lock);
  328. current->blocked = set;
  329. recalc_sigpending(current);
  330. spin_unlock_irq(&current->sigmask_lock);
  331. if ((current->thread.flags & SPARC_FLAG_32BIT) != 0) {
  332. pc &= 0xffffffff;
  333. npc &= 0xffffffff;
  334. }
  335. regs->tpc = pc;
  336. regs->tnpc = npc;
  337. err = __get_user(regs->u_regs[UREG_FP], &scptr->sigc_sp);
  338. err |= __get_user(regs->u_regs[UREG_I0], &scptr->sigc_o0);
  339. err |= __get_user(regs->u_regs[UREG_G1], &scptr->sigc_g1);
  340. /* User can only change condition codes in %tstate. */
  341. err |= __get_user(psr, &scptr->sigc_psr);
  342. if (err)
  343. goto segv;
  344. regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC);
  345. regs->tstate |= psr_to_tstate_icc(psr);
  346. return;
  347. segv:
  348. do_exit(SIGSEGV);
  349. }
  350. asmlinkage void do_rt_sigreturn32(struct pt_regs *regs)
  351. {
  352. struct rt_signal_frame32 *sf;
  353. unsigned int psr;
  354. unsigned pc, npc, fpu_save;
  355. sigset_t set;
  356. sigset_t32 seta;
  357. stack_t st;
  358. int err, i;
  359. synchronize_user_stack();
  360. regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
  361. sf = (struct rt_signal_frame32 *) regs->u_regs [UREG_FP];
  362. /* 1. Make sure we are not getting garbage from the user */
  363. if (verify_area (VERIFY_READ, sf, sizeof (*sf)) ||
  364.     (((unsigned long) sf) & 3))
  365. goto segv;
  366. get_user(pc, &sf->regs.pc);
  367. __get_user(npc, &sf->regs.npc);
  368. if ((pc | npc) & 3)
  369. goto segv;
  370. if ((current->thread.flags & SPARC_FLAG_32BIT) != 0) {
  371. pc &= 0xffffffff;
  372. npc &= 0xffffffff;
  373. }
  374. regs->tpc = pc;
  375. regs->tnpc = npc;
  376. /* 2. Restore the state */
  377. err = __get_user(regs->y, &sf->regs.y);
  378. err |= __get_user(psr, &sf->regs.psr);
  379. for (i = UREG_G1; i <= UREG_I7; i++)
  380. err |= __get_user(regs->u_regs[i], &sf->regs.u_regs[i]);
  381. if ((psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS) {
  382. err |= __get_user(i, &sf->v8plus.g_upper[0]);
  383. if (i == SIGINFO_EXTRA_V8PLUS_MAGIC) {
  384. for (i = UREG_G1; i <= UREG_I7; i++)
  385. err |= __get_user(((u32 *)regs->u_regs)[2*i], &sf->v8plus.g_upper[i]);
  386. }
  387. }
  388. /* User can only change condition codes in %tstate. */
  389. regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC);
  390. regs->tstate |= psr_to_tstate_icc(psr);
  391. err |= __get_user(fpu_save, &sf->fpu_save);
  392. if (fpu_save)
  393. err |= restore_fpu_state32(regs, &sf->fpu_state);
  394. err |= copy_from_user(&seta, &sf->mask, sizeof(sigset_t32));
  395. err |= __get_user((long)st.ss_sp, &sf->stack.ss_sp);
  396. err |= __get_user(st.ss_flags, &sf->stack.ss_flags);
  397. err |= __get_user(st.ss_size, &sf->stack.ss_size);
  398. if (err)
  399. goto segv;
  400. /* It is more difficult to avoid calling this function than to
  401.    call it and ignore errors.  */
  402. do_sigaltstack(&st, NULL, (unsigned long)sf);
  403. switch (_NSIG_WORDS) {
  404. case 4: set.sig[3] = seta.sig[6] + (((long)seta.sig[7]) << 32);
  405. case 3: set.sig[2] = seta.sig[4] + (((long)seta.sig[5]) << 32);
  406. case 2: set.sig[1] = seta.sig[2] + (((long)seta.sig[3]) << 32);
  407. case 1: set.sig[0] = seta.sig[0] + (((long)seta.sig[1]) << 32);
  408. }
  409. sigdelsetmask(&set, ~_BLOCKABLE);
  410. spin_lock_irq(&current->sigmask_lock);
  411. current->blocked = set;
  412. recalc_sigpending(current);
  413. spin_unlock_irq(&current->sigmask_lock);
  414. return;
  415. segv:
  416. do_exit(SIGSEGV);
  417. }
  418. /* Checks if the fp is valid */
  419. static int invalid_frame_pointer(void *fp, int fplen)
  420. {
  421. if ((((unsigned long) fp) & 7) || ((unsigned long)fp) > 0x100000000ULL - fplen)
  422. return 1;
  423. return 0;
  424. }
  425. static inline void *get_sigframe(struct sigaction *sa, struct pt_regs *regs, unsigned long framesize)
  426. {
  427. unsigned long sp;
  428. regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
  429. sp = regs->u_regs[UREG_FP];
  430. /* This is the X/Open sanctioned signal stack switching.  */
  431. if (sa->sa_flags & SA_ONSTACK) {
  432. if (!on_sig_stack(sp) && !((current->sas_ss_sp + current->sas_ss_size) & 7))
  433. sp = current->sas_ss_sp + current->sas_ss_size;
  434. }
  435. return (void *)(sp - framesize);
  436. }
  437. static void
  438. setup_frame32(struct sigaction *sa, struct pt_regs *regs, int signr, sigset_t *oldset, siginfo_t *info)
  439. {
  440. struct signal_sframe32 *sframep;
  441. struct sigcontext32 *sc;
  442. unsigned seta[_NSIG_WORDS32];
  443. int err = 0;
  444. void *sig_address;
  445. int sig_code;
  446. unsigned long pc = regs->tpc;
  447. unsigned long npc = regs->tnpc;
  448. #if 0
  449. int window = 0;
  450. #endif
  451. unsigned psr;
  452. if ((current->thread.flags & SPARC_FLAG_32BIT) != 0) {
  453. pc &= 0xffffffff;
  454. npc &= 0xffffffff;
  455. }
  456. synchronize_user_stack();
  457. save_and_clear_fpu();
  458. sframep = (struct signal_sframe32 *)get_sigframe(sa, regs, SF_ALIGNEDSZ);
  459. if (invalid_frame_pointer (sframep, sizeof(*sframep))){
  460. #ifdef DEBUG_SIGNALS /* fills up the console logs during crashme runs, yuck... */
  461. printk("%s [%d]: User has trashed signal stackn",
  462.        current->comm, current->pid);
  463. printk("Sigstack ptr %p handler at pc<%016lx> for sig<%d>n",
  464.        sframep, pc, signr);
  465. #endif
  466. /* Don't change signal code and address, so that
  467.  * post mortem debuggers can have a look.
  468.  */
  469. do_exit(SIGILL);
  470. }
  471. sc = &sframep->sig_context;
  472. /* We've already made sure frame pointer isn't in kernel space... */
  473. err = __put_user((sas_ss_flags(regs->u_regs[UREG_FP]) == SS_ONSTACK),
  474.  &sc->sigc_onstack);
  475. switch (_NSIG_WORDS) {
  476. case 4: seta[7] = (oldset->sig[3] >> 32);
  477.         seta[6] = oldset->sig[3];
  478. case 3: seta[5] = (oldset->sig[2] >> 32);
  479.         seta[4] = oldset->sig[2];
  480. case 2: seta[3] = (oldset->sig[1] >> 32);
  481.         seta[2] = oldset->sig[1];
  482. case 1: seta[1] = (oldset->sig[0] >> 32);
  483.         seta[0] = oldset->sig[0];
  484. }
  485. err |= __put_user(seta[0], &sc->sigc_mask);
  486. err |= __copy_to_user(sframep->extramask, seta + 1,
  487.       (_NSIG_WORDS32 - 1) * sizeof(unsigned));
  488. err |= __put_user(regs->u_regs[UREG_FP], &sc->sigc_sp);
  489. err |= __put_user(pc, &sc->sigc_pc);
  490. err |= __put_user(npc, &sc->sigc_npc);
  491. psr = tstate_to_psr (regs->tstate);
  492. if(current->thread.fpsaved[0] & FPRS_FEF)
  493. psr |= PSR_EF;
  494. err |= __put_user(psr, &sc->sigc_psr);
  495. err |= __put_user(regs->u_regs[UREG_G1], &sc->sigc_g1);
  496. err |= __put_user(regs->u_regs[UREG_I0], &sc->sigc_o0);
  497. err |= __put_user(current->thread.w_saved, &sc->sigc_oswins);
  498. #if 0
  499. /* w_saved is not currently used... */
  500. if(current->thread.w_saved)
  501. for(window = 0; window < current->thread.w_saved; window++) {
  502. sc->sigc_spbuf[window] =
  503. (char *)current->thread.rwbuf_stkptrs[window];
  504. err |= copy_to_user(&sc->sigc_wbuf[window],
  505.     &current->thread.reg_window[window],
  506.     sizeof(struct reg_window));
  507. }
  508. else
  509. #endif
  510. err |= copy_in_user((u32 *)sframep,
  511.     (u32 *)(regs->u_regs[UREG_FP]),
  512.     sizeof(struct reg_window32));
  513.        
  514. current->thread.w_saved = 0; /* So process is allowed to execute. */
  515. err |= __put_user(signr, &sframep->sig_num);
  516. sig_address = NULL;
  517. sig_code = 0;
  518. if (SI_FROMKERNEL (info) && (info->si_code & __SI_MASK) == __SI_FAULT) {
  519. sig_address = info->si_addr;
  520. switch (signr) {
  521. case SIGSEGV:
  522. switch (info->si_code) {
  523. case SEGV_MAPERR: sig_code = SUBSIG_NOMAPPING; break;
  524. default: sig_code = SUBSIG_PROTECTION; break;
  525. }
  526. break;
  527. case SIGILL:
  528. switch (info->si_code) {
  529. case ILL_ILLOPC: sig_code = SUBSIG_ILLINST; break;
  530. case ILL_PRVOPC: sig_code = SUBSIG_PRIVINST; break;
  531. case ILL_ILLTRP: sig_code = SUBSIG_BADTRAP (info->si_trapno); break;
  532. default: sig_code = SUBSIG_STACK; break;
  533. }
  534. break;
  535. case SIGFPE:
  536. switch (info->si_code) {
  537. case FPE_INTDIV: sig_code = SUBSIG_IDIVZERO; break;
  538. case FPE_INTOVF: sig_code = SUBSIG_FPINTOVFL; break;
  539. case FPE_FLTDIV: sig_code = SUBSIG_FPDIVZERO; break;
  540. case FPE_FLTOVF: sig_code = SUBSIG_FPOVFLOW; break;
  541. case FPE_FLTUND: sig_code = SUBSIG_FPUNFLOW; break;
  542. case FPE_FLTRES: sig_code = SUBSIG_FPINEXACT; break;
  543. case FPE_FLTINV: sig_code = SUBSIG_FPOPERROR; break;
  544. default: sig_code = SUBSIG_FPERROR; break;
  545. }
  546. break;
  547. case SIGBUS:
  548. switch (info->si_code) {
  549. case BUS_ADRALN: sig_code = SUBSIG_ALIGNMENT; break;
  550. case BUS_ADRERR: sig_code = SUBSIG_MISCERROR; break;
  551. default: sig_code = SUBSIG_BUSTIMEOUT; break;
  552. }
  553. break;
  554. case SIGEMT:
  555. switch (info->si_code) {
  556. case EMT_TAGOVF: sig_code = SUBSIG_TAG; break;
  557. }
  558. break;
  559. case SIGSYS:
  560. if (info->si_code == (__SI_FAULT|0x100)) {
  561. /* See sys_sunos32.c */
  562. sig_code = info->si_trapno;
  563. break;
  564. }
  565. default:
  566. sig_address = NULL;
  567. }
  568. }
  569. err |= __put_user((long)sig_address, &sframep->sig_address);
  570. err |= __put_user(sig_code, &sframep->sig_code);
  571. err |= __put_user((u64)sc, &sframep->sig_scptr);
  572. if (err)
  573. goto sigsegv;
  574. regs->u_regs[UREG_FP] = (unsigned long) sframep;
  575. regs->tpc = (unsigned long) sa->sa_handler;
  576. regs->tnpc = (regs->tpc + 4);
  577. if ((current->thread.flags & SPARC_FLAG_32BIT) != 0) {
  578. regs->tpc &= 0xffffffff;
  579. regs->tnpc &= 0xffffffff;
  580. }
  581. return;
  582. sigsegv:
  583. do_exit(SIGSEGV);
  584. }
  585. static inline int save_fpu_state32(struct pt_regs *regs, __siginfo_fpu_t *fpu)
  586. {
  587. unsigned long *fpregs = (unsigned long *)(((char *)current) + AOFF_task_fpregs);
  588. unsigned long fprs;
  589. int err = 0;
  590. fprs = current->thread.fpsaved[0];
  591. if (fprs & FPRS_DL)
  592. err |= copy_to_user(&fpu->si_float_regs[0], fpregs,
  593.     (sizeof(unsigned int) * 32));
  594. if (fprs & FPRS_DU)
  595. err |= copy_to_user(&fpu->si_float_regs[32], fpregs+16,
  596.     (sizeof(unsigned int) * 32));
  597. err |= __put_user(current->thread.xfsr[0], &fpu->si_fsr);
  598. err |= __put_user(current->thread.gsr[0], &fpu->si_gsr);
  599. err |= __put_user(fprs, &fpu->si_fprs);
  600. return err;
  601. }
  602. static inline void new_setup_frame32(struct k_sigaction *ka, struct pt_regs *regs,
  603.      int signo, sigset_t *oldset)
  604. {
  605. struct new_signal_frame32 *sf;
  606. int sigframe_size;
  607. u32 psr;
  608. int i, err;
  609. unsigned seta[_NSIG_WORDS32];
  610. /* 1. Make sure everything is clean */
  611. synchronize_user_stack();
  612. save_and_clear_fpu();
  613. sigframe_size = NF_ALIGNEDSZ;
  614. if (!(current->thread.fpsaved[0] & FPRS_FEF))
  615. sigframe_size -= sizeof(__siginfo_fpu_t);
  616. sf = (struct new_signal_frame32 *)get_sigframe(&ka->sa, regs, sigframe_size);
  617. if (invalid_frame_pointer (sf, sigframe_size)) {
  618. #ifdef DEBUG_SIGNALS
  619. printk("new_setup_frame32(%s:%d): invalid_frame_pointer(%p, %d)n",
  620.        current->comm, current->pid, sf, sigframe_size);
  621. #endif
  622. goto sigill;
  623. }
  624. if (current->thread.w_saved != 0) {
  625. #ifdef DEBUG_SIGNALS
  626. printk ("%s[%d]: Invalid user stack frame for "
  627. "signal delivery.n", current->comm, current->pid);
  628. #endif
  629. goto sigill;
  630. }
  631. /* 2. Save the current process state */
  632. if ((current->thread.flags & SPARC_FLAG_32BIT) != 0) {
  633. regs->tpc &= 0xffffffff;
  634. regs->tnpc &= 0xffffffff;
  635. }
  636. err  = put_user(regs->tpc, &sf->info.si_regs.pc);
  637. err |= __put_user(regs->tnpc, &sf->info.si_regs.npc);
  638. err |= __put_user(regs->y, &sf->info.si_regs.y);
  639. psr = tstate_to_psr (regs->tstate);
  640. if(current->thread.fpsaved[0] & FPRS_FEF)
  641. psr |= PSR_EF;
  642. err |= __put_user(psr, &sf->info.si_regs.psr);
  643. for (i = 0; i < 16; i++)
  644. err |= __put_user(regs->u_regs[i], &sf->info.si_regs.u_regs[i]);
  645. err |= __put_user(sizeof(siginfo_extra_v8plus_t), &sf->extra_size);
  646. err |= __put_user(SIGINFO_EXTRA_V8PLUS_MAGIC, &sf->v8plus.g_upper[0]);
  647. for (i = 1; i < 16; i++)
  648. err |= __put_user(((u32 *)regs->u_regs)[2*i], &sf->v8plus.g_upper[i]);
  649. if (psr & PSR_EF) {
  650. err |= save_fpu_state32(regs, &sf->fpu_state);
  651. err |= __put_user((u64)&sf->fpu_state, &sf->fpu_save);
  652. } else {
  653. err |= __put_user(0, &sf->fpu_save);
  654. }
  655. switch (_NSIG_WORDS) {
  656. case 4: seta[7] = (oldset->sig[3] >> 32);
  657.         seta[6] = oldset->sig[3];
  658. case 3: seta[5] = (oldset->sig[2] >> 32);
  659.         seta[4] = oldset->sig[2];
  660. case 2: seta[3] = (oldset->sig[1] >> 32);
  661.         seta[2] = oldset->sig[1];
  662. case 1: seta[1] = (oldset->sig[0] >> 32);
  663.         seta[0] = oldset->sig[0];
  664. }
  665. err |= __put_user(seta[0], &sf->info.si_mask);
  666. err |= __copy_to_user(sf->extramask, seta + 1,
  667.       (_NSIG_WORDS32 - 1) * sizeof(unsigned));
  668. err |= copy_in_user((u32 *)sf,
  669.     (u32 *)(regs->u_regs[UREG_FP]),
  670.     sizeof(struct reg_window32));
  671. if (err)
  672. goto sigsegv;
  673. /* 3. signal handler back-trampoline and parameters */
  674. regs->u_regs[UREG_FP] = (unsigned long) sf;
  675. regs->u_regs[UREG_I0] = signo;
  676. regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
  677. /* 4. signal handler */
  678. regs->tpc = (unsigned long) ka->sa.sa_handler;
  679. regs->tnpc = (regs->tpc + 4);
  680. if ((current->thread.flags & SPARC_FLAG_32BIT) != 0) {
  681. regs->tpc &= 0xffffffff;
  682. regs->tnpc &= 0xffffffff;
  683. }
  684. /* 5. return to kernel instructions */
  685. if (ka->ka_restorer) {
  686. regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer;
  687. } else {
  688. /* Flush instruction space. */
  689. unsigned long address = ((unsigned long)&(sf->insns[0]));
  690. pgd_t *pgdp = pgd_offset(current->mm, address);
  691. pmd_t *pmdp = pmd_offset(pgdp, address);
  692. pte_t *ptep = pte_offset(pmdp, address);
  693. regs->u_regs[UREG_I7] = (unsigned long) (&(sf->insns[0]) - 2);
  694. err  = __put_user(0x821020d8, &sf->insns[0]); /*mov __NR_sigreturn, %g1*/
  695. err |= __put_user(0x91d02010, &sf->insns[1]); /*t 0x10*/
  696. if(err)
  697. goto sigsegv;
  698. if(pte_present(*ptep)) {
  699. unsigned long page = (unsigned long) page_address(pte_page(*ptep));
  700. __asm__ __volatile__(
  701. " membar #StoreStoren"
  702. " flush %0 + %1"
  703. : : "r" (page), "r" (address & (PAGE_SIZE - 1))
  704. : "memory");
  705. }
  706. }
  707. return;
  708. sigill:
  709. do_exit(SIGILL);
  710. sigsegv:
  711. do_exit(SIGSEGV);
  712. }
  713. /* Setup a Solaris stack frame */
  714. static inline void
  715. setup_svr4_frame32(struct sigaction *sa, unsigned long pc, unsigned long npc,
  716.    struct pt_regs *regs, int signr, sigset_t *oldset)
  717. {
  718. svr4_signal_frame_t *sfp;
  719. svr4_gregset_t  *gr;
  720. svr4_siginfo_t  *si;
  721. svr4_mcontext_t *mc;
  722. svr4_gwindows_t *gw;
  723. svr4_ucontext_t *uc;
  724. svr4_sigset_t setv;
  725. #if 0
  726. int window = 0;
  727. #endif
  728. unsigned psr;
  729. int i, err;
  730. synchronize_user_stack();
  731. save_and_clear_fpu();
  732. regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
  733. sfp = (svr4_signal_frame_t *) get_sigframe(sa, regs, REGWIN_SZ + SVR4_SF_ALIGNED);
  734. if (invalid_frame_pointer (sfp, sizeof (*sfp))){
  735. #ifdef DEBUG_SIGNALS
  736. printk ("Invalid stack framen");
  737. #endif
  738. do_exit(SIGILL);
  739. }
  740. /* Start with a clean frame pointer and fill it */
  741. err = clear_user(sfp, sizeof (*sfp));
  742. /* Setup convenience variables */
  743. si = &sfp->si;
  744. uc = &sfp->uc;
  745. gw = &sfp->gw;
  746. mc = &uc->mcontext;
  747. gr = &mc->greg;
  748. /* FIXME: where am I supposed to put this?
  749.  * sc->sigc_onstack = old_status;
  750.  * anyways, it does not look like it is used for anything at all.
  751.  */
  752. setv.sigbits[0] = oldset->sig[0];
  753. setv.sigbits[1] = (oldset->sig[0] >> 32);
  754. if (_NSIG_WORDS >= 2) {
  755. setv.sigbits[2] = oldset->sig[1];
  756. setv.sigbits[3] = (oldset->sig[1] >> 32);
  757. err |= __copy_to_user(&uc->sigmask, &setv, sizeof(svr4_sigset_t));
  758. } else
  759. err |= __copy_to_user(&uc->sigmask, &setv, 2 * sizeof(unsigned));
  760. /* Store registers */
  761. if ((current->thread.flags & SPARC_FLAG_32BIT) != 0) {
  762. regs->tpc &= 0xffffffff;
  763. regs->tnpc &= 0xffffffff;
  764. }
  765. err |= __put_user(regs->tpc, &((*gr) [SVR4_PC]));
  766. err |= __put_user(regs->tnpc, &((*gr) [SVR4_NPC]));
  767. psr = tstate_to_psr (regs->tstate);
  768. if(current->thread.fpsaved[0] & FPRS_FEF)
  769. psr |= PSR_EF;
  770. err |= __put_user(psr, &((*gr) [SVR4_PSR]));
  771. err |= __put_user(regs->y, &((*gr) [SVR4_Y]));
  772. /* Copy g [1..7] and o [0..7] registers */
  773. for (i = 0; i < 7; i++)
  774. err |= __put_user(regs->u_regs[UREG_G1+i], (&(*gr)[SVR4_G1])+i);
  775. for (i = 0; i < 8; i++)
  776. err |= __put_user(regs->u_regs[UREG_I0+i], (&(*gr)[SVR4_O0])+i);
  777. /* Setup sigaltstack */
  778. err |= __put_user(current->sas_ss_sp, &uc->stack.sp);
  779. err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &uc->stack.flags);
  780. err |= __put_user(current->sas_ss_size, &uc->stack.size);
  781. /* Save the currently window file: */
  782. /* 1. Link sfp->uc->gwins to our windows */
  783. err |= __put_user((u32)(long)gw, &mc->gwin);
  784.     
  785. /* 2. Number of windows to restore at setcontext (): */
  786. err |= __put_user(current->thread.w_saved, &gw->count);
  787. /* 3. Save each valid window
  788.  *    Currently, it makes a copy of the windows from the kernel copy.
  789.  *    David's code for SunOS, makes the copy but keeps the pointer to
  790.  *    the kernel.  My version makes the pointer point to a userland 
  791.  *    copy of those.  Mhm, I wonder if I shouldn't just ignore those
  792.  *    on setcontext and use those that are on the kernel, the signal
  793.  *    handler should not be modyfing those, mhm.
  794.  *
  795.  *    These windows are just used in case synchronize_user_stack failed
  796.  *    to flush the user windows.
  797.  */
  798. #if 0  
  799. for(window = 0; window < current->thread.w_saved; window++) {
  800. err |= __put_user((int *) &(gw->win [window]),
  801.   (int **)gw->winptr +window );
  802. err |= copy_to_user(&gw->win [window],
  803.     &current->thread.reg_window [window],
  804.     sizeof (svr4_rwindow_t));
  805. err |= __put_user(0, (int *)gw->winptr + window);
  806. }
  807. #endif
  808. /* 4. We just pay attention to the gw->count field on setcontext */
  809. current->thread.w_saved = 0; /* So process is allowed to execute. */
  810. /* Setup the signal information.  Solaris expects a bunch of
  811.  * information to be passed to the signal handler, we don't provide
  812.  * that much currently, should use siginfo.
  813.  */
  814. err |= __put_user(signr, &si->siginfo.signo);
  815. err |= __put_user(SVR4_SINOINFO, &si->siginfo.code);
  816. if (err)
  817. goto sigsegv;
  818. regs->u_regs[UREG_FP] = (unsigned long) sfp;
  819. regs->tpc = (unsigned long) sa->sa_handler;
  820. regs->tnpc = (regs->tpc + 4);
  821. if ((current->thread.flags & SPARC_FLAG_32BIT) != 0) {
  822. regs->tpc &= 0xffffffff;
  823. regs->tnpc &= 0xffffffff;
  824. }
  825. #ifdef DEBUG_SIGNALS
  826. printk ("Solaris-frame: %x %xn", (int) regs->tpc, (int) regs->tnpc);
  827. #endif
  828. /* Arguments passed to signal handler */
  829. if (regs->u_regs [14]){
  830. struct reg_window32 *rw = (struct reg_window32 *)
  831. (regs->u_regs [14] & 0x00000000ffffffffUL);
  832. err |= __put_user(signr, &rw->ins [0]);
  833. err |= __put_user((u64)si, &rw->ins [1]);
  834. err |= __put_user((u64)uc, &rw->ins [2]);
  835. err |= __put_user((u64)sfp, &rw->ins [6]); /* frame pointer */
  836. if (err)
  837. goto sigsegv;
  838. regs->u_regs[UREG_I0] = signr;
  839. regs->u_regs[UREG_I1] = (u32)(u64) si;
  840. regs->u_regs[UREG_I2] = (u32)(u64) uc;
  841. }
  842. return;
  843. sigsegv:
  844. do_exit(SIGSEGV);
  845. }
  846. asmlinkage int
  847. svr4_getcontext(svr4_ucontext_t *uc, struct pt_regs *regs)
  848. {
  849. svr4_gregset_t  *gr;
  850. svr4_mcontext_t *mc;
  851. svr4_sigset_t setv;
  852. int i, err;
  853. synchronize_user_stack();
  854. save_and_clear_fpu();
  855. if (current->thread.w_saved){
  856. printk ("Uh oh, w_saved is not zero (%d)n", (int) current->thread.w_saved);
  857. do_exit (SIGSEGV);
  858. }
  859. err = clear_user(uc, sizeof (*uc));
  860. /* Setup convenience variables */
  861. mc = &uc->mcontext;
  862. gr = &mc->greg;
  863. setv.sigbits[0] = current->blocked.sig[0];
  864. setv.sigbits[1] = (current->blocked.sig[0] >> 32);
  865. if (_NSIG_WORDS >= 2) {
  866. setv.sigbits[2] = current->blocked.sig[1];
  867. setv.sigbits[3] = (current->blocked.sig[1] >> 32);
  868. err |= __copy_to_user(&uc->sigmask, &setv, sizeof(svr4_sigset_t));
  869. } else
  870. err |= __copy_to_user(&uc->sigmask, &setv, 2 * sizeof(unsigned));
  871. /* Store registers */
  872. if ((current->thread.flags & SPARC_FLAG_32BIT) != 0) {
  873. regs->tpc &= 0xffffffff;
  874. regs->tnpc &= 0xffffffff;
  875. }
  876. err |= __put_user(regs->tpc, &uc->mcontext.greg [SVR4_PC]);
  877. err |= __put_user(regs->tnpc, &uc->mcontext.greg [SVR4_NPC]);
  878. #if 1
  879. err |= __put_user(0, &uc->mcontext.greg [SVR4_PSR]);
  880. #else
  881. i = tstate_to_psr(regs->tstate) & ~PSR_EF;    
  882. if (current->thread.fpsaved[0] & FPRS_FEF)
  883. i |= PSR_EF;
  884. err |= __put_user(i, &uc->mcontext.greg [SVR4_PSR]);
  885. #endif
  886. err |= __put_user(regs->y, &uc->mcontext.greg [SVR4_Y]);
  887. /* Copy g [1..7] and o [0..7] registers */
  888. for (i = 0; i < 7; i++)
  889. err |= __put_user(regs->u_regs[UREG_G1+i], (&(*gr)[SVR4_G1])+i);
  890. for (i = 0; i < 8; i++)
  891. err |= __put_user(regs->u_regs[UREG_I0+i], (&(*gr)[SVR4_O0])+i);
  892. /* Setup sigaltstack */
  893. err |= __put_user(current->sas_ss_sp, &uc->stack.sp);
  894. err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &uc->stack.flags);
  895. err |= __put_user(current->sas_ss_size, &uc->stack.size);
  896. /* The register file is not saved
  897.  * we have already stuffed all of it with sync_user_stack
  898.  */
  899. return (err ? -EFAULT : 0);
  900. }
  901. /* Set the context for a svr4 application, this is Solaris way to sigreturn */
  902. asmlinkage int svr4_setcontext(svr4_ucontext_t *c, struct pt_regs *regs)
  903. {
  904. struct thread_struct *tp = &current->thread;
  905. svr4_gregset_t  *gr;
  906. u32 pc, npc, psr;
  907. sigset_t set;
  908. svr4_sigset_t setv;
  909. int i, err;
  910. stack_t st;
  911. /* Fixme: restore windows, or is this already taken care of in
  912.  * svr4_setup_frame when sync_user_windows is done?
  913.  */
  914. flush_user_windows();
  915. if (tp->w_saved){
  916. printk ("Uh oh, w_saved is: 0x%xn", tp->w_saved);
  917. goto sigsegv;
  918. }
  919. if (((unsigned long) c) & 3){
  920. printk ("Unaligned structure passedn");
  921. goto sigsegv;
  922. }
  923. if(!__access_ok((unsigned long)c, sizeof(*c))) {
  924. /* Miguel, add nice debugging msg _here_. ;-) */
  925. goto sigsegv;
  926. }
  927. /* Check for valid PC and nPC */
  928. gr = &c->mcontext.greg;
  929. err = __get_user(pc, &((*gr)[SVR4_PC]));
  930. err |= __get_user(npc, &((*gr)[SVR4_NPC]));
  931. if((pc | npc) & 3) {
  932. #ifdef DEBUG_SIGNALS
  933.         printk ("setcontext, PC or nPC were bogusn");
  934. #endif
  935. goto sigsegv;
  936. }
  937. /* Retrieve information from passed ucontext */
  938. /* note that nPC is ored a 1, this is used to inform entry.S */
  939. /* that we don't want it to mess with our PC and nPC */
  940. err |= copy_from_user (&setv, &c->sigmask, sizeof(svr4_sigset_t));
  941. set.sig[0] = setv.sigbits[0] | (((long)setv.sigbits[1]) << 32);
  942. if (_NSIG_WORDS >= 2)
  943. set.sig[1] = setv.sigbits[2] | (((long)setv.sigbits[3]) << 32);
  944. err |= __get_user((long)st.ss_sp, &c->stack.sp);
  945. err |= __get_user(st.ss_flags, &c->stack.flags);
  946. err |= __get_user(st.ss_size, &c->stack.size);
  947. if (err)
  948. goto sigsegv;
  949. /* It is more difficult to avoid calling this function than to
  950.    call it and ignore errors.  */
  951. do_sigaltstack(&st, NULL, regs->u_regs[UREG_I6]);
  952. sigdelsetmask(&set, ~_BLOCKABLE);
  953. spin_lock_irq(&current->sigmask_lock);
  954. current->blocked = set;
  955. recalc_sigpending(current);
  956. spin_unlock_irq(&current->sigmask_lock);
  957. regs->tpc = pc;
  958. regs->tnpc = npc | 1;
  959. if ((current->thread.flags & SPARC_FLAG_32BIT) != 0) {
  960. regs->tpc &= 0xffffffff;
  961. regs->tnpc &= 0xffffffff;
  962. }
  963. err |= __get_user(regs->y, &((*gr) [SVR4_Y]));
  964. err |= __get_user(psr, &((*gr) [SVR4_PSR]));
  965. regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC);
  966. regs->tstate |= psr_to_tstate_icc(psr);
  967. #if 0
  968. if(psr & PSR_EF)
  969. regs->tstate |= TSTATE_PEF;
  970. #endif
  971. /* Restore g[1..7] and o[0..7] registers */
  972. for (i = 0; i < 7; i++)
  973. err |= __get_user(regs->u_regs[UREG_G1+i], (&(*gr)[SVR4_G1])+i);
  974. for (i = 0; i < 8; i++)
  975. err |= __get_user(regs->u_regs[UREG_I0+i], (&(*gr)[SVR4_O0])+i);
  976. if(err)
  977. goto sigsegv;
  978. return -EINTR;
  979. sigsegv:
  980. do_exit(SIGSEGV);
  981. }
  982. static inline void setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs,
  983.         unsigned long signr, sigset_t *oldset,
  984.         siginfo_t *info)
  985. {
  986. struct rt_signal_frame32 *sf;
  987. int sigframe_size;
  988. u32 psr;
  989. int i, err;
  990. sigset_t32 seta;
  991. /* 1. Make sure everything is clean */
  992. synchronize_user_stack();
  993. save_and_clear_fpu();
  994. sigframe_size = RT_ALIGNEDSZ;
  995. if (!(current->thread.fpsaved[0] & FPRS_FEF))
  996. sigframe_size -= sizeof(__siginfo_fpu_t);
  997. sf = (struct rt_signal_frame32 *)get_sigframe(&ka->sa, regs, sigframe_size);
  998. if (invalid_frame_pointer (sf, sigframe_size)) {
  999. #ifdef DEBUG_SIGNALS
  1000. printk("rt_setup_frame32(%s:%d): invalid_frame_pointer(%p, %d)n",
  1001.        current->comm, current->pid, sf, sigframe_size);
  1002. #endif
  1003. goto sigill;
  1004. }
  1005. if (current->thread.w_saved != 0) {
  1006. #ifdef DEBUG_SIGNALS
  1007. printk ("%s[%d]: Invalid user stack frame for "
  1008. "signal delivery.n", current->comm, current->pid);
  1009. #endif
  1010. goto sigill;
  1011. }
  1012. /* 2. Save the current process state */
  1013. if ((current->thread.flags & SPARC_FLAG_32BIT) != 0) {
  1014. regs->tpc &= 0xffffffff;
  1015. regs->tnpc &= 0xffffffff;
  1016. }
  1017. err  = put_user(regs->tpc, &sf->regs.pc);
  1018. err |= __put_user(regs->tnpc, &sf->regs.npc);
  1019. err |= __put_user(regs->y, &sf->regs.y);
  1020. psr = tstate_to_psr (regs->tstate);
  1021. if(current->thread.fpsaved[0] & FPRS_FEF)
  1022. psr |= PSR_EF;
  1023. err |= __put_user(psr, &sf->regs.psr);
  1024. for (i = 0; i < 16; i++)
  1025. err |= __put_user(regs->u_regs[i], &sf->regs.u_regs[i]);
  1026. err |= __put_user(sizeof(siginfo_extra_v8plus_t), &sf->extra_size);
  1027. err |= __put_user(SIGINFO_EXTRA_V8PLUS_MAGIC, &sf->v8plus.g_upper[0]);
  1028. for (i = 1; i < 16; i++)
  1029. err |= __put_user(((u32 *)regs->u_regs)[2*i], &sf->v8plus.g_upper[i]);
  1030. if (psr & PSR_EF) {
  1031. err |= save_fpu_state32(regs, &sf->fpu_state);
  1032. err |= __put_user((u64)&sf->fpu_state, &sf->fpu_save);
  1033. } else {
  1034. err |= __put_user(0, &sf->fpu_save);
  1035. }
  1036. /* Update the siginfo structure.  */
  1037. err |= copy_siginfo_to_user32(&sf->info, info);
  1038. /* Setup sigaltstack */
  1039. err |= __put_user(current->sas_ss_sp, &sf->stack.ss_sp);
  1040. err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &sf->stack.ss_flags);
  1041. err |= __put_user(current->sas_ss_size, &sf->stack.ss_size);
  1042. switch (_NSIG_WORDS) {
  1043. case 4: seta.sig[7] = (oldset->sig[3] >> 32);
  1044. seta.sig[6] = oldset->sig[3];
  1045. case 3: seta.sig[5] = (oldset->sig[2] >> 32);
  1046. seta.sig[4] = oldset->sig[2];
  1047. case 2: seta.sig[3] = (oldset->sig[1] >> 32);
  1048. seta.sig[2] = oldset->sig[1];
  1049. case 1: seta.sig[1] = (oldset->sig[0] >> 32);
  1050. seta.sig[0] = oldset->sig[0];
  1051. }
  1052. err |= __copy_to_user(&sf->mask, &seta, sizeof(sigset_t32));
  1053. err |= copy_in_user((u32 *)sf,
  1054.     (u32 *)(regs->u_regs[UREG_FP]),
  1055.     sizeof(struct reg_window32));
  1056. if (err)
  1057. goto sigsegv;
  1058. /* 3. signal handler back-trampoline and parameters */
  1059. regs->u_regs[UREG_FP] = (unsigned long) sf;
  1060. regs->u_regs[UREG_I0] = signr;
  1061. regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
  1062. /* 4. signal handler */
  1063. regs->tpc = (unsigned long) ka->sa.sa_handler;
  1064. regs->tnpc = (regs->tpc + 4);
  1065. if ((current->thread.flags & SPARC_FLAG_32BIT) != 0) {
  1066. regs->tpc &= 0xffffffff;
  1067. regs->tnpc &= 0xffffffff;
  1068. }
  1069. /* 5. return to kernel instructions */
  1070. if (ka->ka_restorer)
  1071. regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer;
  1072. else {
  1073. /* Flush instruction space. */
  1074. unsigned long address = ((unsigned long)&(sf->insns[0]));
  1075. pgd_t *pgdp = pgd_offset(current->mm, address);
  1076. pmd_t *pmdp = pmd_offset(pgdp, address);
  1077. pte_t *ptep = pte_offset(pmdp, address);
  1078. regs->u_regs[UREG_I7] = (unsigned long) (&(sf->insns[0]) - 2);
  1079. /* mov __NR_rt_sigreturn, %g1 */
  1080. err |= __put_user(0x82102065, &sf->insns[0]);
  1081. /* t 0x10 */
  1082. err |= __put_user(0x91d02010, &sf->insns[1]);
  1083. if (err)
  1084. goto sigsegv;
  1085. if(pte_present(*ptep)) {
  1086. unsigned long page = (unsigned long) page_address(pte_page(*ptep));
  1087. __asm__ __volatile__(
  1088. " membar #StoreStoren"
  1089. " flush %0 + %1"
  1090. : : "r" (page), "r" (address & (PAGE_SIZE - 1))
  1091. : "memory");
  1092. }
  1093. }
  1094. return;
  1095. sigill:
  1096. do_exit(SIGILL);
  1097. sigsegv:
  1098. do_exit(SIGSEGV);
  1099. }
  1100. static inline void handle_signal32(unsigned long signr, struct k_sigaction *ka,
  1101.    siginfo_t *info,
  1102.    sigset_t *oldset, struct pt_regs *regs,
  1103.    int svr4_signal)
  1104. {
  1105. if(svr4_signal)
  1106. setup_svr4_frame32(&ka->sa, regs->tpc, regs->tnpc, regs, signr, oldset);
  1107. else {
  1108. if (ka->sa.sa_flags & SA_SIGINFO)
  1109. setup_rt_frame32(ka, regs, signr, oldset, info);
  1110. else if (current->thread.flags & SPARC_FLAG_NEWSIGNALS)
  1111. new_setup_frame32(ka, regs, signr, oldset);
  1112. else
  1113. setup_frame32(&ka->sa, regs, signr, oldset, info);
  1114. }
  1115. if(ka->sa.sa_flags & SA_ONESHOT)
  1116. ka->sa.sa_handler = SIG_DFL;
  1117. if(!(ka->sa.sa_flags & SA_NOMASK)) {
  1118. spin_lock_irq(&current->sigmask_lock);
  1119. sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
  1120. sigaddset(&current->blocked,signr);
  1121. recalc_sigpending(current);
  1122. spin_unlock_irq(&current->sigmask_lock);
  1123. }
  1124. }
  1125. static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs,
  1126.      struct sigaction *sa)
  1127. {
  1128. switch(regs->u_regs[UREG_I0]) {
  1129. case ERESTARTNOHAND:
  1130. no_system_call_restart:
  1131. regs->u_regs[UREG_I0] = EINTR;
  1132. regs->tstate |= TSTATE_ICARRY;
  1133. break;
  1134. case ERESTARTSYS:
  1135. if(!(sa->sa_flags & SA_RESTART))
  1136. goto no_system_call_restart;
  1137. /* fallthrough */
  1138. case ERESTARTNOINTR:
  1139. regs->u_regs[UREG_I0] = orig_i0;
  1140. regs->tpc -= 4;
  1141. regs->tnpc -= 4;
  1142. }
  1143. }
  1144. #ifdef DEBUG_SIGNALS_MAPS
  1145. #define MAPS_LINE_FORMAT   "%016lx-%016lx %s %016lx %s %lu "
  1146. static inline void read_maps (void)
  1147. {
  1148. struct vm_area_struct * map, * next;
  1149. char * buffer;
  1150. ssize_t i;
  1151. buffer = (char*)__get_free_page(GFP_KERNEL);
  1152. if (!buffer)
  1153. return;
  1154. for (map = current->mm->mmap ; map ; map = next ) {
  1155. /* produce the next line */
  1156. char *line;
  1157. char str[5], *cp = str;
  1158. int flags;
  1159. kdev_t dev;
  1160. unsigned long ino;
  1161. /*
  1162.  * Get the next vma now (but it won't be used if we sleep).
  1163.  */
  1164. next = map->vm_next;
  1165. flags = map->vm_flags;
  1166. *cp++ = flags & VM_READ ? 'r' : '-';
  1167. *cp++ = flags & VM_WRITE ? 'w' : '-';
  1168. *cp++ = flags & VM_EXEC ? 'x' : '-';
  1169. *cp++ = flags & VM_MAYSHARE ? 's' : 'p';
  1170. *cp++ = 0;
  1171. dev = 0;
  1172. ino = 0;
  1173. if (map->vm_file != NULL) {
  1174. dev = map->vm_file->f_dentry->d_inode->i_dev;
  1175. ino = map->vm_file->f_dentry->d_inode->i_ino;
  1176. line = d_path(map->vm_file->f_dentry,
  1177.       map->vm_file->f_vfsmnt,
  1178.       buffer, PAGE_SIZE);
  1179. }
  1180. printk(MAPS_LINE_FORMAT, map->vm_start, map->vm_end, str, map->vm_pgoff << PAGE_SHIFT,
  1181.       kdevname(dev), ino);
  1182. if (map->vm_file != NULL)
  1183. printk("%sn", line);
  1184. else
  1185. printk("n");
  1186. }
  1187. free_page((unsigned long)buffer);
  1188. return;
  1189. }
  1190. #endif
  1191. /* Note that 'init' is a special process: it doesn't get signals it doesn't
  1192.  * want to handle. Thus you cannot kill init even with a SIGKILL even by
  1193.  * mistake.
  1194.  */
  1195. asmlinkage int do_signal32(sigset_t *oldset, struct pt_regs * regs,
  1196.    unsigned long orig_i0, int restart_syscall)
  1197. {
  1198. unsigned long signr;
  1199. struct k_sigaction *ka;
  1200. siginfo_t info;
  1201. int svr4_signal = current->personality == PER_SVR4;
  1202. for (;;) {
  1203. spin_lock_irq(&current->sigmask_lock);
  1204. signr = dequeue_signal(&current->blocked, &info);
  1205. spin_unlock_irq(&current->sigmask_lock);
  1206. if (!signr) break;
  1207. if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) {
  1208. current->exit_code = signr;
  1209. current->state = TASK_STOPPED;
  1210. notify_parent(current, SIGCHLD);
  1211. schedule();
  1212. if (!(signr = current->exit_code))
  1213. continue;
  1214. current->exit_code = 0;
  1215. if (signr == SIGSTOP)
  1216. continue;
  1217. /* Update the siginfo structure.  Is this good?  */
  1218. if (signr != info.si_signo) {
  1219. info.si_signo = signr;
  1220. info.si_errno = 0;
  1221. info.si_code = SI_USER;
  1222. info.si_pid = current->p_pptr->pid;
  1223. info.si_uid = current->p_pptr->uid;
  1224. }
  1225. /* If the (new) signal is now blocked, requeue it.  */
  1226. if (sigismember(&current->blocked, signr)) {
  1227. send_sig_info(signr, &info, current);
  1228. continue;
  1229. }
  1230. }
  1231. ka = &current->sig->action[signr-1];
  1232. if(ka->sa.sa_handler == SIG_IGN) {
  1233. if(signr != SIGCHLD)
  1234. continue;
  1235. /* sys_wait4() grabs the master kernel lock, so
  1236.  * we need not do so, that sucker should be
  1237.  * threaded and would not be that difficult to
  1238.  * do anyways.
  1239.  */
  1240. while(sys_wait4(-1, NULL, WNOHANG, NULL) > 0)
  1241. ;
  1242. continue;
  1243. }
  1244. if(ka->sa.sa_handler == SIG_DFL) {
  1245. unsigned long exit_code = signr;
  1246. if(current->pid == 1)
  1247. continue;
  1248. switch(signr) {
  1249. case SIGCONT: case SIGCHLD: case SIGWINCH:
  1250. continue;
  1251. case SIGTSTP: case SIGTTIN: case SIGTTOU:
  1252. if (is_orphaned_pgrp(current->pgrp))
  1253. continue;
  1254. case SIGSTOP:
  1255. if (current->ptrace & PT_PTRACED)
  1256. continue;
  1257. current->state = TASK_STOPPED;
  1258. current->exit_code = signr;
  1259. if(!(current->p_pptr->sig->action[SIGCHLD-1].sa.sa_flags &
  1260.      SA_NOCLDSTOP))
  1261. notify_parent(current, SIGCHLD);
  1262. schedule();
  1263. continue;
  1264. case SIGQUIT: case SIGILL: case SIGTRAP:
  1265. case SIGABRT: case SIGFPE: case SIGSEGV:
  1266. case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ:
  1267. if (do_coredump(signr, regs))
  1268. exit_code |= 0x80;
  1269. #ifdef DEBUG_SIGNALS
  1270. /* Very useful to debug dynamic linker problems */
  1271. printk ("Sig %ld going for %s[%d]...n", signr, current->comm, current->pid);
  1272. /* On SMP we are only interested in the current
  1273.  * CPU's registers.
  1274.  */
  1275. __show_regs (regs);
  1276. #ifdef DEBUG_SIGNALS_TLB
  1277. do {
  1278. extern void sparc_ultra_dump_itlb(void);
  1279. extern void sparc_ultra_dump_dtlb(void);
  1280. sparc_ultra_dump_dtlb();
  1281. sparc_ultra_dump_itlb();
  1282. } while(0);
  1283. #endif
  1284. #ifdef DEBUG_SIGNALS_TRACE
  1285. {
  1286. struct reg_window32 *rw = (struct reg_window32 *)(regs->u_regs[UREG_FP] & 0xffffffff);
  1287. unsigned int ins[8];
  1288. while(rw &&
  1289.       !(((unsigned long) rw) & 0x3)) {
  1290. copy_from_user(ins, &rw->ins[0], sizeof(ins));
  1291. printk("Caller[%08x](%08x,%08x,%08x,%08x,%08x,%08x)n", ins[7], ins[0], ins[1], ins[2], ins[3], ins[4], ins[5]);
  1292. rw = (struct reg_window32 *)(unsigned long)ins[6];
  1293. }
  1294. }
  1295. #endif
  1296. #ifdef DEBUG_SIGNALS_MAPS
  1297. printk("Maps:n");
  1298. read_maps();
  1299. #endif
  1300. #endif
  1301. /* fall through */
  1302. default:
  1303. sigaddset(&current->pending.signal, signr);
  1304. recalc_sigpending(current);
  1305. current->flags |= PF_SIGNALED;
  1306. do_exit(exit_code);
  1307. /* NOT REACHED */
  1308. }
  1309. }
  1310. if(restart_syscall)
  1311. syscall_restart32(orig_i0, regs, &ka->sa);
  1312. handle_signal32(signr, ka, &info, oldset, regs, svr4_signal);
  1313. return 1;
  1314. }
  1315. if(restart_syscall &&
  1316.    (regs->u_regs[UREG_I0] == ERESTARTNOHAND ||
  1317.     regs->u_regs[UREG_I0] == ERESTARTSYS ||
  1318.     regs->u_regs[UREG_I0] == ERESTARTNOINTR)) {
  1319. /* replay the system call when we are done */
  1320. regs->u_regs[UREG_I0] = orig_i0;
  1321. regs->tpc -= 4;
  1322. regs->tnpc -= 4;
  1323. }
  1324. return 0;
  1325. }
  1326. struct sigstack32 {
  1327. u32 the_stack;
  1328. int cur_status;
  1329. };
  1330. asmlinkage int do_sys32_sigstack(u32 u_ssptr, u32 u_ossptr, unsigned long sp)
  1331. {
  1332. struct sigstack32 *ssptr = (struct sigstack32 *)((unsigned long)(u_ssptr));
  1333. struct sigstack32 *ossptr = (struct sigstack32 *)((unsigned long)(u_ossptr));
  1334. int ret = -EFAULT;
  1335. /* First see if old state is wanted. */
  1336. if (ossptr) {
  1337. if (put_user(current->sas_ss_sp + current->sas_ss_size, &ossptr->the_stack) ||
  1338.     __put_user(on_sig_stack(sp), &ossptr->cur_status))
  1339. goto out;
  1340. }
  1341. /* Now see if we want to update the new state. */
  1342. if (ssptr) {
  1343. void *ss_sp;
  1344. if (get_user((long)ss_sp, &ssptr->the_stack))
  1345. goto out;
  1346. /* If the current stack was set with sigaltstack, don't
  1347.    swap stacks while we are on it.  */
  1348. ret = -EPERM;
  1349. if (current->sas_ss_sp && on_sig_stack(sp))
  1350. goto out;
  1351. /* Since we don't know the extent of the stack, and we don't
  1352.    track onstack-ness, but rather calculate it, we must
  1353.    presume a size.  Ho hum this interface is lossy.  */
  1354. current->sas_ss_sp = (unsigned long)ss_sp - SIGSTKSZ;
  1355. current->sas_ss_size = SIGSTKSZ;
  1356. }
  1357. ret = 0;
  1358. out:
  1359. return ret;
  1360. }
  1361. asmlinkage int do_sys32_sigaltstack(u32 ussa, u32 uossa, unsigned long sp)
  1362. {
  1363. stack_t uss, uoss;
  1364. int ret;
  1365. mm_segment_t old_fs;
  1366. if (ussa && (get_user((long)uss.ss_sp, &((stack_t32 *)(long)ussa)->ss_sp) ||
  1367.     __get_user(uss.ss_flags, &((stack_t32 *)(long)ussa)->ss_flags) ||
  1368.     __get_user(uss.ss_size, &((stack_t32 *)(long)ussa)->ss_size)))
  1369. return -EFAULT;
  1370. old_fs = get_fs();
  1371. set_fs(KERNEL_DS);
  1372. ret = do_sigaltstack(ussa ? &uss : NULL, uossa ? &uoss : NULL, sp);
  1373. set_fs(old_fs);
  1374. if (!ret && uossa && (put_user((long)uoss.ss_sp, &((stack_t32 *)(long)uossa)->ss_sp) ||
  1375.     __put_user(uoss.ss_flags, &((stack_t32 *)(long)uossa)->ss_flags) ||
  1376.     __put_user(uoss.ss_size, &((stack_t32 *)(long)uossa)->ss_size)))
  1377. return -EFAULT;
  1378. return ret;
  1379. }