1 /* $Id: signal32.c,v 1.74 2002/02/09 19:49:30 davem Exp $
2 * arch/sparc64/kernel/signal32.c
4 * Copyright (C) 1991, 1992 Linus Torvalds
5 * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
6 * Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx)
7 * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be)
8 * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
11 #include <linux/sched.h>
12 #include <linux/kernel.h>
13 #include <linux/signal.h>
14 #include <linux/errno.h>
15 #include <linux/wait.h>
16 #include <linux/ptrace.h>
17 #include <linux/unistd.h>
19 #include <linux/tty.h>
20 #include <linux/smp_lock.h>
21 #include <linux/binfmts.h>
22 #include <linux/compat.h>
24 #include <asm/uaccess.h>
25 #include <asm/bitops.h>
26 #include <asm/ptrace.h>
28 #include <asm/pgtable.h>
29 #include <asm/psrcompat.h>
30 #include <asm/fpumacro.h>
31 #include <asm/visasm.h>
33 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
35 int do_signal32(sigset_t *oldset, struct pt_regs *regs,
36 unsigned long orig_o0, int ret_from_syscall);
38 /* Signal frames: the original one (compatible with SunOS):
40 * Set up a signal frame... Make the stack look the way SunOS
41 * expects it to look which is basically:
43 * ---------------------------------- <-- %sp at signal time
46 * Ptr to sigcontext area above
48 * The signal number itself
50 * ---------------------------------- <-- New %sp
52 struct signal_sframe32 {
53 struct reg_window32 sig_window;
56 /* struct sigcontext32 * */ u32 sig_scptr;
58 struct sigcontext32 sig_context;
59 unsigned int extramask[_COMPAT_NSIG_WORDS - 1];
63 * And the new one, intended to be used for Linux applications only
64 * (we have enough in there to work with clone).
65 * All the interesting bits are in the info field.
67 struct new_signal_frame32 {
68 struct sparc_stackf32 ss;
70 /* __siginfo_fpu32_t * */ u32 fpu_save;
71 unsigned int insns[2];
72 unsigned int extramask[_COMPAT_NSIG_WORDS - 1];
73 unsigned int extra_size; /* Should be sizeof(siginfo_extra_v8plus_t) */
74 /* Only valid if (info.si_regs.psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS */
75 siginfo_extra_v8plus_t v8plus;
76 __siginfo_fpu_t fpu_state;
79 struct rt_signal_frame32 {
80 struct sparc_stackf32 ss;
82 struct pt_regs32 regs;
84 /* __siginfo_fpu32_t * */ u32 fpu_save;
85 unsigned int insns[2];
87 unsigned int extra_size; /* Should be sizeof(siginfo_extra_v8plus_t) */
88 /* Only valid if (regs.psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS */
89 siginfo_extra_v8plus_t v8plus;
90 __siginfo_fpu_t fpu_state;
94 #define SF_ALIGNEDSZ (((sizeof(struct signal_sframe32) + 7) & (~7)))
95 #define NF_ALIGNEDSZ (((sizeof(struct new_signal_frame32) + 7) & (~7)))
96 #define RT_ALIGNEDSZ (((sizeof(struct rt_signal_frame32) + 7) & (~7)))
98 int copy_siginfo_to_user32(siginfo_t32 __user *to, siginfo_t *from)
102 if (!access_ok(VERIFY_WRITE, to, sizeof(siginfo_t32)))
105 /* If you change siginfo_t structure, please be sure
106 this code is fixed accordingly.
107 It should never copy any pad contained in the structure
108 to avoid security leaks, but must copy the generic
109 3 ints plus the relevant union member.
110 This routine must convert siginfo from 64bit to 32bit as well
112 err = __put_user(from->si_signo, &to->si_signo);
113 err |= __put_user(from->si_errno, &to->si_errno);
114 err |= __put_user((short)from->si_code, &to->si_code);
115 if (from->si_code < 0)
116 err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
118 switch (from->si_code >> 16) {
119 case __SI_TIMER >> 16:
120 err |= __put_user(from->si_tid, &to->si_tid);
121 err |= __put_user(from->si_overrun, &to->si_overrun);
122 err |= __put_user((u32)(u64)from->si_ptr, &to->si_ptr);
124 case __SI_CHLD >> 16:
125 err |= __put_user(from->si_utime, &to->si_utime);
126 err |= __put_user(from->si_stime, &to->si_stime);
127 err |= __put_user(from->si_status, &to->si_status);
129 err |= __put_user(from->si_pid, &to->si_pid);
130 err |= __put_user(from->si_uid, &to->si_uid);
132 case __SI_FAULT >> 16:
133 case __SI_POLL >> 16:
134 err |= __put_user(from->si_trapno, &to->si_trapno);
135 err |= __put_user((long)from->si_addr, &to->si_addr);
137 case __SI_RT >> 16: /* This is not generated by the kernel as of now. */
138 case __SI_MESGQ >> 16:
139 err |= __put_user(from->si_pid, &to->si_pid);
140 err |= __put_user(from->si_uid, &to->si_uid);
141 err |= __put_user(from->si_int, &to->si_int);
149 * atomically swap in the new signal mask, and wait for a signal.
150 * This is really tricky on the Sparc, watch out...
152 asmlinkage void _sigpause32_common(compat_old_sigset_t set, struct pt_regs *regs)
157 spin_lock_irq(¤t->sighand->siglock);
158 saveset = current->blocked;
159 siginitset(¤t->blocked, set);
161 spin_unlock_irq(¤t->sighand->siglock);
163 regs->tpc = regs->tnpc;
165 if (test_thread_flag(TIF_32BIT)) {
166 regs->tpc &= 0xffffffff;
167 regs->tnpc &= 0xffffffff;
170 /* Condition codes and return value where set here for sigpause,
171 * and so got used by setup_frame, which again causes sigreturn()
175 current->state = TASK_INTERRUPTIBLE;
178 * Return -EINTR and set condition code here,
179 * so the interrupted system call actually returns
182 regs->tstate |= TSTATE_ICARRY;
183 regs->u_regs[UREG_I0] = EINTR;
184 if (do_signal32(&saveset, regs, 0, 0))
189 asmlinkage void do_rt_sigsuspend32(u32 uset, size_t sigsetsize, struct pt_regs *regs)
191 sigset_t oldset, set;
192 compat_sigset_t set32;
194 /* XXX: Don't preclude handling different sized sigset_t's. */
195 if (((compat_size_t)sigsetsize) != sizeof(sigset_t)) {
196 regs->tstate |= TSTATE_ICARRY;
197 regs->u_regs[UREG_I0] = EINVAL;
200 if (copy_from_user(&set32, (void __user *)(long)uset, sizeof(set32))) {
201 regs->tstate |= TSTATE_ICARRY;
202 regs->u_regs[UREG_I0] = EFAULT;
205 switch (_NSIG_WORDS) {
206 case 4: set.sig[3] = set32.sig[6] + (((long)set32.sig[7]) << 32);
207 case 3: set.sig[2] = set32.sig[4] + (((long)set32.sig[5]) << 32);
208 case 2: set.sig[1] = set32.sig[2] + (((long)set32.sig[3]) << 32);
209 case 1: set.sig[0] = set32.sig[0] + (((long)set32.sig[1]) << 32);
211 sigdelsetmask(&set, ~_BLOCKABLE);
212 spin_lock_irq(¤t->sighand->siglock);
213 oldset = current->blocked;
214 current->blocked = set;
216 spin_unlock_irq(¤t->sighand->siglock);
218 regs->tpc = regs->tnpc;
220 if (test_thread_flag(TIF_32BIT)) {
221 regs->tpc &= 0xffffffff;
222 regs->tnpc &= 0xffffffff;
225 /* Condition codes and return value where set here for sigpause,
226 * and so got used by setup_frame, which again causes sigreturn()
230 current->state = TASK_INTERRUPTIBLE;
233 * Return -EINTR and set condition code here,
234 * so the interrupted system call actually returns
237 regs->tstate |= TSTATE_ICARRY;
238 regs->u_regs[UREG_I0] = EINTR;
239 if (do_signal32(&oldset, regs, 0, 0))
244 static int restore_fpu_state32(struct pt_regs *regs, __siginfo_fpu_t __user *fpu)
246 unsigned long *fpregs = current_thread_info()->fpregs;
250 err = __get_user(fprs, &fpu->si_fprs);
252 regs->tstate &= ~TSTATE_PEF;
254 err |= copy_from_user(fpregs, &fpu->si_float_regs[0], (sizeof(unsigned int) * 32));
256 err |= copy_from_user(fpregs+16, &fpu->si_float_regs[32], (sizeof(unsigned int) * 32));
257 err |= __get_user(current_thread_info()->xfsr[0], &fpu->si_fsr);
258 err |= __get_user(current_thread_info()->gsr[0], &fpu->si_gsr);
259 current_thread_info()->fpsaved[0] |= fprs;
263 void do_new_sigreturn32(struct pt_regs *regs)
265 struct new_signal_frame32 __user *sf;
267 unsigned pc, npc, fpu_save;
269 unsigned seta[_COMPAT_NSIG_WORDS];
272 regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
273 sf = (struct new_signal_frame32 __user *) regs->u_regs[UREG_FP];
275 /* 1. Make sure we are not getting garbage from the user */
276 if (verify_area(VERIFY_READ, sf, sizeof(*sf)) ||
277 (((unsigned long) sf) & 3))
280 get_user(pc, &sf->info.si_regs.pc);
281 __get_user(npc, &sf->info.si_regs.npc);
286 if (test_thread_flag(TIF_32BIT)) {
293 /* 2. Restore the state */
294 err = __get_user(regs->y, &sf->info.si_regs.y);
295 err |= __get_user(psr, &sf->info.si_regs.psr);
297 for (i = UREG_G1; i <= UREG_I7; i++)
298 err |= __get_user(regs->u_regs[i], &sf->info.si_regs.u_regs[i]);
299 if ((psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS) {
300 err |= __get_user(i, &sf->v8plus.g_upper[0]);
301 if (i == SIGINFO_EXTRA_V8PLUS_MAGIC) {
302 for (i = UREG_G1; i <= UREG_I7; i++)
303 err |= __get_user(((u32 *)regs->u_regs)[2*i], &sf->v8plus.g_upper[i]);
307 /* User can only change condition codes in %tstate. */
308 regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC);
309 regs->tstate |= psr_to_tstate_icc(psr);
311 err |= __get_user(fpu_save, &sf->fpu_save);
313 err |= restore_fpu_state32(regs, &sf->fpu_state);
314 err |= __get_user(seta[0], &sf->info.si_mask);
315 err |= copy_from_user(seta+1, &sf->extramask,
316 (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int));
319 switch (_NSIG_WORDS) {
320 case 4: set.sig[3] = seta[6] + (((long)seta[7]) << 32);
321 case 3: set.sig[2] = seta[4] + (((long)seta[5]) << 32);
322 case 2: set.sig[1] = seta[2] + (((long)seta[3]) << 32);
323 case 1: set.sig[0] = seta[0] + (((long)seta[1]) << 32);
325 sigdelsetmask(&set, ~_BLOCKABLE);
326 spin_lock_irq(¤t->sighand->siglock);
327 current->blocked = set;
329 spin_unlock_irq(¤t->sighand->siglock);
336 asmlinkage void do_sigreturn32(struct pt_regs *regs)
338 struct sigcontext32 __user *scptr;
339 unsigned int pc, npc, psr;
341 unsigned int seta[_COMPAT_NSIG_WORDS];
344 /* Always make any pending restarted system calls return -EINTR */
345 current_thread_info()->restart_block.fn = do_no_restart_syscall;
347 synchronize_user_stack();
348 if (test_thread_flag(TIF_NEWSIGNALS))
349 return do_new_sigreturn32(regs);
351 scptr = (struct sigcontext32 __user *)
352 (regs->u_regs[UREG_I0] & 0x00000000ffffffffUL);
353 /* Check sanity of the user arg. */
354 if (verify_area(VERIFY_READ, scptr, sizeof(struct sigcontext32)) ||
355 (((unsigned long) scptr) & 3))
358 err = __get_user(pc, &scptr->sigc_pc);
359 err |= __get_user(npc, &scptr->sigc_npc);
362 goto segv; /* Nice try. */
364 err |= __get_user(seta[0], &scptr->sigc_mask);
365 /* Note that scptr + 1 points to extramask */
366 err |= copy_from_user(seta+1, scptr + 1,
367 (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int));
370 switch (_NSIG_WORDS) {
371 case 4: set.sig[3] = seta[6] + (((long)seta[7]) << 32);
372 case 3: set.sig[2] = seta[4] + (((long)seta[5]) << 32);
373 case 2: set.sig[1] = seta[2] + (((long)seta[3]) << 32);
374 case 1: set.sig[0] = seta[0] + (((long)seta[1]) << 32);
376 sigdelsetmask(&set, ~_BLOCKABLE);
377 spin_lock_irq(¤t->sighand->siglock);
378 current->blocked = set;
380 spin_unlock_irq(¤t->sighand->siglock);
382 if (test_thread_flag(TIF_32BIT)) {
388 err = __get_user(regs->u_regs[UREG_FP], &scptr->sigc_sp);
389 err |= __get_user(regs->u_regs[UREG_I0], &scptr->sigc_o0);
390 err |= __get_user(regs->u_regs[UREG_G1], &scptr->sigc_g1);
392 /* User can only change condition codes in %tstate. */
393 err |= __get_user(psr, &scptr->sigc_psr);
396 regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC);
397 regs->tstate |= psr_to_tstate_icc(psr);
404 asmlinkage void do_rt_sigreturn32(struct pt_regs *regs)
406 struct rt_signal_frame32 __user *sf;
407 unsigned int psr, pc, npc, fpu_save, u_ss_sp;
410 compat_sigset_t seta;
414 /* Always make any pending restarted system calls return -EINTR */
415 current_thread_info()->restart_block.fn = do_no_restart_syscall;
417 synchronize_user_stack();
418 regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
419 sf = (struct rt_signal_frame32 __user *) regs->u_regs[UREG_FP];
421 /* 1. Make sure we are not getting garbage from the user */
422 if (verify_area(VERIFY_READ, sf, sizeof(*sf)) ||
423 (((unsigned long) sf) & 3))
426 get_user(pc, &sf->regs.pc);
427 __get_user(npc, &sf->regs.npc);
432 if (test_thread_flag(TIF_32BIT)) {
439 /* 2. Restore the state */
440 err = __get_user(regs->y, &sf->regs.y);
441 err |= __get_user(psr, &sf->regs.psr);
443 for (i = UREG_G1; i <= UREG_I7; i++)
444 err |= __get_user(regs->u_regs[i], &sf->regs.u_regs[i]);
445 if ((psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS) {
446 err |= __get_user(i, &sf->v8plus.g_upper[0]);
447 if (i == SIGINFO_EXTRA_V8PLUS_MAGIC) {
448 for (i = UREG_G1; i <= UREG_I7; i++)
449 err |= __get_user(((u32 *)regs->u_regs)[2*i], &sf->v8plus.g_upper[i]);
453 /* User can only change condition codes in %tstate. */
454 regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC);
455 regs->tstate |= psr_to_tstate_icc(psr);
457 err |= __get_user(fpu_save, &sf->fpu_save);
459 err |= restore_fpu_state32(regs, &sf->fpu_state);
460 err |= copy_from_user(&seta, &sf->mask, sizeof(compat_sigset_t));
461 err |= __get_user(u_ss_sp, &sf->stack.ss_sp);
462 st.ss_sp = (void *) (long) u_ss_sp;
463 err |= __get_user(st.ss_flags, &sf->stack.ss_flags);
464 err |= __get_user(st.ss_size, &sf->stack.ss_size);
468 /* It is more difficult to avoid calling this function than to
469 call it and ignore errors. */
472 do_sigaltstack(&st, NULL, (unsigned long)sf);
475 switch (_NSIG_WORDS) {
476 case 4: set.sig[3] = seta.sig[6] + (((long)seta.sig[7]) << 32);
477 case 3: set.sig[2] = seta.sig[4] + (((long)seta.sig[5]) << 32);
478 case 2: set.sig[1] = seta.sig[2] + (((long)seta.sig[3]) << 32);
479 case 1: set.sig[0] = seta.sig[0] + (((long)seta.sig[1]) << 32);
481 sigdelsetmask(&set, ~_BLOCKABLE);
482 spin_lock_irq(¤t->sighand->siglock);
483 current->blocked = set;
485 spin_unlock_irq(¤t->sighand->siglock);
491 /* Checks if the fp is valid */
492 static int invalid_frame_pointer(void __user *fp, int fplen)
494 if ((((unsigned long) fp) & 7) || ((unsigned long)fp) > 0x100000000ULL - fplen)
499 static void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, unsigned long framesize)
503 regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
504 sp = regs->u_regs[UREG_FP];
506 /* This is the X/Open sanctioned signal stack switching. */
507 if (sa->sa_flags & SA_ONSTACK) {
508 if (!on_sig_stack(sp) && !((current->sas_ss_sp + current->sas_ss_size) & 7))
509 sp = current->sas_ss_sp + current->sas_ss_size;
511 return (void __user *)(sp - framesize);
515 setup_frame32(struct sigaction *sa, struct pt_regs *regs, int signr, sigset_t *oldset, siginfo_t *info)
517 struct signal_sframe32 __user *sframep;
518 struct sigcontext32 __user *sc;
519 unsigned int seta[_COMPAT_NSIG_WORDS];
523 unsigned long pc = regs->tpc;
524 unsigned long npc = regs->tnpc;
527 if (test_thread_flag(TIF_32BIT)) {
532 synchronize_user_stack();
533 save_and_clear_fpu();
535 sframep = (struct signal_sframe32 __user *)
536 get_sigframe(sa, regs, SF_ALIGNEDSZ);
537 if (invalid_frame_pointer(sframep, sizeof(*sframep))){
538 /* Don't change signal code and address, so that
539 * post mortem debuggers can have a look.
544 sc = &sframep->sig_context;
546 /* We've already made sure frame pointer isn't in kernel space... */
547 err = __put_user((sas_ss_flags(regs->u_regs[UREG_FP]) == SS_ONSTACK),
550 switch (_NSIG_WORDS) {
551 case 4: seta[7] = (oldset->sig[3] >> 32);
552 seta[6] = oldset->sig[3];
553 case 3: seta[5] = (oldset->sig[2] >> 32);
554 seta[4] = oldset->sig[2];
555 case 2: seta[3] = (oldset->sig[1] >> 32);
556 seta[2] = oldset->sig[1];
557 case 1: seta[1] = (oldset->sig[0] >> 32);
558 seta[0] = oldset->sig[0];
560 err |= __put_user(seta[0], &sc->sigc_mask);
561 err |= __copy_to_user(sframep->extramask, seta + 1,
562 (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int));
563 err |= __put_user(regs->u_regs[UREG_FP], &sc->sigc_sp);
564 err |= __put_user(pc, &sc->sigc_pc);
565 err |= __put_user(npc, &sc->sigc_npc);
566 psr = tstate_to_psr(regs->tstate);
567 if (current_thread_info()->fpsaved[0] & FPRS_FEF)
569 err |= __put_user(psr, &sc->sigc_psr);
570 err |= __put_user(regs->u_regs[UREG_G1], &sc->sigc_g1);
571 err |= __put_user(regs->u_regs[UREG_I0], &sc->sigc_o0);
572 err |= __put_user(get_thread_wsaved(), &sc->sigc_oswins);
574 err |= copy_in_user((u32 __user *)sframep,
575 (u32 __user *)(regs->u_regs[UREG_FP]),
576 sizeof(struct reg_window32));
578 set_thread_wsaved(0); /* So process is allowed to execute. */
579 err |= __put_user(signr, &sframep->sig_num);
582 if (SI_FROMKERNEL (info) && (info->si_code & __SI_MASK) == __SI_FAULT) {
583 sig_address = info->si_addr;
586 switch (info->si_code) {
587 case SEGV_MAPERR: sig_code = SUBSIG_NOMAPPING; break;
588 default: sig_code = SUBSIG_PROTECTION; break;
592 switch (info->si_code) {
593 case ILL_ILLOPC: sig_code = SUBSIG_ILLINST; break;
594 case ILL_PRVOPC: sig_code = SUBSIG_PRIVINST; break;
595 case ILL_ILLTRP: sig_code = SUBSIG_BADTRAP(info->si_trapno); break;
596 default: sig_code = SUBSIG_STACK; break;
600 switch (info->si_code) {
601 case FPE_INTDIV: sig_code = SUBSIG_IDIVZERO; break;
602 case FPE_INTOVF: sig_code = SUBSIG_FPINTOVFL; break;
603 case FPE_FLTDIV: sig_code = SUBSIG_FPDIVZERO; break;
604 case FPE_FLTOVF: sig_code = SUBSIG_FPOVFLOW; break;
605 case FPE_FLTUND: sig_code = SUBSIG_FPUNFLOW; break;
606 case FPE_FLTRES: sig_code = SUBSIG_FPINEXACT; break;
607 case FPE_FLTINV: sig_code = SUBSIG_FPOPERROR; break;
608 default: sig_code = SUBSIG_FPERROR; break;
612 switch (info->si_code) {
613 case BUS_ADRALN: sig_code = SUBSIG_ALIGNMENT; break;
614 case BUS_ADRERR: sig_code = SUBSIG_MISCERROR; break;
615 default: sig_code = SUBSIG_BUSTIMEOUT; break;
619 switch (info->si_code) {
620 case EMT_TAGOVF: sig_code = SUBSIG_TAG; break;
624 if (info->si_code == (__SI_FAULT|0x100)) {
625 /* See sys_sunos32.c */
626 sig_code = info->si_trapno;
633 err |= __put_user((long)sig_address, &sframep->sig_address);
634 err |= __put_user(sig_code, &sframep->sig_code);
635 err |= __put_user((u64)sc, &sframep->sig_scptr);
639 regs->u_regs[UREG_FP] = (unsigned long) sframep;
640 regs->tpc = (unsigned long) sa->sa_handler;
641 regs->tnpc = (regs->tpc + 4);
642 if (test_thread_flag(TIF_32BIT)) {
643 regs->tpc &= 0xffffffff;
644 regs->tnpc &= 0xffffffff;
653 static int save_fpu_state32(struct pt_regs *regs, __siginfo_fpu_t __user *fpu)
655 unsigned long *fpregs = current_thread_info()->fpregs;
659 fprs = current_thread_info()->fpsaved[0];
661 err |= copy_to_user(&fpu->si_float_regs[0], fpregs,
662 (sizeof(unsigned int) * 32));
664 err |= copy_to_user(&fpu->si_float_regs[32], fpregs+16,
665 (sizeof(unsigned int) * 32));
666 err |= __put_user(current_thread_info()->xfsr[0], &fpu->si_fsr);
667 err |= __put_user(current_thread_info()->gsr[0], &fpu->si_gsr);
668 err |= __put_user(fprs, &fpu->si_fprs);
673 static void new_setup_frame32(struct k_sigaction *ka, struct pt_regs *regs,
674 int signo, sigset_t *oldset)
676 struct new_signal_frame32 __user *sf;
680 unsigned int seta[_COMPAT_NSIG_WORDS];
682 /* 1. Make sure everything is clean */
683 synchronize_user_stack();
684 save_and_clear_fpu();
686 sigframe_size = NF_ALIGNEDSZ;
687 if (!(current_thread_info()->fpsaved[0] & FPRS_FEF))
688 sigframe_size -= sizeof(__siginfo_fpu_t);
690 sf = (struct new_signal_frame32 __user *)
691 get_sigframe(&ka->sa, regs, sigframe_size);
693 if (invalid_frame_pointer(sf, sigframe_size))
696 if (get_thread_wsaved() != 0)
699 /* 2. Save the current process state */
700 if (test_thread_flag(TIF_32BIT)) {
701 regs->tpc &= 0xffffffff;
702 regs->tnpc &= 0xffffffff;
704 err = put_user(regs->tpc, &sf->info.si_regs.pc);
705 err |= __put_user(regs->tnpc, &sf->info.si_regs.npc);
706 err |= __put_user(regs->y, &sf->info.si_regs.y);
707 psr = tstate_to_psr(regs->tstate);
708 if (current_thread_info()->fpsaved[0] & FPRS_FEF)
710 err |= __put_user(psr, &sf->info.si_regs.psr);
711 for (i = 0; i < 16; i++)
712 err |= __put_user(regs->u_regs[i], &sf->info.si_regs.u_regs[i]);
713 err |= __put_user(sizeof(siginfo_extra_v8plus_t), &sf->extra_size);
714 err |= __put_user(SIGINFO_EXTRA_V8PLUS_MAGIC, &sf->v8plus.g_upper[0]);
715 for (i = 1; i < 16; i++)
716 err |= __put_user(((u32 *)regs->u_regs)[2*i], &sf->v8plus.g_upper[i]);
719 err |= save_fpu_state32(regs, &sf->fpu_state);
720 err |= __put_user((u64)&sf->fpu_state, &sf->fpu_save);
722 err |= __put_user(0, &sf->fpu_save);
725 switch (_NSIG_WORDS) {
726 case 4: seta[7] = (oldset->sig[3] >> 32);
727 seta[6] = oldset->sig[3];
728 case 3: seta[5] = (oldset->sig[2] >> 32);
729 seta[4] = oldset->sig[2];
730 case 2: seta[3] = (oldset->sig[1] >> 32);
731 seta[2] = oldset->sig[1];
732 case 1: seta[1] = (oldset->sig[0] >> 32);
733 seta[0] = oldset->sig[0];
735 err |= __put_user(seta[0], &sf->info.si_mask);
736 err |= __copy_to_user(sf->extramask, seta + 1,
737 (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int));
739 err |= copy_in_user((u32 __user *)sf,
740 (u32 __user *)(regs->u_regs[UREG_FP]),
741 sizeof(struct reg_window32));
746 /* 3. signal handler back-trampoline and parameters */
747 regs->u_regs[UREG_FP] = (unsigned long) sf;
748 regs->u_regs[UREG_I0] = signo;
749 regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
751 /* 4. signal handler */
752 regs->tpc = (unsigned long) ka->sa.sa_handler;
753 regs->tnpc = (regs->tpc + 4);
754 if (test_thread_flag(TIF_32BIT)) {
755 regs->tpc &= 0xffffffff;
756 regs->tnpc &= 0xffffffff;
759 /* 5. return to kernel instructions */
760 if (ka->ka_restorer) {
761 regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer;
763 /* Flush instruction space. */
764 unsigned long address = ((unsigned long)&(sf->insns[0]));
765 pgd_t *pgdp = pgd_offset(current->mm, address);
766 pmd_t *pmdp = pmd_offset(pgdp, address);
769 regs->u_regs[UREG_I7] = (unsigned long) (&(sf->insns[0]) - 2);
771 err = __put_user(0x821020d8, &sf->insns[0]); /*mov __NR_sigreturn, %g1*/
772 err |= __put_user(0x91d02010, &sf->insns[1]); /*t 0x10*/
777 ptep = pte_offset_map(pmdp, address);
778 if (pte_present(*ptep)) {
779 unsigned long page = (unsigned long)
780 page_address(pte_page(*ptep));
782 __asm__ __volatile__(
783 " membar #StoreStore\n"
785 : : "r" (page), "r" (address & (PAGE_SIZE - 1))
799 /* Setup a Solaris stack frame */
801 setup_svr4_frame32(struct sigaction *sa, unsigned long pc, unsigned long npc,
802 struct pt_regs *regs, int signr, sigset_t *oldset)
804 svr4_signal_frame_t __user *sfp;
805 svr4_gregset_t __user *gr;
806 svr4_siginfo_t __user *si;
807 svr4_mcontext_t __user *mc;
808 svr4_gwindows_t __user *gw;
809 svr4_ucontext_t __user *uc;
814 synchronize_user_stack();
815 save_and_clear_fpu();
817 regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
818 sfp = (svr4_signal_frame_t __user *)
819 get_sigframe(sa, regs,
820 sizeof(struct reg_window32) + SVR4_SF_ALIGNED);
822 if (invalid_frame_pointer(sfp, sizeof(*sfp)))
825 /* Start with a clean frame pointer and fill it */
826 err = clear_user(sfp, sizeof(*sfp));
828 /* Setup convenience variables */
835 /* FIXME: where am I supposed to put this?
836 * sc->sigc_onstack = old_status;
837 * anyways, it does not look like it is used for anything at all.
839 setv.sigbits[0] = oldset->sig[0];
840 setv.sigbits[1] = (oldset->sig[0] >> 32);
841 if (_NSIG_WORDS >= 2) {
842 setv.sigbits[2] = oldset->sig[1];
843 setv.sigbits[3] = (oldset->sig[1] >> 32);
844 err |= __copy_to_user(&uc->sigmask, &setv, sizeof(svr4_sigset_t));
846 err |= __copy_to_user(&uc->sigmask, &setv,
847 2 * sizeof(unsigned int));
849 /* Store registers */
850 if (test_thread_flag(TIF_32BIT)) {
851 regs->tpc &= 0xffffffff;
852 regs->tnpc &= 0xffffffff;
854 err |= __put_user(regs->tpc, &((*gr)[SVR4_PC]));
855 err |= __put_user(regs->tnpc, &((*gr)[SVR4_NPC]));
856 psr = tstate_to_psr(regs->tstate);
857 if (current_thread_info()->fpsaved[0] & FPRS_FEF)
859 err |= __put_user(psr, &((*gr)[SVR4_PSR]));
860 err |= __put_user(regs->y, &((*gr)[SVR4_Y]));
862 /* Copy g[1..7] and o[0..7] registers */
863 for (i = 0; i < 7; i++)
864 err |= __put_user(regs->u_regs[UREG_G1+i], (&(*gr)[SVR4_G1])+i);
865 for (i = 0; i < 8; i++)
866 err |= __put_user(regs->u_regs[UREG_I0+i], (&(*gr)[SVR4_O0])+i);
868 /* Setup sigaltstack */
869 err |= __put_user(current->sas_ss_sp, &uc->stack.sp);
870 err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &uc->stack.flags);
871 err |= __put_user(current->sas_ss_size, &uc->stack.size);
873 /* Save the currently window file: */
875 /* 1. Link sfp->uc->gwins to our windows */
876 err |= __put_user((u32)(long)gw, &mc->gwin);
878 /* 2. Number of windows to restore at setcontext (): */
879 err |= __put_user(get_thread_wsaved(), &gw->count);
881 /* 3. We just pay attention to the gw->count field on setcontext */
882 set_thread_wsaved(0); /* So process is allowed to execute. */
884 /* Setup the signal information. Solaris expects a bunch of
885 * information to be passed to the signal handler, we don't provide
886 * that much currently, should use siginfo.
888 err |= __put_user(signr, &si->siginfo.signo);
889 err |= __put_user(SVR4_SINOINFO, &si->siginfo.code);
893 regs->u_regs[UREG_FP] = (unsigned long) sfp;
894 regs->tpc = (unsigned long) sa->sa_handler;
895 regs->tnpc = (regs->tpc + 4);
896 if (test_thread_flag(TIF_32BIT)) {
897 regs->tpc &= 0xffffffff;
898 regs->tnpc &= 0xffffffff;
901 /* Arguments passed to signal handler */
902 if (regs->u_regs[14]){
903 struct reg_window32 __user *rw = (struct reg_window32 __user *)
904 (regs->u_regs[14] & 0x00000000ffffffffUL);
906 err |= __put_user(signr, &rw->ins[0]);
907 err |= __put_user((u64)si, &rw->ins[1]);
908 err |= __put_user((u64)uc, &rw->ins[2]);
909 err |= __put_user((u64)sfp, &rw->ins[6]); /* frame pointer */
913 regs->u_regs[UREG_I0] = signr;
914 regs->u_regs[UREG_I1] = (u32)(u64) si;
915 regs->u_regs[UREG_I2] = (u32)(u64) uc;
924 svr4_getcontext(svr4_ucontext_t __user *uc, struct pt_regs *regs)
926 svr4_gregset_t __user *gr;
927 svr4_mcontext_t __user *mc;
932 synchronize_user_stack();
933 save_and_clear_fpu();
935 if (get_thread_wsaved())
938 err = clear_user(uc, sizeof(*uc));
940 /* Setup convenience variables */
944 setv.sigbits[0] = current->blocked.sig[0];
945 setv.sigbits[1] = (current->blocked.sig[0] >> 32);
946 if (_NSIG_WORDS >= 2) {
947 setv.sigbits[2] = current->blocked.sig[1];
948 setv.sigbits[3] = (current->blocked.sig[1] >> 32);
949 err |= __copy_to_user(&uc->sigmask, &setv, sizeof(svr4_sigset_t));
951 err |= __copy_to_user(&uc->sigmask, &setv, 2 * sizeof(unsigned));
953 /* Store registers */
954 if (test_thread_flag(TIF_32BIT)) {
955 regs->tpc &= 0xffffffff;
956 regs->tnpc &= 0xffffffff;
958 err |= __put_user(regs->tpc, &uc->mcontext.greg[SVR4_PC]);
959 err |= __put_user(regs->tnpc, &uc->mcontext.greg[SVR4_NPC]);
961 psr = tstate_to_psr(regs->tstate) & ~PSR_EF;
962 if (current_thread_info()->fpsaved[0] & FPRS_FEF)
964 err |= __put_user(psr, &uc->mcontext.greg[SVR4_PSR]);
966 err |= __put_user(regs->y, &uc->mcontext.greg[SVR4_Y]);
968 /* Copy g[1..7] and o[0..7] registers */
969 for (i = 0; i < 7; i++)
970 err |= __put_user(regs->u_regs[UREG_G1+i], (&(*gr)[SVR4_G1])+i);
971 for (i = 0; i < 8; i++)
972 err |= __put_user(regs->u_regs[UREG_I0+i], (&(*gr)[SVR4_O0])+i);
974 /* Setup sigaltstack */
975 err |= __put_user(current->sas_ss_sp, &uc->stack.sp);
976 err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &uc->stack.flags);
977 err |= __put_user(current->sas_ss_size, &uc->stack.size);
979 /* The register file is not saved
980 * we have already stuffed all of it with sync_user_stack
982 return (err ? -EFAULT : 0);
986 /* Set the context for a svr4 application, this is Solaris way to sigreturn */
987 asmlinkage int svr4_setcontext(svr4_ucontext_t __user *c, struct pt_regs *regs)
989 svr4_gregset_t __user *gr;
991 u32 pc, npc, psr, u_ss_sp;
997 /* Fixme: restore windows, or is this already taken care of in
998 * svr4_setup_frame when sync_user_windows is done?
1000 flush_user_windows();
1002 if (get_thread_wsaved())
1005 if (((unsigned long) c) & 3){
1006 printk("Unaligned structure passed\n");
1010 if (!__access_ok((unsigned long)c, sizeof(*c))) {
1011 /* Miguel, add nice debugging msg _here_. ;-) */
1015 /* Check for valid PC and nPC */
1016 gr = &c->mcontext.greg;
1017 err = __get_user(pc, &((*gr)[SVR4_PC]));
1018 err |= __get_user(npc, &((*gr)[SVR4_NPC]));
1022 /* Retrieve information from passed ucontext */
1023 /* note that nPC is ored a 1, this is used to inform entry.S */
1024 /* that we don't want it to mess with our PC and nPC */
1026 err |= copy_from_user(&setv, &c->sigmask, sizeof(svr4_sigset_t));
1027 set.sig[0] = setv.sigbits[0] | (((long)setv.sigbits[1]) << 32);
1028 if (_NSIG_WORDS >= 2)
1029 set.sig[1] = setv.sigbits[2] | (((long)setv.sigbits[3]) << 32);
1031 err |= __get_user(u_ss_sp, &c->stack.sp);
1032 st.ss_sp = (void *) (long) u_ss_sp;
1033 err |= __get_user(st.ss_flags, &c->stack.flags);
1034 err |= __get_user(st.ss_size, &c->stack.size);
1038 /* It is more difficult to avoid calling this function than to
1039 call it and ignore errors. */
1042 do_sigaltstack(&st, NULL, regs->u_regs[UREG_I6]);
1045 sigdelsetmask(&set, ~_BLOCKABLE);
1046 spin_lock_irq(¤t->sighand->siglock);
1047 current->blocked = set;
1048 recalc_sigpending();
1049 spin_unlock_irq(¤t->sighand->siglock);
1051 regs->tnpc = npc | 1;
1052 if (test_thread_flag(TIF_32BIT)) {
1053 regs->tpc &= 0xffffffff;
1054 regs->tnpc &= 0xffffffff;
1056 err |= __get_user(regs->y, &((*gr)[SVR4_Y]));
1057 err |= __get_user(psr, &((*gr)[SVR4_PSR]));
1058 regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC);
1059 regs->tstate |= psr_to_tstate_icc(psr);
1061 /* Restore g[1..7] and o[0..7] registers */
1062 for (i = 0; i < 7; i++)
1063 err |= __get_user(regs->u_regs[UREG_G1+i], (&(*gr)[SVR4_G1])+i);
1064 for (i = 0; i < 8; i++)
1065 err |= __get_user(regs->u_regs[UREG_I0+i], (&(*gr)[SVR4_O0])+i);
1074 static void setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs,
1075 unsigned long signr, sigset_t *oldset,
1078 struct rt_signal_frame32 __user *sf;
1082 compat_sigset_t seta;
1084 /* 1. Make sure everything is clean */
1085 synchronize_user_stack();
1086 save_and_clear_fpu();
1088 sigframe_size = RT_ALIGNEDSZ;
1089 if (!(current_thread_info()->fpsaved[0] & FPRS_FEF))
1090 sigframe_size -= sizeof(__siginfo_fpu_t);
1092 sf = (struct rt_signal_frame32 __user *)
1093 get_sigframe(&ka->sa, regs, sigframe_size);
1095 if (invalid_frame_pointer(sf, sigframe_size))
1098 if (get_thread_wsaved() != 0)
1101 /* 2. Save the current process state */
1102 if (test_thread_flag(TIF_32BIT)) {
1103 regs->tpc &= 0xffffffff;
1104 regs->tnpc &= 0xffffffff;
1106 err = put_user(regs->tpc, &sf->regs.pc);
1107 err |= __put_user(regs->tnpc, &sf->regs.npc);
1108 err |= __put_user(regs->y, &sf->regs.y);
1109 psr = tstate_to_psr(regs->tstate);
1110 if (current_thread_info()->fpsaved[0] & FPRS_FEF)
1112 err |= __put_user(psr, &sf->regs.psr);
1113 for (i = 0; i < 16; i++)
1114 err |= __put_user(regs->u_regs[i], &sf->regs.u_regs[i]);
1115 err |= __put_user(sizeof(siginfo_extra_v8plus_t), &sf->extra_size);
1116 err |= __put_user(SIGINFO_EXTRA_V8PLUS_MAGIC, &sf->v8plus.g_upper[0]);
1117 for (i = 1; i < 16; i++)
1118 err |= __put_user(((u32 *)regs->u_regs)[2*i],
1119 &sf->v8plus.g_upper[i]);
1122 err |= save_fpu_state32(regs, &sf->fpu_state);
1123 err |= __put_user((u64)&sf->fpu_state, &sf->fpu_save);
1125 err |= __put_user(0, &sf->fpu_save);
1128 /* Update the siginfo structure. */
1129 err |= copy_siginfo_to_user32(&sf->info, info);
1131 /* Setup sigaltstack */
1132 err |= __put_user(current->sas_ss_sp, &sf->stack.ss_sp);
1133 err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &sf->stack.ss_flags);
1134 err |= __put_user(current->sas_ss_size, &sf->stack.ss_size);
1136 switch (_NSIG_WORDS) {
1137 case 4: seta.sig[7] = (oldset->sig[3] >> 32);
1138 seta.sig[6] = oldset->sig[3];
1139 case 3: seta.sig[5] = (oldset->sig[2] >> 32);
1140 seta.sig[4] = oldset->sig[2];
1141 case 2: seta.sig[3] = (oldset->sig[1] >> 32);
1142 seta.sig[2] = oldset->sig[1];
1143 case 1: seta.sig[1] = (oldset->sig[0] >> 32);
1144 seta.sig[0] = oldset->sig[0];
1146 err |= __copy_to_user(&sf->mask, &seta, sizeof(compat_sigset_t));
1148 err |= copy_in_user((u32 __user *)sf,
1149 (u32 __user *)(regs->u_regs[UREG_FP]),
1150 sizeof(struct reg_window32));
1154 /* 3. signal handler back-trampoline and parameters */
1155 regs->u_regs[UREG_FP] = (unsigned long) sf;
1156 regs->u_regs[UREG_I0] = signr;
1157 regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
1159 /* 4. signal handler */
1160 regs->tpc = (unsigned long) ka->sa.sa_handler;
1161 regs->tnpc = (regs->tpc + 4);
1162 if (test_thread_flag(TIF_32BIT)) {
1163 regs->tpc &= 0xffffffff;
1164 regs->tnpc &= 0xffffffff;
1167 /* 5. return to kernel instructions */
1168 if (ka->ka_restorer)
1169 regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer;
1171 /* Flush instruction space. */
1172 unsigned long address = ((unsigned long)&(sf->insns[0]));
1173 pgd_t *pgdp = pgd_offset(current->mm, address);
1174 pmd_t *pmdp = pmd_offset(pgdp, address);
1177 regs->u_regs[UREG_I7] = (unsigned long) (&(sf->insns[0]) - 2);
1179 /* mov __NR_rt_sigreturn, %g1 */
1180 err |= __put_user(0x82102065, &sf->insns[0]);
1183 err |= __put_user(0x91d02010, &sf->insns[1]);
1188 ptep = pte_offset_map(pmdp, address);
1189 if (pte_present(*ptep)) {
1190 unsigned long page = (unsigned long)
1191 page_address(pte_page(*ptep));
1193 __asm__ __volatile__(
1194 " membar #StoreStore\n"
1196 : : "r" (page), "r" (address & (PAGE_SIZE - 1))
1210 static inline void handle_signal32(unsigned long signr, struct k_sigaction *ka,
1212 sigset_t *oldset, struct pt_regs *regs,
1216 setup_svr4_frame32(&ka->sa, regs->tpc, regs->tnpc,
1217 regs, signr, oldset);
1219 if (ka->sa.sa_flags & SA_SIGINFO)
1220 setup_rt_frame32(ka, regs, signr, oldset, info);
1221 else if (test_thread_flag(TIF_NEWSIGNALS))
1222 new_setup_frame32(ka, regs, signr, oldset);
1224 setup_frame32(&ka->sa, regs, signr, oldset, info);
1226 if (ka->sa.sa_flags & SA_ONESHOT)
1227 ka->sa.sa_handler = SIG_DFL;
1228 if (!(ka->sa.sa_flags & SA_NOMASK)) {
1229 spin_lock_irq(¤t->sighand->siglock);
1230 sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
1231 sigaddset(¤t->blocked,signr);
1232 recalc_sigpending();
1233 spin_unlock_irq(¤t->sighand->siglock);
1237 static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs,
1238 struct sigaction *sa)
1240 switch (regs->u_regs[UREG_I0]) {
1241 case ERESTART_RESTARTBLOCK:
1242 case ERESTARTNOHAND:
1243 no_system_call_restart:
1244 regs->u_regs[UREG_I0] = EINTR;
1245 regs->tstate |= TSTATE_ICARRY;
1248 if (!(sa->sa_flags & SA_RESTART))
1249 goto no_system_call_restart;
1251 case ERESTARTNOINTR:
1252 regs->u_regs[UREG_I0] = orig_i0;
1258 /* Note that 'init' is a special process: it doesn't get signals it doesn't
1259 * want to handle. Thus you cannot kill init even with a SIGKILL even by
1262 int do_signal32(sigset_t *oldset, struct pt_regs * regs,
1263 unsigned long orig_i0, int restart_syscall)
1266 struct signal_deliver_cookie cookie;
1268 int svr4_signal = current->personality == PER_SVR4;
1270 cookie.restart_syscall = restart_syscall;
1271 cookie.orig_i0 = orig_i0;
1273 signr = get_signal_to_deliver(&info, regs, &cookie);
1275 struct k_sigaction *ka;
1277 ka = ¤t->sighand->action[signr-1];
1279 if (cookie.restart_syscall)
1280 syscall_restart32(orig_i0, regs, &ka->sa);
1281 handle_signal32(signr, ka, &info, oldset, regs, svr4_signal);
1284 if (cookie.restart_syscall &&
1285 (regs->u_regs[UREG_I0] == ERESTARTNOHAND ||
1286 regs->u_regs[UREG_I0] == ERESTARTSYS ||
1287 regs->u_regs[UREG_I0] == ERESTARTNOINTR)) {
1288 /* replay the system call when we are done */
1289 regs->u_regs[UREG_I0] = cookie.orig_i0;
1293 if (cookie.restart_syscall &&
1294 regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) {
1295 regs->u_regs[UREG_G1] = __NR_restart_syscall;
1307 asmlinkage int do_sys32_sigstack(u32 u_ssptr, u32 u_ossptr, unsigned long sp)
1309 struct sigstack32 __user *ssptr =
1310 (struct sigstack32 __user *)((unsigned long)(u_ssptr));
1311 struct sigstack32 __user *ossptr =
1312 (struct sigstack32 __user *)((unsigned long)(u_ossptr));
1315 /* First see if old state is wanted. */
1317 if (put_user(current->sas_ss_sp + current->sas_ss_size,
1318 &ossptr->the_stack) ||
1319 __put_user(on_sig_stack(sp), &ossptr->cur_status))
1323 /* Now see if we want to update the new state. */
1327 if (get_user(ss_sp, &ssptr->the_stack))
1330 /* If the current stack was set with sigaltstack, don't
1331 * swap stacks while we are on it.
1334 if (current->sas_ss_sp && on_sig_stack(sp))
1337 /* Since we don't know the extent of the stack, and we don't
1338 * track onstack-ness, but rather calculate it, we must
1339 * presume a size. Ho hum this interface is lossy.
1341 current->sas_ss_sp = (unsigned long)ss_sp - SIGSTKSZ;
1342 current->sas_ss_size = SIGSTKSZ;
1350 asmlinkage int do_sys32_sigaltstack(u32 ussa, u32 uossa, unsigned long sp)
1355 mm_segment_t old_fs;
1357 if (ussa && (get_user(u_ss_sp, &((stack_t32 __user *)(long)ussa)->ss_sp) ||
1358 __get_user(uss.ss_flags, &((stack_t32 __user *)(long)ussa)->ss_flags) ||
1359 __get_user(uss.ss_size, &((stack_t32 __user *)(long)ussa)->ss_size)))
1361 uss.ss_sp = (void *) (long) u_ss_sp;
1364 ret = do_sigaltstack(ussa ? &uss : NULL, uossa ? &uoss : NULL, sp);
1366 if (!ret && uossa && (put_user((long)uoss.ss_sp, &((stack_t32 __user *)(long)uossa)->ss_sp) ||
1367 __put_user(uoss.ss_flags, &((stack_t32 __user *)(long)uossa)->ss_flags) ||
1368 __put_user(uoss.ss_size, &((stack_t32 __user *)(long)uossa)->ss_size)))