* @APPLE_OSREFERENCE_LICENSE_HEADER_END@
*/
+#define IOKIT_ENABLE_SHARED_PTR
+
+#include <ptrauth.h>
#include <IOKit/IOInterruptEventSource.h>
#include <IOKit/IOKitDebug.h>
#include <IOKit/IOLib.h>
#include <IOKit/IOTimeStamp.h>
#include <IOKit/IOWorkLoop.h>
#include <IOKit/IOInterruptAccountingPrivate.h>
+#include <libkern/Block_private.h>
#if IOKITSTATS
}
-IOInterruptEventSource *
+OSSharedPtr<IOInterruptEventSource>
IOInterruptEventSource::interruptEventSource(OSObject *inOwner,
Action inAction,
IOService *inProvider,
int inIntIndex)
{
- IOInterruptEventSource *me = new IOInterruptEventSource;
+ OSSharedPtr<IOInterruptEventSource> me = OSMakeShared<IOInterruptEventSource>();
if (me && !me->init(inOwner, inAction, inProvider, inIntIndex)) {
- me->release();
- return 0;
+ return nullptr;
}
return me;
}
-IOInterruptEventSource *
+OSSharedPtr<IOInterruptEventSource>
IOInterruptEventSource::interruptEventSource(OSObject *inOwner,
IOService *inProvider,
int inIntIndex,
ActionBlock inAction)
{
- IOInterruptEventSource * ies;
+ OSSharedPtr<IOInterruptEventSource> ies;
ies = IOInterruptEventSource::interruptEventSource(inOwner, (Action) NULL, inProvider, inIntIndex);
if (ies) {
ies->setActionBlock((IOEventSource::ActionBlock) inAction);
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));
}
if (kActionBlock & flags) {
(intActionBlock)(this, numInts);
} else {
- (*intAction)(owner, this, numInts);
+ ((IOInterruptEventAction)intAction)(owner, this, numInts);
}
if (reserved->statistics) {
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));
}
} 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));
}
if (kActionBlock & flags) {
(intActionBlock)(this, numInts);
} else {
- (*intAction)(owner, this, numInts);
+ ((IOInterruptEventAction)intAction)(owner, this, numInts);
}
if (reserved->statistics) {
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));
}
}
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);
}
}
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);
}
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);
}
}
{
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;
+}