X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/99c3a10404e5d1ef94397ab4df5a8b74711fc4d3..04b8595b18b1b41ac7a206e4b3d51a635f8413d7:/iokit/Kernel/IOMapper.cpp?ds=inline diff --git a/iokit/Kernel/IOMapper.cpp b/iokit/Kernel/IOMapper.cpp index 6abcb5d1a..294e13822 100644 --- a/iokit/Kernel/IOMapper.cpp +++ b/iokit/Kernel/IOMapper.cpp @@ -142,28 +142,47 @@ void IOMapper::waitForSystemMapper() IOMapper * IOMapper::copyMapperForDevice(IOService * device) { + return copyMapperForDeviceWithIndex(device, 0); +} + +IOMapper * IOMapper::copyMapperForDeviceWithIndex(IOService * device, unsigned int index) +{ + OSData *data; OSObject * obj; - IOMapper * mapper; + IOMapper * mapper = NULL; OSDictionary * matching; obj = device->copyProperty("iommu-parent"); if (!obj) - return (NULL); + return (NULL); if ((mapper = OSDynamicCast(IOMapper, obj))) - return (mapper); + return (mapper); - matching = IOService::propertyMatching(gIOMapperIDKey, obj); - if (matching) + if ((data = OSDynamicCast(OSData, obj))) { - mapper = OSDynamicCast(IOMapper, IOService::waitForMatchingService(matching)); - matching->release(); + if (index >= data->getLength() / sizeof(UInt32)) + goto done; + + data = OSData::withBytesNoCopy((UInt32 *)data->getBytesNoCopy() + index, sizeof(UInt32)); + if (!data) + goto done; + + matching = IOService::propertyMatching(gIOMapperIDKey, data); + data->release(); } - if (mapper) - device->setProperty("iommu-parent", mapper); else - obj->release(); - + matching = IOService::propertyMatching(gIOMapperIDKey, obj); + + if (matching) + { + mapper = OSDynamicCast(IOMapper, IOService::waitForMatchingService(matching)); + matching->release(); + } + +done: + if (obj) + obj->release(); return (mapper); }