[NTOS:KE] Fixup for the NMI task handler: handle NMI recursion. -- Code was lost in commit 2efed8ef (r45040).

This commit is contained in:
Hermès Bélusca-Maïto 2019-04-23 03:42:24 +02:00
parent 3c8f19eb21
commit 04906f2abb
No known key found for this signature in database
GPG key ID: 3B2539C65E7B93D0
3 changed files with 26 additions and 23 deletions

View 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

View 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

View 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;
/* Set it back to busy */
TssGdt->HighWord.Bits.Dpl = 0;
TssGdt->HighWord.Bits.Pres = 1;
TssGdt->HighWord.Bits.Type = I386_ACTIVE_TSS;
/* Restore nested flag */
__writeeflags(__readeflags() | EFLAGS_NESTED_TASK);
/* Handled, return from interrupt */
KiIret();
/* Unhandled: crash the system */
KiSystemFatalException(EXCEPTION_NMI, NULL);
}
/* Unhandled: crash the system */
KiSystemFatalException(EXCEPTION_NMI, NULL);
/* Restore original TSS */
PCR->TSS = Tss;
/* Set it back to busy */
TssGdt->HighWord.Bits.Dpl = 0;
TssGdt->HighWord.Bits.Pres = 1;
TssGdt->HighWord.Bits.Type = I386_ACTIVE_TSS;
/* Restore nested flag */
__writeeflags(__readeflags() | EFLAGS_NESTED_TASK);
/* Handled, return from interrupt */
}
DECLSPEC_NORETURN