Author: bonefish Date: 2010-06-14 23:33:11 +0200 (Mon, 14 Jun 2010) New Revision: 37134 Changeset: http://dev.haiku-os.org/changeset/37134/haiku Modified: haiku/trunk/src/system/kernel/device_manager/IORequest.cpp haiku/trunk/src/system/kernel/device_manager/IORequest.h Log: IORequest::_Copy*(): Resolved TODO: Don't cast the generic_addr_t to void* anymore as that truncates physical addresses when PAE is enabled. Now, if a 4 GB physical address limit is forced in DMAResource, the system continues to work fine when the physical memory > 4 GB is used. Otherwise it hangs or crashes. Modified: haiku/trunk/src/system/kernel/device_manager/IORequest.cpp =================================================================== --- haiku/trunk/src/system/kernel/device_manager/IORequest.cpp 2010-06-14 20:41:18 UTC (rev 37133) +++ haiku/trunk/src/system/kernel/device_manager/IORequest.cpp 2010-06-14 21:33:11 UTC (rev 37134) @@ -1168,7 +1168,7 @@ // If we can, we directly copy from/to the virtual buffer. The memory is // locked in this case. - status_t (*copyFunction)(void*, void*, size_t, team_id, bool); + status_t (*copyFunction)(void*, generic_addr_t, size_t, team_id, bool); if (fBuffer->IsPhysical()) { copyFunction = &IORequest::_CopyPhysical; } else { @@ -1193,8 +1193,8 @@ // copy vector-wise while (size > 0) { generic_size_t toCopy = min_c(size, vecs[0].length - vecOffset); - status_t error = copyFunction(buffer, - (uint8*)vecs[0].base + vecOffset, toCopy, fTeam, copyIn); + status_t error = copyFunction(buffer, vecs[0].base + vecOffset, toCopy, + fTeam, copyIn); if (error != B_OK) return error; @@ -1209,39 +1209,36 @@ /* static */ status_t -IORequest::_CopySimple(void* bounceBuffer, void* external, size_t size, +IORequest::_CopySimple(void* bounceBuffer, generic_addr_t external, size_t size, team_id team, bool copyIn) { - TRACE(" IORequest::_CopySimple(%p, %p, %lu, %d)\n", bounceBuffer, external, - size, copyIn); + TRACE(" IORequest::_CopySimple(%p, %#" B_PRIxGENADDR ", %lu, %d)\n", + bounceBuffer, external, size, copyIn); if (copyIn) - memcpy(bounceBuffer, external, size); + memcpy(bounceBuffer, (void*)(addr_t)external, size); else - memcpy(external, bounceBuffer, size); + memcpy((void*)(addr_t)external, bounceBuffer, size); return B_OK; } /* static */ status_t -IORequest::_CopyPhysical(void* bounceBuffer, void* external, size_t size, - team_id team, bool copyIn) +IORequest::_CopyPhysical(void* bounceBuffer, generic_addr_t external, + size_t size, team_id team, bool copyIn) { -// TODO: The physical address must be phys_addr_t! - if (copyIn) { - return vm_memcpy_from_physical(bounceBuffer, (addr_t)external, size, - false); - } + if (copyIn) + return vm_memcpy_from_physical(bounceBuffer, external, size, false); - return vm_memcpy_to_physical((addr_t)external, bounceBuffer, size, false); + return vm_memcpy_to_physical(external, bounceBuffer, size, false); } /* static */ status_t -IORequest::_CopyUser(void* _bounceBuffer, void* _external, size_t size, +IORequest::_CopyUser(void* _bounceBuffer, generic_addr_t _external, size_t size, team_id team, bool copyIn) { uint8* bounceBuffer = (uint8*)_bounceBuffer; - uint8* external = (uint8*)_external; + uint8* external = (uint8*)(addr_t)_external; while (size > 0) { static const int32 kEntryCount = 8; @@ -1258,8 +1255,8 @@ for (uint32 i = 0; i < count; i++) { const physical_entry& entry = entries[i]; - error = _CopyPhysical(bounceBuffer, (void*)entry.address, - entry.size, team, copyIn); + error = _CopyPhysical(bounceBuffer, entry.address, entry.size, team, + copyIn); if (error != B_OK) return error; Modified: haiku/trunk/src/system/kernel/device_manager/IORequest.h =================================================================== --- haiku/trunk/src/system/kernel/device_manager/IORequest.h 2010-06-14 20:41:18 UTC (rev 37133) +++ haiku/trunk/src/system/kernel/device_manager/IORequest.h 2010-06-14 21:33:11 UTC (rev 37134) @@ -308,13 +308,15 @@ private: status_t _CopyData(void* buffer, off_t offset, size_t size, bool copyIn); - static status_t _CopySimple(void* bounceBuffer, void* external, - size_t size, team_id team, bool copyIn); + static status_t _CopySimple(void* bounceBuffer, + generic_addr_t external, size_t size, + team_id team, bool copyIn); static status_t _CopyPhysical(void* bounceBuffer, - void* external, size_t size, team_id team, - bool copyIn); - static status_t _CopyUser(void* bounceBuffer, void* external, - size_t size, team_id team, bool copyIn); + generic_addr_t external, size_t size, + team_id team, bool copyIn); + static status_t _CopyUser(void* bounceBuffer, + generic_addr_t external, size_t size, + team_id team, bool copyIn); mutex fLock; IORequestOwner* fOwner;