IOReturn IOInterruptController::enableInterrupt(IOService *nub, int source) { IOInterruptSource *interruptSources; IOInterruptVectorNumber vectorNumber; IOInterruptVector *vector; OSData *vectorData; interruptSources = nub->_interruptSources; vectorData = interruptSources[source].vectorData; vectorNumber = *(IOInterruptVectorNumber *)vectorData->getBytesNoCopy(); vector = &vectors[vectorNumber]; if (vector->interruptDisabledSoft) { vector->interruptDisabledSoft = 0; #if !defined(__i386__) && !defined(__x86_64__) OSMemoryBarrier(); #endif if (!getPlatform()->atInterruptLevel()) { while (vector->interruptActive) {} } if (vector->interruptDisabledHard) { vector->interruptDisabledHard = 0; enableVector(vectorNumber, vector); } } return kIOReturnSuccess; }
IOReturn IOInterruptController::enableInterrupt(IOService *nub, int source) { IOInterruptSource *interruptSources; long vectorNumber; IOInterruptVector *vector; OSData *vectorData; interruptSources = nub->_interruptSources; vectorData = interruptSources[source].vectorData; vectorNumber = *(long *)vectorData->getBytesNoCopy(); vector = &vectors[vectorNumber]; if (vector->interruptDisabledSoft) { vector->interruptDisabledSoft = 0; #if __ppc__ sync(); isync(); #endif if (!getPlatform()->atInterruptLevel()) { while (vector->interruptActive); #if __ppc__ isync(); #endif } if (vector->interruptDisabledHard) { vector->interruptDisabledHard = 0; enableVector(vectorNumber, vector); } } return kIOReturnSuccess; }