From e2680d395c850275c567ef73dbe43859df21e035 Mon Sep 17 00:00:00 2001 From: "Mrozek, Michal" Date: Wed, 17 Jan 2018 18:14:27 +0100 Subject: [PATCH] Fix incorrect pointer programming when offseted SVM pointers are used. Change-Id: Idf8b6d9c116cf6fb8cfd069158e9eef4d981b272 --- runtime/kernel/kernel.cpp | 2 +- unit_tests/kernel/kernel_arg_svm_tests.cpp | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/runtime/kernel/kernel.cpp b/runtime/kernel/kernel.cpp index b7e1ab6133..a76f742018 100644 --- a/runtime/kernel/kernel.cpp +++ b/runtime/kernel/kernel.cpp @@ -817,7 +817,7 @@ cl_int Kernel::setArgSvmAlloc(uint32_t argIndex, void *svmPtr, GraphicsAllocatio size_t offset = ptrDiff(ptrToPatch, svmAlloc->getUnderlyingBuffer()); allocSize -= offset; } - Buffer::setSurfaceState(&getContext(), surfaceState, allocSize, ptrToPatch, svmAlloc); + Buffer::setSurfaceState(&getContext(), surfaceState, allocSize, ptrToPatch, nullptr); } if (!kernelArguments[argIndex].isPatched) { diff --git a/unit_tests/kernel/kernel_arg_svm_tests.cpp b/unit_tests/kernel/kernel_arg_svm_tests.cpp index a4e07f5845..d4fc51fdf2 100644 --- a/unit_tests/kernel/kernel_arg_svm_tests.cpp +++ b/unit_tests/kernel/kernel_arg_svm_tests.cpp @@ -202,6 +202,26 @@ HWTEST_F(KernelArgSvmTest, SetKernelArgValidSvmAllocStateful) { delete[] svmPtr; } +HWTEST_F(KernelArgSvmTest, givenOffsetedSvmPointerWhenSetArgSvmAllocIsCalledThenProperSvmAddressIsPatched) { + std::unique_ptr svmPtr(new char[256]); + + auto offsetedPtr = svmPtr.get() + 4; + + GraphicsAllocation svmAlloc(svmPtr.get(), 256); + pKernelInfo->usesSsh = true; + pKernelInfo->requiresSshForBuffers = true; + + pKernel->setArgSvmAlloc(0, offsetedPtr, &svmAlloc); + + typedef typename FamilyType::RENDER_SURFACE_STATE RENDER_SURFACE_STATE; + auto surfaceState = reinterpret_cast( + ptrOffset(pKernel->getSurfaceStateHeap(), + pKernelInfo->kernelArgInfo[0].offsetHeap)); + + void *surfaceAddress = reinterpret_cast(surfaceState->getSurfaceBaseAddress()); + EXPECT_EQ(offsetedPtr, surfaceAddress); +} + TEST_F(KernelArgSvmTest, SetKernelArgImmediateInvalidArgValue) { auto retVal = pKernel->setArgImmediate(0, 256, nullptr); EXPECT_EQ(CL_INVALID_ARG_VALUE, retVal);