From 955d04b6ff160873651ec68a0e32200704e41267 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 23 Aug 2006 01:07:14 +0000 Subject: [PATCH] - Disable interrupts while in HalpLowerIrql - Properly handle IRR. - Call IRR Handlers through the SWINT table. svn path=/trunk/; revision=23659 --- reactos/hal/halx86/generic/irq.S | 5 +++-- reactos/hal/halx86/generic/irql.c | 33 +++++++++++-------------------- 2 files changed, 15 insertions(+), 23 deletions(-) diff --git a/reactos/hal/halx86/generic/irq.S b/reactos/hal/halx86/generic/irq.S index 484faf33d14..88f1e851221 100644 --- a/reactos/hal/halx86/generic/irq.S +++ b/reactos/hal/halx86/generic/irq.S @@ -93,7 +93,8 @@ SoftIntByteTable: .byte DISPATCH_LEVEL /* IRR 6 */ .byte DISPATCH_LEVEL /* IRR 7 */ -SoftIntHandlerTable: +.globl _SoftIntHandlerTable +_SoftIntHandlerTable: .long _KiUnexpectedInterrupt /* PASSIVE_LEVEL */ .long _HalpApcInterrupt /* APC_LEVEL */ .long _HalpDispatchInterrupt /* DISPATCH_LEVEL */ @@ -179,7 +180,7 @@ _@HalRequestSoftwareInterrupt@4: /* Call the pending interrupt */ jmp $ - call SoftIntHandlerTable[edx*4] + call _SoftIntHandlerTable[edx*4] AfterCall: diff --git a/reactos/hal/halx86/generic/irql.c b/reactos/hal/halx86/generic/irql.c index de5e3e54dae..a1b458f0421 100644 --- a/reactos/hal/halx86/generic/irql.c +++ b/reactos/hal/halx86/generic/irql.c @@ -23,8 +23,8 @@ UCHAR Table[8] = 2, 2, 2, 2 }; -VOID HalpDispatchInterrupt(VOID); -VOID HalpApcInterrupt(VOID); +typedef VOID (*PSW_HANDLER)(VOID); +extern PSW_HANDLER SoftIntHandlerTable[]; /* FUNCTIONS ****************************************************************/ @@ -34,6 +34,10 @@ VOID STATIC HalpLowerIrql(KIRQL NewIrql) { ULONG Mask; + ULONG Flags; + + Ki386SaveFlags(Flags); + Ki386DisableInterrupts(); if (KeGetPcr()->Irql > DISPATCH_LEVEL) { @@ -46,34 +50,21 @@ HalpLowerIrql(KIRQL NewIrql) if (NewIrql >= PROFILE_LEVEL) { KeGetPcr()->Irql = NewIrql; + Ki386RestoreFlags(Flags); return; } if (NewIrql >= DISPATCH_LEVEL) { KeGetPcr()->Irql = NewIrql; + Ki386RestoreFlags(Flags); return; } - KeGetPcr()->Irql = DISPATCH_LEVEL; - if (Table[KeGetPcr()->IRR] >= NewIrql) + KeGetPcr()->Irql = NewIrql; + if (Table[KeGetPcr()->IRR] > NewIrql) { - if (Table[KeGetPcr()->IRR] == DISPATCH_LEVEL) - { - HalpDispatchInterrupt(); - } + SoftIntHandlerTable[Table[KeGetPcr()->IRR]](); } - KeGetPcr()->Irql = APC_LEVEL; - if (NewIrql == APC_LEVEL) - { - return; - } - if (Table[KeGetPcr()->IRR] >= NewIrql) - { - if (Table[KeGetPcr()->IRR] == APC_LEVEL) - { - HalpApcInterrupt(); - } - } - KeGetPcr()->Irql = PASSIVE_LEVEL; + Ki386RestoreFlags(Flags); } /**********************************************************************