From 111b11272975f9ad1314b4e3a5ac05604bc19e13 Mon Sep 17 00:00:00 2001 From: Mateusz Hoppe Date: Tue, 20 Jun 2023 16:14:44 +0000 Subject: [PATCH] feature: add assertBufferPtr to ImplicitArgs Related-To: NEO-5753, NEO-8078 Signed-off-by: Mateusz Hoppe --- level_zero/core/source/kernel/kernel_imp.cpp | 4 +++ .../unit_tests/sources/assert/test_assert.cpp | 36 +++++++++++++++++++ shared/source/kernel/implicit_args.h | 3 +- 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/level_zero/core/source/kernel/kernel_imp.cpp b/level_zero/core/source/kernel/kernel_imp.cpp index 4ed0eaa605..a6afdebe8e 100644 --- a/level_zero/core/source/kernel/kernel_imp.cpp +++ b/level_zero/core/source/kernel/kernel_imp.cpp @@ -1172,6 +1172,10 @@ void KernelImp::setAssertBuffer() { this->getImmutableData()->getDescriptor().payloadMappings.implicitArgs.assertBufferAddress, static_cast(assertHandler->getAssertBuffer()->getGpuAddressToPatch())); this->residencyContainer.push_back(assertHandler->getAssertBuffer()); + + if (pImplicitArgs) { + pImplicitArgs->assertBufferPtr = static_cast(assertHandler->getAssertBuffer()->getGpuAddressToPatch()); + } } void KernelImp::patchBindlessOffsetsInCrossThreadData(uint64_t bindlessSurfaceStateBaseOffset) const { diff --git a/level_zero/core/test/unit_tests/sources/assert/test_assert.cpp b/level_zero/core/test/unit_tests/sources/assert/test_assert.cpp index 4893438b2d..286e4d8bec 100644 --- a/level_zero/core/test/unit_tests/sources/assert/test_assert.cpp +++ b/level_zero/core/test/unit_tests/sources/assert/test_assert.cpp @@ -6,6 +6,7 @@ */ #include "shared/source/helpers/hw_info.h" +#include "shared/source/kernel/implicit_args.h" #include "shared/test/common/helpers/default_hw_info.h" #include "shared/test/common/libult/ult_command_stream_receiver.h" #include "shared/test/common/mocks/mock_assert_handler.h" @@ -89,6 +90,41 @@ TEST(KernelAssert, GivenKernelWithAssertWhenSettingAssertBufferThenAssertBufferI EXPECT_TRUE(std::find(kernel.getResidencyContainer().begin(), kernel.getResidencyContainer().end(), assertHandler->getAssertBuffer()) != kernel.getResidencyContainer().end()); } +TEST(KernelAssert, GivenKernelWithAssertAndImplicitArgsWhenInitializingKernelThenImplicitArgsAssertBufferPtrIsSet) { + NEO::Device *neoDevice(NEO::MockDevice::createWithNewExecutionEnvironment(NEO::defaultHwInfo.get(), 0)); + Mock l0Device(neoDevice, neoDevice->getExecutionEnvironment()); + + auto assertHandler = new MockAssertHandler(neoDevice); + neoDevice->getRootDeviceEnvironmentRef().assertHandler.reset(assertHandler); + + MockModule module(&l0Device, nullptr, ModuleType::User); + Mock kernel; + kernel.module = &module; + + kernel.descriptor.kernelMetadata.kernelName = "test"; + kernel.descriptor.kernelAttributes.flags.usesAssert = true; + kernel.descriptor.kernelAttributes.flags.requiresImplicitArgs = true; + kernel.descriptor.payloadMappings.implicitArgs.assertBufferAddress.stateless = 0; + kernel.descriptor.payloadMappings.implicitArgs.assertBufferAddress.pointerSize = sizeof(uintptr_t); + kernel.crossThreadData = std::make_unique(16); + kernel.crossThreadDataSize = sizeof(uint8_t[16]); + + module.kernelImmData = &kernel.immutableData; + char heap[8]; + kernel.info.heapInfo.pKernelHeap = heap; + + ze_kernel_desc_t kernelDesc = {}; + kernelDesc.pKernelName = "test"; + + auto result = kernel.initialize(&kernelDesc); + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + + auto assertBufferAddress = assertHandler->getAssertBuffer()->getGpuAddressToPatch(); + auto implicitArgs = kernel.getImplicitArgs(); + ASSERT_NE(nullptr, implicitArgs); + EXPECT_EQ(assertBufferAddress, implicitArgs->assertBufferPtr); +} + TEST(KernelAssert, GivenNoAssertHandlerWhenKernelWithAssertSetsAssertBufferThenAssertHandlerIsCreated) { NEO::Device *neoDevice(NEO::MockDevice::createWithNewExecutionEnvironment(NEO::defaultHwInfo.get(), 0)); Mock l0Device(neoDevice, neoDevice->getExecutionEnvironment()); diff --git a/shared/source/kernel/implicit_args.h b/shared/source/kernel/implicit_args.h index 8079b78bc9..1eb6090cc7 100644 --- a/shared/source/kernel/implicit_args.h +++ b/shared/source/kernel/implicit_args.h @@ -37,7 +37,8 @@ struct ImplicitArgs { uint32_t groupCountZ; uint32_t padding0; uint64_t rtGlobalBufferPtr; - uint8_t reserved[24]; + uint64_t assertBufferPtr; + uint8_t reserved[16]; }; static_assert((sizeof(ImplicitArgs) & 31) == 0, "Implicit args size need to be aligned to 32");