[NTOSKRNL]

- Fix a critical bug in interrupt handling that could result in HAL returning the current processor to the wrong IRQL after an interrupt is handled that requires a raise to a synchronize IRQL.

svn path=/trunk/; revision=57065
This commit is contained in:
Cameron Gutman 2012-08-13 01:17:13 +00:00
parent 8288824381
commit 360a87c9f9

View file

@ -229,7 +229,7 @@ FASTCALL
KiChainedDispatch(IN PKTRAP_FRAME TrapFrame, KiChainedDispatch(IN PKTRAP_FRAME TrapFrame,
IN PKINTERRUPT Interrupt) IN PKINTERRUPT Interrupt)
{ {
KIRQL OldIrql; KIRQL OldIrql, OldInterruptIrql = 0;
BOOLEAN Handled; BOOLEAN Handled;
PLIST_ENTRY NextEntry, ListHead; PLIST_ENTRY NextEntry, ListHead;
@ -250,7 +250,7 @@ KiChainedDispatch(IN PKTRAP_FRAME TrapFrame,
if (Interrupt->SynchronizeIrql > Interrupt->Irql) if (Interrupt->SynchronizeIrql > Interrupt->Irql)
{ {
/* Raise to higher IRQL */ /* Raise to higher IRQL */
OldIrql = KfRaiseIrql(Interrupt->SynchronizeIrql); OldInterruptIrql = KfRaiseIrql(Interrupt->SynchronizeIrql);
} }
/* Acquire interrupt lock */ /* Acquire interrupt lock */
@ -267,7 +267,8 @@ KiChainedDispatch(IN PKTRAP_FRAME TrapFrame,
if (Interrupt->SynchronizeIrql > Interrupt->Irql) if (Interrupt->SynchronizeIrql > Interrupt->Irql)
{ {
/* Lower the IRQL back */ /* Lower the IRQL back */
KfLowerIrql(OldIrql); ASSERT(OldInterruptIrql == Interrupt->Irql);
KfLowerIrql(OldInterruptIrql);
} }
/* Check if the interrupt got handled and it's level */ /* Check if the interrupt got handled and it's level */