From: Hermès Bélusca-Maïto Date: Tue, 23 Apr 2019 01:42:24 +0000 (+0200) Subject: [NTOS:KE] Fixup for the NMI task handler: handle NMI recursion. -- Code was lost... X-Git-Tag: 0.4.14-dev~711 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=04906f2abbae83c2a475ea31555a2eb5b5a09960 [NTOS:KE] Fixup for the NMI task handler: handle NMI recursion. -- Code was lost in commit 2efed8ef (r45040). --- diff --git a/ntoskrnl/include/internal/i386/asmmacro.S b/ntoskrnl/include/internal/i386/asmmacro.S index 57f83b7cedb..f7af217cc9f 100644 --- a/ntoskrnl/include/internal/i386/asmmacro.S +++ b/ntoskrnl/include/internal/i386/asmmacro.S @@ -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 diff --git a/ntoskrnl/ke/i386/trap.s b/ntoskrnl/ke/i386/trap.s index d70ff66404b..f3496f0ebc3 100644 --- a/ntoskrnl/ke/i386/trap.s +++ b/ntoskrnl/ke/i386/trap.s @@ -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 diff --git a/ntoskrnl/ke/i386/traphdlr.c b/ntoskrnl/ke/i386/traphdlr.c index 863641bb689..e262bb85b92 100644 --- a/ntoskrnl/ke/i386/traphdlr.c +++ b/ntoskrnl/ke/i386/traphdlr.c @@ -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