void IOInterruptController::timeStampInterruptHandlerInternal(bool isStart, IOInterruptVectorNumber vectorNumber, IOInterruptVector *vector) { uint64_t providerID = 0; vm_offset_t unslidHandler = 0; vm_offset_t unslidTarget = 0; IOService * provider = getProvider(); if (provider) { providerID = provider->getRegistryEntryID(); } if (vector) { unslidHandler = VM_KERNEL_UNSLIDE((vm_offset_t)vector->handler); unslidTarget = VM_KERNEL_UNSLIDE_OR_PERM((vm_offset_t)vector->target); } if (isStart) { 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); } }
IOReturn IOSharedInterruptController::handleInterrupt(void * /*refCon*/, IOService * nub, int /*source*/) { IOInterruptVectorNumber vectorNumber; IOInterruptVector *vector; for (vectorNumber = 0; vectorNumber < numVectors; vectorNumber++) { vector = &vectors[vectorNumber]; vector->interruptActive = 1; if (!vector->interruptDisabledSoft) { // Call the handler if it exists. if (vector->interruptRegistered) { bool trace = (gIOKitTrace & kIOTraceInterrupts) ? true : false; if (trace) IOTimeStampStartConstant(IODBG_INTC(IOINTC_HANDLER), (uintptr_t) vectorNumber, (uintptr_t) vector->handler, (uintptr_t)vector->target); // Call handler. vector->handler(vector->target, vector->refCon, vector->nub, vector->source); if (trace) IOTimeStampEndConstant(IODBG_INTC(IOINTC_HANDLER), (uintptr_t) vectorNumber, (uintptr_t) vector->handler, (uintptr_t)vector->target); } } vector->interruptActive = 0; } // if any of the vectors are dissabled, then dissable this controller. IOSimpleLockLock(controllerLock); if (vectorsEnabled != vectorsRegistered) { nub->disableInterrupt(0); controllerDisabled = 1; } IOSimpleLockUnlock(controllerLock); return kIOReturnSuccess; }
void IOInterruptController::timeStampSpuriousInterrupt(void) { uint64_t providerID = 0; IOService * provider = getProvider(); if (provider) { providerID = provider->getRegistryEntryID(); } IOTimeStampConstant(IODBG_INTC(IOINTC_SPURIOUS), providerID); }