signal.c 31 KB

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