- kern_return_t kr;
- task_t mapTask = NULL;
- vm_map_t vmmap = NULL;
- addr64_t lastIOAddr;
- IOAddressRange range;
- IOOptionBits iomdOptions = kIOMemoryTypeVirtual64;
-
- if (!capacity)
- return false;
-
- _options = options;
- _capacity = capacity;
- _physAddrs = 0;
- _physSegCount = 0;
- _buffer = 0;
- range.address = 0;
- range.length = 0;
- _ranges.v64 = ⦥
-
- // Grab the direction and the Auto Prepare bits from the Buffer MD options
- iomdOptions |= options & (kIOMemoryDirectionMask | kIOMemoryAutoPrepare);
-
- if ((options & (kIOMemorySharingTypeMask | kIOMapCacheMask)) && (alignment < page_size))
- alignment = page_size;
-
- if (physicalMask && (alignment <= 1))
- alignment = ((physicalMask ^ PAGE_MASK) & PAGE_MASK) + 1;
-
- _alignment = alignment;
-
- if (((inTask != kernel_task) && !(options & kIOMemoryPageable)) ||
- (physicalMask && (options & kIOMapCacheMask)))
- return false;
-
- if ((options & kIOMemoryPhysicallyContiguous) && !physicalMask)
- physicalMask = 0xFFFFFFFF;
-
- // set flags for entry + object create
- vm_prot_t memEntryCacheMode = VM_PROT_READ | VM_PROT_WRITE;
-
- // set memory entry cache mode
- switch (options & kIOMapCacheMask)
- {
- case kIOMapInhibitCache:
- SET_MAP_MEM(MAP_MEM_IO, memEntryCacheMode);
- break;
-
- case kIOMapWriteThruCache:
- SET_MAP_MEM(MAP_MEM_WTHRU, memEntryCacheMode);
- break;
-
- case kIOMapWriteCombineCache:
- SET_MAP_MEM(MAP_MEM_WCOMB, memEntryCacheMode);
- break;
-
- case kIOMapCopybackCache:
- SET_MAP_MEM(MAP_MEM_COPYBACK, memEntryCacheMode);
- break;
-
- case kIOMapDefaultCache:
- default:
- SET_MAP_MEM(MAP_MEM_NOOP, memEntryCacheMode);
- break;
- }
-
- if (options & kIOMemoryPageable)
- {
- iomdOptions |= kIOMemoryBufferPageable;
-
- // must create the entry before any pages are allocated
-
- // set flags for entry + object create
- memEntryCacheMode |= MAP_MEM_NAMED_CREATE;
-
- if (options & kIOMemoryPurgeable)
- memEntryCacheMode |= MAP_MEM_PURGABLE;
- }
- else
- {
- memEntryCacheMode |= MAP_MEM_NAMED_REUSE;
-
- if (IOMapper::gSystem)
- // assuming mapped space is 2G
- lastIOAddr = (1UL << 31) - PAGE_SIZE;
- else
- lastIOAddr = ptoa_64(gIOHighestAllocatedPage);
-
- if (physicalMask && (lastIOAddr != (lastIOAddr & physicalMask)))
- {
- mach_vm_address_t address;
- iomdOptions &= ~kIOMemoryTypeVirtual64;
- iomdOptions |= kIOMemoryTypePhysical64;
-
- address = IOMallocPhysical(capacity, physicalMask);
- _buffer = (void *) address;
- if (!_buffer)