diff --git a/level_zero/tools/test/unit_tests/sources/debug/debug_session_tests.cpp b/level_zero/tools/test/unit_tests/sources/debug/debug_session_tests.cpp index b465a4e35c..36a5aff5d7 100644 --- a/level_zero/tools/test/unit_tests/sources/debug/debug_session_tests.cpp +++ b/level_zero/tools/test/unit_tests/sources/debug/debug_session_tests.cpp @@ -11,6 +11,7 @@ #include "shared/test/common/mocks/mock_device.h" #include "shared/test/common/mocks/mock_gmm_helper.h" #include "shared/test/common/mocks/mock_sip.h" +#include "shared/test/common/mocks/mock_sip_external_lib.h" #include "shared/test/common/mocks/ult_device_factory.h" #include "shared/test/common/test_macros/hw_test.h" @@ -2851,7 +2852,7 @@ TEST_F(DebugSessionRegistersAccessTestV3, givenTypeToRegsetDescCalledThenCorrect } TEST_F(DebugSessionRegistersAccessTestV3, givenDeviceWithMockSipExternalLibInterfaceWhenTypeToRegsetDescCalledThenReturnsRegsetDescFromMap) { - class MockSipExternalLibForTest : public NEO::SipExternalLib { + class MockSipExternalLibForTest : public MockSipExternalLib { public: int getSipKernelBinary(NEO::Device &device, NEO::SipKernelType type, std::vector &retBinary, std::vector &stateSaveAreaHeader) override { return 0; @@ -2983,7 +2984,7 @@ TEST_F(DebugSessionRegistersAccessTestV3, givenDeviceWithMockSipExternalLibInter } TEST_F(DebugSessionRegistersAccessTestV3, givenDeviceWithMockSipExternalLibInterfaceWhenRegistersAccessHelperCalledThenReturnsSuccess) { - class MockSipExternalLibForTest : public NEO::SipExternalLib { + class MockSipExternalLibForTest : public MockSipExternalLib { public: int getSipKernelBinary(NEO::Device &device, NEO::SipKernelType type, std::vector &retBinary, std::vector &stateSaveAreaHeader) override { return 0; @@ -4639,7 +4640,7 @@ TEST_F(DebugSessionRegistersAccessTestV3, givenDeviceWithoutSipExternalLibInterf } TEST_F(DebugSessionRegistersAccessTestV3, givenDeviceWithMockSipExternalLibInterfaceWhenIsHeaplessModeCalledThenReturnsTrue) { - class MockSipExternalLibForTest : public NEO::SipExternalLib { + class MockSipExternalLibForTest : public MockSipExternalLib { public: int getSipKernelBinary(NEO::Device &device, NEO::SipKernelType type, std::vector &retBinary, std::vector &stateSaveAreaHeader) override { return 0; diff --git a/level_zero/tools/test/unit_tests/sources/debug/linux/xe/test_debug_api_linux_xe.cpp b/level_zero/tools/test/unit_tests/sources/debug/linux/xe/test_debug_api_linux_xe.cpp index 80edcd4856..3b0d9db1a7 100644 --- a/level_zero/tools/test/unit_tests/sources/debug/linux/xe/test_debug_api_linux_xe.cpp +++ b/level_zero/tools/test/unit_tests/sources/debug/linux/xe/test_debug_api_linux_xe.cpp @@ -21,6 +21,7 @@ #include "shared/test/common/libult/linux/drm_mock_helper.h" #include "shared/test/common/mocks/mock_device.h" #include "shared/test/common/mocks/mock_sip.h" +#include "shared/test/common/mocks/mock_sip_external_lib.h" #include "shared/test/common/mocks/ult_device_factory.h" #include "shared/test/common/os_interface/linux/sys_calls_linux_ult.h" #include "shared/test/common/os_interface/linux/xe/eudebug/mock_eudebug_interface.h" @@ -290,7 +291,7 @@ TEST_F(DebugApiLinuxTestXe, WhenOpenDebuggerFailsThenCorrectErrorIsReturned) { TEST_F(DebugApiLinuxTestXe, GivenSipExternalLibWithFailingCreateRegisterDescriptorMapWhenCreatingDebugSessionThenNullptrIsReturned) { // Mock SipExternalLib that fails to create register descriptor map - class MockSipExternalLibFailingCreateMap : public NEO::SipExternalLib { + class MockSipExternalLibFailingCreateMap : public MockSipExternalLib { public: int getSipKernelBinary(NEO::Device &device, NEO::SipKernelType type, std::vector &retBinary, std::vector &stateSaveAreaHeader) override { return 0; // Success for getSipKernelBinary diff --git a/shared/source/built_ins/sip.cpp b/shared/source/built_ins/sip.cpp index 4717d0b474..d9b8943b3e 100644 --- a/shared/source/built_ins/sip.cpp +++ b/shared/source/built_ins/sip.cpp @@ -99,7 +99,10 @@ size_t SipKernel::getStateSaveAreaSize(Device *device) const { auto numSlices = std::max(hwInfo.gtSystemInfo.MaxSlicesSupported, NEO::GfxCoreHelper::getHighestEnabledSlice(hwInfo)); size_t stateSaveAreaSize = 0; - if (hdr->versionHeader.version.major == 4) { + const auto sipExternalLib = device->getSipExternalLibInterface(); + if (sipExternalLib != nullptr) { + stateSaveAreaSize = sipExternalLib->getStateSaveAreaSize(); + } else if (hdr->versionHeader.version.major == 4) { if (debugManager.flags.ForceTotalWMTPDataSize.get() > -1) { stateSaveAreaSize = static_cast(debugManager.flags.ForceTotalWMTPDataSize.get()); } else { diff --git a/shared/source/sip_external_lib/sip_external_lib.h b/shared/source/sip_external_lib/sip_external_lib.h index a3d143cacc..988ce37da5 100644 --- a/shared/source/sip_external_lib/sip_external_lib.h +++ b/shared/source/sip_external_lib/sip_external_lib.h @@ -26,6 +26,7 @@ class SipExternalLib : NonCopyableAndNonMovableClass { virtual int getSipKernelBinary(NEO::Device &device, SipKernelType type, std::vector &retBinary, std::vector &stateSaveAreaHeader) = 0; virtual bool createRegisterDescriptorMap() = 0; virtual SIP::regset_desc *getRegsetDescFromMap(uint32_t type) = 0; + virtual size_t getStateSaveAreaSize() const = 0; }; } // namespace NEO diff --git a/shared/test/common/mocks/mock_sip_external_lib.h b/shared/test/common/mocks/mock_sip_external_lib.h new file mode 100644 index 0000000000..3850687b98 --- /dev/null +++ b/shared/test/common/mocks/mock_sip_external_lib.h @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2025 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#pragma once + +#include "shared/source/sip_external_lib/sip_external_lib.h" + +class MockSipExternalLib : public NEO::SipExternalLib { + public: + std::vector getSipKernelBinaryRetBinary; + std::vector getSipKernelBinaryStateSaveAreaHeader; + int getSipKernelBinaryRetValue = 0; + int getSipKernelBinary(NEO::Device &device, SipKernelType type, std::vector &retBinary, std::vector &stateSaveAreaHeader) override { + retBinary = getSipKernelBinaryRetBinary; + stateSaveAreaHeader = getSipKernelBinaryStateSaveAreaHeader; + return getSipKernelBinaryRetValue; + } + + bool createRegisterDescriptorMapRetValue = true; + bool createRegisterDescriptorMap() override { + return createRegisterDescriptorMapRetValue; + } + + SIP::regset_desc *getRegsetDescFromMapRetValue = nullptr; + SIP::regset_desc *getRegsetDescFromMap(uint32_t type) override { + return getRegsetDescFromMapRetValue; + } + + size_t getStateSaveAreaSizeRetValue = 0; + size_t getStateSaveAreaSize() const override { + return getStateSaveAreaSizeRetValue; + } +}; diff --git a/shared/test/unit_test/built_ins/sip_tests.cpp b/shared/test/unit_test/built_ins/sip_tests.cpp index 431e6d7e51..a1b372c2fa 100644 --- a/shared/test/unit_test/built_ins/sip_tests.cpp +++ b/shared/test/unit_test/built_ins/sip_tests.cpp @@ -12,6 +12,7 @@ #include "shared/source/helpers/gfx_core_helper.h" #include "shared/source/memory_manager/memory_allocation.h" #include "shared/source/os_interface/os_context.h" +#include "shared/source/sip_external_lib/sip_external_lib.h" #include "shared/test/common/fixtures/device_fixture.h" #include "shared/test/common/helpers/debug_manager_state_restore.h" #include "shared/test/common/helpers/engine_descriptor_helper.h" @@ -27,6 +28,7 @@ #include "shared/test/common/mocks/mock_os_context.h" #include "shared/test/common/mocks/mock_release_helper.h" #include "shared/test/common/mocks/mock_sip.h" +#include "shared/test/common/mocks/mock_sip_external_lib.h" #include "shared/test/common/test_macros/hw_test.h" #include "shared/test/common/test_macros/test.h" @@ -992,3 +994,24 @@ TEST_F(DebugExternalLibSipTest, givenGetSipBinaryFromExternalLibRetunsTrueWhenGe debugManager.flags.GetSipBinaryFromExternalLib.set(1); EXPECT_EQ(nullptr, pDevice->getSipExternalLibInterface()); } + +TEST_F(DebugExternalLibSipTest, givenGetSipBinaryFromExternalLibRetunsTrueWhenGetStateSaveAreaSizeCalledThenSizeIsReturned) { + DebugManagerStateRestore restorer; + debugManager.flags.GetSipBinaryFromExternalLib.set(1); + auto lib = new MockSipExternalLib(); + lib->getStateSaveAreaSizeRetValue = 17381; + pDevice->getRootDeviceEnvironmentRef().sipExternalLib.reset(lib); + EXPECT_EQ(alignUp(17381u, MemoryConstants::pageSize), SipKernel::getSipKernel(*pDevice, nullptr).getStateSaveAreaSize(pDevice)); +} + +TEST_F(DebugExternalLibSipTest, givenGetSipBinaryFromExternalLibRetunsTrueAndDebugSipKernelWhenGetStateSaveAreaSizeCalledThenSizeIsReturned) { + DebugManagerStateRestore restorer; + debugManager.flags.GetSipBinaryFromExternalLib.set(1); + auto lib = new MockSipExternalLib(); + lib->getSipKernelBinaryRetBinary = std::vector{0x1, 0x2, 0x3, 0x4}; + lib->getSipKernelBinaryStateSaveAreaHeader = std::vector{0x5, 0x6, 0x7, 0x8}; + lib->getSipKernelBinaryRetValue = 0; + lib->getStateSaveAreaSizeRetValue = 17381; + pDevice->getRootDeviceEnvironmentRef().sipExternalLib.reset(lib); + EXPECT_EQ(alignUp(17381u, MemoryConstants::pageSize), SipKernel::getDebugSipKernel(*pDevice).getStateSaveAreaSize(pDevice)); +} \ No newline at end of file