signal_mm.c 27 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030
  1. /*
  2. * linux/arch/m68k/kernel/signal.c
  3. *
  4. * Copyright (C) 1991, 1992 Linus Torvalds
  5. *
  6. * This file is subject to the terms and conditions of the GNU General Public
  7. * License. See the file COPYING in the main directory of this archive
  8. * for more details.
  9. */
  10. /*
  11. * Linux/m68k support by Hamish Macdonald
  12. *
  13. * 68060 fixes by Jesper Skov
  14. *
  15. * 1997-12-01 Modified for POSIX.1b signals by Andreas Schwab
  16. *
  17. * mathemu support by Roman Zippel
  18. * (Note: fpstate in the signal context is completely ignored for the emulator
  19. * and the internal floating point format is put on stack)
  20. */
  21. /*
  22. * ++roman (07/09/96): implemented signal stacks (specially for tosemu on
  23. * Atari :-) Current limitation: Only one sigstack can be active at one time.
  24. * If a second signal with SA_ONSTACK set arrives while working on a sigstack,
  25. * SA_ONSTACK is ignored. This behaviour avoids lots of trouble with nested
  26. * signal handlers!
  27. */
  28. #include <linux/sched.h>
  29. #include <linux/mm.h>
  30. #include <linux/kernel.h>
  31. #include <linux/signal.h>
  32. #include <linux/syscalls.h>
  33. #include <linux/errno.h>
  34. #include <linux/wait.h>
  35. #include <linux/ptrace.h>
  36. #include <linux/unistd.h>
  37. #include <linux/stddef.h>
  38. #include <linux/highuid.h>
  39. #include <linux/personality.h>
  40. #include <linux/tty.h>
  41. #include <linux/binfmts.h>
  42. #include <linux/module.h>
  43. #include <asm/setup.h>
  44. #include <asm/uaccess.h>
  45. #include <asm/pgtable.h>
  46. #include <asm/traps.h>
  47. #include <asm/ucontext.h>
  48. #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
  49. static const int frame_extra_sizes[16] = {
  50. [1] = -1, /* sizeof(((struct frame *)0)->un.fmt1), */
  51. [2] = sizeof(((struct frame *)0)->un.fmt2),
  52. [3] = sizeof(((struct frame *)0)->un.fmt3),
  53. #ifdef CONFIG_COLDFIRE
  54. [4] = 0,
  55. #else
  56. [4] = sizeof(((struct frame *)0)->un.fmt4),
  57. #endif
  58. [5] = -1, /* sizeof(((struct frame *)0)->un.fmt5), */
  59. [6] = -1, /* sizeof(((struct frame *)0)->un.fmt6), */
  60. [7] = sizeof(((struct frame *)0)->un.fmt7),
  61. [8] = -1, /* sizeof(((struct frame *)0)->un.fmt8), */
  62. [9] = sizeof(((struct frame *)0)->un.fmt9),
  63. [10] = sizeof(((struct frame *)0)->un.fmta),
  64. [11] = sizeof(((struct frame *)0)->un.fmtb),
  65. [12] = -1, /* sizeof(((struct frame *)0)->un.fmtc), */
  66. [13] = -1, /* sizeof(((struct frame *)0)->un.fmtd), */
  67. [14] = -1, /* sizeof(((struct frame *)0)->un.fmte), */
  68. [15] = -1, /* sizeof(((struct frame *)0)->un.fmtf), */
  69. };
  70. int handle_kernel_fault(struct pt_regs *regs)
  71. {
  72. const struct exception_table_entry *fixup;
  73. struct pt_regs *tregs;
  74. /* Are we prepared to handle this kernel fault? */
  75. fixup = search_exception_tables(regs->pc);
  76. if (!fixup)
  77. return 0;
  78. /* Create a new four word stack frame, discarding the old one. */
  79. regs->stkadj = frame_extra_sizes[regs->format];
  80. tregs = (struct pt_regs *)((long)regs + regs->stkadj);
  81. tregs->vector = regs->vector;
  82. #ifdef CONFIG_COLDFIRE
  83. tregs->format = 4;
  84. #else
  85. tregs->format = 0;
  86. #endif
  87. tregs->pc = fixup->fixup;
  88. tregs->sr = regs->sr;
  89. return 1;
  90. }
  91. /*
  92. * Atomically swap in the new signal mask, and wait for a signal.
  93. */
  94. asmlinkage int
  95. sys_sigsuspend(int unused0, int unused1, old_sigset_t mask)
  96. {
  97. mask &= _BLOCKABLE;
  98. spin_lock_irq(&current->sighand->siglock);
  99. current->saved_sigmask = current->blocked;
  100. siginitset(&current->blocked, mask);
  101. recalc_sigpending();
  102. spin_unlock_irq(&current->sighand->siglock);
  103. current->state = TASK_INTERRUPTIBLE;
  104. schedule();
  105. set_restore_sigmask();
  106. return -ERESTARTNOHAND;
  107. }
  108. asmlinkage int
  109. sys_sigaction(int sig, const struct old_sigaction __user *act,
  110. struct old_sigaction __user *oact)
  111. {
  112. struct k_sigaction new_ka, old_ka;
  113. int ret;
  114. if (act) {
  115. old_sigset_t mask;
  116. if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
  117. __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
  118. __get_user(new_ka.sa.sa_restorer, &act->sa_restorer) ||
  119. __get_user(new_ka.sa.sa_flags, &act->sa_flags) ||
  120. __get_user(mask, &act->sa_mask))
  121. return -EFAULT;
  122. siginitset(&new_ka.sa.sa_mask, mask);
  123. }
  124. ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
  125. if (!ret && oact) {
  126. if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
  127. __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
  128. __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) ||
  129. __put_user(old_ka.sa.sa_flags, &oact->sa_flags) ||
  130. __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask))
  131. return -EFAULT;
  132. }
  133. return ret;
  134. }
  135. asmlinkage int
  136. sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss)
  137. {
  138. return do_sigaltstack(uss, uoss, rdusp());
  139. }
  140. /*
  141. * Do a signal return; undo the signal stack.
  142. *
  143. * Keep the return code on the stack quadword aligned!
  144. * That makes the cache flush below easier.
  145. */
  146. struct sigframe
  147. {
  148. char __user *pretcode;
  149. int sig;
  150. int code;
  151. struct sigcontext __user *psc;
  152. char retcode[8];
  153. unsigned long extramask[_NSIG_WORDS-1];
  154. struct sigcontext sc;
  155. };
  156. struct rt_sigframe
  157. {
  158. char __user *pretcode;
  159. int sig;
  160. struct siginfo __user *pinfo;
  161. void __user *puc;
  162. char retcode[8];
  163. struct siginfo info;
  164. struct ucontext uc;
  165. };
  166. static unsigned char fpu_version; /* version number of fpu, set by setup_frame */
  167. static inline int restore_fpu_state(struct sigcontext *sc)
  168. {
  169. int err = 1;
  170. if (FPU_IS_EMU) {
  171. /* restore registers */
  172. memcpy(current->thread.fpcntl, sc->sc_fpcntl, 12);
  173. memcpy(current->thread.fp, sc->sc_fpregs, 24);
  174. return 0;
  175. }
  176. if (CPU_IS_060 ? sc->sc_fpstate[2] : sc->sc_fpstate[0]) {
  177. /* Verify the frame format. */
  178. if (!CPU_IS_060 && (sc->sc_fpstate[0] != fpu_version))
  179. goto out;
  180. if (CPU_IS_020_OR_030) {
  181. if (m68k_fputype & FPU_68881 &&
  182. !(sc->sc_fpstate[1] == 0x18 || sc->sc_fpstate[1] == 0xb4))
  183. goto out;
  184. if (m68k_fputype & FPU_68882 &&
  185. !(sc->sc_fpstate[1] == 0x38 || sc->sc_fpstate[1] == 0xd4))
  186. goto out;
  187. } else if (CPU_IS_040) {
  188. if (!(sc->sc_fpstate[1] == 0x00 ||
  189. sc->sc_fpstate[1] == 0x28 ||
  190. sc->sc_fpstate[1] == 0x60))
  191. goto out;
  192. } else if (CPU_IS_060) {
  193. if (!(sc->sc_fpstate[3] == 0x00 ||
  194. sc->sc_fpstate[3] == 0x60 ||
  195. sc->sc_fpstate[3] == 0xe0))
  196. goto out;
  197. } else
  198. goto out;
  199. __asm__ volatile (".chip 68k/68881\n\t"
  200. "fmovemx %0,%%fp0-%%fp1\n\t"
  201. "fmoveml %1,%%fpcr/%%fpsr/%%fpiar\n\t"
  202. ".chip 68k"
  203. : /* no outputs */
  204. : "m" (*sc->sc_fpregs), "m" (*sc->sc_fpcntl));
  205. }
  206. __asm__ volatile (".chip 68k/68881\n\t"
  207. "frestore %0\n\t"
  208. ".chip 68k" : : "m" (*sc->sc_fpstate));
  209. err = 0;
  210. out:
  211. return err;
  212. }
  213. #define FPCONTEXT_SIZE 216
  214. #define uc_fpstate uc_filler[0]
  215. #define uc_formatvec uc_filler[FPCONTEXT_SIZE/4]
  216. #define uc_extra uc_filler[FPCONTEXT_SIZE/4+1]
  217. static inline int rt_restore_fpu_state(struct ucontext __user *uc)
  218. {
  219. unsigned char fpstate[FPCONTEXT_SIZE];
  220. int context_size = CPU_IS_060 ? 8 : 0;
  221. fpregset_t fpregs;
  222. int err = 1;
  223. if (FPU_IS_EMU) {
  224. /* restore fpu control register */
  225. if (__copy_from_user(current->thread.fpcntl,
  226. uc->uc_mcontext.fpregs.f_fpcntl, 12))
  227. goto out;
  228. /* restore all other fpu register */
  229. if (__copy_from_user(current->thread.fp,
  230. uc->uc_mcontext.fpregs.f_fpregs, 96))
  231. goto out;
  232. return 0;
  233. }
  234. if (__get_user(*(long *)fpstate, (long __user *)&uc->uc_fpstate))
  235. goto out;
  236. if (CPU_IS_060 ? fpstate[2] : fpstate[0]) {
  237. if (!CPU_IS_060)
  238. context_size = fpstate[1];
  239. /* Verify the frame format. */
  240. if (!CPU_IS_060 && (fpstate[0] != fpu_version))
  241. goto out;
  242. if (CPU_IS_020_OR_030) {
  243. if (m68k_fputype & FPU_68881 &&
  244. !(context_size == 0x18 || context_size == 0xb4))
  245. goto out;
  246. if (m68k_fputype & FPU_68882 &&
  247. !(context_size == 0x38 || context_size == 0xd4))
  248. goto out;
  249. } else if (CPU_IS_040) {
  250. if (!(context_size == 0x00 ||
  251. context_size == 0x28 ||
  252. context_size == 0x60))
  253. goto out;
  254. } else if (CPU_IS_060) {
  255. if (!(fpstate[3] == 0x00 ||
  256. fpstate[3] == 0x60 ||
  257. fpstate[3] == 0xe0))
  258. goto out;
  259. } else
  260. goto out;
  261. if (__copy_from_user(&fpregs, &uc->uc_mcontext.fpregs,
  262. sizeof(fpregs)))
  263. goto out;
  264. __asm__ volatile (".chip 68k/68881\n\t"
  265. "fmovemx %0,%%fp0-%%fp7\n\t"
  266. "fmoveml %1,%%fpcr/%%fpsr/%%fpiar\n\t"
  267. ".chip 68k"
  268. : /* no outputs */
  269. : "m" (*fpregs.f_fpregs),
  270. "m" (*fpregs.f_fpcntl));
  271. }
  272. if (context_size &&
  273. __copy_from_user(fpstate + 4, (long __user *)&uc->uc_fpstate + 1,
  274. context_size))
  275. goto out;
  276. __asm__ volatile (".chip 68k/68881\n\t"
  277. "frestore %0\n\t"
  278. ".chip 68k" : : "m" (*fpstate));
  279. err = 0;
  280. out:
  281. return err;
  282. }
  283. static int mangle_kernel_stack(struct pt_regs *regs, int formatvec,
  284. void __user *fp)
  285. {
  286. int fsize = frame_extra_sizes[formatvec >> 12];
  287. if (fsize < 0) {
  288. /*
  289. * user process trying to return with weird frame format
  290. */
  291. #ifdef DEBUG
  292. printk("user process returning with weird frame format\n");
  293. #endif
  294. return 1;
  295. }
  296. if (!fsize) {
  297. regs->format = formatvec >> 12;
  298. regs->vector = formatvec & 0xfff;
  299. } else {
  300. struct switch_stack *sw = (struct switch_stack *)regs - 1;
  301. unsigned long buf[fsize / 2]; /* yes, twice as much */
  302. /* that'll make sure that expansion won't crap over data */
  303. if (copy_from_user(buf + fsize / 4, fp, fsize))
  304. return 1;
  305. /* point of no return */
  306. regs->format = formatvec >> 12;
  307. regs->vector = formatvec & 0xfff;
  308. #define frame_offset (sizeof(struct pt_regs)+sizeof(struct switch_stack))
  309. __asm__ __volatile__ (
  310. #ifdef CONFIG_COLDFIRE
  311. " movel %0,%/sp\n\t"
  312. " bra ret_from_signal\n"
  313. #else
  314. " movel %0,%/a0\n\t"
  315. " subl %1,%/a0\n\t" /* make room on stack */
  316. " movel %/a0,%/sp\n\t" /* set stack pointer */
  317. /* move switch_stack and pt_regs */
  318. "1: movel %0@+,%/a0@+\n\t"
  319. " dbra %2,1b\n\t"
  320. " lea %/sp@(%c3),%/a0\n\t" /* add offset of fmt */
  321. " lsrl #2,%1\n\t"
  322. " subql #1,%1\n\t"
  323. /* copy to the gap we'd made */
  324. "2: movel %4@+,%/a0@+\n\t"
  325. " dbra %1,2b\n\t"
  326. " bral ret_from_signal\n"
  327. #endif
  328. : /* no outputs, it doesn't ever return */
  329. : "a" (sw), "d" (fsize), "d" (frame_offset/4-1),
  330. "n" (frame_offset), "a" (buf + fsize/4)
  331. : "a0");
  332. #undef frame_offset
  333. }
  334. return 0;
  335. }
  336. static inline int
  337. restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *usc, void __user *fp)
  338. {
  339. int formatvec;
  340. struct sigcontext context;
  341. int err;
  342. /* Always make any pending restarted system calls return -EINTR */
  343. current_thread_info()->restart_block.fn = do_no_restart_syscall;
  344. /* get previous context */
  345. if (copy_from_user(&context, usc, sizeof(context)))
  346. goto badframe;
  347. /* restore passed registers */
  348. regs->d0 = context.sc_d0;
  349. regs->d1 = context.sc_d1;
  350. regs->a0 = context.sc_a0;
  351. regs->a1 = context.sc_a1;
  352. regs->sr = (regs->sr & 0xff00) | (context.sc_sr & 0xff);
  353. regs->pc = context.sc_pc;
  354. regs->orig_d0 = -1; /* disable syscall checks */
  355. wrusp(context.sc_usp);
  356. formatvec = context.sc_formatvec;
  357. err = restore_fpu_state(&context);
  358. if (err || mangle_kernel_stack(regs, formatvec, fp))
  359. goto badframe;
  360. return 0;
  361. badframe:
  362. return 1;
  363. }
  364. static inline int
  365. rt_restore_ucontext(struct pt_regs *regs, struct switch_stack *sw,
  366. struct ucontext __user *uc)
  367. {
  368. int temp;
  369. greg_t __user *gregs = uc->uc_mcontext.gregs;
  370. unsigned long usp;
  371. int err;
  372. /* Always make any pending restarted system calls return -EINTR */
  373. current_thread_info()->restart_block.fn = do_no_restart_syscall;
  374. err = __get_user(temp, &uc->uc_mcontext.version);
  375. if (temp != MCONTEXT_VERSION)
  376. goto badframe;
  377. /* restore passed registers */
  378. err |= __get_user(regs->d0, &gregs[0]);
  379. err |= __get_user(regs->d1, &gregs[1]);
  380. err |= __get_user(regs->d2, &gregs[2]);
  381. err |= __get_user(regs->d3, &gregs[3]);
  382. err |= __get_user(regs->d4, &gregs[4]);
  383. err |= __get_user(regs->d5, &gregs[5]);
  384. err |= __get_user(sw->d6, &gregs[6]);
  385. err |= __get_user(sw->d7, &gregs[7]);
  386. err |= __get_user(regs->a0, &gregs[8]);
  387. err |= __get_user(regs->a1, &gregs[9]);
  388. err |= __get_user(regs->a2, &gregs[10]);
  389. err |= __get_user(sw->a3, &gregs[11]);
  390. err |= __get_user(sw->a4, &gregs[12]);
  391. err |= __get_user(sw->a5, &gregs[13]);
  392. err |= __get_user(sw->a6, &gregs[14]);
  393. err |= __get_user(usp, &gregs[15]);
  394. wrusp(usp);
  395. err |= __get_user(regs->pc, &gregs[16]);
  396. err |= __get_user(temp, &gregs[17]);
  397. regs->sr = (regs->sr & 0xff00) | (temp & 0xff);
  398. regs->orig_d0 = -1; /* disable syscall checks */
  399. err |= __get_user(temp, &uc->uc_formatvec);
  400. err |= rt_restore_fpu_state(uc);
  401. if (err || do_sigaltstack(&uc->uc_stack, NULL, usp) == -EFAULT)
  402. goto badframe;
  403. if (mangle_kernel_stack(regs, temp, &uc->uc_extra))
  404. goto badframe;
  405. return 0;
  406. badframe:
  407. return 1;
  408. }
  409. asmlinkage int do_sigreturn(unsigned long __unused)
  410. {
  411. struct switch_stack *sw = (struct switch_stack *) &__unused;
  412. struct pt_regs *regs = (struct pt_regs *) (sw + 1);
  413. unsigned long usp = rdusp();
  414. struct sigframe __user *frame = (struct sigframe __user *)(usp - 4);
  415. sigset_t set;
  416. if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
  417. goto badframe;
  418. if (__get_user(set.sig[0], &frame->sc.sc_mask) ||
  419. (_NSIG_WORDS > 1 &&
  420. __copy_from_user(&set.sig[1], &frame->extramask,
  421. sizeof(frame->extramask))))
  422. goto badframe;
  423. sigdelsetmask(&set, ~_BLOCKABLE);
  424. current->blocked = set;
  425. recalc_sigpending();
  426. if (restore_sigcontext(regs, &frame->sc, frame + 1))
  427. goto badframe;
  428. return regs->d0;
  429. badframe:
  430. force_sig(SIGSEGV, current);
  431. return 0;
  432. }
  433. asmlinkage int do_rt_sigreturn(unsigned long __unused)
  434. {
  435. struct switch_stack *sw = (struct switch_stack *) &__unused;
  436. struct pt_regs *regs = (struct pt_regs *) (sw + 1);
  437. unsigned long usp = rdusp();
  438. struct rt_sigframe __user *frame = (struct rt_sigframe __user *)(usp - 4);
  439. sigset_t set;
  440. if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
  441. goto badframe;
  442. if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
  443. goto badframe;
  444. sigdelsetmask(&set, ~_BLOCKABLE);
  445. current->blocked = set;
  446. recalc_sigpending();
  447. if (rt_restore_ucontext(regs, sw, &frame->uc))
  448. goto badframe;
  449. return regs->d0;
  450. badframe:
  451. force_sig(SIGSEGV, current);
  452. return 0;
  453. }
  454. /*
  455. * Set up a signal frame.
  456. */
  457. static inline void save_fpu_state(struct sigcontext *sc, struct pt_regs *regs)
  458. {
  459. if (FPU_IS_EMU) {
  460. /* save registers */
  461. memcpy(sc->sc_fpcntl, current->thread.fpcntl, 12);
  462. memcpy(sc->sc_fpregs, current->thread.fp, 24);
  463. return;
  464. }
  465. __asm__ volatile (".chip 68k/68881\n\t"
  466. "fsave %0\n\t"
  467. ".chip 68k"
  468. : : "m" (*sc->sc_fpstate) : "memory");
  469. if (CPU_IS_060 ? sc->sc_fpstate[2] : sc->sc_fpstate[0]) {
  470. fpu_version = sc->sc_fpstate[0];
  471. if (CPU_IS_020_OR_030 &&
  472. regs->vector >= (VEC_FPBRUC * 4) &&
  473. regs->vector <= (VEC_FPNAN * 4)) {
  474. /* Clear pending exception in 68882 idle frame */
  475. if (*(unsigned short *) sc->sc_fpstate == 0x1f38)
  476. sc->sc_fpstate[0x38] |= 1 << 3;
  477. }
  478. __asm__ volatile (".chip 68k/68881\n\t"
  479. "fmovemx %%fp0-%%fp1,%0\n\t"
  480. "fmoveml %%fpcr/%%fpsr/%%fpiar,%1\n\t"
  481. ".chip 68k"
  482. : "=m" (*sc->sc_fpregs),
  483. "=m" (*sc->sc_fpcntl)
  484. : /* no inputs */
  485. : "memory");
  486. }
  487. }
  488. static inline int rt_save_fpu_state(struct ucontext __user *uc, struct pt_regs *regs)
  489. {
  490. unsigned char fpstate[FPCONTEXT_SIZE];
  491. int context_size = CPU_IS_060 ? 8 : 0;
  492. int err = 0;
  493. if (FPU_IS_EMU) {
  494. /* save fpu control register */
  495. err |= copy_to_user(uc->uc_mcontext.fpregs.f_fpcntl,
  496. current->thread.fpcntl, 12);
  497. /* save all other fpu register */
  498. err |= copy_to_user(uc->uc_mcontext.fpregs.f_fpregs,
  499. current->thread.fp, 96);
  500. return err;
  501. }
  502. __asm__ volatile (".chip 68k/68881\n\t"
  503. "fsave %0\n\t"
  504. ".chip 68k"
  505. : : "m" (*fpstate) : "memory");
  506. err |= __put_user(*(long *)fpstate, (long __user *)&uc->uc_fpstate);
  507. if (CPU_IS_060 ? fpstate[2] : fpstate[0]) {
  508. fpregset_t fpregs;
  509. if (!CPU_IS_060)
  510. context_size = fpstate[1];
  511. fpu_version = fpstate[0];
  512. if (CPU_IS_020_OR_030 &&
  513. regs->vector >= (VEC_FPBRUC * 4) &&
  514. regs->vector <= (VEC_FPNAN * 4)) {
  515. /* Clear pending exception in 68882 idle frame */
  516. if (*(unsigned short *) fpstate == 0x1f38)
  517. fpstate[0x38] |= 1 << 3;
  518. }
  519. __asm__ volatile (".chip 68k/68881\n\t"
  520. "fmovemx %%fp0-%%fp7,%0\n\t"
  521. "fmoveml %%fpcr/%%fpsr/%%fpiar,%1\n\t"
  522. ".chip 68k"
  523. : "=m" (*fpregs.f_fpregs),
  524. "=m" (*fpregs.f_fpcntl)
  525. : /* no inputs */
  526. : "memory");
  527. err |= copy_to_user(&uc->uc_mcontext.fpregs, &fpregs,
  528. sizeof(fpregs));
  529. }
  530. if (context_size)
  531. err |= copy_to_user((long __user *)&uc->uc_fpstate + 1, fpstate + 4,
  532. context_size);
  533. return err;
  534. }
  535. static void setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs,
  536. unsigned long mask)
  537. {
  538. sc->sc_mask = mask;
  539. sc->sc_usp = rdusp();
  540. sc->sc_d0 = regs->d0;
  541. sc->sc_d1 = regs->d1;
  542. sc->sc_a0 = regs->a0;
  543. sc->sc_a1 = regs->a1;
  544. sc->sc_sr = regs->sr;
  545. sc->sc_pc = regs->pc;
  546. sc->sc_formatvec = regs->format << 12 | regs->vector;
  547. save_fpu_state(sc, regs);
  548. }
  549. static inline int rt_setup_ucontext(struct ucontext __user *uc, struct pt_regs *regs)
  550. {
  551. struct switch_stack *sw = (struct switch_stack *)regs - 1;
  552. greg_t __user *gregs = uc->uc_mcontext.gregs;
  553. int err = 0;
  554. err |= __put_user(MCONTEXT_VERSION, &uc->uc_mcontext.version);
  555. err |= __put_user(regs->d0, &gregs[0]);
  556. err |= __put_user(regs->d1, &gregs[1]);
  557. err |= __put_user(regs->d2, &gregs[2]);
  558. err |= __put_user(regs->d3, &gregs[3]);
  559. err |= __put_user(regs->d4, &gregs[4]);
  560. err |= __put_user(regs->d5, &gregs[5]);
  561. err |= __put_user(sw->d6, &gregs[6]);
  562. err |= __put_user(sw->d7, &gregs[7]);
  563. err |= __put_user(regs->a0, &gregs[8]);
  564. err |= __put_user(regs->a1, &gregs[9]);
  565. err |= __put_user(regs->a2, &gregs[10]);
  566. err |= __put_user(sw->a3, &gregs[11]);
  567. err |= __put_user(sw->a4, &gregs[12]);
  568. err |= __put_user(sw->a5, &gregs[13]);
  569. err |= __put_user(sw->a6, &gregs[14]);
  570. err |= __put_user(rdusp(), &gregs[15]);
  571. err |= __put_user(regs->pc, &gregs[16]);
  572. err |= __put_user(regs->sr, &gregs[17]);
  573. err |= __put_user((regs->format << 12) | regs->vector, &uc->uc_formatvec);
  574. err |= rt_save_fpu_state(uc, regs);
  575. return err;
  576. }
  577. static inline void push_cache (unsigned long vaddr)
  578. {
  579. /*
  580. * Using the old cache_push_v() was really a big waste.
  581. *
  582. * What we are trying to do is to flush 8 bytes to ram.
  583. * Flushing 2 cache lines of 16 bytes is much cheaper than
  584. * flushing 1 or 2 pages, as previously done in
  585. * cache_push_v().
  586. * Jes
  587. */
  588. if (CPU_IS_040) {
  589. unsigned long temp;
  590. __asm__ __volatile__ (".chip 68040\n\t"
  591. "nop\n\t"
  592. "ptestr (%1)\n\t"
  593. "movec %%mmusr,%0\n\t"
  594. ".chip 68k"
  595. : "=r" (temp)
  596. : "a" (vaddr));
  597. temp &= PAGE_MASK;
  598. temp |= vaddr & ~PAGE_MASK;
  599. __asm__ __volatile__ (".chip 68040\n\t"
  600. "nop\n\t"
  601. "cpushl %%bc,(%0)\n\t"
  602. ".chip 68k"
  603. : : "a" (temp));
  604. }
  605. else if (CPU_IS_060) {
  606. unsigned long temp;
  607. __asm__ __volatile__ (".chip 68060\n\t"
  608. "plpar (%0)\n\t"
  609. ".chip 68k"
  610. : "=a" (temp)
  611. : "0" (vaddr));
  612. __asm__ __volatile__ (".chip 68060\n\t"
  613. "cpushl %%bc,(%0)\n\t"
  614. ".chip 68k"
  615. : : "a" (temp));
  616. }
  617. else {
  618. /*
  619. * 68030/68020 have no writeback cache;
  620. * still need to clear icache.
  621. * Note that vaddr is guaranteed to be long word aligned.
  622. */
  623. unsigned long temp;
  624. asm volatile ("movec %%cacr,%0" : "=r" (temp));
  625. temp += 4;
  626. asm volatile ("movec %0,%%caar\n\t"
  627. "movec %1,%%cacr"
  628. : : "r" (vaddr), "r" (temp));
  629. asm volatile ("movec %0,%%caar\n\t"
  630. "movec %1,%%cacr"
  631. : : "r" (vaddr + 4), "r" (temp));
  632. }
  633. }
  634. static inline void __user *
  635. get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size)
  636. {
  637. unsigned long usp;
  638. /* Default to using normal stack. */
  639. usp = rdusp();
  640. /* This is the X/Open sanctioned signal stack switching. */
  641. if (ka->sa.sa_flags & SA_ONSTACK) {
  642. if (!sas_ss_flags(usp))
  643. usp = current->sas_ss_sp + current->sas_ss_size;
  644. }
  645. return (void __user *)((usp - frame_size) & -8UL);
  646. }
  647. static int setup_frame (int sig, struct k_sigaction *ka,
  648. sigset_t *set, struct pt_regs *regs)
  649. {
  650. struct sigframe __user *frame;
  651. int fsize = frame_extra_sizes[regs->format];
  652. struct sigcontext context;
  653. int err = 0;
  654. if (fsize < 0) {
  655. #ifdef DEBUG
  656. printk ("setup_frame: Unknown frame format %#x\n",
  657. regs->format);
  658. #endif
  659. goto give_sigsegv;
  660. }
  661. frame = get_sigframe(ka, regs, sizeof(*frame) + fsize);
  662. if (fsize)
  663. err |= copy_to_user (frame + 1, regs + 1, fsize);
  664. err |= __put_user((current_thread_info()->exec_domain
  665. && current_thread_info()->exec_domain->signal_invmap
  666. && sig < 32
  667. ? current_thread_info()->exec_domain->signal_invmap[sig]
  668. : sig),
  669. &frame->sig);
  670. err |= __put_user(regs->vector, &frame->code);
  671. err |= __put_user(&frame->sc, &frame->psc);
  672. if (_NSIG_WORDS > 1)
  673. err |= copy_to_user(frame->extramask, &set->sig[1],
  674. sizeof(frame->extramask));
  675. setup_sigcontext(&context, regs, set->sig[0]);
  676. err |= copy_to_user (&frame->sc, &context, sizeof(context));
  677. /* Set up to return from userspace. */
  678. err |= __put_user(frame->retcode, &frame->pretcode);
  679. /* moveq #,d0; trap #0 */
  680. err |= __put_user(0x70004e40 + (__NR_sigreturn << 16),
  681. (long __user *)(frame->retcode));
  682. if (err)
  683. goto give_sigsegv;
  684. push_cache ((unsigned long) &frame->retcode);
  685. /*
  686. * Set up registers for signal handler. All the state we are about
  687. * to destroy is successfully copied to sigframe.
  688. */
  689. wrusp ((unsigned long) frame);
  690. regs->pc = (unsigned long) ka->sa.sa_handler;
  691. /*
  692. * This is subtle; if we build more than one sigframe, all but the
  693. * first one will see frame format 0 and have fsize == 0, so we won't
  694. * screw stkadj.
  695. */
  696. if (fsize)
  697. regs->stkadj = fsize;
  698. /* Prepare to skip over the extra stuff in the exception frame. */
  699. if (regs->stkadj) {
  700. struct pt_regs *tregs =
  701. (struct pt_regs *)((ulong)regs + regs->stkadj);
  702. #ifdef DEBUG
  703. printk("Performing stackadjust=%04x\n", regs->stkadj);
  704. #endif
  705. /* This must be copied with decreasing addresses to
  706. handle overlaps. */
  707. tregs->vector = 0;
  708. tregs->format = 0;
  709. tregs->pc = regs->pc;
  710. tregs->sr = regs->sr;
  711. }
  712. return 0;
  713. give_sigsegv:
  714. force_sigsegv(sig, current);
  715. return err;
  716. }
  717. static int setup_rt_frame (int sig, struct k_sigaction *ka, siginfo_t *info,
  718. sigset_t *set, struct pt_regs *regs)
  719. {
  720. struct rt_sigframe __user *frame;
  721. int fsize = frame_extra_sizes[regs->format];
  722. int err = 0;
  723. if (fsize < 0) {
  724. #ifdef DEBUG
  725. printk ("setup_frame: Unknown frame format %#x\n",
  726. regs->format);
  727. #endif
  728. goto give_sigsegv;
  729. }
  730. frame = get_sigframe(ka, regs, sizeof(*frame));
  731. if (fsize)
  732. err |= copy_to_user (&frame->uc.uc_extra, regs + 1, fsize);
  733. err |= __put_user((current_thread_info()->exec_domain
  734. && current_thread_info()->exec_domain->signal_invmap
  735. && sig < 32
  736. ? current_thread_info()->exec_domain->signal_invmap[sig]
  737. : sig),
  738. &frame->sig);
  739. err |= __put_user(&frame->info, &frame->pinfo);
  740. err |= __put_user(&frame->uc, &frame->puc);
  741. err |= copy_siginfo_to_user(&frame->info, info);
  742. /* Create the ucontext. */
  743. err |= __put_user(0, &frame->uc.uc_flags);
  744. err |= __put_user(NULL, &frame->uc.uc_link);
  745. err |= __put_user((void __user *)current->sas_ss_sp,
  746. &frame->uc.uc_stack.ss_sp);
  747. err |= __put_user(sas_ss_flags(rdusp()),
  748. &frame->uc.uc_stack.ss_flags);
  749. err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
  750. err |= rt_setup_ucontext(&frame->uc, regs);
  751. err |= copy_to_user (&frame->uc.uc_sigmask, set, sizeof(*set));
  752. /* Set up to return from userspace. */
  753. err |= __put_user(frame->retcode, &frame->pretcode);
  754. #ifdef __mcoldfire__
  755. /* movel #__NR_rt_sigreturn,d0; trap #0 */
  756. err |= __put_user(0x203c0000, (long __user *)(frame->retcode + 0));
  757. err |= __put_user(0x00004e40 + (__NR_rt_sigreturn << 16),
  758. (long __user *)(frame->retcode + 4));
  759. #else
  760. /* moveq #,d0; notb d0; trap #0 */
  761. err |= __put_user(0x70004600 + ((__NR_rt_sigreturn ^ 0xff) << 16),
  762. (long __user *)(frame->retcode + 0));
  763. err |= __put_user(0x4e40, (short __user *)(frame->retcode + 4));
  764. #endif
  765. if (err)
  766. goto give_sigsegv;
  767. push_cache ((unsigned long) &frame->retcode);
  768. /*
  769. * Set up registers for signal handler. All the state we are about
  770. * to destroy is successfully copied to sigframe.
  771. */
  772. wrusp ((unsigned long) frame);
  773. regs->pc = (unsigned long) ka->sa.sa_handler;
  774. /*
  775. * This is subtle; if we build more than one sigframe, all but the
  776. * first one will see frame format 0 and have fsize == 0, so we won't
  777. * screw stkadj.
  778. */
  779. if (fsize)
  780. regs->stkadj = fsize;
  781. /* Prepare to skip over the extra stuff in the exception frame. */
  782. if (regs->stkadj) {
  783. struct pt_regs *tregs =
  784. (struct pt_regs *)((ulong)regs + regs->stkadj);
  785. #ifdef DEBUG
  786. printk("Performing stackadjust=%04x\n", regs->stkadj);
  787. #endif
  788. /* This must be copied with decreasing addresses to
  789. handle overlaps. */
  790. tregs->vector = 0;
  791. tregs->format = 0;
  792. tregs->pc = regs->pc;
  793. tregs->sr = regs->sr;
  794. }
  795. return 0;
  796. give_sigsegv:
  797. force_sigsegv(sig, current);
  798. return err;
  799. }
  800. static inline void
  801. handle_restart(struct pt_regs *regs, struct k_sigaction *ka, int has_handler)
  802. {
  803. switch (regs->d0) {
  804. case -ERESTARTNOHAND:
  805. if (!has_handler)
  806. goto do_restart;
  807. regs->d0 = -EINTR;
  808. break;
  809. case -ERESTART_RESTARTBLOCK:
  810. if (!has_handler) {
  811. regs->d0 = __NR_restart_syscall;
  812. regs->pc -= 2;
  813. break;
  814. }
  815. regs->d0 = -EINTR;
  816. break;
  817. case -ERESTARTSYS:
  818. if (has_handler && !(ka->sa.sa_flags & SA_RESTART)) {
  819. regs->d0 = -EINTR;
  820. break;
  821. }
  822. /* fallthrough */
  823. case -ERESTARTNOINTR:
  824. do_restart:
  825. regs->d0 = regs->orig_d0;
  826. regs->pc -= 2;
  827. break;
  828. }
  829. }
  830. void ptrace_signal_deliver(struct pt_regs *regs, void *cookie)
  831. {
  832. if (regs->orig_d0 < 0)
  833. return;
  834. switch (regs->d0) {
  835. case -ERESTARTNOHAND:
  836. case -ERESTARTSYS:
  837. case -ERESTARTNOINTR:
  838. regs->d0 = regs->orig_d0;
  839. regs->orig_d0 = -1;
  840. regs->pc -= 2;
  841. break;
  842. }
  843. }
  844. /*
  845. * OK, we're invoking a handler
  846. */
  847. static void
  848. handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info,
  849. sigset_t *oldset, struct pt_regs *regs)
  850. {
  851. int err;
  852. /* are we from a system call? */
  853. if (regs->orig_d0 >= 0)
  854. /* If so, check system call restarting.. */
  855. handle_restart(regs, ka, 1);
  856. /* set up the stack frame */
  857. if (ka->sa.sa_flags & SA_SIGINFO)
  858. err = setup_rt_frame(sig, ka, info, oldset, regs);
  859. else
  860. err = setup_frame(sig, ka, oldset, regs);
  861. if (err)
  862. return;
  863. sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
  864. if (!(ka->sa.sa_flags & SA_NODEFER))
  865. sigaddset(&current->blocked,sig);
  866. recalc_sigpending();
  867. if (test_thread_flag(TIF_DELAYED_TRACE)) {
  868. regs->sr &= ~0x8000;
  869. send_sig(SIGTRAP, current, 1);
  870. }
  871. clear_thread_flag(TIF_RESTORE_SIGMASK);
  872. }
  873. /*
  874. * Note that 'init' is a special process: it doesn't get signals it doesn't
  875. * want to handle. Thus you cannot kill init even with a SIGKILL even by
  876. * mistake.
  877. */
  878. asmlinkage void do_signal(struct pt_regs *regs)
  879. {
  880. siginfo_t info;
  881. struct k_sigaction ka;
  882. int signr;
  883. sigset_t *oldset;
  884. current->thread.esp0 = (unsigned long) regs;
  885. if (test_thread_flag(TIF_RESTORE_SIGMASK))
  886. oldset = &current->saved_sigmask;
  887. else
  888. oldset = &current->blocked;
  889. signr = get_signal_to_deliver(&info, &ka, regs, NULL);
  890. if (signr > 0) {
  891. /* Whee! Actually deliver the signal. */
  892. handle_signal(signr, &ka, &info, oldset, regs);
  893. return;
  894. }
  895. /* Did we come from a system call? */
  896. if (regs->orig_d0 >= 0)
  897. /* Restart the system call - no handlers present */
  898. handle_restart(regs, NULL, 0);
  899. /* If there's no signal to deliver, we just restore the saved mask. */
  900. if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
  901. clear_thread_flag(TIF_RESTORE_SIGMASK);
  902. sigprocmask(SIG_SETMASK, &current->saved_sigmask, NULL);
  903. }
  904. }