From 728ecbbafb53a46f2f4d59789ce7bd40d6720cfe Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sat, 27 Nov 2004 19:24:15 +0000 Subject: [PATCH] - Simplified the irq lock table. - Enabled interrupts while calling KiDeliverApc. svn path=/trunk/; revision=11842 --- reactos/ntoskrnl/ke/i386/irq.c | 38 +++++++++++++++------------------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/reactos/ntoskrnl/ke/i386/irq.c b/reactos/ntoskrnl/ke/i386/irq.c index dc40a0e5c2f..0e1e055cd56 100644 --- a/reactos/ntoskrnl/ke/i386/irq.c +++ b/reactos/ntoskrnl/ke/i386/irq.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: irq.c,v 1.55 2004/11/10 02:51:00 ion Exp $ +/* $Id: irq.c,v 1.56 2004/11/27 19:24:15 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/i386/irq.c @@ -182,9 +182,9 @@ static unsigned int irq_handler[NR_IRQS]= * be accessed at any irq level. */ -static LIST_ENTRY isr_table[NR_IRQS]={{NULL,NULL},}; -static PKSPIN_LOCK isr_lock[NR_IRQS] = {NULL,}; -static KSPIN_LOCK isr_table_lock = {0,}; +static LIST_ENTRY isr_table[NR_IRQS]; +static KSPIN_LOCK isr_lock[NR_IRQS]; +static KSPIN_LOCK isr_table_lock; #define TAG_ISR_LOCK TAG('I', 'S', 'R', 'L') @@ -207,7 +207,9 @@ KeInitInterrupts (VOID) KiIdt[IRQ_BASE+i].b=(irq_handler[i]&0xffff0000)+PRESENT+ I486_INTERRUPT_GATE; InitializeListHead(&isr_table[i]); + KeInitializeSpinLock(&isr_lock[i]); } + KeInitializeSpinLock(&isr_table_lock); } STATIC VOID @@ -360,8 +362,10 @@ KiInterruptDispatch (ULONG vector, PKIRQ_TRAPFRAME Trapframe) KeIRQTrapFrameToTrapFrame(Trapframe, &KernelTrapFrame); CurrentThread->TrapFrame = &KernelTrapFrame; } - + + Ke386EnableInterrupts(); KiDeliverApc(KernelMode, NULL, NULL); + Ke386DisableInterrupts(); ASSERT(KeGetCurrentThread() == CurrentThread); if (CurrentThread->TrapFrame == &KernelTrapFrame) @@ -382,16 +386,15 @@ KeDumpIrqList(VOID) for (i=0;iFlink; current = CONTAINING_RECORD(current_entry,KINTERRUPT,Entry); } - DPRINT("\n",0); } } @@ -424,21 +427,14 @@ KeConnectInterrupt(PKINTERRUPT InterruptObject) * Check if the vector is already in use that we can share it */ ListHead = CONTAINING_RECORD(isr_table[Vector].Flink,KINTERRUPT,Entry); - if (!IsListEmpty(&isr_table[Vector]) && + if (!IsListEmpty(&isr_table[Vector]) && (InterruptObject->Shareable == FALSE || ListHead->Shareable==FALSE)) - { - KeReleaseSpinLock(&isr_table_lock,oldlvl); - return FALSE; - } - else - { - isr_lock[Vector] = - ExAllocatePoolWithTag(NonPagedPool, sizeof(KSPIN_LOCK), - TAG_ISR_LOCK); - KeInitializeSpinLock(isr_lock[Vector]); - } + { + KeReleaseSpinLock(&isr_table_lock,oldlvl); + return FALSE; + } - InterruptObject->IrqLock = isr_lock[Vector]; + InterruptObject->IrqLock = &isr_lock[Vector]; KeRaiseIrql(InterruptObject->SynchLevel,&synch_oldlvl); KiAcquireSpinLock(InterruptObject->IrqLock);