mirror of
https://github.com/reactos/reactos.git
synced 2024-09-08 11:50:08 +00:00
[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:
parent
8288824381
commit
360a87c9f9
|
@ -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 */
|
||||||
|
|
Loading…
Reference in a new issue