feature: Calculate StateSaveAreaSize with siplib

Related-To: NEO-15642
Signed-off-by: Wesley Waugh <wesley.waugh@intel.com>
This commit is contained in:
Wesley Waugh
2025-10-15 23:14:35 +00:00
committed by Compute-Runtime-Automation
parent 6d00cb7081
commit e2c8175caf
6 changed files with 71 additions and 5 deletions

View File

@@ -11,6 +11,7 @@
#include "shared/test/common/mocks/mock_device.h" #include "shared/test/common/mocks/mock_device.h"
#include "shared/test/common/mocks/mock_gmm_helper.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.h"
#include "shared/test/common/mocks/mock_sip_external_lib.h"
#include "shared/test/common/mocks/ult_device_factory.h" #include "shared/test/common/mocks/ult_device_factory.h"
#include "shared/test/common/test_macros/hw_test.h" #include "shared/test/common/test_macros/hw_test.h"
@@ -2851,7 +2852,7 @@ TEST_F(DebugSessionRegistersAccessTestV3, givenTypeToRegsetDescCalledThenCorrect
} }
TEST_F(DebugSessionRegistersAccessTestV3, givenDeviceWithMockSipExternalLibInterfaceWhenTypeToRegsetDescCalledThenReturnsRegsetDescFromMap) { TEST_F(DebugSessionRegistersAccessTestV3, givenDeviceWithMockSipExternalLibInterfaceWhenTypeToRegsetDescCalledThenReturnsRegsetDescFromMap) {
class MockSipExternalLibForTest : public NEO::SipExternalLib { class MockSipExternalLibForTest : public MockSipExternalLib {
public: public:
int getSipKernelBinary(NEO::Device &device, NEO::SipKernelType type, std::vector<char> &retBinary, std::vector<char> &stateSaveAreaHeader) override { int getSipKernelBinary(NEO::Device &device, NEO::SipKernelType type, std::vector<char> &retBinary, std::vector<char> &stateSaveAreaHeader) override {
return 0; return 0;
@@ -2983,7 +2984,7 @@ TEST_F(DebugSessionRegistersAccessTestV3, givenDeviceWithMockSipExternalLibInter
} }
TEST_F(DebugSessionRegistersAccessTestV3, givenDeviceWithMockSipExternalLibInterfaceWhenRegistersAccessHelperCalledThenReturnsSuccess) { TEST_F(DebugSessionRegistersAccessTestV3, givenDeviceWithMockSipExternalLibInterfaceWhenRegistersAccessHelperCalledThenReturnsSuccess) {
class MockSipExternalLibForTest : public NEO::SipExternalLib { class MockSipExternalLibForTest : public MockSipExternalLib {
public: public:
int getSipKernelBinary(NEO::Device &device, NEO::SipKernelType type, std::vector<char> &retBinary, std::vector<char> &stateSaveAreaHeader) override { int getSipKernelBinary(NEO::Device &device, NEO::SipKernelType type, std::vector<char> &retBinary, std::vector<char> &stateSaveAreaHeader) override {
return 0; return 0;
@@ -4639,7 +4640,7 @@ TEST_F(DebugSessionRegistersAccessTestV3, givenDeviceWithoutSipExternalLibInterf
} }
TEST_F(DebugSessionRegistersAccessTestV3, givenDeviceWithMockSipExternalLibInterfaceWhenIsHeaplessModeCalledThenReturnsTrue) { TEST_F(DebugSessionRegistersAccessTestV3, givenDeviceWithMockSipExternalLibInterfaceWhenIsHeaplessModeCalledThenReturnsTrue) {
class MockSipExternalLibForTest : public NEO::SipExternalLib { class MockSipExternalLibForTest : public MockSipExternalLib {
public: public:
int getSipKernelBinary(NEO::Device &device, NEO::SipKernelType type, std::vector<char> &retBinary, std::vector<char> &stateSaveAreaHeader) override { int getSipKernelBinary(NEO::Device &device, NEO::SipKernelType type, std::vector<char> &retBinary, std::vector<char> &stateSaveAreaHeader) override {
return 0; return 0;

View File

@@ -21,6 +21,7 @@
#include "shared/test/common/libult/linux/drm_mock_helper.h" #include "shared/test/common/libult/linux/drm_mock_helper.h"
#include "shared/test/common/mocks/mock_device.h" #include "shared/test/common/mocks/mock_device.h"
#include "shared/test/common/mocks/mock_sip.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/mocks/ult_device_factory.h"
#include "shared/test/common/os_interface/linux/sys_calls_linux_ult.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" #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) { TEST_F(DebugApiLinuxTestXe, GivenSipExternalLibWithFailingCreateRegisterDescriptorMapWhenCreatingDebugSessionThenNullptrIsReturned) {
// Mock SipExternalLib that fails to create register descriptor map // Mock SipExternalLib that fails to create register descriptor map
class MockSipExternalLibFailingCreateMap : public NEO::SipExternalLib { class MockSipExternalLibFailingCreateMap : public MockSipExternalLib {
public: public:
int getSipKernelBinary(NEO::Device &device, NEO::SipKernelType type, std::vector<char> &retBinary, std::vector<char> &stateSaveAreaHeader) override { int getSipKernelBinary(NEO::Device &device, NEO::SipKernelType type, std::vector<char> &retBinary, std::vector<char> &stateSaveAreaHeader) override {
return 0; // Success for getSipKernelBinary return 0; // Success for getSipKernelBinary

View File

@@ -99,7 +99,10 @@ size_t SipKernel::getStateSaveAreaSize(Device *device) const {
auto numSlices = std::max(hwInfo.gtSystemInfo.MaxSlicesSupported, NEO::GfxCoreHelper::getHighestEnabledSlice(hwInfo)); auto numSlices = std::max(hwInfo.gtSystemInfo.MaxSlicesSupported, NEO::GfxCoreHelper::getHighestEnabledSlice(hwInfo));
size_t stateSaveAreaSize = 0; 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) { if (debugManager.flags.ForceTotalWMTPDataSize.get() > -1) {
stateSaveAreaSize = static_cast<size_t>(debugManager.flags.ForceTotalWMTPDataSize.get()); stateSaveAreaSize = static_cast<size_t>(debugManager.flags.ForceTotalWMTPDataSize.get());
} else { } else {

View File

@@ -26,6 +26,7 @@ class SipExternalLib : NonCopyableAndNonMovableClass {
virtual int getSipKernelBinary(NEO::Device &device, SipKernelType type, std::vector<char> &retBinary, std::vector<char> &stateSaveAreaHeader) = 0; virtual int getSipKernelBinary(NEO::Device &device, SipKernelType type, std::vector<char> &retBinary, std::vector<char> &stateSaveAreaHeader) = 0;
virtual bool createRegisterDescriptorMap() = 0; virtual bool createRegisterDescriptorMap() = 0;
virtual SIP::regset_desc *getRegsetDescFromMap(uint32_t type) = 0; virtual SIP::regset_desc *getRegsetDescFromMap(uint32_t type) = 0;
virtual size_t getStateSaveAreaSize() const = 0;
}; };
} // namespace NEO } // namespace NEO

View File

@@ -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<char> getSipKernelBinaryRetBinary;
std::vector<char> getSipKernelBinaryStateSaveAreaHeader;
int getSipKernelBinaryRetValue = 0;
int getSipKernelBinary(NEO::Device &device, SipKernelType type, std::vector<char> &retBinary, std::vector<char> &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;
}
};

View File

@@ -12,6 +12,7 @@
#include "shared/source/helpers/gfx_core_helper.h" #include "shared/source/helpers/gfx_core_helper.h"
#include "shared/source/memory_manager/memory_allocation.h" #include "shared/source/memory_manager/memory_allocation.h"
#include "shared/source/os_interface/os_context.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/fixtures/device_fixture.h"
#include "shared/test/common/helpers/debug_manager_state_restore.h" #include "shared/test/common/helpers/debug_manager_state_restore.h"
#include "shared/test/common/helpers/engine_descriptor_helper.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_os_context.h"
#include "shared/test/common/mocks/mock_release_helper.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.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/hw_test.h"
#include "shared/test/common/test_macros/test.h" #include "shared/test/common/test_macros/test.h"
@@ -992,3 +994,24 @@ TEST_F(DebugExternalLibSipTest, givenGetSipBinaryFromExternalLibRetunsTrueWhenGe
debugManager.flags.GetSipBinaryFromExternalLib.set(1); debugManager.flags.GetSipBinaryFromExternalLib.set(1);
EXPECT_EQ(nullptr, pDevice->getSipExternalLibInterface()); 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<char>{0x1, 0x2, 0x3, 0x4};
lib->getSipKernelBinaryStateSaveAreaHeader = std::vector<char>{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));
}