diff --git a/rocclr/runtime/device/gpu/gpuvirtual.cpp b/rocclr/runtime/device/gpu/gpuvirtual.cpp index dc9f0076a8..2facbbe466 100644 --- a/rocclr/runtime/device/gpu/gpuvirtual.cpp +++ b/rocclr/runtime/device/gpu/gpuvirtual.cpp @@ -3575,7 +3575,9 @@ VirtualGPU::submitTransferBufferFromFile(amd::TransferBufferFileCommand& cmd) size_t srcDstSize = amd::TransferBufferFileCommand::StagingBufferSize; srcDstSize = std::min(srcDstSize, copySize); void* srcDstBuffer = staging->cpuMap(*this); - if (!cmd.file()->transferBlock(writeBuffer, srcDstBuffer, fileOffset, 0, srcDstSize)) { + if (!cmd.file()->transferBlock(writeBuffer, + srcDstBuffer, staging->size(), fileOffset, 0, srcDstSize)) { + cmd.setStatus(CL_INVALID_OPERATION); return; } staging->cpuUnmap(*this); diff --git a/rocclr/runtime/device/pal/palvirtual.cpp b/rocclr/runtime/device/pal/palvirtual.cpp index 40e2ed043e..687e5e0009 100644 --- a/rocclr/runtime/device/pal/palvirtual.cpp +++ b/rocclr/runtime/device/pal/palvirtual.cpp @@ -3434,7 +3434,9 @@ VirtualGPU::submitTransferBufferFromFile(amd::TransferBufferFileCommand& cmd) size_t srcDstSize = amd::TransferBufferFileCommand::StagingBufferSize; srcDstSize = std::min(srcDstSize, copySize); void* srcDstBuffer = staging->cpuMap(*this); - if (!cmd.file()->transferBlock(writeBuffer, srcDstBuffer, fileOffset, 0, srcDstSize)) { + if (!cmd.file()->transferBlock(writeBuffer, + srcDstBuffer, staging->size(), fileOffset, 0, srcDstSize)) { + cmd.setStatus(CL_INVALID_OPERATION); return; } staging->cpuUnmap(*this); diff --git a/rocclr/runtime/platform/command.cpp b/rocclr/runtime/platform/command.cpp index 194a04f7b9..a525a693af 100644 --- a/rocclr/runtime/platform/command.cpp +++ b/rocclr/runtime/platform/command.cpp @@ -595,8 +595,9 @@ TransferBufferFileCommand::submit(device::VirtualDevice& device) void* srcDstBuffer = mem->cpuMap(device); // Make HD transfer to the host accessible memory bool writeBuffer(type() == CL_COMMAND_WRITE_BUFFER_FROM_FILE_AMD); - if (!file()->transferBlock(writeBuffer, srcDstBuffer, + if (!file()->transferBlock(writeBuffer, srcDstBuffer, mem->size(), fileOffset(), origin()[0], size()[0])) { + setStatus(CL_INVALID_OPERATION); return; } mem->cpuUnmap(device); diff --git a/rocclr/runtime/platform/memory.hpp b/rocclr/runtime/platform/memory.hpp index 1dbab69cd6..cc07cb7f15 100644 --- a/rocclr/runtime/platform/memory.hpp +++ b/rocclr/runtime/platform/memory.hpp @@ -695,6 +695,7 @@ public: bool transferBlock( bool read, void* dst, + uint64_t bufferSize, uint64_t fileOffset, uint64_t bufferOffset, uint64_t size) const;