kern_return_t vm_read_fast(target_map, dest_address, size, memory_object, offset) vm_map_t target_map; vm_address_t dest_address; vm_size_t size; ipc_port_t memory_object; vm_offset_t offset; { vm_map_entry_t dest_entry; vm_map_version_t version; vm_object_t object; vm_offset_t dest_pa_address = trunc_page(dest_address); kern_return_t kr; vm_map_lock(target_map); if (!vm_map_lookup_entry(target_map, dest_address, &dest_entry)) { vm_map_unlock(target_map); // panic("invalid address\n"); return(KERN_INVALID_ADDRESS); } vm_map_clip_start(target_map, dest_entry, dest_pa_address); if ((dest_entry->vme_end - (dest_entry->vme_start + (dest_address - dest_pa_address))) < size) { vm_map_unlock(target_map); // panic("map too small\n"); return(KERN_INVALID_ADDRESS); } if (!IP_VALID(memory_object) || (object = vm_object_enter(memory_object, size, FALSE)) == VM_OBJECT_NULL) { vm_map_unlock(target_map); return(KERN_INVALID_ARGUMENT); } version.main_timestamp = target_map->timestamp; vm_map_unlock(target_map); /* XXX DEBUG if (dest_entry->object.vm_object == VM_OBJECT_NULL) printf("dst_entry object null!\n"); printf("vm_read_fast: ORIGEN, offset: %d, size: %d\n", offset, size); printf("vm_read_fast: DESTINO, offset: %d\n", dest_entry->offset); */ kr = vm_fault_copy_tmp(object, offset, &size, dest_entry->object.vm_object, dest_entry->offset + (dest_address - dest_pa_address), target_map, &version, FALSE); return kr; }