diff options
Diffstat (limited to 'arch/sparc64/kernel/rtrap.S')
-rw-r--r-- | arch/sparc64/kernel/rtrap.S | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/arch/sparc64/kernel/rtrap.S b/arch/sparc64/kernel/rtrap.S index 6892cf556f45..fd3cee4d117c 100644 --- a/arch/sparc64/kernel/rtrap.S +++ b/arch/sparc64/kernel/rtrap.S | |||
@@ -132,6 +132,18 @@ __handle_signal: | |||
132 | ba,pt %xcc, __handle_signal_continue | 132 | ba,pt %xcc, __handle_signal_continue |
133 | andn %l1, %l4, %l1 | 133 | andn %l1, %l4, %l1 |
134 | 134 | ||
135 | /* When returning from a NMI (%pil==15) interrupt we want to | ||
136 | * avoid running softirqs, doing IRQ tracing, preempting, etc. | ||
137 | */ | ||
138 | .globl rtrap_nmi | ||
139 | rtrap_nmi: ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1 | ||
140 | sethi %hi(0xf << 20), %l4 | ||
141 | and %l1, %l4, %l4 | ||
142 | andn %l1, %l4, %l1 | ||
143 | srl %l4, 20, %l4 | ||
144 | ba,pt %xcc, rtrap_no_irq_enable | ||
145 | wrpr %l4, %pil | ||
146 | |||
135 | .align 64 | 147 | .align 64 |
136 | .globl rtrap_irq, rtrap, irqsz_patchme, rtrap_xcall | 148 | .globl rtrap_irq, rtrap, irqsz_patchme, rtrap_xcall |
137 | rtrap_irq: | 149 | rtrap_irq: |
@@ -161,8 +173,8 @@ rtrap_xcall: | |||
161 | call trace_hardirqs_on | 173 | call trace_hardirqs_on |
162 | nop | 174 | nop |
163 | wrpr %l4, %pil | 175 | wrpr %l4, %pil |
164 | rtrap_no_irq_enable: | ||
165 | #endif | 176 | #endif |
177 | rtrap_no_irq_enable: | ||
166 | andcc %l1, TSTATE_PRIV, %l3 | 178 | andcc %l1, TSTATE_PRIV, %l3 |
167 | bne,pn %icc, to_kernel | 179 | bne,pn %icc, to_kernel |
168 | nop | 180 | nop |