From 7e380dad6278a12370e24493d8e0d2c1bfce97ed Mon Sep 17 00:00:00 2001 From: Maciej Dziuban Date: Mon, 30 Jul 2018 11:25:27 +0200 Subject: [PATCH] Delete incorrect check in setArgImmediate Change-Id: Ie02bb4a6f34f564fb563e373c4e37f851cd29e92 --- runtime/kernel/kernel.cpp | 10 ++--- .../kernel/kernel_immediate_arg_tests.cpp | 37 +++++++++++++------ 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/runtime/kernel/kernel.cpp b/runtime/kernel/kernel.cpp index 7ab0bef817..71941cbc68 100644 --- a/runtime/kernel/kernel.cpp +++ b/runtime/kernel/kernel.cpp @@ -1282,13 +1282,11 @@ cl_int Kernel::setArgImmediate(uint32_t argIndex, DEBUG_BREAK_IF(!(ptrOffset(pDst, kernelArgPatchInfo.size) <= crossThreadDataEnd)); ((void)(crossThreadDataEnd)); - if (kernelArgPatchInfo.sourceOffset >= argSize) { - return CL_INVALID_ARG_SIZE; + if (kernelArgPatchInfo.sourceOffset < argSize) { + size_t maxBytesToCopy = argSize - kernelArgPatchInfo.sourceOffset; + size_t bytesToCopy = std::min(static_cast(kernelArgPatchInfo.size), maxBytesToCopy); + memcpy_s(pDst, kernelArgPatchInfo.size, pSrc, bytesToCopy); } - - size_t maxBytesToCopy = argSize - kernelArgPatchInfo.sourceOffset; - size_t bytesToCopy = std::min(static_cast(kernelArgPatchInfo.size), maxBytesToCopy); - memcpy_s(pDst, kernelArgPatchInfo.size, pSrc, bytesToCopy); } retVal = CL_SUCCESS; } diff --git a/unit_tests/kernel/kernel_immediate_arg_tests.cpp b/unit_tests/kernel/kernel_immediate_arg_tests.cpp index 71d2a28eb1..d6efe1de57 100644 --- a/unit_tests/kernel/kernel_immediate_arg_tests.cpp +++ b/unit_tests/kernel/kernel_immediate_arg_tests.cpp @@ -299,6 +299,7 @@ TYPED_TEST(KernelArgImmediateTest, givenMulitplePatchesAndSecondPatchSizeTooLarg const std::vector memoryBeyondLimitBefore1(memoryBeyondLimitAddress1, memoryBeyondLimitAddress1 + sizeof(TypeParam) / 2); const std::vector memoryBeyondLimitBefore2(memoryBeyondLimitAddress2, memoryBeyondLimitAddress2 + sizeof(TypeParam) / 2); + this->pKernelInfo->kernelArgInfo[3].kernelArgPatchInfoVector[0].size = 0; this->pKernelInfo->kernelArgInfo[3].kernelArgPatchInfoVector[2].sourceOffset = 0; this->pKernelInfo->kernelArgInfo[3].kernelArgPatchInfoVector[1].sourceOffset = sizeof(TypeParam) / 2; this->pKernelInfo->kernelArgInfo[3].kernelArgPatchInfoVector[2].size = sizeof(TypeParam) / 2; @@ -314,18 +315,32 @@ TYPED_TEST(KernelArgImmediateTest, givenMulitplePatchesAndSecondPatchSizeTooLarg EXPECT_EQ(CL_SUCCESS, retVal); } -TYPED_TEST(KernelArgImmediateTest, givenSourceOffsetBeyondArgumentWhenSettingArgThenDontCopyAnythingAndReturnInvalidArgSize) { - TypeParam argument; - std::memset(&argument, 0xaa, sizeof(TypeParam)); +TYPED_TEST(KernelArgImmediateTest, givenMultiplePatchesAndOneSourceOffsetBeyondArgumentWhenSettingArgThenDontCopyThisPatch) { + TypeParam memory[2]; + std::memset(&memory[0], 0xaa, sizeof(TypeParam)); + std::memset(&memory[1], 0xbb, sizeof(TypeParam)); - const auto crossthreadDataAddress = this->pKernel->getCrossThreadData() + - this->pKernelInfo->kernelArgInfo[0].kernelArgPatchInfoVector[0].crossthreadOffset; - const std::vector crossthreadDataBefore(crossthreadDataAddress, crossthreadDataAddress + sizeof(TypeParam)); + const auto destinationMemoryAddress1 = this->pKernel->getCrossThreadData() + + this->pKernelInfo->kernelArgInfo[3].kernelArgPatchInfoVector[1].crossthreadOffset; + const auto destinationMemoryAddress2 = this->pKernel->getCrossThreadData() + + this->pKernelInfo->kernelArgInfo[3].kernelArgPatchInfoVector[2].crossthreadOffset; + const auto memoryBeyondLimitAddress1 = destinationMemoryAddress1 + sizeof(TypeParam); + const auto memoryBeyondLimitAddress2 = destinationMemoryAddress2; - this->pKernelInfo->kernelArgInfo[0].kernelArgPatchInfoVector[0].sourceOffset = sizeof(TypeParam); - this->pKernelInfo->kernelArgInfo[0].kernelArgPatchInfoVector[0].size = sizeof(TypeParam); - auto retVal = this->pKernel->setArg(0, sizeof(TypeParam), &argument); + const std::vector memoryBeyondLimitBefore1(memoryBeyondLimitAddress1, memoryBeyondLimitAddress1 + sizeof(TypeParam)); + const std::vector memoryBeyondLimitBefore2(memoryBeyondLimitAddress2, memoryBeyondLimitAddress2 + sizeof(TypeParam)); - EXPECT_EQ(0, std::memcmp(crossthreadDataBefore.data(), crossthreadDataAddress, sizeof(TypeParam))); - EXPECT_EQ(CL_INVALID_ARG_SIZE, retVal); + this->pKernelInfo->kernelArgInfo[3].kernelArgPatchInfoVector[0].size = 0; + this->pKernelInfo->kernelArgInfo[3].kernelArgPatchInfoVector[1].sourceOffset = 0; + this->pKernelInfo->kernelArgInfo[3].kernelArgPatchInfoVector[1].size = sizeof(TypeParam); + this->pKernelInfo->kernelArgInfo[3].kernelArgPatchInfoVector[2].sourceOffset = sizeof(TypeParam); + this->pKernelInfo->kernelArgInfo[3].kernelArgPatchInfoVector[2].size = 1; + auto retVal = this->pKernel->setArg(3, sizeof(TypeParam), &memory[0]); + + EXPECT_EQ(0, std::memcmp(memoryBeyondLimitBefore1.data(), memoryBeyondLimitAddress1, memoryBeyondLimitBefore1.size())); + EXPECT_EQ(0, std::memcmp(memoryBeyondLimitBefore2.data(), memoryBeyondLimitAddress2, memoryBeyondLimitBefore2.size())); + + EXPECT_EQ(0, std::memcmp(&memory[0], destinationMemoryAddress1, sizeof(TypeParam))); + + EXPECT_EQ(CL_SUCCESS, retVal); }