]> git.saurik.com Git - apple/xnu.git/blobdiff - iokit/Kernel/IOFilterInterruptEventSource.cpp
xnu-4570.51.1.tar.gz
[apple/xnu.git] / iokit / Kernel / IOFilterInterruptEventSource.cpp
index 944e84ced357c79514e52884297c68476ff427db..c6f79e91dda530fac08cb7d1119d2552a8eae18d 100644 (file)
@@ -31,6 +31,7 @@
 #include <IOKit/IOKitDebug.h>
 #include <IOKit/IOTimeStamp.h>
 #include <IOKit/IOWorkLoop.h>
+#include <IOKit/IOInterruptAccountingPrivate.h>
 
 #if IOKITSTATS
 
@@ -130,12 +131,12 @@ void IOFilterInterruptEventSource::signalInterrupt()
     producerCount++;
        
        if (trace)
-           IOTimeStampStartConstant(IODBG_INTES(IOINTES_SEMA), (uintptr_t) this, (uintptr_t) owner);
+           IOTimeStampStartConstant(IODBG_INTES(IOINTES_SEMA), VM_KERNEL_ADDRHIDE(this), VM_KERNEL_ADDRHIDE(owner));
     
     signalWorkAvailable();
        
        if (trace)
-           IOTimeStampEndConstant(IODBG_INTES(IOINTES_SEMA), (uintptr_t) this, (uintptr_t) owner);
+           IOTimeStampEndConstant(IODBG_INTES(IOINTES_SEMA), VM_KERNEL_ADDRHIDE(this), VM_KERNEL_ADDRHIDE(owner));
        
 }
 
@@ -153,18 +154,38 @@ void IOFilterInterruptEventSource::normalInterruptOccurred
     (void */*refcon*/, IOService */*prov*/, int /*source*/)
 {
     bool       filterRes;
+    uint64_t   startTime = 0;
+    uint64_t   endTime = 0;
        bool    trace = (gIOKitTrace & kIOTraceIntEventSource) ? true : false;
        
        if (trace)
                IOTimeStampStartConstant(IODBG_INTES(IOINTES_FILTER),
-                                                                (uintptr_t) filterAction, (uintptr_t) owner, (uintptr_t) this, (uintptr_t) workLoop);
+                                        VM_KERNEL_UNSLIDE(filterAction), VM_KERNEL_ADDRHIDE(owner), VM_KERNEL_ADDRHIDE(this), VM_KERNEL_ADDRHIDE(workLoop));
+
+    if (IOInterruptEventSource::reserved->statistics) {
+        if (IA_GET_STATISTIC_ENABLED(kInterruptAccountingFirstLevelTimeIndex)) {
+            startTime = mach_absolute_time();
+        }
+    }
     
     // Call the filter.
     filterRes = (*filterAction)(owner, this);
+
+    if (IOInterruptEventSource::reserved->statistics) {
+        if (IA_GET_STATISTIC_ENABLED(kInterruptAccountingFirstLevelCountIndex)) {
+            IA_ADD_VALUE(&IOInterruptEventSource::reserved->statistics->interruptStatistics[kInterruptAccountingFirstLevelCountIndex], 1);
+        }
+
+        if (IA_GET_STATISTIC_ENABLED(kInterruptAccountingFirstLevelTimeIndex)) {
+            endTime = mach_absolute_time();
+            IA_ADD_VALUE(&IOInterruptEventSource::reserved->statistics->interruptStatistics[kInterruptAccountingFirstLevelTimeIndex], endTime - startTime);
+        }
+    }
        
        if (trace)
                IOTimeStampEndConstant(IODBG_INTES(IOINTES_FILTER),
-                                                          (uintptr_t) filterAction, (uintptr_t) owner, (uintptr_t) this, (uintptr_t) workLoop);
+                               VM_KERNEL_ADDRHIDE(filterAction), VM_KERNEL_ADDRHIDE(owner),
+                               VM_KERNEL_ADDRHIDE(this), VM_KERNEL_ADDRHIDE(workLoop));
        
     if (filterRes)
         signalInterrupt();
@@ -174,18 +195,37 @@ void IOFilterInterruptEventSource::disableInterruptOccurred
     (void */*refcon*/, IOService *prov, int source)
 {
     bool       filterRes;
+    uint64_t   startTime = 0;
+    uint64_t   endTime = 0;
        bool    trace = (gIOKitTrace & kIOTraceIntEventSource) ? true : false;
        
        if (trace)
                IOTimeStampStartConstant(IODBG_INTES(IOINTES_FILTER),
-                                                                (uintptr_t) filterAction, (uintptr_t) owner, (uintptr_t) this, (uintptr_t) workLoop);
+                                        VM_KERNEL_UNSLIDE(filterAction), VM_KERNEL_ADDRHIDE(owner), VM_KERNEL_ADDRHIDE(this), VM_KERNEL_ADDRHIDE(workLoop));
+
+    if (IOInterruptEventSource::reserved->statistics) {
+        if (IA_GET_STATISTIC_ENABLED(kInterruptAccountingFirstLevelTimeIndex)) {
+            startTime = mach_absolute_time();
+        }
+    }
     
     // Call the filter.
     filterRes = (*filterAction)(owner, this);
-       
+
+    if (IOInterruptEventSource::reserved->statistics) {
+        if (IA_GET_STATISTIC_ENABLED(kInterruptAccountingFirstLevelCountIndex)) {
+            IA_ADD_VALUE(&IOInterruptEventSource::reserved->statistics->interruptStatistics[kInterruptAccountingFirstLevelCountIndex], 1);
+        }
+
+        if (IA_GET_STATISTIC_ENABLED(kInterruptAccountingFirstLevelTimeIndex)) {
+            endTime = mach_absolute_time();
+            IA_ADD_VALUE(&IOInterruptEventSource::reserved->statistics->interruptStatistics[kInterruptAccountingFirstLevelTimeIndex], endTime - startTime);
+        }
+    }
+
        if (trace)
                IOTimeStampEndConstant(IODBG_INTES(IOINTES_FILTER),
-                                                          (uintptr_t) filterAction, (uintptr_t) owner, (uintptr_t) this, (uintptr_t) workLoop);
+                                      VM_KERNEL_UNSLIDE(filterAction), VM_KERNEL_ADDRHIDE(owner), VM_KERNEL_ADDRHIDE(this), VM_KERNEL_ADDRHIDE(workLoop));
        
     if (filterRes) {
         prov->disableInterrupt(source);        /* disable the interrupt */