diff options
Diffstat (limited to 'arch/sparc64/kernel/signal32.c')
-rw-r--r-- | arch/sparc64/kernel/signal32.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/arch/sparc64/kernel/signal32.c b/arch/sparc64/kernel/signal32.c index d8e61511d..33892065f 100644 --- a/arch/sparc64/kernel/signal32.c +++ b/arch/sparc64/kernel/signal32.c @@ -1,4 +1,4 @@ -/* $Id: signal32.c,v 1.8 1997/05/18 08:42:15 davem Exp $ +/* $Id: signal32.c,v 1.10 1997/05/27 06:28:07 davem Exp $ * arch/sparc64/kernel/signal32.c * * Copyright (C) 1991, 1992 Linus Torvalds @@ -398,8 +398,15 @@ new_setup_frame32(struct sigaction *sa, struct pt_regs *regs, regs->tnpc = (regs->tpc + 4); /* Flush instruction space. */ - __asm__ __volatile__ ("flush %0; flush %0 + 4" : : "r" (&(sf->insns[0]))); - + __asm__ __volatile__(" + membar #StoreStore + stxa %%g0, [%0] %2 + stxa %%g0, [%1] %2 + flush %%g4 + " : /* no outputs */ + : "r" (((unsigned long)&(sf->insns[0])) & ~(PAGE_MASK)), + "r" ((((unsigned long)&(sf->insns[0])) & ~(PAGE_MASK)) + PAGE_SIZE), + "i" (ASI_IC_TAG)); } /* Setup a Solaris stack frame */ @@ -677,7 +684,7 @@ asmlinkage int do_signal32(unsigned long oldmask, struct pt_regs * regs, while ((signr = current->signal & mask) != 0) { signr = ffz(~signr); - clear_bit(signr, ¤t->signal); + clear_bit(signr + 32, ¤t->signal); sa = current->sig->action + signr; signr++; if ((current->flags & PF_PTRACED) && signr != SIGKILL) { |