.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
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
TrapFrame);
}
-DECLSPEC_NORETURN
VOID
__cdecl
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