Loading...
--- xnu/xnu-2050.22.13/iokit/Kernel/IOInterruptController.cpp
+++ xnu/xnu-1504.15.3/iokit/Kernel/IOInterruptController.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998-2010 Apple Inc. All rights reserved.
+ * Copyright (c) 1998-2011 Apple Inc. All rights reserved.
*
* @APPLE_OSREFERENCE_LICENSE_HEADER_START@
*
@@ -25,6 +25,11 @@
*
* @APPLE_OSREFERENCE_LICENSE_HEADER_END@
*/
+
+
+#if __ppc__
+#include <ppc/proc_reg.h>
+#endif
#include <IOKit/IOLib.h>
#include <IOKit/IOService.h>
@@ -290,10 +295,17 @@
if (vector->interruptDisabledSoft) {
vector->interruptDisabledSoft = 0;
+#if __ppc__
+ sync();
+ isync();
+#endif
if (!getPlatform()->atInterruptLevel()) {
while (vector->interruptActive)
{}
+#if __ppc__
+ isync();
+#endif
}
if (vector->interruptDisabledHard) {
vector->interruptDisabledHard = 0;
@@ -318,10 +330,17 @@
vector = &vectors[vectorNumber];
vector->interruptDisabledSoft = 1;
+#if __ppc__
+ sync();
+ isync();
+#endif
if (!getPlatform()->atInterruptLevel()) {
while (vector->interruptActive)
{}
+#if __ppc__
+ isync();
+#endif
}
return kIOReturnSuccess;
@@ -644,6 +663,10 @@
interruptState = IOSimpleLockLockDisableInterrupt(controllerLock);
if (!vector->interruptDisabledSoft) {
vector->interruptDisabledSoft = 1;
+#if __ppc__
+ sync();
+ isync();
+#endif
vectorsEnabled--;
}
IOSimpleLockUnlockEnableInterrupt(controllerLock, interruptState);
@@ -651,6 +674,9 @@
if (!getPlatform()->atInterruptLevel()) {
while (vector->interruptActive)
{}
+#if __ppc__
+ isync();
+#endif
}
return kIOReturnSuccess;
@@ -673,26 +699,48 @@
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 __ppc__
+ sync();
+ isync();
+#endif
+ if (!vector->interruptDisabledSoft) {
+#if __ppc__
+ isync();
+#endif
+
+ // Call the handler if it exists.
+ if (vector->interruptRegistered) {
+
+ bool trace = (gIOKitTrace & kIOTraceInterrupts) ? true : false;
+ bool timeHandler = gIOInterruptThresholdNS ? true : false;
+ uint64_t startTime = 0;
+ uint64_t endTime = 0;
if (trace)
IOTimeStampStartConstant(IODBG_INTC(IOINTC_HANDLER),
(uintptr_t) vectorNumber, (uintptr_t) vector->handler, (uintptr_t)vector->target);
+ if (timeHandler)
+ startTime = mach_absolute_time();
+
// Call handler.
vector->handler(vector->target, vector->refCon, vector->nub, vector->source);
+
+ if (timeHandler)
+ {
+ endTime = mach_absolute_time();
+ if ((endTime - startTime) > gIOInterruptThresholdNS)
+ panic("IOSIC::handleInterrupt: interrupt exceeded threshold, handlerTime = %qd, vectorNumber = %d, handler = %p, target = %p\n",
+ endTime - startTime, (int)vectorNumber, vector->handler, vector->target);
+ }
if (trace)
IOTimeStampEndConstant(IODBG_INTC(IOINTC_HANDLER),
(uintptr_t) vectorNumber, (uintptr_t) vector->handler, (uintptr_t)vector->target);
- }
- }
+ }
+
+ }
vector->interruptActive = 0;
}