tile: Enable NMIs on return from handle_nmi() without errors
authorZhigang Lu <zlu@tilera.com>
Mon, 27 Jan 2014 08:25:28 +0000 (16:25 +0800)
committerChris Metcalf <cmetcalf@tilera.com>
Fri, 7 Mar 2014 16:19:48 +0000 (11:19 -0500)
NMI interrupts mask ALL interrupts before calling the handler,
so we need to unmask NMIs according to the value handle_nmi() returns.
If it returns zero, the NMIs should be re-enabled; if it returns
a non-zero error, the NMIs should be disabled.

Signed-off-by: Zhigang Lu <zlu@tilera.com>
Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
arch/tile/kernel/intvec_32.S
arch/tile/kernel/intvec_64.S

index 605ffbda44ffab81d6f496720ebf718c8ff7bab2..cdbda45a4e4bba22c5397338b34f3310426fcd77 100644 (file)
@@ -946,6 +946,13 @@ STD_ENTRY(interrupt_return)
        bzt     r30, .Lrestore_regs
 3:
 
+       /* We are relying on INT_PERF_COUNT at 33, and AUX_PERF_COUNT at 48 */
+       {
+        moveli r0, lo16(1 << (INT_PERF_COUNT - 32))
+        bz     r31, .Lrestore_regs
+       }
+       auli    r0, r0, ha16(1 << (INT_AUX_PERF_COUNT - 32))
+       mtspr   SPR_INTERRUPT_MASK_RESET_K_1, r0
 
        /*
         * We now commit to returning from this interrupt, since we will be
@@ -1171,6 +1178,10 @@ handle_nmi:
         PTREGS_PTR(r0, PTREGS_OFFSET_BASE)
        }
        FEEDBACK_REENTER(handle_nmi)
+       {
+        movei  r30, 1
+        seq    r31, r0, zero
+       }
        j       interrupt_return
        STD_ENDPROC(handle_nmi)
 
index 8f892a58afd4171dfe135f2c9e87dc850819f34c..5b67efcecabd17603deb47cd622d94e9b710d470 100644 (file)
@@ -971,6 +971,15 @@ STD_ENTRY(interrupt_return)
        beqzt   r30, .Lrestore_regs
 3:
 
+#if INT_PERF_COUNT + 1 != INT_AUX_PERF_COUNT
+# error Bad interrupt assumption
+#endif
+       {
+        movei  r0, 3   /* two adjacent bits for the PERF_COUNT mask */
+        beqz   r31, .Lrestore_regs
+       }
+       shli    r0, r0, INT_PERF_COUNT
+       mtspr   SPR_INTERRUPT_MASK_RESET_K, r0
 
        /*
         * We now commit to returning from this interrupt, since we will be
@@ -1187,7 +1196,7 @@ handle_nmi:
        FEEDBACK_REENTER(handle_nmi)
        {
         movei  r30, 1
-        move   r31, r0
+        cmpeq  r31, r0, zero
        }
        j       interrupt_return
        STD_ENDPROC(handle_nmi)