- if (options & kIOMemoryPageable) {
- kern_return_t kr;
- ipc_port_t sharedMem = (ipc_port_t) _memEntry;
- vm_size_t size = round_page_32(_ranges.v[0].length);
-
- // must create the entry before any pages are allocated
- if( 0 == sharedMem) {
-
- // set memory entry cache
- vm_prot_t memEntryCacheMode = VM_PROT_READ | VM_PROT_WRITE;
- 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;
- }
-
- kr = mach_make_memory_entry( map,
- &size, _ranges.v[0].address,
- memEntryCacheMode, &sharedMem,
- NULL );
-
- if( (KERN_SUCCESS == kr) && (size != round_page_32(_ranges.v[0].length))) {
- ipc_port_release_send( sharedMem );
- kr = kIOReturnVMError;
- }
- if( KERN_SUCCESS != kr)
- sharedMem = 0;
- _memEntry = (void *) sharedMem;
- }
+ if (mapTask)
+ {
+ if (!reserved) {
+ reserved = IONew( ExpansionData, 1 );
+ if( !reserved)
+ return( false );
+ }
+ reserved->map = createMappingInTask(mapTask, 0,
+ kIOMapAnywhere | (options & kIOMapCacheMask), 0, 0);
+ if (!reserved->map)
+ {
+ _buffer = 0;
+ return( false );
+ }
+ release(); // map took a retain on this
+ reserved->map->retain();
+ removeMapping(reserved->map);
+ mach_vm_address_t buffer = reserved->map->getAddress();
+ _buffer = (void *) buffer;
+ if (kIOMemoryTypeVirtual64 == (kIOMemoryTypeMask & iomdOptions))
+ _ranges.v64->address = buffer;