+IOReturn IODTGetInterruptOptions( IORegistryEntry * regEntry, int source, IOOptionBits * options )
+{
+ OSArray * controllers;
+ OSArray * specifiers;
+ OSArray * shared;
+ OSObject * spec;
+ OSObject * oneSpec;
+
+ *options = 0;
+
+ controllers = OSDynamicCast(OSArray, regEntry->getProperty(gIOInterruptControllersKey));
+ specifiers = OSDynamicCast(OSArray, regEntry->getProperty(gIOInterruptSpecifiersKey));
+
+ if( !controllers || !specifiers)
+ return (kIOReturnNoInterrupt);
+
+ shared = (OSArray *) gIODTSharedInterrupts->getObject(
+ (const OSSymbol *) controllers->getObject(source) );
+ if (!shared)
+ return (kIOReturnSuccess);
+
+ spec = specifiers->getObject(source);
+ if (!spec)
+ return (kIOReturnNoInterrupt);
+
+ for (unsigned int i = 0;
+ (oneSpec = shared->getObject(i))
+ && (!oneSpec->isEqualTo(spec));
+ i++ ) {}
+
+ if (oneSpec)
+ *options = kIODTInterruptShared;
+
+ return (kIOReturnSuccess);
+}
+
+static bool IODTMapInterruptsSharing( IORegistryEntry * regEntry, OSDictionary * allInts )