X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/0a7de7458d150b5d4dffc935ba399be265ef0a1a..c3c9b80d004dbbfdf763edeb97968c6997e3b45b:/iokit/Kernel/IOInterruptEventSource.cpp diff --git a/iokit/Kernel/IOInterruptEventSource.cpp b/iokit/Kernel/IOInterruptEventSource.cpp index 19d5d597d..a720e9a30 100644 --- a/iokit/Kernel/IOInterruptEventSource.cpp +++ b/iokit/Kernel/IOInterruptEventSource.cpp @@ -26,6 +26,9 @@ * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ +#define IOKIT_ENABLE_SHARED_PTR + +#include #include #include #include @@ -34,6 +37,7 @@ #include #include #include +#include #if IOKITSTATS @@ -208,29 +212,28 @@ IOInterruptEventSource::unregisterInterruptHandler(IOService *inProvider, } -IOInterruptEventSource * +OSSharedPtr IOInterruptEventSource::interruptEventSource(OSObject *inOwner, Action inAction, IOService *inProvider, int inIntIndex) { - IOInterruptEventSource *me = new IOInterruptEventSource; + OSSharedPtr me = OSMakeShared(); if (me && !me->init(inOwner, inAction, inProvider, inIntIndex)) { - me->release(); - return 0; + return nullptr; } return me; } -IOInterruptEventSource * +OSSharedPtr IOInterruptEventSource::interruptEventSource(OSObject *inOwner, IOService *inProvider, int inIntIndex, ActionBlock inAction) { - IOInterruptEventSource * ies; + OSSharedPtr ies; ies = IOInterruptEventSource::interruptEventSource(inOwner, (Action) NULL, inProvider, inIntIndex); if (ies) { ies->setActionBlock((IOEventSource::ActionBlock) inAction); @@ -331,16 +334,24 @@ IOInterruptEventSource::checkForWork() uint64_t endCPUTime = 0; unsigned int cacheProdCount = producerCount; int numInts = cacheProdCount - consumerCount; - IOInterruptEventAction intAction = (IOInterruptEventAction) action; + IOEventSource::Action intAction = action; ActionBlock intActionBlock = (ActionBlock) actionBlock; + void *address; bool trace = (gIOKitTrace & kIOTraceIntEventSource) ? true : false; + if (kActionBlock & flags) { + address = ptrauth_nop_cast(void *, _Block_get_invoke_fn((struct Block_layout *)intActionBlock)); + } else { + address = ptrauth_nop_cast(void *, intAction); + } + IOStatisticsCheckForWork(); if (numInts > 0) { if (trace) { IOTimeStampStartConstant(IODBG_INTES(IOINTES_ACTION), - VM_KERNEL_ADDRHIDE(intAction), VM_KERNEL_ADDRHIDE(owner), + VM_KERNEL_ADDRHIDE(address), + VM_KERNEL_ADDRHIDE(owner), VM_KERNEL_ADDRHIDE(this), VM_KERNEL_ADDRHIDE(workLoop)); } @@ -358,7 +369,7 @@ IOInterruptEventSource::checkForWork() if (kActionBlock & flags) { (intActionBlock)(this, numInts); } else { - (*intAction)(owner, this, numInts); + ((IOInterruptEventAction)intAction)(owner, this, numInts); } if (reserved->statistics) { @@ -379,7 +390,8 @@ IOInterruptEventSource::checkForWork() if (trace) { IOTimeStampEndConstant(IODBG_INTES(IOINTES_ACTION), - VM_KERNEL_ADDRHIDE(intAction), VM_KERNEL_ADDRHIDE(owner), + VM_KERNEL_ADDRHIDE(address), + VM_KERNEL_ADDRHIDE(owner), VM_KERNEL_ADDRHIDE(this), VM_KERNEL_ADDRHIDE(workLoop)); } @@ -390,7 +402,8 @@ IOInterruptEventSource::checkForWork() } else if (numInts < 0) { if (trace) { IOTimeStampStartConstant(IODBG_INTES(IOINTES_ACTION), - VM_KERNEL_ADDRHIDE(intAction), VM_KERNEL_ADDRHIDE(owner), + VM_KERNEL_ADDRHIDE(address), + VM_KERNEL_ADDRHIDE(owner), VM_KERNEL_ADDRHIDE(this), VM_KERNEL_ADDRHIDE(workLoop)); } @@ -408,7 +421,7 @@ IOInterruptEventSource::checkForWork() if (kActionBlock & flags) { (intActionBlock)(this, numInts); } else { - (*intAction)(owner, this, numInts); + ((IOInterruptEventAction)intAction)(owner, this, numInts); } if (reserved->statistics) { @@ -429,7 +442,8 @@ IOInterruptEventSource::checkForWork() if (trace) { IOTimeStampEndConstant(IODBG_INTES(IOINTES_ACTION), - VM_KERNEL_ADDRHIDE(intAction), VM_KERNEL_ADDRHIDE(owner), + VM_KERNEL_ADDRHIDE(address), + VM_KERNEL_ADDRHIDE(owner), VM_KERNEL_ADDRHIDE(this), VM_KERNEL_ADDRHIDE(workLoop)); } @@ -456,6 +470,9 @@ IOInterruptEventSource::normalInterruptOccurred } if (reserved->statistics) { + if (reserved->statistics->enablePrimaryTimestamp) { + reserved->statistics->primaryTimestamp = mach_absolute_time(); + } if (IA_GET_STATISTIC_ENABLED(kInterruptAccountingFirstLevelCountIndex)) { IA_ADD_VALUE(&reserved->statistics->interruptStatistics[kInterruptAccountingFirstLevelCountIndex], 1); } @@ -484,6 +501,9 @@ IOInterruptEventSource::disableInterruptOccurred } if (reserved->statistics) { + if (reserved->statistics->enablePrimaryTimestamp) { + reserved->statistics->primaryTimestamp = mach_absolute_time(); + } if (IA_GET_STATISTIC_ENABLED(kInterruptAccountingFirstLevelCountIndex)) { IA_ADD_VALUE(&reserved->statistics->interruptStatistics[kInterruptAccountingFirstLevelCountIndex], 1); } @@ -498,12 +518,12 @@ IOInterruptEventSource::disableInterruptOccurred void IOInterruptEventSource::interruptOccurred -(void *refcon, IOService *prov, int source) +(void *_refcon, IOService *prov, int source) { if (autoDisable && prov) { - disableInterruptOccurred(refcon, prov, source); + disableInterruptOccurred(_refcon, prov, source); } else { - normalInterruptOccurred(refcon, prov, source); + normalInterruptOccurred(_refcon, prov, source); } } @@ -513,3 +533,20 @@ IOInterruptEventSource::warmCPU { return ml_interrupt_prewarm(abstime); } + +void +IOInterruptEventSource::enablePrimaryInterruptTimestamp(bool enable) +{ + if (reserved->statistics) { + reserved->statistics->enablePrimaryTimestamp = enable; + } +} + +uint64_t +IOInterruptEventSource::getPrimaryInterruptTimestamp() +{ + if (reserved->statistics && reserved->statistics->enablePrimaryTimestamp) { + return reserved->statistics->primaryTimestamp; + } + return -1ULL; +}