mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 08:25:03 +00:00
[NTOS:KE] Fixup for the NMI task handler: handle NMI recursion. -- Code was lost in commit 2efed8ef
(r45040).
This commit is contained in:
parent
3c8f19eb21
commit
04906f2abb
3 changed files with 26 additions and 23 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue