X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/b0d623f7f2ae71ed96e60569f61f9a9a27016e80..04b8595b18b1b41ac7a206e4b3d51a635f8413d7:/iokit/Kernel/IOMapper.cpp?ds=inline diff --git a/iokit/Kernel/IOMapper.cpp b/iokit/Kernel/IOMapper.cpp index 171e22ff3..294e13822 100644 --- a/iokit/Kernel/IOMapper.cpp +++ b/iokit/Kernel/IOMapper.cpp @@ -29,8 +29,7 @@ #include #include #include - -#include "IOCopyMapper.h" +#include __BEGIN_DECLS extern ppnum_t pmap_find_phys(pmap_t pmap, addr64_t va); @@ -42,7 +41,7 @@ OSDefineMetaClassAndAbstractStructors(IOMapper, IOService); OSMetaClassDefineReservedUsed(IOMapper, 0); OSMetaClassDefineReservedUsed(IOMapper, 1); OSMetaClassDefineReservedUsed(IOMapper, 2); -OSMetaClassDefineReservedUnused(IOMapper, 3); +OSMetaClassDefineReservedUsed(IOMapper, 3); OSMetaClassDefineReservedUnused(IOMapper, 4); OSMetaClassDefineReservedUnused(IOMapper, 5); OSMetaClassDefineReservedUnused(IOMapper, 6); @@ -134,40 +133,62 @@ void IOMapper::waitForSystemMapper() { sMapperLock.lock(); while ((uintptr_t) IOMapper::gSystem & kWaitMask) + { + OSReportWithBacktrace("waitForSystemMapper"); sMapperLock.sleep(&IOMapper::gSystem); + } sMapperLock.unlock(); } 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); } ppnum_t IOMapper::iovmAllocDMACommand(IODMACommand * command, IOItemCount pageCount) { - return (0); + return (0); } void IOMapper::iovmFreeDMACommand(IODMACommand * command, @@ -175,6 +196,17 @@ void IOMapper::iovmFreeDMACommand(IODMACommand * command, { } +ppnum_t IOMapper::iovmMapMemory( + OSObject * memory, // dma command or iomd + ppnum_t offsetPage, + ppnum_t pageCount, + uint32_t options, + upl_page_info_t * pageList, + const IODMAMapSpecification * mapSpecification) +{ + return (0); +} + void IOMapper::iovmInsert(ppnum_t addr, IOItemCount offset, ppnum_t *pageList, IOItemCount pageCount) { @@ -251,6 +283,7 @@ void IOMapperIOVMFree(ppnum_t addr, unsigned pages) ppnum_t IOMapperInsertPage(ppnum_t addr, unsigned offset, ppnum_t page) { if (IOMapper::gSystem) { + if (!addr) panic("!addr"); IOMapper::gSystem->iovmInsert(addr, (IOItemCount) offset, page); return addr + offset; } @@ -390,23 +423,4 @@ void IOMappedWrite64(IOPhysicalAddress address, UInt64 value) ml_phys_write_double((vm_offset_t) address, value); } -mach_vm_address_t IOMallocPhysical(mach_vm_size_t size, mach_vm_address_t mask) -{ - mach_vm_address_t address = 0; - if (gIOCopyMapper) - { - address = ptoa_64(gIOCopyMapper->iovmAlloc(atop_64(round_page(size)))); - } - return (address); -} - -void IOFreePhysical(mach_vm_address_t address, mach_vm_size_t size) -{ - if (gIOCopyMapper) - { - gIOCopyMapper->iovmFree(atop_64(address), atop_64(round_page(size))); - } -} - - __END_DECLS