signal.c 31 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123
  1. /* $Id: signal.c,v 1.110 2002/02/08 03:57:14 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/sched.h>
  10. #include <linux/kernel.h>
  11. #include <linux/signal.h>
  12. #include <linux/errno.h>
  13. #include <linux/wait.h>
  14. #include <linux/ptrace.h>
  15. #include <linux/unistd.h>
  16. #include <linux/mm.h>
  17. #include <linux/tty.h>
  18. #include <linux/smp.h>
  19. #include <linux/binfmts.h> /* do_coredum */
  20. #include <linux/bitops.h>
  21. #include <asm/uaccess.h>
  22. #include <asm/ptrace.h>
  23. #include <asm/svr4.h>
  24. #include <asm/pgalloc.h>
  25. #include <asm/pgtable.h>
  26. #include <asm/cacheflush.h> /* flush_sig_insns */
  27. #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
  28. extern void fpsave(unsigned long *fpregs, unsigned long *fsr,
  29. void *fpqueue, unsigned long *fpqdepth);
  30. extern void fpload(unsigned long *fpregs, unsigned long *fsr);
  31. /* Signal frames: the original one (compatible with SunOS):
  32. *
  33. * Set up a signal frame... Make the stack look the way SunOS
  34. * expects it to look which is basically:
  35. *
  36. * ---------------------------------- <-- %sp at signal time
  37. * Struct sigcontext
  38. * Signal address
  39. * Ptr to sigcontext area above
  40. * Signal code
  41. * The signal number itself
  42. * One register window
  43. * ---------------------------------- <-- New %sp
  44. */
  45. struct signal_sframe {
  46. struct reg_window sig_window;
  47. int sig_num;
  48. int sig_code;
  49. struct sigcontext __user *sig_scptr;
  50. int sig_address;
  51. struct sigcontext sig_context;
  52. unsigned int extramask[_NSIG_WORDS - 1];
  53. };
  54. /*
  55. * And the new one, intended to be used for Linux applications only
  56. * (we have enough in there to work with clone).
  57. * All the interesting bits are in the info field.
  58. */
  59. struct new_signal_frame {
  60. struct sparc_stackf ss;
  61. __siginfo_t info;
  62. __siginfo_fpu_t __user *fpu_save;
  63. unsigned long insns[2] __attribute__ ((aligned (8)));
  64. unsigned int extramask[_NSIG_WORDS - 1];
  65. unsigned int extra_size; /* Should be 0 */
  66. __siginfo_fpu_t fpu_state;
  67. };
  68. struct rt_signal_frame {
  69. struct sparc_stackf ss;
  70. siginfo_t info;
  71. struct pt_regs regs;
  72. sigset_t mask;
  73. __siginfo_fpu_t __user *fpu_save;
  74. unsigned int insns[2];
  75. stack_t stack;
  76. unsigned int extra_size; /* Should be 0 */
  77. __siginfo_fpu_t fpu_state;
  78. };
  79. /* Align macros */
  80. #define SF_ALIGNEDSZ (((sizeof(struct signal_sframe) + 7) & (~7)))
  81. #define NF_ALIGNEDSZ (((sizeof(struct new_signal_frame) + 7) & (~7)))
  82. #define RT_ALIGNEDSZ (((sizeof(struct rt_signal_frame) + 7) & (~7)))
  83. static int _sigpause_common(old_sigset_t set)
  84. {
  85. set &= _BLOCKABLE;
  86. spin_lock_irq(&current->sighand->siglock);
  87. current->saved_sigmask = current->blocked;
  88. siginitset(&current->blocked, set);
  89. recalc_sigpending();
  90. spin_unlock_irq(&current->sighand->siglock);
  91. current->state = TASK_INTERRUPTIBLE;
  92. schedule();
  93. set_thread_flag(TIF_RESTORE_SIGMASK);
  94. return -ERESTARTNOHAND;
  95. }
  96. asmlinkage int sys_sigpause(unsigned int set)
  97. {
  98. return _sigpause_common(set);
  99. }
  100. asmlinkage int sys_sigsuspend(old_sigset_t set)
  101. {
  102. return _sigpause_common(set);
  103. }
  104. static inline int
  105. restore_fpu_state(struct pt_regs *regs, __siginfo_fpu_t __user *fpu)
  106. {
  107. int err;
  108. #ifdef CONFIG_SMP
  109. if (test_tsk_thread_flag(current, TIF_USEDFPU))
  110. regs->psr &= ~PSR_EF;
  111. #else
  112. if (current == last_task_used_math) {
  113. last_task_used_math = NULL;
  114. regs->psr &= ~PSR_EF;
  115. }
  116. #endif
  117. set_used_math();
  118. clear_tsk_thread_flag(current, TIF_USEDFPU);
  119. if (!access_ok(VERIFY_READ, fpu, sizeof(*fpu)))
  120. return -EFAULT;
  121. err = __copy_from_user(&current->thread.float_regs[0], &fpu->si_float_regs[0],
  122. (sizeof(unsigned long) * 32));
  123. err |= __get_user(current->thread.fsr, &fpu->si_fsr);
  124. err |= __get_user(current->thread.fpqdepth, &fpu->si_fpqdepth);
  125. if (current->thread.fpqdepth != 0)
  126. err |= __copy_from_user(&current->thread.fpqueue[0],
  127. &fpu->si_fpqueue[0],
  128. ((sizeof(unsigned long) +
  129. (sizeof(unsigned long *)))*16));
  130. return err;
  131. }
  132. static inline void do_new_sigreturn (struct pt_regs *regs)
  133. {
  134. struct new_signal_frame __user *sf;
  135. unsigned long up_psr, pc, npc;
  136. sigset_t set;
  137. __siginfo_fpu_t __user *fpu_save;
  138. int err;
  139. sf = (struct new_signal_frame __user *) regs->u_regs[UREG_FP];
  140. /* 1. Make sure we are not getting garbage from the user */
  141. if (!access_ok(VERIFY_READ, sf, sizeof(*sf)))
  142. goto segv_and_exit;
  143. if (((unsigned long) sf) & 3)
  144. goto segv_and_exit;
  145. err = __get_user(pc, &sf->info.si_regs.pc);
  146. err |= __get_user(npc, &sf->info.si_regs.npc);
  147. if ((pc | npc) & 3)
  148. goto segv_and_exit;
  149. /* 2. Restore the state */
  150. up_psr = regs->psr;
  151. err |= __copy_from_user(regs, &sf->info.si_regs, sizeof(struct pt_regs));
  152. /* User can only change condition codes and FPU enabling in %psr. */
  153. regs->psr = (up_psr & ~(PSR_ICC | PSR_EF))
  154. | (regs->psr & (PSR_ICC | PSR_EF));
  155. err |= __get_user(fpu_save, &sf->fpu_save);
  156. if (fpu_save)
  157. err |= restore_fpu_state(regs, fpu_save);
  158. /* This is pretty much atomic, no amount locking would prevent
  159. * the races which exist anyways.
  160. */
  161. err |= __get_user(set.sig[0], &sf->info.si_mask);
  162. err |= __copy_from_user(&set.sig[1], &sf->extramask,
  163. (_NSIG_WORDS-1) * sizeof(unsigned int));
  164. if (err)
  165. goto segv_and_exit;
  166. sigdelsetmask(&set, ~_BLOCKABLE);
  167. spin_lock_irq(&current->sighand->siglock);
  168. current->blocked = set;
  169. recalc_sigpending();
  170. spin_unlock_irq(&current->sighand->siglock);
  171. return;
  172. segv_and_exit:
  173. force_sig(SIGSEGV, current);
  174. }
  175. asmlinkage void do_sigreturn(struct pt_regs *regs)
  176. {
  177. struct sigcontext __user *scptr;
  178. unsigned long pc, npc, psr;
  179. sigset_t set;
  180. int err;
  181. /* Always make any pending restarted system calls return -EINTR */
  182. current_thread_info()->restart_block.fn = do_no_restart_syscall;
  183. synchronize_user_stack();
  184. if (current->thread.new_signal) {
  185. do_new_sigreturn(regs);
  186. return;
  187. }
  188. scptr = (struct sigcontext __user *) regs->u_regs[UREG_I0];
  189. /* Check sanity of the user arg. */
  190. if (!access_ok(VERIFY_READ, scptr, sizeof(struct sigcontext)) ||
  191. (((unsigned long) scptr) & 3))
  192. goto segv_and_exit;
  193. err = __get_user(pc, &scptr->sigc_pc);
  194. err |= __get_user(npc, &scptr->sigc_npc);
  195. if ((pc | npc) & 3)
  196. goto segv_and_exit;
  197. /* This is pretty much atomic, no amount locking would prevent
  198. * the races which exist anyways.
  199. */
  200. err |= __get_user(set.sig[0], &scptr->sigc_mask);
  201. /* Note that scptr + 1 points to extramask */
  202. err |= __copy_from_user(&set.sig[1], scptr + 1,
  203. (_NSIG_WORDS - 1) * sizeof(unsigned int));
  204. if (err)
  205. goto segv_and_exit;
  206. sigdelsetmask(&set, ~_BLOCKABLE);
  207. spin_lock_irq(&current->sighand->siglock);
  208. current->blocked = set;
  209. recalc_sigpending();
  210. spin_unlock_irq(&current->sighand->siglock);
  211. regs->pc = pc;
  212. regs->npc = npc;
  213. err = __get_user(regs->u_regs[UREG_FP], &scptr->sigc_sp);
  214. err |= __get_user(regs->u_regs[UREG_I0], &scptr->sigc_o0);
  215. err |= __get_user(regs->u_regs[UREG_G1], &scptr->sigc_g1);
  216. /* User can only change condition codes in %psr. */
  217. err |= __get_user(psr, &scptr->sigc_psr);
  218. if (err)
  219. goto segv_and_exit;
  220. regs->psr &= ~(PSR_ICC);
  221. regs->psr |= (psr & PSR_ICC);
  222. return;
  223. segv_and_exit:
  224. force_sig(SIGSEGV, current);
  225. }
  226. asmlinkage void do_rt_sigreturn(struct pt_regs *regs)
  227. {
  228. struct rt_signal_frame __user *sf;
  229. unsigned int psr, pc, npc;
  230. __siginfo_fpu_t __user *fpu_save;
  231. mm_segment_t old_fs;
  232. sigset_t set;
  233. stack_t st;
  234. int err;
  235. synchronize_user_stack();
  236. sf = (struct rt_signal_frame __user *) regs->u_regs[UREG_FP];
  237. if (!access_ok(VERIFY_READ, sf, sizeof(*sf)) ||
  238. (((unsigned long) sf) & 0x03))
  239. goto segv;
  240. err = __get_user(pc, &sf->regs.pc);
  241. err |= __get_user(npc, &sf->regs.npc);
  242. err |= ((pc | npc) & 0x03);
  243. err |= __get_user(regs->y, &sf->regs.y);
  244. err |= __get_user(psr, &sf->regs.psr);
  245. err |= __copy_from_user(&regs->u_regs[UREG_G1],
  246. &sf->regs.u_regs[UREG_G1], 15 * sizeof(u32));
  247. regs->psr = (regs->psr & ~PSR_ICC) | (psr & PSR_ICC);
  248. err |= __get_user(fpu_save, &sf->fpu_save);
  249. if (fpu_save)
  250. err |= restore_fpu_state(regs, fpu_save);
  251. err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t));
  252. err |= __copy_from_user(&st, &sf->stack, sizeof(stack_t));
  253. if (err)
  254. goto segv;
  255. regs->pc = pc;
  256. regs->npc = npc;
  257. /* It is more difficult to avoid calling this function than to
  258. * call it and ignore errors.
  259. */
  260. old_fs = get_fs();
  261. set_fs(KERNEL_DS);
  262. do_sigaltstack((const stack_t __user *) &st, NULL, (unsigned long)sf);
  263. set_fs(old_fs);
  264. sigdelsetmask(&set, ~_BLOCKABLE);
  265. spin_lock_irq(&current->sighand->siglock);
  266. current->blocked = set;
  267. recalc_sigpending();
  268. spin_unlock_irq(&current->sighand->siglock);
  269. return;
  270. segv:
  271. force_sig(SIGSEGV, current);
  272. }
  273. /* Checks if the fp is valid */
  274. static inline int invalid_frame_pointer(void __user *fp, int fplen)
  275. {
  276. if ((((unsigned long) fp) & 7) ||
  277. !__access_ok((unsigned long)fp, fplen) ||
  278. ((sparc_cpu_model == sun4 || sparc_cpu_model == sun4c) &&
  279. ((unsigned long) fp < 0xe0000000 && (unsigned long) fp >= 0x20000000)))
  280. return 1;
  281. return 0;
  282. }
  283. static inline void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, unsigned long framesize)
  284. {
  285. unsigned long sp;
  286. sp = regs->u_regs[UREG_FP];
  287. /* This is the X/Open sanctioned signal stack switching. */
  288. if (sa->sa_flags & SA_ONSTACK) {
  289. if (!on_sig_stack(sp) && !((current->sas_ss_sp + current->sas_ss_size) & 7))
  290. sp = current->sas_ss_sp + current->sas_ss_size;
  291. }
  292. return (void __user *)(sp - framesize);
  293. }
  294. static inline void
  295. setup_frame(struct sigaction *sa, struct pt_regs *regs, int signr, sigset_t *oldset, siginfo_t *info)
  296. {
  297. struct signal_sframe __user *sframep;
  298. struct sigcontext __user *sc;
  299. int window = 0, err;
  300. unsigned long pc = regs->pc;
  301. unsigned long npc = regs->npc;
  302. struct thread_info *tp = current_thread_info();
  303. void __user *sig_address;
  304. int sig_code;
  305. synchronize_user_stack();
  306. sframep = (struct signal_sframe __user *)
  307. get_sigframe(sa, regs, SF_ALIGNEDSZ);
  308. if (invalid_frame_pointer(sframep, sizeof(*sframep))){
  309. /* Don't change signal code and address, so that
  310. * post mortem debuggers can have a look.
  311. */
  312. goto sigill_and_return;
  313. }
  314. sc = &sframep->sig_context;
  315. /* We've already made sure frame pointer isn't in kernel space... */
  316. err = __put_user((sas_ss_flags(regs->u_regs[UREG_FP]) == SS_ONSTACK),
  317. &sc->sigc_onstack);
  318. err |= __put_user(oldset->sig[0], &sc->sigc_mask);
  319. err |= __copy_to_user(sframep->extramask, &oldset->sig[1],
  320. (_NSIG_WORDS - 1) * sizeof(unsigned int));
  321. err |= __put_user(regs->u_regs[UREG_FP], &sc->sigc_sp);
  322. err |= __put_user(pc, &sc->sigc_pc);
  323. err |= __put_user(npc, &sc->sigc_npc);
  324. err |= __put_user(regs->psr, &sc->sigc_psr);
  325. err |= __put_user(regs->u_regs[UREG_G1], &sc->sigc_g1);
  326. err |= __put_user(regs->u_regs[UREG_I0], &sc->sigc_o0);
  327. err |= __put_user(tp->w_saved, &sc->sigc_oswins);
  328. if (tp->w_saved)
  329. for (window = 0; window < tp->w_saved; window++) {
  330. put_user((char *)tp->rwbuf_stkptrs[window],
  331. &sc->sigc_spbuf[window]);
  332. err |= __copy_to_user(&sc->sigc_wbuf[window],
  333. &tp->reg_window[window],
  334. sizeof(struct reg_window));
  335. }
  336. else
  337. err |= __copy_to_user(sframep, (char *) regs->u_regs[UREG_FP],
  338. sizeof(struct reg_window));
  339. tp->w_saved = 0; /* So process is allowed to execute. */
  340. err |= __put_user(signr, &sframep->sig_num);
  341. sig_address = NULL;
  342. sig_code = 0;
  343. if (SI_FROMKERNEL (info) && (info->si_code & __SI_MASK) == __SI_FAULT) {
  344. sig_address = info->si_addr;
  345. switch (signr) {
  346. case SIGSEGV:
  347. switch (info->si_code) {
  348. case SEGV_MAPERR: sig_code = SUBSIG_NOMAPPING; break;
  349. default: sig_code = SUBSIG_PROTECTION; break;
  350. }
  351. break;
  352. case SIGILL:
  353. switch (info->si_code) {
  354. case ILL_ILLOPC: sig_code = SUBSIG_ILLINST; break;
  355. case ILL_PRVOPC: sig_code = SUBSIG_PRIVINST; break;
  356. case ILL_ILLTRP: sig_code = SUBSIG_BADTRAP(info->si_trapno); break;
  357. default: sig_code = SUBSIG_STACK; break;
  358. }
  359. break;
  360. case SIGFPE:
  361. switch (info->si_code) {
  362. case FPE_INTDIV: sig_code = SUBSIG_IDIVZERO; break;
  363. case FPE_INTOVF: sig_code = SUBSIG_FPINTOVFL; break;
  364. case FPE_FLTDIV: sig_code = SUBSIG_FPDIVZERO; break;
  365. case FPE_FLTOVF: sig_code = SUBSIG_FPOVFLOW; break;
  366. case FPE_FLTUND: sig_code = SUBSIG_FPUNFLOW; break;
  367. case FPE_FLTRES: sig_code = SUBSIG_FPINEXACT; break;
  368. case FPE_FLTINV: sig_code = SUBSIG_FPOPERROR; break;
  369. default: sig_code = SUBSIG_FPERROR; break;
  370. }
  371. break;
  372. case SIGBUS:
  373. switch (info->si_code) {
  374. case BUS_ADRALN: sig_code = SUBSIG_ALIGNMENT; break;
  375. case BUS_ADRERR: sig_code = SUBSIG_MISCERROR; break;
  376. default: sig_code = SUBSIG_BUSTIMEOUT; break;
  377. }
  378. break;
  379. case SIGEMT:
  380. switch (info->si_code) {
  381. case EMT_TAGOVF: sig_code = SUBSIG_TAG; break;
  382. }
  383. break;
  384. case SIGSYS:
  385. if (info->si_code == (__SI_FAULT|0x100)) {
  386. /* See sys_sunos.c */
  387. sig_code = info->si_trapno;
  388. break;
  389. }
  390. default:
  391. sig_address = NULL;
  392. }
  393. }
  394. err |= __put_user((unsigned long)sig_address, &sframep->sig_address);
  395. err |= __put_user(sig_code, &sframep->sig_code);
  396. err |= __put_user(sc, &sframep->sig_scptr);
  397. if (err)
  398. goto sigsegv;
  399. regs->u_regs[UREG_FP] = (unsigned long) sframep;
  400. regs->pc = (unsigned long) sa->sa_handler;
  401. regs->npc = (regs->pc + 4);
  402. return;
  403. sigill_and_return:
  404. do_exit(SIGILL);
  405. sigsegv:
  406. force_sigsegv(signr, current);
  407. }
  408. static inline int
  409. save_fpu_state(struct pt_regs *regs, __siginfo_fpu_t __user *fpu)
  410. {
  411. int err = 0;
  412. #ifdef CONFIG_SMP
  413. if (test_tsk_thread_flag(current, TIF_USEDFPU)) {
  414. put_psr(get_psr() | PSR_EF);
  415. fpsave(&current->thread.float_regs[0], &current->thread.fsr,
  416. &current->thread.fpqueue[0], &current->thread.fpqdepth);
  417. regs->psr &= ~(PSR_EF);
  418. clear_tsk_thread_flag(current, TIF_USEDFPU);
  419. }
  420. #else
  421. if (current == last_task_used_math) {
  422. put_psr(get_psr() | PSR_EF);
  423. fpsave(&current->thread.float_regs[0], &current->thread.fsr,
  424. &current->thread.fpqueue[0], &current->thread.fpqdepth);
  425. last_task_used_math = NULL;
  426. regs->psr &= ~(PSR_EF);
  427. }
  428. #endif
  429. err |= __copy_to_user(&fpu->si_float_regs[0],
  430. &current->thread.float_regs[0],
  431. (sizeof(unsigned long) * 32));
  432. err |= __put_user(current->thread.fsr, &fpu->si_fsr);
  433. err |= __put_user(current->thread.fpqdepth, &fpu->si_fpqdepth);
  434. if (current->thread.fpqdepth != 0)
  435. err |= __copy_to_user(&fpu->si_fpqueue[0],
  436. &current->thread.fpqueue[0],
  437. ((sizeof(unsigned long) +
  438. (sizeof(unsigned long *)))*16));
  439. clear_used_math();
  440. return err;
  441. }
  442. static inline void
  443. new_setup_frame(struct k_sigaction *ka, struct pt_regs *regs,
  444. int signo, sigset_t *oldset)
  445. {
  446. struct new_signal_frame __user *sf;
  447. int sigframe_size, err;
  448. /* 1. Make sure everything is clean */
  449. synchronize_user_stack();
  450. sigframe_size = NF_ALIGNEDSZ;
  451. if (!used_math())
  452. sigframe_size -= sizeof(__siginfo_fpu_t);
  453. sf = (struct new_signal_frame __user *)
  454. get_sigframe(&ka->sa, regs, sigframe_size);
  455. if (invalid_frame_pointer(sf, sigframe_size))
  456. goto sigill_and_return;
  457. if (current_thread_info()->w_saved != 0)
  458. goto sigill_and_return;
  459. /* 2. Save the current process state */
  460. err = __copy_to_user(&sf->info.si_regs, regs, sizeof(struct pt_regs));
  461. err |= __put_user(0, &sf->extra_size);
  462. if (used_math()) {
  463. err |= save_fpu_state(regs, &sf->fpu_state);
  464. err |= __put_user(&sf->fpu_state, &sf->fpu_save);
  465. } else {
  466. err |= __put_user(0, &sf->fpu_save);
  467. }
  468. err |= __put_user(oldset->sig[0], &sf->info.si_mask);
  469. err |= __copy_to_user(sf->extramask, &oldset->sig[1],
  470. (_NSIG_WORDS - 1) * sizeof(unsigned int));
  471. err |= __copy_to_user(sf, (char *) regs->u_regs[UREG_FP],
  472. sizeof(struct reg_window));
  473. if (err)
  474. goto sigsegv;
  475. /* 3. signal handler back-trampoline and parameters */
  476. regs->u_regs[UREG_FP] = (unsigned long) sf;
  477. regs->u_regs[UREG_I0] = signo;
  478. regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
  479. regs->u_regs[UREG_I2] = (unsigned long) &sf->info;
  480. /* 4. signal handler */
  481. regs->pc = (unsigned long) ka->sa.sa_handler;
  482. regs->npc = (regs->pc + 4);
  483. /* 5. return to kernel instructions */
  484. if (ka->ka_restorer)
  485. regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer;
  486. else {
  487. regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2);
  488. /* mov __NR_sigreturn, %g1 */
  489. err |= __put_user(0x821020d8, &sf->insns[0]);
  490. /* t 0x10 */
  491. err |= __put_user(0x91d02010, &sf->insns[1]);
  492. if (err)
  493. goto sigsegv;
  494. /* Flush instruction space. */
  495. flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0]));
  496. }
  497. return;
  498. sigill_and_return:
  499. do_exit(SIGILL);
  500. sigsegv:
  501. force_sigsegv(signo, current);
  502. }
  503. static inline void
  504. new_setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
  505. int signo, sigset_t *oldset, siginfo_t *info)
  506. {
  507. struct rt_signal_frame __user *sf;
  508. int sigframe_size;
  509. unsigned int psr;
  510. int err;
  511. synchronize_user_stack();
  512. sigframe_size = RT_ALIGNEDSZ;
  513. if (!used_math())
  514. sigframe_size -= sizeof(__siginfo_fpu_t);
  515. sf = (struct rt_signal_frame __user *)
  516. get_sigframe(&ka->sa, regs, sigframe_size);
  517. if (invalid_frame_pointer(sf, sigframe_size))
  518. goto sigill;
  519. if (current_thread_info()->w_saved != 0)
  520. goto sigill;
  521. err = __put_user(regs->pc, &sf->regs.pc);
  522. err |= __put_user(regs->npc, &sf->regs.npc);
  523. err |= __put_user(regs->y, &sf->regs.y);
  524. psr = regs->psr;
  525. if (used_math())
  526. psr |= PSR_EF;
  527. err |= __put_user(psr, &sf->regs.psr);
  528. err |= __copy_to_user(&sf->regs.u_regs, regs->u_regs, sizeof(regs->u_regs));
  529. err |= __put_user(0, &sf->extra_size);
  530. if (psr & PSR_EF) {
  531. err |= save_fpu_state(regs, &sf->fpu_state);
  532. err |= __put_user(&sf->fpu_state, &sf->fpu_save);
  533. } else {
  534. err |= __put_user(0, &sf->fpu_save);
  535. }
  536. err |= __copy_to_user(&sf->mask, &oldset->sig[0], sizeof(sigset_t));
  537. /* Setup sigaltstack */
  538. err |= __put_user(current->sas_ss_sp, &sf->stack.ss_sp);
  539. err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &sf->stack.ss_flags);
  540. err |= __put_user(current->sas_ss_size, &sf->stack.ss_size);
  541. err |= __copy_to_user(sf, (char *) regs->u_regs[UREG_FP],
  542. sizeof(struct reg_window));
  543. err |= copy_siginfo_to_user(&sf->info, info);
  544. if (err)
  545. goto sigsegv;
  546. regs->u_regs[UREG_FP] = (unsigned long) sf;
  547. regs->u_regs[UREG_I0] = signo;
  548. regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
  549. regs->u_regs[UREG_I2] = (unsigned long) &sf->regs;
  550. regs->pc = (unsigned long) ka->sa.sa_handler;
  551. regs->npc = (regs->pc + 4);
  552. if (ka->ka_restorer)
  553. regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer;
  554. else {
  555. regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2);
  556. /* mov __NR_sigreturn, %g1 */
  557. err |= __put_user(0x821020d8, &sf->insns[0]);
  558. /* t 0x10 */
  559. err |= __put_user(0x91d02010, &sf->insns[1]);
  560. if (err)
  561. goto sigsegv;
  562. /* Flush instruction space. */
  563. flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0]));
  564. }
  565. return;
  566. sigill:
  567. do_exit(SIGILL);
  568. sigsegv:
  569. force_sigsegv(signo, current);
  570. }
  571. /* Setup a Solaris stack frame */
  572. static inline void
  573. setup_svr4_frame(struct sigaction *sa, unsigned long pc, unsigned long npc,
  574. struct pt_regs *regs, int signr, sigset_t *oldset)
  575. {
  576. svr4_signal_frame_t __user *sfp;
  577. svr4_gregset_t __user *gr;
  578. svr4_siginfo_t __user *si;
  579. svr4_mcontext_t __user *mc;
  580. svr4_gwindows_t __user *gw;
  581. svr4_ucontext_t __user *uc;
  582. svr4_sigset_t setv;
  583. struct thread_info *tp = current_thread_info();
  584. int window = 0, err;
  585. synchronize_user_stack();
  586. sfp = (svr4_signal_frame_t __user *)
  587. get_sigframe(sa, regs, SVR4_SF_ALIGNED + sizeof(struct reg_window));
  588. if (invalid_frame_pointer(sfp, sizeof(*sfp)))
  589. goto sigill_and_return;
  590. /* Start with a clean frame pointer and fill it */
  591. err = __clear_user(sfp, sizeof(*sfp));
  592. /* Setup convenience variables */
  593. si = &sfp->si;
  594. uc = &sfp->uc;
  595. gw = &sfp->gw;
  596. mc = &uc->mcontext;
  597. gr = &mc->greg;
  598. /* FIXME: where am I supposed to put this?
  599. * sc->sigc_onstack = old_status;
  600. * anyways, it does not look like it is used for anything at all.
  601. */
  602. setv.sigbits[0] = oldset->sig[0];
  603. setv.sigbits[1] = oldset->sig[1];
  604. if (_NSIG_WORDS >= 4) {
  605. setv.sigbits[2] = oldset->sig[2];
  606. setv.sigbits[3] = oldset->sig[3];
  607. err |= __copy_to_user(&uc->sigmask, &setv, sizeof(svr4_sigset_t));
  608. } else
  609. err |= __copy_to_user(&uc->sigmask, &setv,
  610. 2 * sizeof(unsigned int));
  611. /* Store registers */
  612. err |= __put_user(regs->pc, &((*gr)[SVR4_PC]));
  613. err |= __put_user(regs->npc, &((*gr)[SVR4_NPC]));
  614. err |= __put_user(regs->psr, &((*gr)[SVR4_PSR]));
  615. err |= __put_user(regs->y, &((*gr)[SVR4_Y]));
  616. /* Copy g[1..7] and o[0..7] registers */
  617. err |= __copy_to_user(&(*gr)[SVR4_G1], &regs->u_regs[UREG_G1],
  618. sizeof(long) * 7);
  619. err |= __copy_to_user(&(*gr)[SVR4_O0], &regs->u_regs[UREG_I0],
  620. sizeof(long) * 8);
  621. /* Setup sigaltstack */
  622. err |= __put_user(current->sas_ss_sp, &uc->stack.sp);
  623. err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &uc->stack.flags);
  624. err |= __put_user(current->sas_ss_size, &uc->stack.size);
  625. /* Save the currently window file: */
  626. /* 1. Link sfp->uc->gwins to our windows */
  627. err |= __put_user(gw, &mc->gwin);
  628. /* 2. Number of windows to restore at setcontext(): */
  629. err |= __put_user(tp->w_saved, &gw->count);
  630. /* 3. Save each valid window
  631. * Currently, it makes a copy of the windows from the kernel copy.
  632. * David's code for SunOS, makes the copy but keeps the pointer to
  633. * the kernel. My version makes the pointer point to a userland
  634. * copy of those. Mhm, I wonder if I shouldn't just ignore those
  635. * on setcontext and use those that are on the kernel, the signal
  636. * handler should not be modyfing those, mhm.
  637. *
  638. * These windows are just used in case synchronize_user_stack failed
  639. * to flush the user windows.
  640. */
  641. for (window = 0; window < tp->w_saved; window++) {
  642. err |= __put_user((int __user *) &(gw->win[window]), &gw->winptr[window]);
  643. err |= __copy_to_user(&gw->win[window],
  644. &tp->reg_window[window],
  645. sizeof(svr4_rwindow_t));
  646. err |= __put_user(0, gw->winptr[window]);
  647. }
  648. /* 4. We just pay attention to the gw->count field on setcontext */
  649. tp->w_saved = 0; /* So process is allowed to execute. */
  650. /* Setup the signal information. Solaris expects a bunch of
  651. * information to be passed to the signal handler, we don't provide
  652. * that much currently, should use siginfo.
  653. */
  654. err |= __put_user(signr, &si->siginfo.signo);
  655. err |= __put_user(SVR4_SINOINFO, &si->siginfo.code);
  656. if (err)
  657. goto sigsegv;
  658. regs->u_regs[UREG_FP] = (unsigned long) sfp;
  659. regs->pc = (unsigned long) sa->sa_handler;
  660. regs->npc = (regs->pc + 4);
  661. /* Arguments passed to signal handler */
  662. if (regs->u_regs[14]){
  663. struct reg_window __user *rw = (struct reg_window __user *)
  664. regs->u_regs[14];
  665. err |= __put_user(signr, &rw->ins[0]);
  666. err |= __put_user(si, &rw->ins[1]);
  667. err |= __put_user(uc, &rw->ins[2]);
  668. err |= __put_user(sfp, &rw->ins[6]); /* frame pointer */
  669. if (err)
  670. goto sigsegv;
  671. regs->u_regs[UREG_I0] = signr;
  672. regs->u_regs[UREG_I1] = (unsigned long) si;
  673. regs->u_regs[UREG_I2] = (unsigned long) uc;
  674. }
  675. return;
  676. sigill_and_return:
  677. do_exit(SIGILL);
  678. sigsegv:
  679. force_sigsegv(signr, current);
  680. }
  681. asmlinkage int svr4_getcontext(svr4_ucontext_t __user *uc, struct pt_regs *regs)
  682. {
  683. svr4_gregset_t __user *gr;
  684. svr4_mcontext_t __user *mc;
  685. svr4_sigset_t setv;
  686. int err = 0;
  687. synchronize_user_stack();
  688. if (current_thread_info()->w_saved)
  689. return -EFAULT;
  690. err = clear_user(uc, sizeof(*uc));
  691. if (err)
  692. return -EFAULT;
  693. /* Setup convenience variables */
  694. mc = &uc->mcontext;
  695. gr = &mc->greg;
  696. setv.sigbits[0] = current->blocked.sig[0];
  697. setv.sigbits[1] = current->blocked.sig[1];
  698. if (_NSIG_WORDS >= 4) {
  699. setv.sigbits[2] = current->blocked.sig[2];
  700. setv.sigbits[3] = current->blocked.sig[3];
  701. err |= __copy_to_user(&uc->sigmask, &setv, sizeof(svr4_sigset_t));
  702. } else
  703. err |= __copy_to_user(&uc->sigmask, &setv,
  704. 2 * sizeof(unsigned int));
  705. /* Store registers */
  706. err |= __put_user(regs->pc, &uc->mcontext.greg[SVR4_PC]);
  707. err |= __put_user(regs->npc, &uc->mcontext.greg[SVR4_NPC]);
  708. err |= __put_user(regs->psr, &uc->mcontext.greg[SVR4_PSR]);
  709. err |= __put_user(regs->y, &uc->mcontext.greg[SVR4_Y]);
  710. /* Copy g[1..7] and o[0..7] registers */
  711. err |= __copy_to_user(&(*gr)[SVR4_G1], &regs->u_regs[UREG_G1],
  712. sizeof(uint) * 7);
  713. err |= __copy_to_user(&(*gr)[SVR4_O0], &regs->u_regs[UREG_I0],
  714. sizeof(uint) * 8);
  715. /* Setup sigaltstack */
  716. err |= __put_user(current->sas_ss_sp, &uc->stack.sp);
  717. err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &uc->stack.flags);
  718. err |= __put_user(current->sas_ss_size, &uc->stack.size);
  719. /* The register file is not saved
  720. * we have already stuffed all of it with sync_user_stack
  721. */
  722. return (err ? -EFAULT : 0);
  723. }
  724. /* Set the context for a svr4 application, this is Solaris way to sigreturn */
  725. asmlinkage int svr4_setcontext(svr4_ucontext_t __user *c, struct pt_regs *regs)
  726. {
  727. svr4_gregset_t __user *gr;
  728. unsigned long pc, npc, psr;
  729. mm_segment_t old_fs;
  730. sigset_t set;
  731. svr4_sigset_t setv;
  732. int err;
  733. stack_t st;
  734. /* Fixme: restore windows, or is this already taken care of in
  735. * svr4_setup_frame when sync_user_windows is done?
  736. */
  737. flush_user_windows();
  738. if (current_thread_info()->w_saved)
  739. goto sigsegv_and_return;
  740. if (((unsigned long) c) & 3)
  741. goto sigsegv_and_return;
  742. if (!__access_ok((unsigned long)c, sizeof(*c)))
  743. goto sigsegv_and_return;
  744. /* Check for valid PC and nPC */
  745. gr = &c->mcontext.greg;
  746. err = __get_user(pc, &((*gr)[SVR4_PC]));
  747. err |= __get_user(npc, &((*gr)[SVR4_NPC]));
  748. if ((pc | npc) & 3)
  749. goto sigsegv_and_return;
  750. /* Retrieve information from passed ucontext */
  751. /* note that nPC is ored a 1, this is used to inform entry.S */
  752. /* that we don't want it to mess with our PC and nPC */
  753. /* This is pretty much atomic, no amount locking would prevent
  754. * the races which exist anyways.
  755. */
  756. err |= __copy_from_user(&setv, &c->sigmask, sizeof(svr4_sigset_t));
  757. err |= __get_user(st.ss_sp, &c->stack.sp);
  758. err |= __get_user(st.ss_flags, &c->stack.flags);
  759. err |= __get_user(st.ss_size, &c->stack.size);
  760. if (err)
  761. goto sigsegv_and_return;
  762. /* It is more difficult to avoid calling this function than to
  763. call it and ignore errors. */
  764. old_fs = get_fs();
  765. set_fs(KERNEL_DS);
  766. do_sigaltstack((const stack_t __user *) &st, NULL,
  767. regs->u_regs[UREG_I6]);
  768. set_fs(old_fs);
  769. set.sig[0] = setv.sigbits[0];
  770. set.sig[1] = setv.sigbits[1];
  771. if (_NSIG_WORDS >= 4) {
  772. set.sig[2] = setv.sigbits[2];
  773. set.sig[3] = setv.sigbits[3];
  774. }
  775. sigdelsetmask(&set, ~_BLOCKABLE);
  776. spin_lock_irq(&current->sighand->siglock);
  777. current->blocked = set;
  778. recalc_sigpending();
  779. spin_unlock_irq(&current->sighand->siglock);
  780. regs->pc = pc;
  781. regs->npc = npc | 1;
  782. err |= __get_user(regs->y, &((*gr)[SVR4_Y]));
  783. err |= __get_user(psr, &((*gr)[SVR4_PSR]));
  784. regs->psr &= ~(PSR_ICC);
  785. regs->psr |= (psr & PSR_ICC);
  786. /* Restore g[1..7] and o[0..7] registers */
  787. err |= __copy_from_user(&regs->u_regs[UREG_G1], &(*gr)[SVR4_G1],
  788. sizeof(long) * 7);
  789. err |= __copy_from_user(&regs->u_regs[UREG_I0], &(*gr)[SVR4_O0],
  790. sizeof(long) * 8);
  791. return (err ? -EFAULT : 0);
  792. sigsegv_and_return:
  793. force_sig(SIGSEGV, current);
  794. return -EFAULT;
  795. }
  796. static inline void
  797. handle_signal(unsigned long signr, struct k_sigaction *ka,
  798. siginfo_t *info, sigset_t *oldset, struct pt_regs *regs,
  799. int svr4_signal)
  800. {
  801. if (svr4_signal)
  802. setup_svr4_frame(&ka->sa, regs->pc, regs->npc, regs, signr, oldset);
  803. else {
  804. if (ka->sa.sa_flags & SA_SIGINFO)
  805. new_setup_rt_frame(ka, regs, signr, oldset, info);
  806. else if (current->thread.new_signal)
  807. new_setup_frame(ka, regs, signr, oldset);
  808. else
  809. setup_frame(&ka->sa, regs, signr, oldset, info);
  810. }
  811. spin_lock_irq(&current->sighand->siglock);
  812. sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
  813. if (!(ka->sa.sa_flags & SA_NOMASK))
  814. sigaddset(&current->blocked, signr);
  815. recalc_sigpending();
  816. spin_unlock_irq(&current->sighand->siglock);
  817. }
  818. static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
  819. struct sigaction *sa)
  820. {
  821. switch(regs->u_regs[UREG_I0]) {
  822. case ERESTART_RESTARTBLOCK:
  823. case ERESTARTNOHAND:
  824. no_system_call_restart:
  825. regs->u_regs[UREG_I0] = EINTR;
  826. regs->psr |= PSR_C;
  827. break;
  828. case ERESTARTSYS:
  829. if (!(sa->sa_flags & SA_RESTART))
  830. goto no_system_call_restart;
  831. /* fallthrough */
  832. case ERESTARTNOINTR:
  833. regs->u_regs[UREG_I0] = orig_i0;
  834. regs->pc -= 4;
  835. regs->npc -= 4;
  836. }
  837. }
  838. /* Note that 'init' is a special process: it doesn't get signals it doesn't
  839. * want to handle. Thus you cannot kill init even with a SIGKILL even by
  840. * mistake.
  841. */
  842. asmlinkage void do_signal(struct pt_regs * regs, unsigned long orig_i0, int restart_syscall)
  843. {
  844. siginfo_t info;
  845. struct sparc_deliver_cookie cookie;
  846. struct k_sigaction ka;
  847. int signr;
  848. sigset_t *oldset;
  849. /*
  850. * XXX Disable svr4 signal handling until solaris emulation works.
  851. * It is buggy - Anton
  852. */
  853. #define SVR4_SIGNAL_BROKEN 1
  854. #ifdef SVR4_SIGNAL_BROKEN
  855. int svr4_signal = 0;
  856. #else
  857. int svr4_signal = current->personality == PER_SVR4;
  858. #endif
  859. cookie.restart_syscall = restart_syscall;
  860. cookie.orig_i0 = orig_i0;
  861. if (test_thread_flag(TIF_RESTORE_SIGMASK))
  862. oldset = &current->saved_sigmask;
  863. else
  864. oldset = &current->blocked;
  865. signr = get_signal_to_deliver(&info, &ka, regs, &cookie);
  866. if (signr > 0) {
  867. if (cookie.restart_syscall)
  868. syscall_restart(cookie.orig_i0, regs, &ka.sa);
  869. handle_signal(signr, &ka, &info, oldset,
  870. regs, svr4_signal);
  871. /* a signal was successfully delivered; the saved
  872. * sigmask will have been stored in the signal frame,
  873. * and will be restored by sigreturn, so we can simply
  874. * clear the TIF_RESTORE_SIGMASK flag.
  875. */
  876. if (test_thread_flag(TIF_RESTORE_SIGMASK))
  877. clear_thread_flag(TIF_RESTORE_SIGMASK);
  878. return;
  879. }
  880. if (cookie.restart_syscall &&
  881. (regs->u_regs[UREG_I0] == ERESTARTNOHAND ||
  882. regs->u_regs[UREG_I0] == ERESTARTSYS ||
  883. regs->u_regs[UREG_I0] == ERESTARTNOINTR)) {
  884. /* replay the system call when we are done */
  885. regs->u_regs[UREG_I0] = cookie.orig_i0;
  886. regs->pc -= 4;
  887. regs->npc -= 4;
  888. }
  889. if (cookie.restart_syscall &&
  890. regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) {
  891. regs->u_regs[UREG_G1] = __NR_restart_syscall;
  892. regs->pc -= 4;
  893. regs->npc -= 4;
  894. }
  895. /* if there's no signal to deliver, we just put the saved sigmask
  896. * back
  897. */
  898. if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
  899. clear_thread_flag(TIF_RESTORE_SIGMASK);
  900. sigprocmask(SIG_SETMASK, &current->saved_sigmask, NULL);
  901. }
  902. }
  903. asmlinkage int
  904. do_sys_sigstack(struct sigstack __user *ssptr, struct sigstack __user *ossptr,
  905. unsigned long sp)
  906. {
  907. int ret = -EFAULT;
  908. /* First see if old state is wanted. */
  909. if (ossptr) {
  910. if (put_user(current->sas_ss_sp + current->sas_ss_size,
  911. &ossptr->the_stack) ||
  912. __put_user(on_sig_stack(sp), &ossptr->cur_status))
  913. goto out;
  914. }
  915. /* Now see if we want to update the new state. */
  916. if (ssptr) {
  917. char *ss_sp;
  918. if (get_user(ss_sp, &ssptr->the_stack))
  919. goto out;
  920. /* If the current stack was set with sigaltstack, don't
  921. swap stacks while we are on it. */
  922. ret = -EPERM;
  923. if (current->sas_ss_sp && on_sig_stack(sp))
  924. goto out;
  925. /* Since we don't know the extent of the stack, and we don't
  926. track onstack-ness, but rather calculate it, we must
  927. presume a size. Ho hum this interface is lossy. */
  928. current->sas_ss_sp = (unsigned long)ss_sp - SIGSTKSZ;
  929. current->sas_ss_size = SIGSTKSZ;
  930. }
  931. ret = 0;
  932. out:
  933. return ret;
  934. }
  935. void ptrace_signal_deliver(struct pt_regs *regs, void *cookie)
  936. {
  937. struct sparc_deliver_cookie *cp = cookie;
  938. if (cp->restart_syscall &&
  939. (regs->u_regs[UREG_I0] == ERESTARTNOHAND ||
  940. regs->u_regs[UREG_I0] == ERESTARTSYS ||
  941. regs->u_regs[UREG_I0] == ERESTARTNOINTR)) {
  942. /* replay the system call when we are done */
  943. regs->u_regs[UREG_I0] = cp->orig_i0;
  944. regs->pc -= 4;
  945. regs->npc -= 4;
  946. cp->restart_syscall = 0;
  947. }
  948. if (cp->restart_syscall &&
  949. regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) {
  950. regs->u_regs[UREG_G1] = __NR_restart_syscall;
  951. regs->pc -= 4;
  952. regs->npc -= 4;
  953. cp->restart_syscall = 0;
  954. }
  955. }