Home | Info | Community | Development | myReactOS | Contact Us
Definition at line 541 of file ppc_irq.c.
Referenced by IoConnectInterrupt().
{ KIRQL oldlvl,synch_oldlvl; PKINTERRUPT ListHead; ULONG Vector; PISR_TABLE CurrentIsr; BOOLEAN Result; DPRINT("KeConnectInterrupt()\n"); Vector = InterruptObject->Vector; if (Vector < 0 || Vector >= NR_TRAPS) return FALSE; ASSERT (InterruptObject->Number < KeNumberProcessors); KeSetSystemAffinityThread(1 << InterruptObject->Number); CurrentIsr = &IsrTable[Vector][(ULONG)InterruptObject->Number]; KeRaiseIrql(Vector,&oldlvl); KiAcquireSpinLock(&CurrentIsr->Lock); /* * Check if the vector is already in use that we can share it */ if (!IsListEmpty(&CurrentIsr->ListHead)) { ListHead = CONTAINING_RECORD(CurrentIsr->ListHead.Flink,KINTERRUPT,InterruptListEntry); if (InterruptObject->ShareVector == FALSE || ListHead->ShareVector==FALSE) { KiReleaseSpinLock(&CurrentIsr->Lock); KeLowerIrql(oldlvl); KeRevertToUserAffinityThread(); return FALSE; } } synch_oldlvl = KeAcquireInterruptSpinLock(InterruptObject); DPRINT("%x %x\n",CurrentIsr->ListHead.Flink, CurrentIsr->ListHead.Blink); Result = HalEnableSystemInterrupt(Vector, InterruptObject->Irql, InterruptObject->Mode); if (Result) { InsertTailList(&CurrentIsr->ListHead,&InterruptObject->InterruptListEntry); DPRINT("%x %x\n",InterruptObject->InterruptListEntry.Flink, InterruptObject->InterruptListEntry.Blink); } InterruptObject->Connected = TRUE; KeReleaseInterruptSpinLock(InterruptObject, synch_oldlvl); /* * Release the table spinlock */ KiReleaseSpinLock(&CurrentIsr->Lock); KeLowerIrql(oldlvl); KeDumpIrqList(); KeRevertToUserAffinityThread(); return Result; }