Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

sparc64: Make special trap return path for TRAP_NMI().

We don't want the rtrap path to try and run softirqs or
anything like that when returning from a PIL==15 NMI.

Signed-off-by: David S. Miller <davem@davemloft.net>

+14 -2
+1 -1
arch/sparc/include/asm/ttable.h
··· 162 162 mov level, %o0; \ 163 163 call routine; \ 164 164 add %sp, PTREGS_OFF, %o1; \ 165 - ba,a,pt %xcc, rtrap_irq; 165 + ba,a,pt %xcc, rtrap_nmi; 166 166 167 167 #define TRAP_IVEC TRAP_NOSAVE(do_ivec) 168 168
+13 -1
arch/sparc64/kernel/rtrap.S
··· 132 132 ba,pt %xcc, __handle_signal_continue 133 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 147 .align 64 136 148 .globl rtrap_irq, rtrap, irqsz_patchme, rtrap_xcall 137 149 rtrap_irq: ··· 173 161 call trace_hardirqs_on 174 162 nop 175 163 wrpr %l4, %pil 176 - rtrap_no_irq_enable: 177 164 #endif 165 + rtrap_no_irq_enable: 178 166 andcc %l1, TSTATE_PRIV, %l3 179 167 bne,pn %icc, to_kernel 180 168 nop