diff options
Diffstat (limited to 'arch/sparc64/kernel/rtrap.S')
-rw-r--r-- | arch/sparc64/kernel/rtrap.S | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/arch/sparc64/kernel/rtrap.S b/arch/sparc64/kernel/rtrap.S index 76b9b32de..5cdddfdb9 100644 --- a/arch/sparc64/kernel/rtrap.S +++ b/arch/sparc64/kernel/rtrap.S @@ -1,10 +1,12 @@ -/* $Id: rtrap.S,v 1.61 2002-02-09 19:49:31 davem Exp $ +/* $Id: rtrap.S,v 1.62 2002-02-11 06:42:06 davem Exp $ * rtrap.S: Preparing for return from trap on Sparc V9. * * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) */ +#include <linux/config.h> + #include <asm/asi.h> #include <asm/pstate.h> #include <asm/ptrace.h> @@ -148,7 +150,13 @@ __handle_signal: andn %l1, %l4, %l1 .align 64 - .globl rtrap_clr_l6, rtrap, irqsz_patchme + .globl rtrap_irq, rtrap_clr_l6, rtrap, irqsz_patchme +rtrap_irq: +#ifdef CONFIG_PREEMPT + ldsw [%g6 + TI_PRE_COUNT], %l0 + sub %l0, 1, %l0 + stw %l0, [%g6 + TI_PRE_COUNT] +#endif rtrap_clr_l6: clr %l6 rtrap: ldub [%g6 + TI_CPU], %l0 sethi %hi(irq_stat), %l2 ! &softirq_active @@ -261,7 +269,18 @@ rt_continue: ldx [%sp + PTREGS_OFF + PT_V9_G1], %g1 kern_rtt: restore retry -to_kernel: ldub [%g6 + TI_FPDEPTH], %l5 +to_kernel: +#ifdef CONFIG_PREEMPT + ldsw [%g6 + TI_PRE_COUNT], %l5 + brnz %l5, kern_fpucheck + add %l5, 1, %l6 + stw %l6, [%g6 + TI_PRE_COUNT] + call kpreempt_maybe + wrpr %g0, RTRAP_PSTATE, %pstate + wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate + stw %l5, [%g6 + TI_PRE_COUNT] +#endif +kern_fpucheck: ldub [%g6 + TI_FPDEPTH], %l5 brz,pt %l5, rt_continue srl %l5, 1, %o0 add %g6, TI_FPSAVED, %l6 |