signal.c 31 KB

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