From dbf9e7ff63850505c2fbe1b7c09319f1bec39a5e Mon Sep 17 00:00:00 2001 From: Jemale Lockett Date: Tue, 18 Nov 2025 17:18:15 +0000 Subject: [PATCH] refactor: Add conditions for metadata and vmbind handling Resolves: NEO-16089 Signed-off-by: Jemale Lockett --- .../linux/xe/ioctl_helper_xe_debugger.cpp | 10 +++++++ .../xe/eudebug/mock_eudebug_interface.cpp | 2 +- .../linux/xe/eudebug/mock_eudebug_interface.h | 8 +++-- .../xe/ioctl_helper_xe_debugger_tests.cpp | 30 +++++++++++++++++-- 4 files changed, 45 insertions(+), 5 deletions(-) diff --git a/shared/source/os_interface/linux/xe/ioctl_helper_xe_debugger.cpp b/shared/source/os_interface/linux/xe/ioctl_helper_xe_debugger.cpp index b170a76cbd..6933d72a51 100644 --- a/shared/source/os_interface/linux/xe/ioctl_helper_xe_debugger.cpp +++ b/shared/source/os_interface/linux/xe/ioctl_helper_xe_debugger.cpp @@ -66,6 +66,10 @@ int IoctlHelperXe::getEuDebugSysFsEnable() { } uint32_t IoctlHelperXe::registerResource(DrmResourceClass classType, const void *data, size_t size) { + if (euDebugInterface->getInterfaceType() != EuDebugInterfaceType::prelim) { + return 0; + } + DebugMetadataCreate metadata = {}; if (classType == DrmResourceClass::elf) { metadata.type = euDebugInterface->getParamValue(EuDebugParam::metadataElfBinary); @@ -98,6 +102,9 @@ uint32_t IoctlHelperXe::registerResource(DrmResourceClass classType, const void } void IoctlHelperXe::unregisterResource(uint32_t handle) { + if (euDebugInterface->getInterfaceType() != EuDebugInterfaceType::prelim) { + return; + } DebugMetadataDestroy metadata = {}; metadata.metadataId = handle; [[maybe_unused]] auto retVal = IoctlHelperXe::ioctl(DrmIoctl::metadataDestroy, &metadata); @@ -106,6 +113,9 @@ void IoctlHelperXe::unregisterResource(uint32_t handle) { } std::unique_ptr IoctlHelperXe::prepareVmBindExt(const StackVec &bindExtHandles, uint64_t cookie) { + if (euDebugInterface->getInterfaceType() != EuDebugInterfaceType::prelim) { + return nullptr; + } static_assert(std::is_trivially_destructible_v, "Storage must be allowed to be reused without calling the destructor!"); diff --git a/shared/test/common/os_interface/linux/xe/eudebug/mock_eudebug_interface.cpp b/shared/test/common/os_interface/linux/xe/eudebug/mock_eudebug_interface.cpp index 42652bdc8a..59a633f6ff 100644 --- a/shared/test/common/os_interface/linux/xe/eudebug/mock_eudebug_interface.cpp +++ b/shared/test/common/os_interface/linux/xe/eudebug/mock_eudebug_interface.cpp @@ -243,5 +243,5 @@ std::unique_ptr MockEuDebugInterface::toDrmEuDebugAckEve } char MockEuDebugInterface::sysFsContent = '1'; -[[maybe_unused]] static EnableEuDebugInterface enableMockEuDebug(MockEuDebugInterface::euDebugInterfaceType, MockEuDebugInterface::sysFsXeEuDebugFile, []() -> std::unique_ptr { return std::make_unique(); }); +[[maybe_unused]] static EnableEuDebugInterface enableMockEuDebug(EuDebugInterfaceType::upstream, MockEuDebugInterface::sysFsXeEuDebugFile, []() -> std::unique_ptr { return std::make_unique(); }); } // namespace NEO diff --git a/shared/test/common/os_interface/linux/xe/eudebug/mock_eudebug_interface.h b/shared/test/common/os_interface/linux/xe/eudebug/mock_eudebug_interface.h index 800709f529..dcd3dfe419 100644 --- a/shared/test/common/os_interface/linux/xe/eudebug/mock_eudebug_interface.h +++ b/shared/test/common/os_interface/linux/xe/eudebug/mock_eudebug_interface.h @@ -14,10 +14,9 @@ class MockEuDebugInterface : public EuDebugInterface { static char sysFsContent; static constexpr const char *sysFsXeEuDebugFile = "/mock_eudebug"; static constexpr uintptr_t sysFsFd = 0xE0DEB0; - static constexpr EuDebugInterfaceType euDebugInterfaceType = EuDebugInterfaceType::upstream; bool isExecQueuePageFaultEnableSupported() override { return pageFaultEnableSupported; }; uint32_t getParamValue(EuDebugParam param) const override; - EuDebugInterfaceType getInterfaceType() const override { return euDebugInterfaceType; }; + EuDebugInterfaceType getInterfaceType() const override { return currentInterfaceType; }; uint64_t getDefaultClientHandle() const override { return 1; // EuDebugInterfaceUpstream::defaultClientHandle }; @@ -42,6 +41,11 @@ class MockEuDebugInterface : public EuDebugInterface { std::unique_ptr toDrmEuDebugAckEvent(const EuDebugAckEvent &ackEvent) override; bool pageFaultEnableSupported = false; + + EuDebugInterfaceType currentInterfaceType = EuDebugInterfaceType::upstream; + void setCurrentInterfaceType(EuDebugInterfaceType newType) { + currentInterfaceType = newType; + } }; } // namespace NEO diff --git a/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_debugger_tests.cpp b/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_debugger_tests.cpp index c74e0292f6..f70829a6bf 100644 --- a/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_debugger_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_debugger_tests.cpp @@ -242,7 +242,7 @@ TEST_F(IoctlHelperXeTest, givenInvalidPathWhenCreateEuDebugInterfaceThenReturnNu auto drm = DrmMockXeDebug::create(*executionEnvironment->rootDeviceEnvironments[0]); VariableBackup mockFreadReturnBackup(&IoFunctions::mockFreadReturn, 0); - VariableBackup eudebugSysFsEntryBackup(&eudebugSysfsEntry[static_cast(MockEuDebugInterface::euDebugInterfaceType)], "invalidEntry"); + VariableBackup eudebugSysFsEntryBackup(&eudebugSysfsEntry[static_cast(EuDebugInterfaceType::upstream)], "invalidEntry"); auto euDebugInterface = EuDebugInterface::create(drm->getSysFsPciPath()); EXPECT_EQ(nullptr, euDebugInterface); @@ -263,6 +263,8 @@ TEST_F(IoctlHelperXeTest, givenXeRegisterResourceThenCorrectIoctlCalled) { auto executionEnvironment = std::make_unique(); auto drm = DrmMockXeDebug::create(*executionEnvironment->rootDeviceEnvironments[0]); auto xeIoctlHelper = static_cast(drm->ioctlHelper.get()); + auto &eudebugInterface = xeIoctlHelper->euDebugInterface; + static_cast(eudebugInterface.get())->setCurrentInterfaceType(EuDebugInterfaceType::prelim); constexpr size_t bufferSize = 20; uint8_t buffer[bufferSize]; @@ -298,7 +300,6 @@ TEST_F(IoctlHelperXeTest, givenXeRegisterResourceThenCorrectIoctlCalled) { EXPECT_EQ(drm->metadataAddr, buffer); EXPECT_EQ(drm->metadataSize, bufferSize); EXPECT_EQ(drm->metadataType, static_cast(EuDebugParam::metadataSbaArea)); - drm->metadataID = 0; drm->metadataAddr = nullptr; drm->metadataSize = 0; @@ -313,6 +314,9 @@ TEST_F(IoctlHelperXeTest, givenXeunregisterResourceThenCorrectIoctlCalled) { auto executionEnvironment = std::make_unique(); auto drm = DrmMockXeDebug::create(*executionEnvironment->rootDeviceEnvironments[0]); auto xeIoctlHelper = static_cast(drm->ioctlHelper.get()); + auto &eudebugInterface = xeIoctlHelper->euDebugInterface; + static_cast(eudebugInterface.get())->setCurrentInterfaceType(EuDebugInterfaceType::prelim); + xeIoctlHelper->unregisterResource(0x1234); EXPECT_EQ(drm->metadataID, 0x1234u); } @@ -321,6 +325,8 @@ TEST_F(IoctlHelperXeTest, whenGettingVmBindExtFromHandlesThenProperStructsAreRet auto executionEnvironment = std::make_unique(); auto drm = DrmMockXeDebug::create(*executionEnvironment->rootDeviceEnvironments[0]); auto xeIoctlHelper = static_cast(drm->ioctlHelper.get()); + auto &eudebugInterface = xeIoctlHelper->euDebugInterface; + static_cast(eudebugInterface.get())->setCurrentInterfaceType(EuDebugInterfaceType::prelim); StackVec bindExtHandles; bindExtHandles.push_back(1u); @@ -340,6 +346,26 @@ TEST_F(IoctlHelperXeTest, whenGettingVmBindExtFromHandlesThenProperStructsAreRet EXPECT_EQ(reinterpret_cast(&vmBindExt[2]), vmBindExt[1].base.nextExtension); } +TEST_F(IoctlHelperXeTest, givenUpstreamEuDebugInterfaceThenRegisterAndUnregisterResourceAndPrepareVmBindExtReturnEarly) { + auto executionEnvironment = std::make_unique(); + auto drm = DrmMockXeDebug::create(*executionEnvironment->rootDeviceEnvironments[0]); + auto xeIoctlHelper = static_cast(drm->ioctlHelper.get()); + + constexpr size_t bufferSize = 20; + uint8_t buffer[bufferSize]; + + auto id = xeIoctlHelper->registerResource(DrmResourceClass::elf, buffer, bufferSize); + EXPECT_EQ(id, 0u); + + drm->metadataID = 0x6789u; + xeIoctlHelper->unregisterResource(0x1234); + EXPECT_EQ(drm->metadataID, 0x6789u); + + StackVec bindExtHandles; + auto retVal = xeIoctlHelper->prepareVmBindExt(bindExtHandles, 1); + EXPECT_EQ(retVal, nullptr); +} + TEST_F(IoctlHelperXeTest, givenRegisterIsaHandleWhenIsaIsTileInstancedThenBOCookieSet) { const uint32_t rootDeviceIndex = 0u; auto executionEnvironment = std::make_unique();