[NTOS:KE] Fixup for the NMI task handler: handle NMI recursion. -- Code was lost...
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Tue, 23 Apr 2019 01:42:24 +0000 (03:42 +0200)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Thu, 20 Jun 2019 17:39:44 +0000 (19:39 +0200)
ntoskrnl/include/internal/i386/asmmacro.S
ntoskrnl/ke/i386/trap.s
ntoskrnl/ke/i386/traphdlr.c

index 57f83b7..f7af217 100644 (file)
@@ -249,19 +249,24 @@ MACRO(TRAP_ENTRY, Trap, Flags)
     .ENDP
 ENDM
 
+#define KI_NMI  HEX(0001)
+
 MACRO(TASK_ENTRY, Trap, Flags)
-    // EXTERN @&Trap&Handler@0 :PROC
     EXTERN _&Trap&Handler :PROC
     PUBLIC _&Trap
     .PROC _&Trap
         /* Generate proper debugging symbols */
         FPO 0, 0, 0, 0, 0, FRAME_TSS
 
-        // /* Common code to create the trap frame */
-        // KiEnterTrap Flags
-
         /* Call the C handler */
-        KiCallHandler _&Trap&Handler // @&Trap&Handler@0
+        call _&Trap&Handler
+
+        if (Flags AND KI_NMI)
+            /* Return from NMI: return with iret and handle NMI recursion */
+            iretd
+            jmp _&Trap
+        endif
+
     .ENDP
 ENDM
 
index d70ff66..f3496f0 100644 (file)
@@ -97,7 +97,7 @@ ENDR
 
 TRAP_ENTRY KiTrap00, KI_PUSH_FAKE_ERROR_CODE
 TRAP_ENTRY KiTrap01, KI_PUSH_FAKE_ERROR_CODE
-TASK_ENTRY KiTrap02, 0
+TASK_ENTRY KiTrap02, KI_NMI
 TRAP_ENTRY KiTrap03, KI_PUSH_FAKE_ERROR_CODE
 TRAP_ENTRY KiTrap04, KI_PUSH_FAKE_ERROR_CODE
 TRAP_ENTRY KiTrap05, KI_PUSH_FAKE_ERROR_CODE
index 863641b..e262bb8 100644 (file)
@@ -455,7 +455,6 @@ KiTrap01Handler(IN PKTRAP_FRAME TrapFrame)
                              TrapFrame);
 }
 
-DECLSPEC_NORETURN
 VOID
 __cdecl
 KiTrap02Handler(VOID)
@@ -561,25 +560,24 @@ KiTrap02Handler(VOID)
      * We have to make sure we're still in our original NMI -- a nested NMI
      * will point back to the NMI TSS, and in that case we're hosed.
      */
-    if (PCR->TSS->Backlink != KGDT_NMI_TSS)
+    if (PCR->TSS->Backlink == KGDT_NMI_TSS)
     {
-        /* Restore original TSS */
-        PCR->TSS = Tss;
+        /* Unhandled: crash the system */
+        KiSystemFatalException(EXCEPTION_NMI, NULL);
+    }
 
-        /* Set it back to busy */
-        TssGdt->HighWord.Bits.Dpl = 0;
-        TssGdt->HighWord.Bits.Pres = 1;
-        TssGdt->HighWord.Bits.Type = I386_ACTIVE_TSS;
+    /* Restore original TSS */
+    PCR->TSS = Tss;
 
-        /* Restore nested flag */
-        __writeeflags(__readeflags() | EFLAGS_NESTED_TASK);
+    /* Set it back to busy */
+    TssGdt->HighWord.Bits.Dpl = 0;
+    TssGdt->HighWord.Bits.Pres = 1;
+    TssGdt->HighWord.Bits.Type = I386_ACTIVE_TSS;
 
-        /* Handled, return from interrupt */
-        KiIret();
-    }
+    /* Restore nested flag */
+    __writeeflags(__readeflags() | EFLAGS_NESTED_TASK);
 
-    /* Unhandled: crash the system */
-    KiSystemFatalException(EXCEPTION_NMI, NULL);
+    /* Handled, return from interrupt */
 }
 
 DECLSPEC_NORETURN