// Check if the interrupt source can/should be shared.
canBeShared = vectorCanBeShared(vectorNumber, vector);
IODTGetInterruptOptions(nub, source, &options);
+#if defined(__i386__) || defined(__x86_64__)
+ int interruptType;
+ if (OSDynamicCast(IOPlatformDevice, getProvider()) &&
+ (getInterruptType(nub, source, &interruptType) == kIOReturnSuccess) &&
+ (kIOInterruptTypeLevel & interruptType))
+ {
+ options |= kIODTInterruptShared;
+ }
+#endif
shouldBeShared = canBeShared && (options & kIODTInterruptShared);
wasAlreadyRegisterd = vector->interruptRegistered;
_numInterruptSources = 1;
// Set up the IOInterruptSource to point at this.
+ parentController->retain();
+ parentSource->retain();
_interruptSources[0].interruptController = parentController;
_interruptSources[0].vectorData = parentSource;
IOInterruptAction IOSharedInterruptController::getInterruptHandlerAddress(void)
{
- return (IOInterruptAction)&IOSharedInterruptController::handleInterrupt;
+ return OSMemberFunctionCast(IOInterruptAction,
+ this, &IOSharedInterruptController::handleInterrupt);
}
IOReturn IOSharedInterruptController::handleInterrupt(void * /*refCon*/,