/* $Id$
- *
+ *
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/ke/i386/irq.c
* PURPOSE: IRQ handling
- *
+ *
* PROGRAMMERS: David Welch (welch@mcmail.com)
- * Hartmut Birr
*/
/*
/* INCLUDES ****************************************************************/
#include <ntoskrnl.h>
-#if defined(KDBG) || defined(DBG)
-#include <../dbg/kdb.h>
-#endif /* KDBG */
-
#include <../hal/halx86/include/halirq.h>
+#include <../hal/halx86/include/mps.h>
#define NDEBUG
#include <internal/debug.h>
/* GLOBALS *****************************************************************/
-#ifdef CONFIG_SMP
+/* Interrupt handler list */
-#define __STR(x) #x
-#define STR(x) __STR(x)
+#ifdef CONFIG_SMP
-#define INT_NAME(intnum) _KiUnexpectedInterrupt##intnum
#define INT_NAME2(intnum) KiUnexpectedInterrupt##intnum
-#define BUILD_COMMON_INTERRUPT_HANDLER() \
-__asm__( \
- "_KiCommonInterrupt:\n\t" \
- "cld\n\t" \
- "pushl %ds\n\t" \
- "pushl %es\n\t" \
- "pushl %fs\n\t" \
- "pushl %gs\n\t" \
- "movl $0xceafbeef,%eax\n\t" \
- "pushl %eax\n\t" \
- "movl $" STR(KERNEL_DS) ",%eax\n\t" \
- "movl %eax,%ds\n\t" \
- "movl %eax,%es\n\t" \
- "movl %eax,%gs\n\t" \
- "movl $" STR(PCR_SELECTOR) ",%eax\n\t" \
- "movl %eax,%fs\n\t" \
- "pushl %esp\n\t" \
- "pushl %ebx\n\t" \
- "call _KiInterruptDispatch\n\t" \
- "popl %eax\n\t" \
- "popl %eax\n\t" \
- "popl %eax\n\t" \
- "popl %gs\n\t" \
- "popl %fs\n\t" \
- "popl %es\n\t" \
- "popl %ds\n\t" \
- "popa\n\t" \
- "iret\n\t");
-
#define BUILD_INTERRUPT_HANDLER(intnum) \
-VOID INT_NAME2(intnum)(VOID); \
-__asm__( \
- STR(INT_NAME(intnum)) ":\n\t" \
- "pusha\n\t" \
- "movl $0x" STR(intnum) ",%ebx\n\t" \
- "jmp _KiCommonInterrupt");
-
-
-/* Interrupt handlers and declarations */
+VOID INT_NAME2(intnum)(VOID);
-#define B(x,y) \
+#define D(x,y) \
BUILD_INTERRUPT_HANDLER(x##y)
-#define B16(x) \
- B(x,0) B(x,1) B(x,2) B(x,3) \
- B(x,4) B(x,5) B(x,6) B(x,7) \
- B(x,8) B(x,9) B(x,A) B(x,B) \
- B(x,C) B(x,D) B(x,E) B(x,F)
+#define D16(x) \
+ D(x,0) D(x,1) D(x,2) D(x,3) \
+ D(x,4) D(x,5) D(x,6) D(x,7) \
+ D(x,8) D(x,9) D(x,A) D(x,B) \
+ D(x,C) D(x,D) D(x,E) D(x,F)
-
-BUILD_COMMON_INTERRUPT_HANDLER()
-B16(3) B16(4) B16(5) B16(6)
-B16(7) B16(8) B16(9) B16(A)
-B16(B) B16(C) B16(D) B16(E)
-B16(F)
-
-#undef B
-#undef B16
-
-
-/* Interrupt handler list */
+D16(3) D16(4) D16(5) D16(6)
+D16(7) D16(8) D16(9) D16(A)
+D16(B) D16(C) D16(D) D16(E)
+D16(F)
#define L(x,y) \
(ULONG)& INT_NAME2(x##y)
#define L16(x) \
- L(x,0), L(x,1), L(x,2), L(x,3), \
- L(x,4), L(x,5), L(x,6), L(x,7), \
- L(x,8), L(x,9), L(x,A), L(x,B), \
- L(x,C), L(x,D), L(x,E), L(x,F)
+ L(x,0), L(x,1), L(x,2), L(x,3), \
+ L(x,4), L(x,5), L(x,6), L(x,7), \
+ L(x,8), L(x,9), L(x,A), L(x,B), \
+ L(x,C), L(x,D), L(x,E), L(x,F)
static ULONG irq_handler[ROUND_UP(NR_IRQS, 16)] = {
L16(3), L16(4), L16(5), L16(6),
#undef L
#undef L16
+#undef D
+#undef D16
#else /* CONFIG_SMP */
- void irq_handler_0(void);
- void irq_handler_1(void);
- void irq_handler_2(void);
- void irq_handler_3(void);
- void irq_handler_4(void);
- void irq_handler_5(void);
- void irq_handler_6(void);
- void irq_handler_7(void);
- void irq_handler_8(void);
- void irq_handler_9(void);
- void irq_handler_10(void);
- void irq_handler_11(void);
- void irq_handler_12(void);
- void irq_handler_13(void);
- void irq_handler_14(void);
- void irq_handler_15(void);
+void irq_handler_0(void);
+void irq_handler_1(void);
+void irq_handler_2(void);
+void irq_handler_3(void);
+void irq_handler_4(void);
+void irq_handler_5(void);
+void irq_handler_6(void);
+void irq_handler_7(void);
+void irq_handler_8(void);
+void irq_handler_9(void);
+void irq_handler_10(void);
+void irq_handler_11(void);
+void irq_handler_12(void);
+void irq_handler_13(void);
+void irq_handler_14(void);
+void irq_handler_15(void);
static unsigned int irq_handler[NR_IRQS]=
- {
- (int)&irq_handler_0,
- (int)&irq_handler_1,
- (int)&irq_handler_2,
- (int)&irq_handler_3,
- (int)&irq_handler_4,
- (int)&irq_handler_5,
- (int)&irq_handler_6,
- (int)&irq_handler_7,
- (int)&irq_handler_8,
- (int)&irq_handler_9,
- (int)&irq_handler_10,
- (int)&irq_handler_11,
- (int)&irq_handler_12,
- (int)&irq_handler_13,
- (int)&irq_handler_14,
- (int)&irq_handler_15,
- };
+{
+ (int)&irq_handler_0,
+ (int)&irq_handler_1,
+ (int)&irq_handler_2,
+ (int)&irq_handler_3,
+ (int)&irq_handler_4,
+ (int)&irq_handler_5,
+ (int)&irq_handler_6,
+ (int)&irq_handler_7,
+ (int)&irq_handler_8,
+ (int)&irq_handler_9,
+ (int)&irq_handler_10,
+ (int)&irq_handler_11,
+ (int)&irq_handler_12,
+ (int)&irq_handler_13,
+ (int)&irq_handler_14,
+ (int)&irq_handler_15,
+};
#endif /* CONFIG_SMP */
/*
- * PURPOSE: Object describing each isr
+ * PURPOSE: Object describing each isr
* NOTE: The data in this table is only modified at passsive level but can
* be accessed at any irq level.
*/
#endif
#define TAG_ISR_LOCK TAG('I', 'S', 'R', 'L')
+extern IDT_DESCRIPTOR KiIdt[256];
/* FUNCTIONS ****************************************************************/
#define PRESENT (0x8000)
#define I486_INTERRUPT_GATE (0xe00)
-VOID INIT_FUNCTION
+VOID
+INIT_FUNCTION
+NTAPI
KeInitInterrupts (VOID)
{
int i, j;
*/
for (i=0;i<NR_IRQS;i++)
{
- KiIdt[IRQ_BASE+i].a=(irq_handler[i]&0xffff)+(KERNEL_CS<<16);
- KiIdt[IRQ_BASE+i].b=(irq_handler[i]&0xffff0000)+PRESENT+
- I486_INTERRUPT_GATE;
+ KiIdt[IRQ_BASE+i].a=(irq_handler[i]&0xffff)+(KGDT_R0_CODE<<16);
+ KiIdt[IRQ_BASE+i].b=(irq_handler[i]&0xffff0000)+PRESENT+
+ I486_INTERRUPT_GATE;
#ifdef CONFIG_SMP
- for (j = 0; j < MAXIMUM_PROCESSORS; j++)
+ for (j = 0; j < MAXIMUM_PROCESSORS; j++)
#else
- j = 0;
+ j = 0;
#endif
- {
- InitializeListHead(&IsrTable[i][j].ListHead);
+ {
+ InitializeListHead(&IsrTable[i][j].ListHead);
KeInitializeSpinLock(&IsrTable[i][j].Lock);
- IsrTable[i][j].Count = 0;
- }
+ IsrTable[i][j].Count = 0;
+ }
}
}
-STATIC VOID
+STATIC VOID
KeIRQTrapFrameToTrapFrame(PKIRQ_TRAPFRAME IrqTrapFrame,
- PKTRAP_FRAME TrapFrame)
+ PKTRAP_FRAME TrapFrame)
{
- TrapFrame->Gs = (USHORT)IrqTrapFrame->Gs;
- TrapFrame->Fs = (USHORT)IrqTrapFrame->Fs;
- TrapFrame->Es = (USHORT)IrqTrapFrame->Es;
- TrapFrame->Ds = (USHORT)IrqTrapFrame->Ds;
+ TrapFrame->SegGs = (USHORT)IrqTrapFrame->Gs;
+ TrapFrame->SegFs = (USHORT)IrqTrapFrame->Fs;
+ TrapFrame->SegEs = (USHORT)IrqTrapFrame->Es;
+ TrapFrame->SegDs = (USHORT)IrqTrapFrame->Ds;
TrapFrame->Eax = IrqTrapFrame->Eax;
TrapFrame->Ecx = IrqTrapFrame->Ecx;
TrapFrame->Edx = IrqTrapFrame->Edx;
TrapFrame->Ebx = IrqTrapFrame->Ebx;
- TrapFrame->Esp = IrqTrapFrame->Esp;
+ TrapFrame->HardwareEsp = IrqTrapFrame->Esp;
TrapFrame->Ebp = IrqTrapFrame->Ebp;
TrapFrame->Esi = IrqTrapFrame->Esi;
TrapFrame->Edi = IrqTrapFrame->Edi;
TrapFrame->Eip = IrqTrapFrame->Eip;
- TrapFrame->Cs = IrqTrapFrame->Cs;
- TrapFrame->Eflags = IrqTrapFrame->Eflags;
+ TrapFrame->SegCs = IrqTrapFrame->Cs;
+ TrapFrame->EFlags = IrqTrapFrame->Eflags;
}
STATIC VOID
KeTrapFrameToIRQTrapFrame(PKTRAP_FRAME TrapFrame,
- PKIRQ_TRAPFRAME IrqTrapFrame)
+ PKIRQ_TRAPFRAME IrqTrapFrame)
{
- IrqTrapFrame->Gs = TrapFrame->Gs;
- IrqTrapFrame->Fs = TrapFrame->Fs;
- IrqTrapFrame->Es = TrapFrame->Es;
- IrqTrapFrame->Ds = TrapFrame->Ds;
+ IrqTrapFrame->Gs = TrapFrame->SegGs;
+ IrqTrapFrame->Fs = TrapFrame->SegFs;
+ IrqTrapFrame->Es = TrapFrame->SegEs;
+ IrqTrapFrame->Ds = TrapFrame->SegDs;
IrqTrapFrame->Eax = TrapFrame->Eax;
IrqTrapFrame->Ecx = TrapFrame->Ecx;
IrqTrapFrame->Edx = TrapFrame->Edx;
IrqTrapFrame->Ebx = TrapFrame->Ebx;
- IrqTrapFrame->Esp = TrapFrame->Esp;
+ IrqTrapFrame->Esp = TrapFrame->HardwareEsp;
IrqTrapFrame->Ebp = TrapFrame->Ebp;
IrqTrapFrame->Esi = TrapFrame->Esi;
IrqTrapFrame->Edi = TrapFrame->Edi;
IrqTrapFrame->Eip = TrapFrame->Eip;
- IrqTrapFrame->Cs = TrapFrame->Cs;
- IrqTrapFrame->Eflags = TrapFrame->Eflags;
+ IrqTrapFrame->Cs = TrapFrame->SegCs;
+ IrqTrapFrame->Eflags = TrapFrame->EFlags;
}
VOID STDCALL
while (current != &CurrentIsr->ListHead)
{
- isr = CONTAINING_RECORD(current,KINTERRUPT,Entry);
+ isr = CONTAINING_RECORD(current,KINTERRUPT,InterruptListEntry);
oldlvl = KeAcquireInterruptSpinLock(isr);
if (isr->ServiceRoutine(isr, isr->ServiceContext))
{
KeReleaseInterruptSpinLock(isr, oldlvl);
- break;
- }
+ break;
+ }
KeReleaseInterruptSpinLock(isr, oldlvl);
current = current->Flink;
}
KiReleaseSpinLock(&CurrentIsr->Lock);
}
-VOID
+VOID
KiInterruptDispatch (ULONG vector, PKIRQ_TRAPFRAME Trapframe)
/*
* FUNCTION: Calls the irq specific handler for an irq
* At this point we have interrupts disabled, nothing has been done to
* the PIC.
*/
-
+
KeGetCurrentPrcb()->InterruptCount++;
/*
* default HAL this will send an EOI to the PIC and alter the IRQL.
*/
if (!HalBeginSystemInterrupt (vector,
- VECTOR2IRQL(vector),
- &old_level))
+ VECTOR2IRQL(vector),
+ &old_level))
{
return;
}
*/
Ke386DisableInterrupts();
- HalEndSystemInterrupt (old_level, 0);
-
- if (old_level==PASSIVE_LEVEL && Trapframe->Cs != KERNEL_CS)
+ if (old_level==PASSIVE_LEVEL && Trapframe->Cs != KGDT_R0_CODE)
{
+ HalEndSystemInterrupt (APC_LEVEL, 0);
+
CurrentThread = KeGetCurrentThread();
- if (CurrentThread!=NULL && CurrentThread->Alerted[1])
+ if (CurrentThread!=NULL && CurrentThread->ApcState.UserApcPending)
{
- DPRINT("PID: %d, TID: %d CS %04x/%04x\n",
- ((PETHREAD)CurrentThread)->ThreadsProcess->UniqueProcessId,
- ((PETHREAD)CurrentThread)->Cid.UniqueThread,
- Trapframe->Cs,
- CurrentThread->TrapFrame ? CurrentThread->TrapFrame->Cs : 0);
- if (CurrentThread->TrapFrame == NULL)
- {
- OldTrapFrame = CurrentThread->TrapFrame;
- KeIRQTrapFrameToTrapFrame(Trapframe, &KernelTrapFrame);
- CurrentThread->TrapFrame = &KernelTrapFrame;
- }
-
- Ke386EnableInterrupts();
- KiDeliverApc(KernelMode, NULL, NULL);
+ DPRINT("PID: %d, TID: %d CS %04x/%04x\n",
+ ((PETHREAD)CurrentThread)->ThreadsProcess->UniqueProcessId,
+ ((PETHREAD)CurrentThread)->Cid.UniqueThread,
+ Trapframe->Cs,
+ CurrentThread->TrapFrame ? CurrentThread->TrapFrame->Cs : 0);
+ if (CurrentThread->TrapFrame == NULL)
+ {
+ OldTrapFrame = CurrentThread->TrapFrame;
+ KeIRQTrapFrameToTrapFrame(Trapframe, &KernelTrapFrame);
+ CurrentThread->TrapFrame = &KernelTrapFrame;
+ }
+
+ Ke386EnableInterrupts();
+ KiDeliverApc(UserMode, NULL, NULL);
Ke386DisableInterrupts();
-
- ASSERT(KeGetCurrentThread() == CurrentThread);
+
+ ASSERT(KeGetCurrentThread() == CurrentThread);
if (CurrentThread->TrapFrame == &KernelTrapFrame)
- {
+ {
KeTrapFrameToIRQTrapFrame(&KernelTrapFrame, Trapframe);
- CurrentThread->TrapFrame = OldTrapFrame;
- }
- }
+ CurrentThread->TrapFrame = OldTrapFrame;
+ }
+ }
+ KeLowerIrql(PASSIVE_LEVEL);
}
+ else
+ {
+ HalEndSystemInterrupt (old_level, 0);
+ }
+
}
-static VOID
+static VOID
KeDumpIrqList(VOID)
{
PKINTERRUPT current;
PLIST_ENTRY current_entry;
- ULONG i, j;
+ LONG i, j;
KIRQL oldlvl;
BOOLEAN printed;
-
+
for (i=0;i<NR_IRQS;i++)
{
- printed = FALSE;
+ printed = FALSE;
KeRaiseIrql(VECTOR2IRQL(i + IRQ_BASE),&oldlvl);
- for (j=0; j < KeNumberProcessors; j++)
- {
- KiAcquireSpinLock(&IsrTable[i][j].Lock);
-
- current_entry = IsrTable[i][j].ListHead.Flink;
- current = CONTAINING_RECORD(current_entry,KINTERRUPT,Entry);
- while (current_entry!=&(IsrTable[i][j].ListHead))
- {
- if (printed == FALSE)
- {
- printed = TRUE;
- DPRINT("For irq %x:\n",i);
- }
- DPRINT(" Isr %x\n",current);
- current_entry = current_entry->Flink;
- current = CONTAINING_RECORD(current_entry,KINTERRUPT,Entry);
- }
- KiReleaseSpinLock(&IsrTable[i][j].Lock);
- }
+ for (j=0; j < KeNumberProcessors; j++)
+ {
+ KiAcquireSpinLock(&IsrTable[i][j].Lock);
+
+ current_entry = IsrTable[i][j].ListHead.Flink;
+ current = CONTAINING_RECORD(current_entry,KINTERRUPT,InterruptListEntry);
+ while (current_entry!=&(IsrTable[i][j].ListHead))
+ {
+ if (printed == FALSE)
+ {
+ printed = TRUE;
+ DPRINT("For irq %x:\n",i);
+ }
+ DPRINT(" Isr %x\n",current);
+ current_entry = current_entry->Flink;
+ current = CONTAINING_RECORD(current_entry,KINTERRUPT,InterruptListEntry);
+ }
+ KiReleaseSpinLock(&IsrTable[i][j].Lock);
+ }
KeLowerIrql(oldlvl);
}
}
/*
* @implemented
*/
-BOOLEAN STDCALL
+BOOLEAN
+STDCALL
KeConnectInterrupt(PKINTERRUPT InterruptObject)
{
KIRQL oldlvl,synch_oldlvl;
Vector -= IRQ_BASE;
- ASSERT (InterruptObject->ProcessorNumber < KeNumberProcessors);
+ ASSERT (InterruptObject->Number < KeNumberProcessors);
- KeSetSystemAffinityThread(1 << InterruptObject->ProcessorNumber);
+ KeSetSystemAffinityThread(1 << InterruptObject->Number);
- CurrentIsr = &IsrTable[Vector][(ULONG)InterruptObject->ProcessorNumber];
+ CurrentIsr = &IsrTable[Vector][(ULONG)InterruptObject->Number];
KeRaiseIrql(VECTOR2IRQL(Vector + IRQ_BASE),&oldlvl);
KiAcquireSpinLock(&CurrentIsr->Lock);
*/
if (!IsListEmpty(&CurrentIsr->ListHead))
{
- ListHead = CONTAINING_RECORD(CurrentIsr->ListHead.Flink,KINTERRUPT,Entry);
- if (InterruptObject->Shareable == FALSE || ListHead->Shareable==FALSE)
+ ListHead = CONTAINING_RECORD(CurrentIsr->ListHead.Flink,KINTERRUPT,InterruptListEntry);
+ if (InterruptObject->ShareVector == FALSE || ListHead->ShareVector==FALSE)
{
KiReleaseSpinLock(&CurrentIsr->Lock);
KeLowerIrql(oldlvl);
DPRINT("%x %x\n",CurrentIsr->ListHead.Flink, CurrentIsr->ListHead.Blink);
- Result = HalEnableSystemInterrupt(Vector + IRQ_BASE, InterruptObject->Irql, InterruptObject->InterruptMode);
+ Result = HalEnableSystemInterrupt(Vector + IRQ_BASE, InterruptObject->Irql, InterruptObject->Mode);
if (Result)
{
- InsertTailList(&CurrentIsr->ListHead,&InterruptObject->Entry);
- DPRINT("%x %x\n",InterruptObject->Entry.Flink, InterruptObject->Entry.Blink);
+ InsertTailList(&CurrentIsr->ListHead,&InterruptObject->InterruptListEntry);
+ DPRINT("%x %x\n",InterruptObject->InterruptListEntry.Flink, InterruptObject->InterruptListEntry.Blink);
}
+ InterruptObject->Connected = TRUE;
KeReleaseInterruptSpinLock(InterruptObject, synch_oldlvl);
/*
*/
KiReleaseSpinLock(&CurrentIsr->Lock);
KeLowerIrql(oldlvl);
-
+
KeDumpIrqList();
KeRevertToUserAffinityThread();
return Result;
}
-
/*
* @implemented
- */
-VOID STDCALL
-KeDisconnectInterrupt(PKINTERRUPT InterruptObject)
-/*
+ *
* FUNCTION: Releases a drivers isr
* ARGUMENTS:
* InterruptObject = isr to release
*/
+BOOLEAN
+STDCALL
+KeDisconnectInterrupt(PKINTERRUPT InterruptObject)
{
- KIRQL oldlvl,synch_oldlvl;
- PISR_TABLE CurrentIsr;
+ KIRQL oldlvl,synch_oldlvl;
+ PISR_TABLE CurrentIsr;
+ BOOLEAN State;
- DPRINT("KeDisconnectInterrupt\n");
-
- ASSERT (InterruptObject->ProcessorNumber < KeNumberProcessors);
+ DPRINT1("KeDisconnectInterrupt\n");
+ ASSERT (InterruptObject->Number < KeNumberProcessors);
- KeSetSystemAffinityThread(1 << InterruptObject->ProcessorNumber);
+ /* Set the affinity */
+ KeSetSystemAffinityThread(1 << InterruptObject->Number);
- CurrentIsr = &IsrTable[InterruptObject->Vector - IRQ_BASE][(ULONG)InterruptObject->ProcessorNumber];
+ /* Get the ISR Tabe */
+ CurrentIsr = &IsrTable[InterruptObject->Vector - IRQ_BASE]
+ [(ULONG)InterruptObject->Number];
- KeRaiseIrql(VECTOR2IRQL(InterruptObject->Vector),&oldlvl);
- KiAcquireSpinLock(&CurrentIsr->Lock);
+ /* Raise IRQL to required level and lock table */
+ KeRaiseIrql(VECTOR2IRQL(InterruptObject->Vector),&oldlvl);
+ KiAcquireSpinLock(&CurrentIsr->Lock);
- synch_oldlvl = KeAcquireInterruptSpinLock(InterruptObject);
+ /* Check if it's actually connected */
+ if ((State = InterruptObject->Connected))
+ {
+ /* Lock the Interrupt */
+ synch_oldlvl = KeAcquireInterruptSpinLock(InterruptObject);
- RemoveEntryList(&InterruptObject->Entry);
- if (IsListEmpty(&CurrentIsr->ListHead))
- {
- HalDisableSystemInterrupt(InterruptObject->Vector, 0);
- }
- KeReleaseInterruptSpinLock(InterruptObject, synch_oldlvl);
+ /* Remove this one, and check if all are gone */
+ RemoveEntryList(&InterruptObject->InterruptListEntry);
+ if (IsListEmpty(&CurrentIsr->ListHead))
+ {
+ /* Completely Disable the Interrupt */
+ HalDisableSystemInterrupt(InterruptObject->Vector, InterruptObject->Irql);
+ }
+
+ /* Disconnect it */
+ InterruptObject->Connected = FALSE;
+
+ /* Release the interrupt lock */
+ KeReleaseInterruptSpinLock(InterruptObject, synch_oldlvl);
+ }
+ /* Release the table spinlock */
+ KiReleaseSpinLock(&CurrentIsr->Lock);
+ KeLowerIrql(oldlvl);
- /*
- * Release the table spinlock
- */
- KiReleaseSpinLock(&CurrentIsr->Lock);
- KeLowerIrql(oldlvl);
-
- KeRevertToUserAffinityThread();
+ /* Go back to default affinity */
+ KeRevertToUserAffinityThread();
+
+ /* Return Old Interrupt State */
+ return State;
}
-
/*
* @implemented
*/
VOID
STDCALL
-KeInitializeInterrupt(PKINTERRUPT InterruptObject,
- PKSERVICE_ROUTINE ServiceRoutine,
- PVOID ServiceContext,
- PKSPIN_LOCK SpinLock,
- ULONG Vector,
- KIRQL Irql,
- KIRQL SynchronizeIrql,
- KINTERRUPT_MODE InterruptMode,
- BOOLEAN ShareVector,
- CHAR ProcessorNumber,
- BOOLEAN FloatingSave)
+KeInitializeInterrupt(PKINTERRUPT Interrupt,
+ PKSERVICE_ROUTINE ServiceRoutine,
+ PVOID ServiceContext,
+ PKSPIN_LOCK SpinLock,
+ ULONG Vector,
+ KIRQL Irql,
+ KIRQL SynchronizeIrql,
+ KINTERRUPT_MODE InterruptMode,
+ BOOLEAN ShareVector,
+ CHAR ProcessorNumber,
+ BOOLEAN FloatingSave)
{
- InterruptObject->ServiceRoutine = ServiceRoutine;
- InterruptObject->ServiceContext = ServiceContext;
- InterruptObject->ActualLock = SpinLock;
- InterruptObject->Vector = Vector;
- InterruptObject->Irql = Irql;
- InterruptObject->SynchLevel = SynchronizeIrql;
- InterruptObject->InterruptMode = InterruptMode;
- InterruptObject->Shareable = ShareVector;
- InterruptObject->ProcessorNumber = ProcessorNumber;
- InterruptObject->FloatingSave = FloatingSave;
+ /* Set the Interrupt Header */
+ Interrupt->Type = InterruptObject;
+ Interrupt->Size = sizeof(KINTERRUPT);
+
+ /* Check if we got a spinlock */
+ if (SpinLock)
+ {
+ Interrupt->ActualLock = SpinLock;
+ }
+ else
+ {
+ /* This means we'll be usin the built-in one */
+ KeInitializeSpinLock(&Interrupt->SpinLock);
+ Interrupt->ActualLock = &Interrupt->SpinLock;
+ }
+
+ /* Set the other settings */
+ Interrupt->ServiceRoutine = ServiceRoutine;
+ Interrupt->ServiceContext = ServiceContext;
+ Interrupt->Vector = Vector;
+ Interrupt->Irql = Irql;
+ Interrupt->SynchronizeIrql = SynchronizeIrql;
+ Interrupt->Mode = InterruptMode;
+ Interrupt->ShareVector = ShareVector;
+ Interrupt->Number = ProcessorNumber;
+ Interrupt->FloatingSave = FloatingSave;
+
+ /* Disconnect it at first */
+ Interrupt->Connected = FALSE;
}
VOID KePrintInterruptStatistic(VOID)
{
- ULONG i, j;
+ LONG i, j;
for (j = 0; j < KeNumberProcessors; j++)
{
for (i = 0; i < NR_IRQS; i++)
{
if (IsrTable[i][j].Count)
- {
- DPRINT1(" Irq %x(%d): %d\n", i, VECTOR2IRQ(i + IRQ_BASE), IsrTable[i][j].Count);
- }
+ {
+ DPRINT1(" Irq %x(%d): %d\n", i, VECTOR2IRQ(i + IRQ_BASE), IsrTable[i][j].Count);
+ }
}
}
}
-
/* EOF */