1 /* $Id: signal.c,v 1.108 2001/01/24 21:05:12 davem Exp $
2 * linux/arch/sparc/kernel/signal.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)
10 #include <linux/config.h>
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/smp.h>
20 #include <linux/smp_lock.h>
22 #include <asm/uaccess.h>
23 #include <asm/bitops.h>
24 #include <asm/ptrace.h>
26 #include <asm/pgalloc.h>
27 #include <asm/pgtable.h>
29 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
31 extern void fpsave(unsigned long *fpregs, unsigned long *fsr,
32 void *fpqueue, unsigned long *fpqdepth);
33 extern void fpload(unsigned long *fpregs, unsigned long *fsr);
35 asmlinkage int do_signal(sigset_t *oldset, struct pt_regs * regs,
36 unsigned long orig_o0, int ret_from_syscall);
38 /* This turned off for production... */
39 /* #define DEBUG_SIGNALS 1 */
40 /* #define DEBUG_SIGNALS_TRACE 1 */
41 /* #define DEBUG_SIGNALS_MAPS 1 */
43 /* Signal frames: the original one (compatible with SunOS):
45 * Set up a signal frame... Make the stack look the way SunOS
46 * expects it to look which is basically:
48 * ---------------------------------- <-- %sp at signal time
51 * Ptr to sigcontext area above
53 * The signal number itself
55 * ---------------------------------- <-- New %sp
57 struct signal_sframe {
58 struct reg_window sig_window;
61 struct sigcontext *sig_scptr;
63 struct sigcontext sig_context;
64 unsigned int extramask[_NSIG_WORDS - 1];
68 * And the new one, intended to be used for Linux applications only
69 * (we have enough in there to work with clone).
70 * All the interesting bits are in the info field.
73 struct new_signal_frame {
74 struct sparc_stackf ss;
76 __siginfo_fpu_t *fpu_save;
77 unsigned long insns [2] __attribute__ ((aligned (8)));
78 unsigned int extramask[_NSIG_WORDS - 1];
79 unsigned int extra_size; /* Should be 0 */
80 __siginfo_fpu_t fpu_state;
83 struct rt_signal_frame {
84 struct sparc_stackf ss;
88 __siginfo_fpu_t *fpu_save;
89 unsigned int insns [2];
91 unsigned int extra_size; /* Should be 0 */
92 __siginfo_fpu_t fpu_state;
95 int copy_siginfo_to_user(siginfo_t *to, siginfo_t *from)
97 if (!access_ok(VERIFY_WRITE, to, sizeof(siginfo_t)))
99 if (from->si_code < 0)
100 return __copy_to_user(to, from, sizeof(siginfo_t));
104 /* If you change siginfo_t structure, please be sure
105 this code is fixed accordingly.
106 It should never copy any pad contained in the structure
107 to avoid security leaks, but must copy the generic
108 3 ints plus the relevant union member. */
109 err = __put_user(from->si_signo, &to->si_signo);
110 err |= __put_user(from->si_errno, &to->si_errno);
111 err |= __put_user((short)from->si_code, &to->si_code);
112 switch (from->si_code >> 16) {
113 case __SI_CHLD >> 16:
114 err |= __put_user(from->si_utime, &to->si_utime);
115 err |= __put_user(from->si_stime, &to->si_stime);
116 /* case __SI_RT: This is not generated by the kernel as of now. */
117 err |= __put_user(from->si_status, &to->si_status);
119 err |= __put_user(from->si_uid, &to->si_uid);
120 err |= __put_user(from->si_pid, &to->si_pid);
128 #define SF_ALIGNEDSZ (((sizeof(struct signal_sframe) + 7) & (~7)))
129 #define NF_ALIGNEDSZ (((sizeof(struct new_signal_frame) + 7) & (~7)))
130 #define RT_ALIGNEDSZ (((sizeof(struct rt_signal_frame) + 7) & (~7)))
133 * atomically swap in the new signal mask, and wait for a signal.
134 * This is really tricky on the Sparc, watch out...
136 asmlinkage void _sigpause_common(old_sigset_t set, struct pt_regs *regs)
141 spin_lock_irq(¤t->sigmask_lock);
142 saveset = current->blocked;
143 siginitset(¤t->blocked, set);
144 recalc_sigpending(current);
145 spin_unlock_irq(¤t->sigmask_lock);
147 regs->pc = regs->npc;
150 /* Condition codes and return value where set here for sigpause,
151 * and so got used by setup_frame, which again causes sigreturn()
155 current->state = TASK_INTERRUPTIBLE;
158 * Return -EINTR and set condition code here,
159 * so the interrupted system call actually returns
163 regs->u_regs[UREG_I0] = EINTR;
164 if (do_signal(&saveset, regs, 0, 0))
169 asmlinkage void do_sigpause(unsigned int set, struct pt_regs *regs)
171 _sigpause_common(set, regs);
174 asmlinkage void do_sigsuspend (struct pt_regs *regs)
176 _sigpause_common(regs->u_regs[UREG_I0], regs);
179 asmlinkage void do_rt_sigsuspend(sigset_t *uset, size_t sigsetsize,
180 struct pt_regs *regs)
182 sigset_t oldset, set;
184 /* XXX: Don't preclude handling different sized sigset_t's. */
185 if (sigsetsize != sizeof(sigset_t)) {
187 regs->u_regs[UREG_I0] = EINVAL;
191 if (copy_from_user(&set, uset, sizeof(set))) {
193 regs->u_regs[UREG_I0] = EFAULT;
197 sigdelsetmask(&set, ~_BLOCKABLE);
198 spin_lock_irq(¤t->sigmask_lock);
199 oldset = current->blocked;
200 current->blocked = set;
201 recalc_sigpending(current);
202 spin_unlock_irq(¤t->sigmask_lock);
204 regs->pc = regs->npc;
207 /* Condition codes and return value where set here for sigpause,
208 * and so got used by setup_frame, which again causes sigreturn()
212 current->state = TASK_INTERRUPTIBLE;
215 * Return -EINTR and set condition code here,
216 * so the interrupted system call actually returns
220 regs->u_regs[UREG_I0] = EINTR;
221 if (do_signal(&oldset, regs, 0, 0))
227 restore_fpu_state(struct pt_regs *regs, __siginfo_fpu_t *fpu)
231 if (current->flags & PF_USEDFPU)
232 regs->psr &= ~PSR_EF;
234 if (current == last_task_used_math) {
235 last_task_used_math = 0;
236 regs->psr &= ~PSR_EF;
239 current->used_math = 1;
240 current->flags &= ~PF_USEDFPU;
242 if (verify_area (VERIFY_READ, fpu, sizeof(*fpu)))
245 err = __copy_from_user(¤t->thread.float_regs[0], &fpu->si_float_regs[0],
246 (sizeof(unsigned long) * 32));
247 err |= __get_user(current->thread.fsr, &fpu->si_fsr);
248 err |= __get_user(current->thread.fpqdepth, &fpu->si_fpqdepth);
249 if (current->thread.fpqdepth != 0)
250 err |= __copy_from_user(¤t->thread.fpqueue[0],
252 ((sizeof(unsigned long) +
253 (sizeof(unsigned long *)))*16));
257 static inline void do_new_sigreturn (struct pt_regs *regs)
259 struct new_signal_frame *sf;
260 unsigned long up_psr, pc, npc;
262 __siginfo_fpu_t *fpu_save;
265 sf = (struct new_signal_frame *) regs->u_regs [UREG_FP];
267 /* 1. Make sure we are not getting garbage from the user */
268 if (verify_area (VERIFY_READ, sf, sizeof (*sf)))
274 err = __get_user(pc, &sf->info.si_regs.pc);
275 err |= __get_user(npc, &sf->info.si_regs.npc);
280 /* 2. Restore the state */
282 err |= __copy_from_user(regs, &sf->info.si_regs, sizeof (struct pt_regs));
284 /* User can only change condition codes and FPU enabling in %psr. */
285 regs->psr = (up_psr & ~(PSR_ICC | PSR_EF))
286 | (regs->psr & (PSR_ICC | PSR_EF));
288 err |= __get_user(fpu_save, &sf->fpu_save);
291 err |= restore_fpu_state(regs, fpu_save);
293 /* This is pretty much atomic, no amount locking would prevent
294 * the races which exist anyways.
296 err |= __get_user(set.sig[0], &sf->info.si_mask);
297 err |= __copy_from_user(&set.sig[1], &sf->extramask,
298 (_NSIG_WORDS-1) * sizeof(unsigned int));
303 sigdelsetmask(&set, ~_BLOCKABLE);
304 spin_lock_irq(¤t->sigmask_lock);
305 current->blocked = set;
306 recalc_sigpending(current);
307 spin_unlock_irq(¤t->sigmask_lock);
314 asmlinkage void do_sigreturn(struct pt_regs *regs)
316 struct sigcontext *scptr;
317 unsigned long pc, npc, psr;
321 synchronize_user_stack();
323 if (current->thread.new_signal)
324 return do_new_sigreturn (regs);
326 scptr = (struct sigcontext *) regs->u_regs[UREG_I0];
328 /* Check sanity of the user arg. */
329 if(verify_area(VERIFY_READ, scptr, sizeof(struct sigcontext)) ||
330 (((unsigned long) scptr) & 3))
333 err = __get_user(pc, &scptr->sigc_pc);
334 err |= __get_user(npc, &scptr->sigc_npc);
339 /* This is pretty much atomic, no amount locking would prevent
340 * the races which exist anyways.
342 err |= __get_user(set.sig[0], &scptr->sigc_mask);
343 /* Note that scptr + 1 points to extramask */
344 err |= __copy_from_user(&set.sig[1], scptr + 1,
345 (_NSIG_WORDS - 1) * sizeof(unsigned int));
350 sigdelsetmask(&set, ~_BLOCKABLE);
351 spin_lock_irq(¤t->sigmask_lock);
352 current->blocked = set;
353 recalc_sigpending(current);
354 spin_unlock_irq(¤t->sigmask_lock);
359 err = __get_user(regs->u_regs[UREG_FP], &scptr->sigc_sp);
360 err |= __get_user(regs->u_regs[UREG_I0], &scptr->sigc_o0);
361 err |= __get_user(regs->u_regs[UREG_G1], &scptr->sigc_g1);
363 /* User can only change condition codes in %psr. */
364 err |= __get_user(psr, &scptr->sigc_psr);
368 regs->psr &= ~(PSR_ICC);
369 regs->psr |= (psr & PSR_ICC);
373 send_sig(SIGSEGV, current, 1);
376 asmlinkage void do_rt_sigreturn(struct pt_regs *regs)
378 struct rt_signal_frame *sf;
379 unsigned int psr, pc, npc;
380 __siginfo_fpu_t *fpu_save;
385 synchronize_user_stack();
386 sf = (struct rt_signal_frame *) regs->u_regs[UREG_FP];
387 if(verify_area(VERIFY_READ, sf, sizeof(*sf)) ||
388 (((unsigned long) sf) & 0x03))
391 err = __get_user(pc, &sf->regs.pc);
392 err |= __get_user(npc, &sf->regs.npc);
393 err |= ((pc | npc) & 0x03);
395 err |= __get_user(regs->y, &sf->regs.y);
396 err |= __get_user(psr, &sf->regs.psr);
398 err |= __copy_from_user(®s->u_regs[UREG_G1], &sf->regs.u_regs[UREG_G1], 15*sizeof(u32));
400 regs->psr = (regs->psr & ~PSR_ICC) | (psr & PSR_ICC);
402 err |= __get_user(fpu_save, &sf->fpu_save);
405 err |= restore_fpu_state(regs, fpu_save);
406 err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t));
408 err |= __copy_from_user(&st, &sf->stack, sizeof(stack_t));
416 /* It is more difficult to avoid calling this function than to
417 call it and ignore errors. */
418 do_sigaltstack(&st, NULL, (unsigned long)sf);
420 sigdelsetmask(&set, ~_BLOCKABLE);
421 spin_lock_irq(¤t->sigmask_lock);
422 current->blocked = set;
423 recalc_sigpending(current);
424 spin_unlock_irq(¤t->sigmask_lock);
427 send_sig(SIGSEGV, current, 1);
430 /* Checks if the fp is valid */
431 static inline int invalid_frame_pointer (void *fp, int fplen)
433 if ((((unsigned long) fp) & 7) ||
434 !__access_ok((unsigned long)fp, fplen) ||
435 ((sparc_cpu_model == sun4 || sparc_cpu_model == sun4c) &&
436 ((unsigned long) fp < 0xe0000000 && (unsigned long) fp >= 0x20000000)))
442 static inline void *get_sigframe(struct sigaction *sa, struct pt_regs *regs, unsigned long framesize)
446 sp = regs->u_regs[UREG_FP];
448 /* This is the X/Open sanctioned signal stack switching. */
449 if (sa->sa_flags & SA_ONSTACK) {
450 if (!on_sig_stack(sp) && !((current->sas_ss_sp + current->sas_ss_size) & 7))
451 sp = current->sas_ss_sp + current->sas_ss_size;
453 return (void *)(sp - framesize);
457 setup_frame(struct sigaction *sa, struct pt_regs *regs, int signr, sigset_t *oldset, siginfo_t *info)
459 struct signal_sframe *sframep;
460 struct sigcontext *sc;
462 unsigned long pc = regs->pc;
463 unsigned long npc = regs->npc;
467 synchronize_user_stack();
468 sframep = (struct signal_sframe *)get_sigframe(sa, regs, SF_ALIGNEDSZ);
469 if (invalid_frame_pointer (sframep, sizeof(*sframep))){
470 #ifdef DEBUG_SIGNALS /* fills up the console logs during crashme runs, yuck... */
471 printk("%s [%d]: User has trashed signal stack\n",
472 current->comm, current->pid);
473 printk("Sigstack ptr %p handler at pc<%08lx> for sig<%d>\n",
476 /* Don't change signal code and address, so that
477 * post mortem debuggers can have a look.
479 goto sigill_and_return;
482 sc = &sframep->sig_context;
484 /* We've already made sure frame pointer isn't in kernel space... */
485 err = __put_user((sas_ss_flags(regs->u_regs[UREG_FP]) == SS_ONSTACK),
487 err |= __put_user(oldset->sig[0], &sc->sigc_mask);
488 err |= __copy_to_user(sframep->extramask, &oldset->sig[1],
489 (_NSIG_WORDS - 1) * sizeof(unsigned int));
490 err |= __put_user(regs->u_regs[UREG_FP], &sc->sigc_sp);
491 err |= __put_user(pc, &sc->sigc_pc);
492 err |= __put_user(npc, &sc->sigc_npc);
493 err |= __put_user(regs->psr, &sc->sigc_psr);
494 err |= __put_user(regs->u_regs[UREG_G1], &sc->sigc_g1);
495 err |= __put_user(regs->u_regs[UREG_I0], &sc->sigc_o0);
496 err |= __put_user(current->thread.w_saved, &sc->sigc_oswins);
497 if(current->thread.w_saved)
498 for(window = 0; window < current->thread.w_saved; window++) {
499 sc->sigc_spbuf[window] =
500 (char *)current->thread.rwbuf_stkptrs[window];
501 err |= __copy_to_user(&sc->sigc_wbuf[window],
502 ¤t->thread.reg_window[window],
503 sizeof(struct reg_window));
506 err |= __copy_to_user(sframep, (char *)regs->u_regs[UREG_FP],
507 sizeof(struct reg_window));
509 current->thread.w_saved = 0; /* So process is allowed to execute. */
511 err |= __put_user(signr, &sframep->sig_num);
514 if (SI_FROMKERNEL (info) && (info->si_code & __SI_MASK) == __SI_FAULT) {
515 sig_address = info->si_addr;
518 switch (info->si_code) {
519 case SEGV_MAPERR: sig_code = SUBSIG_NOMAPPING; break;
520 default: sig_code = SUBSIG_PROTECTION; break;
524 switch (info->si_code) {
525 case ILL_ILLOPC: sig_code = SUBSIG_ILLINST; break;
526 case ILL_PRVOPC: sig_code = SUBSIG_PRIVINST; break;
527 case ILL_ILLTRP: sig_code = SUBSIG_BADTRAP (info->si_trapno); break;
528 default: sig_code = SUBSIG_STACK; break;
532 switch (info->si_code) {
533 case FPE_INTDIV: sig_code = SUBSIG_IDIVZERO; break;
534 case FPE_INTOVF: sig_code = SUBSIG_FPINTOVFL; break;
535 case FPE_FLTDIV: sig_code = SUBSIG_FPDIVZERO; break;
536 case FPE_FLTOVF: sig_code = SUBSIG_FPOVFLOW; break;
537 case FPE_FLTUND: sig_code = SUBSIG_FPUNFLOW; break;
538 case FPE_FLTRES: sig_code = SUBSIG_FPINEXACT; break;
539 case FPE_FLTINV: sig_code = SUBSIG_FPOPERROR; break;
540 default: sig_code = SUBSIG_FPERROR; break;
544 switch (info->si_code) {
545 case BUS_ADRALN: sig_code = SUBSIG_ALIGNMENT; break;
546 case BUS_ADRERR: sig_code = SUBSIG_MISCERROR; break;
547 default: sig_code = SUBSIG_BUSTIMEOUT; break;
551 switch (info->si_code) {
552 case EMT_TAGOVF: sig_code = SUBSIG_TAG; break;
556 if (info->si_code == (__SI_FAULT|0x100)) {
557 /* See sys_sunos.c */
558 sig_code = info->si_trapno;
565 err |= __put_user((long)sig_address, &sframep->sig_address);
566 err |= __put_user(sig_code, &sframep->sig_code);
567 err |= __put_user(sc, &sframep->sig_scptr);
571 regs->u_regs[UREG_FP] = (unsigned long) sframep;
572 regs->pc = (unsigned long) sa->sa_handler;
573 regs->npc = (regs->pc + 4);
584 save_fpu_state(struct pt_regs *regs, __siginfo_fpu_t *fpu)
588 if (current->flags & PF_USEDFPU) {
589 put_psr(get_psr() | PSR_EF);
590 fpsave(¤t->thread.float_regs[0], ¤t->thread.fsr,
591 ¤t->thread.fpqueue[0], ¤t->thread.fpqdepth);
592 regs->psr &= ~(PSR_EF);
593 current->flags &= ~(PF_USEDFPU);
596 if (current == last_task_used_math) {
597 put_psr(get_psr() | PSR_EF);
598 fpsave(¤t->thread.float_regs[0], ¤t->thread.fsr,
599 ¤t->thread.fpqueue[0], ¤t->thread.fpqdepth);
600 last_task_used_math = 0;
601 regs->psr &= ~(PSR_EF);
604 err |= __copy_to_user(&fpu->si_float_regs[0], ¤t->thread.float_regs[0],
605 (sizeof(unsigned long) * 32));
606 err |= __put_user(current->thread.fsr, &fpu->si_fsr);
607 err |= __put_user(current->thread.fpqdepth, &fpu->si_fpqdepth);
608 if (current->thread.fpqdepth != 0)
609 err |= __copy_to_user(&fpu->si_fpqueue[0], ¤t->thread.fpqueue[0],
610 ((sizeof(unsigned long) +
611 (sizeof(unsigned long *)))*16));
612 current->used_math = 0;
617 new_setup_frame(struct k_sigaction *ka, struct pt_regs *regs,
618 int signo, sigset_t *oldset)
620 struct new_signal_frame *sf;
621 int sigframe_size, err;
623 /* 1. Make sure everything is clean */
624 synchronize_user_stack();
626 sigframe_size = NF_ALIGNEDSZ;
627 if (!current->used_math)
628 sigframe_size -= sizeof(__siginfo_fpu_t);
630 sf = (struct new_signal_frame *)get_sigframe(&ka->sa, regs, sigframe_size);
632 if (invalid_frame_pointer (sf, sigframe_size))
633 goto sigill_and_return;
635 if (current->thread.w_saved != 0) {
637 printk ("%s [%d]: Invalid user stack frame for "
638 "signal delivery.\n", current->comm, current->pid);
640 goto sigill_and_return;
643 /* 2. Save the current process state */
644 err = __copy_to_user(&sf->info.si_regs, regs, sizeof (struct pt_regs));
646 err |= __put_user(0, &sf->extra_size);
648 if (current->used_math) {
649 err |= save_fpu_state(regs, &sf->fpu_state);
650 err |= __put_user(&sf->fpu_state, &sf->fpu_save);
652 err |= __put_user(0, &sf->fpu_save);
655 err |= __put_user(oldset->sig[0], &sf->info.si_mask);
656 err |= __copy_to_user(sf->extramask, &oldset->sig[1],
657 (_NSIG_WORDS - 1) * sizeof(unsigned int));
658 err |= __copy_to_user(sf, (char *) regs->u_regs [UREG_FP],
659 sizeof (struct reg_window));
663 /* 3. signal handler back-trampoline and parameters */
664 regs->u_regs[UREG_FP] = (unsigned long) sf;
665 regs->u_regs[UREG_I0] = signo;
666 regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
667 regs->u_regs[UREG_I2] = (unsigned long) &sf->info;
669 /* 4. signal handler */
670 regs->pc = (unsigned long) ka->sa.sa_handler;
671 regs->npc = (regs->pc + 4);
673 /* 5. return to kernel instructions */
675 regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer;
677 regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2);
679 /* mov __NR_sigreturn, %g1 */
680 err |= __put_user(0x821020d8, &sf->insns[0]);
683 err |= __put_user(0x91d02010, &sf->insns[1]);
687 /* Flush instruction space. */
688 flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0]));
699 new_setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
700 int signo, sigset_t *oldset, siginfo_t *info)
702 struct rt_signal_frame *sf;
707 synchronize_user_stack();
708 sigframe_size = RT_ALIGNEDSZ;
709 if(!current->used_math)
710 sigframe_size -= sizeof(__siginfo_fpu_t);
711 sf = (struct rt_signal_frame *)get_sigframe(&ka->sa, regs, sigframe_size);
712 if(invalid_frame_pointer(sf, sigframe_size))
714 if(current->thread.w_saved != 0)
717 err = __put_user(regs->pc, &sf->regs.pc);
718 err |= __put_user(regs->npc, &sf->regs.npc);
719 err |= __put_user(regs->y, &sf->regs.y);
721 if(current->used_math)
723 err |= __put_user(psr, &sf->regs.psr);
724 err |= __copy_to_user(&sf->regs.u_regs, regs->u_regs, sizeof(regs->u_regs));
725 err |= __put_user(0, &sf->extra_size);
728 err |= save_fpu_state(regs, &sf->fpu_state);
729 err |= __put_user(&sf->fpu_state, &sf->fpu_save);
731 err |= __put_user(0, &sf->fpu_save);
733 err |= __copy_to_user(&sf->mask, &oldset->sig[0], sizeof(sigset_t));
735 /* Setup sigaltstack */
736 err |= __put_user(current->sas_ss_sp, &sf->stack.ss_sp);
737 err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &sf->stack.ss_flags);
738 err |= __put_user(current->sas_ss_size, &sf->stack.ss_size);
740 err |= __copy_to_user(sf, (char *) regs->u_regs [UREG_FP],
741 sizeof (struct reg_window));
743 err |= copy_siginfo_to_user(&sf->info, info);
748 regs->u_regs[UREG_FP] = (unsigned long) sf;
749 regs->u_regs[UREG_I0] = signo;
750 regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
751 regs->u_regs[UREG_I2] = (unsigned long) &sf->regs;
753 regs->pc = (unsigned long) ka->sa.sa_handler;
754 regs->npc = (regs->pc + 4);
757 regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer;
759 regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2);
761 /* mov __NR_sigreturn, %g1 */
762 err |= __put_user(0x821020d8, &sf->insns[0]);
765 err |= __put_user(0x91d02010, &sf->insns[1]);
769 /* Flush instruction space. */
770 flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0]));
780 /* Setup a Solaris stack frame */
782 setup_svr4_frame(struct sigaction *sa, unsigned long pc, unsigned long npc,
783 struct pt_regs *regs, int signr, sigset_t *oldset)
785 svr4_signal_frame_t *sfp;
794 synchronize_user_stack();
795 sfp = (svr4_signal_frame_t *) get_sigframe(sa, regs, SVR4_SF_ALIGNED + sizeof(struct reg_window));
797 if (invalid_frame_pointer (sfp, sizeof (*sfp))){
799 printk ("Invalid stack frame\n");
801 goto sigill_and_return;
804 /* Start with a clean frame pointer and fill it */
805 err = __clear_user(sfp, sizeof (*sfp));
807 /* Setup convenience variables */
814 /* FIXME: where am I supposed to put this?
815 * sc->sigc_onstack = old_status;
816 * anyways, it does not look like it is used for anything at all.
818 setv.sigbits[0] = oldset->sig[0];
819 setv.sigbits[1] = oldset->sig[1];
820 if (_NSIG_WORDS >= 4) {
821 setv.sigbits[2] = oldset->sig[2];
822 setv.sigbits[3] = oldset->sig[3];
823 err |= __copy_to_user(&uc->sigmask, &setv, sizeof(svr4_sigset_t));
825 err |= __copy_to_user(&uc->sigmask, &setv, 2 * sizeof(unsigned int));
827 /* Store registers */
828 err |= __put_user(regs->pc, &((*gr) [SVR4_PC]));
829 err |= __put_user(regs->npc, &((*gr) [SVR4_NPC]));
830 err |= __put_user(regs->psr, &((*gr) [SVR4_PSR]));
831 err |= __put_user(regs->y, &((*gr) [SVR4_Y]));
833 /* Copy g [1..7] and o [0..7] registers */
834 err |= __copy_to_user(&(*gr)[SVR4_G1], ®s->u_regs [UREG_G1], sizeof (long) * 7);
835 err |= __copy_to_user(&(*gr)[SVR4_O0], ®s->u_regs [UREG_I0], sizeof (long) * 8);
837 /* Setup sigaltstack */
838 err |= __put_user(current->sas_ss_sp, &uc->stack.sp);
839 err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &uc->stack.flags);
840 err |= __put_user(current->sas_ss_size, &uc->stack.size);
842 /* Save the currently window file: */
844 /* 1. Link sfp->uc->gwins to our windows */
845 err |= __put_user(gw, &mc->gwin);
847 /* 2. Number of windows to restore at setcontext (): */
848 err |= __put_user(current->thread.w_saved, &gw->count);
850 /* 3. Save each valid window
851 * Currently, it makes a copy of the windows from the kernel copy.
852 * David's code for SunOS, makes the copy but keeps the pointer to
853 * the kernel. My version makes the pointer point to a userland
854 * copy of those. Mhm, I wonder if I shouldn't just ignore those
855 * on setcontext and use those that are on the kernel, the signal
856 * handler should not be modyfing those, mhm.
858 * These windows are just used in case synchronize_user_stack failed
859 * to flush the user windows.
861 for(window = 0; window < current->thread.w_saved; window++) {
862 err |= __put_user((int *) &(gw->win [window]), &gw->winptr [window]);
863 err |= __copy_to_user(&gw->win [window],
864 ¤t->thread.reg_window [window],
865 sizeof (svr4_rwindow_t));
866 err |= __put_user(0, gw->winptr [window]);
869 /* 4. We just pay attention to the gw->count field on setcontext */
870 current->thread.w_saved = 0; /* So process is allowed to execute. */
872 /* Setup the signal information. Solaris expects a bunch of
873 * information to be passed to the signal handler, we don't provide
874 * that much currently, should use siginfo.
876 err |= __put_user(signr, &si->siginfo.signo);
877 err |= __put_user(SVR4_SINOINFO, &si->siginfo.code);
881 regs->u_regs[UREG_FP] = (unsigned long) sfp;
882 regs->pc = (unsigned long) sa->sa_handler;
883 regs->npc = (regs->pc + 4);
886 printk ("Solaris-frame: %x %x\n", (int) regs->pc, (int) regs->npc);
888 /* Arguments passed to signal handler */
889 if (regs->u_regs [14]){
890 struct reg_window *rw = (struct reg_window *) regs->u_regs [14];
892 err |= __put_user(signr, &rw->ins [0]);
893 err |= __put_user(si, &rw->ins [1]);
894 err |= __put_user(uc, &rw->ins [2]);
895 err |= __put_user(sfp, &rw->ins [6]); /* frame pointer */
899 regs->u_regs[UREG_I0] = signr;
900 regs->u_regs[UREG_I1] = (uint) si;
901 regs->u_regs[UREG_I2] = (uint) uc;
911 asmlinkage int svr4_getcontext (svr4_ucontext_t *uc, struct pt_regs *regs)
918 synchronize_user_stack();
920 if (current->thread.w_saved)
921 goto sigsegv_and_return;
923 err = clear_user(uc, sizeof (*uc));
927 /* Setup convenience variables */
931 setv.sigbits[0] = current->blocked.sig[0];
932 setv.sigbits[1] = current->blocked.sig[1];
933 if (_NSIG_WORDS >= 4) {
934 setv.sigbits[2] = current->blocked.sig[2];
935 setv.sigbits[3] = current->blocked.sig[3];
936 err |= __copy_to_user(&uc->sigmask, &setv, sizeof(svr4_sigset_t));
938 err |= __copy_to_user(&uc->sigmask, &setv, 2 * sizeof(unsigned int));
940 /* Store registers */
941 err |= __put_user(regs->pc, &uc->mcontext.greg [SVR4_PC]);
942 err |= __put_user(regs->npc, &uc->mcontext.greg [SVR4_NPC]);
943 err |= __put_user(regs->psr, &uc->mcontext.greg [SVR4_PSR]);
944 err |= __put_user(regs->y, &uc->mcontext.greg [SVR4_Y]);
946 /* Copy g [1..7] and o [0..7] registers */
947 err |= __copy_to_user(&(*gr)[SVR4_G1], ®s->u_regs [UREG_G1], sizeof (uint) * 7);
948 err |= __copy_to_user(&(*gr)[SVR4_O0], ®s->u_regs [UREG_I0], sizeof (uint) * 8);
950 /* Setup sigaltstack */
951 err |= __put_user(current->sas_ss_sp, &uc->stack.sp);
952 err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &uc->stack.flags);
953 err |= __put_user(current->sas_ss_size, &uc->stack.size);
955 /* The register file is not saved
956 * we have already stuffed all of it with sync_user_stack
958 return (err ? -EFAULT : 0);
964 /* Set the context for a svr4 application, this is Solaris way to sigreturn */
965 asmlinkage int svr4_setcontext (svr4_ucontext_t *c, struct pt_regs *regs)
967 struct thread_struct *tp = ¤t->thread;
969 unsigned long pc, npc, psr;
975 /* Fixme: restore windows, or is this already taken care of in
976 * svr4_setup_frame when sync_user_windows is done?
978 flush_user_windows();
981 goto sigsegv_and_return;
984 goto sigsegv_and_return;
986 if(!__access_ok((unsigned long)c, sizeof(*c)))
987 goto sigsegv_and_return;
989 /* Check for valid PC and nPC */
990 gr = &c->mcontext.greg;
991 err = __get_user(pc, &((*gr)[SVR4_PC]));
992 err |= __get_user(npc, &((*gr)[SVR4_NPC]));
995 goto sigsegv_and_return;
997 /* Retrieve information from passed ucontext */
998 /* note that nPC is ored a 1, this is used to inform entry.S */
999 /* that we don't want it to mess with our PC and nPC */
1001 /* This is pretty much atomic, no amount locking would prevent
1002 * the races which exist anyways.
1004 err |= __copy_from_user(&setv, &c->sigmask, sizeof(svr4_sigset_t));
1006 err |= __get_user(st.ss_sp, &c->stack.sp);
1007 err |= __get_user(st.ss_flags, &c->stack.flags);
1008 err |= __get_user(st.ss_size, &c->stack.size);
1011 goto sigsegv_and_return;
1013 /* It is more difficult to avoid calling this function than to
1014 call it and ignore errors. */
1015 do_sigaltstack(&st, NULL, regs->u_regs[UREG_I6]);
1017 set.sig[0] = setv.sigbits[0];
1018 set.sig[1] = setv.sigbits[1];
1019 if (_NSIG_WORDS >= 4) {
1020 set.sig[2] = setv.sigbits[2];
1021 set.sig[3] = setv.sigbits[3];
1023 sigdelsetmask(&set, ~_BLOCKABLE);
1024 spin_lock_irq(¤t->sigmask_lock);
1025 current->blocked = set;
1026 recalc_sigpending(current);
1027 spin_unlock_irq(¤t->sigmask_lock);
1029 regs->npc = npc | 1;
1030 err |= __get_user(regs->y, &((*gr) [SVR4_Y]));
1031 err |= __get_user(psr, &((*gr) [SVR4_PSR]));
1032 regs->psr &= ~(PSR_ICC);
1033 regs->psr |= (psr & PSR_ICC);
1035 /* Restore g[1..7] and o[0..7] registers */
1036 err |= __copy_from_user(®s->u_regs [UREG_G1], &(*gr)[SVR4_G1],
1038 err |= __copy_from_user(®s->u_regs [UREG_I0], &(*gr)[SVR4_O0],
1040 return (err ? -EFAULT : 0);
1047 handle_signal(unsigned long signr, struct k_sigaction *ka,
1048 siginfo_t *info, sigset_t *oldset, struct pt_regs *regs,
1052 setup_svr4_frame(&ka->sa, regs->pc, regs->npc, regs, signr, oldset);
1054 if (ka->sa.sa_flags & SA_SIGINFO)
1055 new_setup_rt_frame(ka, regs, signr, oldset, info);
1056 else if (current->thread.new_signal)
1057 new_setup_frame (ka, regs, signr, oldset);
1059 setup_frame(&ka->sa, regs, signr, oldset, info);
1061 if(ka->sa.sa_flags & SA_ONESHOT)
1062 ka->sa.sa_handler = SIG_DFL;
1063 if(!(ka->sa.sa_flags & SA_NOMASK)) {
1064 spin_lock_irq(¤t->sigmask_lock);
1065 sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
1066 sigaddset(¤t->blocked, signr);
1067 recalc_sigpending(current);
1068 spin_unlock_irq(¤t->sigmask_lock);
1072 static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
1073 struct sigaction *sa)
1075 switch(regs->u_regs[UREG_I0]) {
1076 case ERESTARTNOHAND:
1077 no_system_call_restart:
1078 regs->u_regs[UREG_I0] = EINTR;
1082 if(!(sa->sa_flags & SA_RESTART))
1083 goto no_system_call_restart;
1085 case ERESTARTNOINTR:
1086 regs->u_regs[UREG_I0] = orig_i0;
1092 #ifdef DEBUG_SIGNALS_MAPS
1094 #define MAPS_LINE_FORMAT "%08lx-%08lx %s %08lx %s %lu "
1096 static inline void read_maps (void)
1098 struct vm_area_struct * map, * next;
1102 buffer = (char*)__get_free_page(GFP_KERNEL);
1106 for (map = current->mm->mmap ; map ; map = next ) {
1107 /* produce the next line */
1109 char str[5], *cp = str;
1115 * Get the next vma now (but it won't be used if we sleep).
1117 next = map->vm_next;
1118 flags = map->vm_flags;
1120 *cp++ = flags & VM_READ ? 'r' : '-';
1121 *cp++ = flags & VM_WRITE ? 'w' : '-';
1122 *cp++ = flags & VM_EXEC ? 'x' : '-';
1123 *cp++ = flags & VM_MAYSHARE ? 's' : 'p';
1128 if (map->vm_file != NULL) {
1129 dev = map->vm_file->f_dentry->d_inode->i_dev;
1130 ino = map->vm_file->f_dentry->d_inode->i_ino;
1131 line = d_path(map->vm_file->f_dentry,
1132 map->vm_file->f_vfsmnt,
1137 printk(MAPS_LINE_FORMAT, map->vm_start, map->vm_end, str, map->vm_pgoff << PAGE_SHIFT,
1138 kdevname(dev), ino);
1139 if (map->vm_file != NULL)
1140 printk("%s\n", line);
1144 free_page((unsigned long)buffer);
1149 /* Note that 'init' is a special process: it doesn't get signals it doesn't
1150 * want to handle. Thus you cannot kill init even with a SIGKILL even by
1153 asmlinkage int do_signal(sigset_t *oldset, struct pt_regs * regs,
1154 unsigned long orig_i0, int restart_syscall)
1156 unsigned long signr;
1157 struct k_sigaction *ka;
1161 * XXX Disable svr4 signal handling until solaris emulation works.
1162 * It is buggy - Anton
1164 #define SVR4_SIGNAL_BROKEN 1
1165 #ifdef SVR4_SIGNAL_BROKEN
1166 int svr4_signal = 0;
1168 int svr4_signal = current->personality == PER_SVR4;
1172 oldset = ¤t->blocked;
1175 spin_lock_irq(¤t->sigmask_lock);
1176 signr = dequeue_signal(¤t->blocked, &info);
1177 spin_unlock_irq(¤t->sigmask_lock);
1182 if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) {
1183 /* Do the syscall restart before we let the debugger
1184 * look at the child registers.
1186 if (restart_syscall &&
1187 (regs->u_regs[UREG_I0] == ERESTARTNOHAND ||
1188 regs->u_regs[UREG_I0] == ERESTARTSYS ||
1189 regs->u_regs[UREG_I0] == ERESTARTNOINTR)) {
1190 regs->u_regs[UREG_I0] = orig_i0;
1193 restart_syscall = 0;
1195 current->exit_code = signr;
1196 current->state = TASK_STOPPED;
1198 /* This happens to be SMP safe so no need to
1199 * grab master kernel lock even in this case.
1201 notify_parent(current, SIGCHLD);
1203 if (!(signr = current->exit_code))
1205 current->exit_code = 0;
1206 if (signr == SIGSTOP)
1209 /* Update the siginfo structure. Is this good? */
1210 if (signr != info.si_signo) {
1211 info.si_signo = signr;
1213 info.si_code = SI_USER;
1214 info.si_pid = current->p_pptr->pid;
1215 info.si_uid = current->p_pptr->uid;
1218 /* If the (new) signal is now blocked, requeue it. */
1219 if (sigismember(¤t->blocked, signr)) {
1220 send_sig_info(signr, &info, current);
1225 ka = ¤t->sig->action[signr-1];
1227 if (ka->sa.sa_handler == SIG_IGN) {
1228 if (signr != SIGCHLD)
1231 /* sys_wait4() grabs the master kernel lock, so
1232 * we need not do so, that sucker should be
1233 * threaded and would not be that difficult to
1236 while (sys_wait4(-1, NULL, WNOHANG, NULL) > 0)
1240 if (ka->sa.sa_handler == SIG_DFL) {
1241 unsigned long exit_code = signr;
1243 if (current->pid == 1)
1246 case SIGCONT: case SIGCHLD: case SIGWINCH: case SIGURG:
1249 case SIGTSTP: case SIGTTIN: case SIGTTOU:
1250 /* The operations performed by
1251 * is_orphaned_pgrp() are protected by
1252 * the tasklist_lock.
1254 if (is_orphaned_pgrp(current->pgrp))
1258 if (current->ptrace & PT_PTRACED)
1260 current->state = TASK_STOPPED;
1261 current->exit_code = signr;
1263 /* notify_parent() is SMP safe */
1264 if (!(current->p_pptr->sig->action[SIGCHLD-1].sa.sa_flags &
1266 notify_parent(current, SIGCHLD);
1270 case SIGQUIT: case SIGILL: case SIGTRAP:
1271 case SIGABRT: case SIGFPE: case SIGSEGV:
1272 case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ:
1273 if (do_coredump(signr, regs))
1275 #ifdef DEBUG_SIGNALS
1276 /* Very useful to debug dynamic linker problems */
1277 printk ("Sig %ld going for %s[%d]...\n", signr, current->comm, current->pid);
1279 #ifdef DEBUG_SIGNALS_TRACE
1281 struct reg_window *rw = (struct reg_window *)regs->u_regs[UREG_FP];
1282 unsigned int ins[8];
1285 !(((unsigned long) rw) & 0x3)) {
1286 copy_from_user(ins, &rw->ins[0], sizeof(ins));
1287 printk("Caller[%08x](%08x,%08x,%08x,%08x,%08x,%08x)\n", ins[7], ins[0], ins[1], ins[2], ins[3], ins[4], ins[5]);
1288 rw = (struct reg_window *)(unsigned long)ins[6];
1292 #ifdef DEBUG_SIGNALS_MAPS
1299 sigaddset(¤t->pending.signal, signr);
1300 recalc_sigpending(current);
1301 current->flags |= PF_SIGNALED;
1306 if (restart_syscall)
1307 syscall_restart(orig_i0, regs, &ka->sa);
1308 handle_signal(signr, ka, &info, oldset, regs, svr4_signal);
1311 if (restart_syscall &&
1312 (regs->u_regs[UREG_I0] == ERESTARTNOHAND ||
1313 regs->u_regs[UREG_I0] == ERESTARTSYS ||
1314 regs->u_regs[UREG_I0] == ERESTARTNOINTR)) {
1315 /* replay the system call when we are done */
1316 regs->u_regs[UREG_I0] = orig_i0;
1324 do_sys_sigstack(struct sigstack *ssptr, struct sigstack *ossptr, unsigned long sp)
1328 /* First see if old state is wanted. */
1330 if (put_user(current->sas_ss_sp + current->sas_ss_size, &ossptr->the_stack) ||
1331 __put_user(on_sig_stack(sp), &ossptr->cur_status))
1335 /* Now see if we want to update the new state. */
1339 if (get_user(ss_sp, &ssptr->the_stack))
1341 /* If the current stack was set with sigaltstack, don't
1342 swap stacks while we are on it. */
1344 if (current->sas_ss_sp && on_sig_stack(sp))
1347 /* Since we don't know the extent of the stack, and we don't
1348 track onstack-ness, but rather calculate it, we must
1349 presume a size. Ho hum this interface is lossy. */
1350 current->sas_ss_sp = (unsigned long)ss_sp - SIGSTKSZ;
1351 current->sas_ss_size = SIGSTKSZ;