summaryrefslogtreecommitdiffstats
path: root/arch/mips/kernel/irixsig.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/mips/kernel/irixsig.c')
-rw-r--r--arch/mips/kernel/irixsig.c40
1 files changed, 18 insertions, 22 deletions
diff --git a/arch/mips/kernel/irixsig.c b/arch/mips/kernel/irixsig.c
index 693d72110..7ec7b175c 100644
--- a/arch/mips/kernel/irixsig.c
+++ b/arch/mips/kernel/irixsig.c
@@ -3,7 +3,7 @@
*
* Copyright (C) 1996 David S. Miller (dm@engr.sgi.com)
*
- * $Id: irixsig.c,v 1.10 1999/01/03 17:50:50 ralf Exp $
+ * $Id: irixsig.c,v 1.11 1999/06/17 13:25:46 ralf Exp $
*/
#include <linux/kernel.h>
@@ -114,17 +114,17 @@ static void setup_irix_frame(struct k_sigaction *ka, struct pt_regs *regs,
dump_irix5_sigctx(ctx);
#endif
- regs->regs[5] = 0; /* XXX sigcode XXX */
regs->regs[4] = (unsigned long) signr;
+ regs->regs[5] = 0; /* XXX sigcode XXX */
regs->regs[6] = regs->regs[29] = sp;
regs->regs[7] = (unsigned long) ka->sa.sa_handler;
- regs->regs[25] = regs->cp0_epc = current->tss.irix_trampoline;
+ regs->regs[25] = regs->cp0_epc = (unsigned long) ka->sa.sa_restorer;
return;
segv_and_exit:
- lock_kernel();
- do_exit(SIGSEGV);
- unlock_kernel();
+ if (signr == SIGSEGV)
+ ka->sa.sa_handler = SIG_DFL;
+ force_sig(SIGSEGV, current);
}
static void inline
@@ -300,11 +300,12 @@ asmlinkage int do_irix_signal(sigset_t *oldset, struct pt_regs *regs)
return 0;
}
-asmlinkage unsigned long irix_sigreturn(struct pt_regs *regs)
+asmlinkage void
+irix_sigreturn(struct pt_regs *regs)
{
struct sigctx_irix5 *context, *magic;
unsigned long umask, mask;
- u64 *fregs, res;
+ u64 *fregs;
int sig, i, base = 0;
sigset_t blocked;
@@ -365,11 +366,7 @@ asmlinkage unsigned long irix_sigreturn(struct pt_regs *regs)
/* Unreached */
badframe:
- lock_kernel();
- do_exit(SIGSEGV);
- unlock_kernel();
-
- return res;
+ force_sig(SIGSEGV, current);
}
struct sigact_irix5 {
@@ -390,7 +387,7 @@ static inline void dump_sigact_irix5(struct sigact_irix5 *p)
asmlinkage int
irix_sigaction(int sig, const struct sigaction *act,
- struct sigaction *oact, unsigned long trampoline)
+ struct sigaction *oact, void *trampoline)
{
struct k_sigaction new_ka, old_ka;
int ret;
@@ -410,15 +407,14 @@ irix_sigaction(int sig, const struct sigaction *act,
return -EFAULT;
__copy_from_user(&mask, &act->sa_mask, sizeof(sigset_t));
- new_ka.ka_restorer = NULL;
- }
- /*
- * Hmmm... methinks IRIX libc always passes a valid trampoline
- * value for all invocations of sigaction. Will have to
- * investigate. POSIX POSIX, die die die...
- */
- current->tss.irix_trampoline = trampoline;
+ /*
+ * Hmmm... methinks IRIX libc always passes a valid trampoline
+ * value for all invocations of sigaction. Will have to
+ * investigate. POSIX POSIX, die die die...
+ */
+ new_ka.sa.sa_restorer = trampoline;
+ }
/* XXX Implement SIG_SETMASK32 for IRIX compatibility */
ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);