X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/cb3231590a3c94ab4375e2228bd5e86b0cf1ad7e..c3c9b80d004dbbfdf763edeb97968c6997e3b45b:/iokit/Kernel/IOInterruptController.cpp diff --git a/iokit/Kernel/IOInterruptController.cpp b/iokit/Kernel/IOInterruptController.cpp index 18441e5ce..6dc591963 100644 --- a/iokit/Kernel/IOInterruptController.cpp +++ b/iokit/Kernel/IOInterruptController.cpp @@ -43,9 +43,9 @@ OSDefineMetaClassAndAbstractStructors(IOInterruptController, IOService); -OSMetaClassDefineReservedUnused(IOInterruptController, 0); -OSMetaClassDefineReservedUnused(IOInterruptController, 1); -OSMetaClassDefineReservedUnused(IOInterruptController, 2); +OSMetaClassDefineReservedUsedX86(IOInterruptController, 0); +OSMetaClassDefineReservedUsedX86(IOInterruptController, 1); +OSMetaClassDefineReservedUsedX86(IOInterruptController, 2); OSMetaClassDefineReservedUnused(IOInterruptController, 3); OSMetaClassDefineReservedUnused(IOInterruptController, 4); OSMetaClassDefineReservedUnused(IOInterruptController, 5); @@ -318,6 +318,14 @@ IOInterruptController::enableInterrupt(IOService *nub, int source) if (vector->interruptDisabledHard) { vector->interruptDisabledHard = 0; + // A DSB ISH on ARM is needed to make sure the vector data are + // properly initialized before the MMIO enabling the interrupts + // in hardware. OSMemoryBarrier(), which maps to DMB, is not + // sufficient here as the CPUs are not consumers of the device + // write. Hence, the DMB does not guarantee the CPUs won't see an + // interrupt before it initalizes the vector data properly. + OSSynchronizeIO(); + enableVector(vectorNumber, vector); } } @@ -423,6 +431,21 @@ IOInterruptController::causeVector(IOInterruptVectorNumber /*vectorNumber*/, { } +void +IOInterruptController::setCPUInterruptProperties(IOService */*service*/) +{ +} + +void +IOInterruptController::sendIPI(unsigned int /*cpu_id*/, bool /*deferred*/) +{ +} + +void +IOInterruptController::cancelDeferredIPI(unsigned int /*cpu_id*/) +{ +} + void IOInterruptController::timeStampSpuriousInterrupt(void) { @@ -456,11 +479,17 @@ IOInterruptController::timeStampInterruptHandlerInternal(bool isStart, IOInterru if (isStart) { +#if INTERRUPT_MASKED_DEBUG + ml_irq_debug_start((uintptr_t)vector->handler, (uintptr_t)vector); +#endif IOTimeStampStartConstant(IODBG_INTC(IOINTC_HANDLER), (uintptr_t)vectorNumber, (uintptr_t)unslidHandler, (uintptr_t)unslidTarget, (uintptr_t)providerID); } else { IOTimeStampEndConstant(IODBG_INTC(IOINTC_HANDLER), (uintptr_t)vectorNumber, (uintptr_t)unslidHandler, (uintptr_t)unslidTarget, (uintptr_t)providerID); +#if INTERRUPT_MASKED_DEBUG + ml_irq_debug_end(); +#endif } }