feature: Enable Support for reading updated StateSaveHeaders

Related-To: NEO-16518

Signed-off-by: Neil R. Spruit <neil.r.spruit@intel.com>
This commit is contained in:
Neil R. Spruit
2025-11-18 21:58:03 +00:00
committed by Compute-Runtime-Automation
parent a52f526929
commit b580e4e023
22 changed files with 385 additions and 181 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2024 Intel Corporation
* Copyright (C) 2018-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -9,5 +9,6 @@
#define CONFIG_H
#cmakedefine NEO_ARCH "${NEO_ARCH}"
#cmakedefine BRANCH_TYPE @BRANCH_TYPE@
#endif /* CONFIG_H */

View File

@@ -7,6 +7,7 @@
#include "shared/source/command_container/implicit_scaling.h"
#include "shared/source/command_stream/wait_status.h"
#include "shared/source/debugger/DebuggerStateSaveHeader.h"
#include "shared/source/helpers/api_specific_config.h"
#include "shared/source/helpers/bit_helpers.h"
#include "shared/source/helpers/compiler_product_helper.h"
@@ -61,7 +62,6 @@
#include "level_zero/core/test/unit_tests/mocks/mock_memory_manager.h"
#include "level_zero/driver_experimental/zex_common.h"
#include "common/StateSaveAreaHeader.h"
#include "gtest/gtest.h"
#include <memory>

View File

@@ -1034,13 +1034,7 @@ void DebugSessionImp::validateAndSetStateSaveAreaHeader(uint64_t vmHandle, uint6
if (0 == strcmp(pStateSaveArea->versionHeader.magic, "tssarea")) {
size_t size = pStateSaveArea->versionHeader.size * 8u;
size_t regHeaderSize = 0;
if (pStateSaveArea->versionHeader.version.major == 3) {
DEBUG_BREAK_IF(size != sizeof(NEO::StateSaveAreaHeader));
regHeaderSize = sizeof(SIP::intelgt_state_save_area_V3);
} else if (pStateSaveArea->versionHeader.version.major < 3) {
DEBUG_BREAK_IF(size != sizeof(NEO::StateSaveAreaHeader::regHeader) + sizeof(NEO::StateSaveAreaHeader::versionHeader));
regHeaderSize = sizeof(SIP::intelgt_state_save_area);
} else {
if (!getRegHeaderSize(pStateSaveArea, size, regHeaderSize)) {
PRINT_DEBUGGER_ERROR_LOG("Setting Context State Save Area: unsupported version == %d.%d.%d\n", (int)pStateSaveArea->versionHeader.version.major, (int)pStateSaveArea->versionHeader.version.minor, (int)pStateSaveArea->versionHeader.version.patch);
DEBUG_BREAK_IF(true);
return;
@@ -1104,12 +1098,14 @@ const SIP::regset_desc *DebugSessionImp::getSbaRegsetDesc(L0::Device *device, co
static const SIP::regset_desc sbaHeapless = {0, 0, 0, 0};
static const SIP::regset_desc sba = {0, ZET_DEBUG_SBA_COUNT_INTEL_GPU, 64, 8};
if (ssah.versionHeader.version.major > 3) {
if (ssah.versionHeader.version.major > 5) {
DEBUG_BREAK_IF(true);
PRINT_DEBUGGER_ERROR_LOG("Unsupported version of State Save Area Header\n", "");
return nullptr;
} else if (ssah.versionHeader.version.major == 3 && isHeaplessMode(device, ssah.regHeaderV3)) {
return &sbaHeapless;
} else if (ssah.versionHeader.version.major == 5) {
return &sbaHeapless;
} else {
return &sba;
}
@@ -1522,14 +1518,14 @@ ze_result_t DebugSession::getRegisterSetProperties(Device *device, uint32_t *pCo
ZET_DEBUG_REGSET_TYPE_DBG_INTEL_GPU,
ZET_DEBUG_REGSET_TYPE_FC_INTEL_GPU};
// Add V3-specific register types
if (pStateSaveArea->versionHeader.version.major == 3) {
// Add V3/V5-specific register types
if (pStateSaveArea->versionHeader.version.major >= 3) {
regsetTypes.insert(regsetTypes.end(), {ZET_DEBUG_REGSET_TYPE_MSG_INTEL_GPU,
ZET_DEBUG_REGSET_TYPE_MODE_FLAGS_INTEL_GPU,
ZET_DEBUG_REGSET_TYPE_DEBUG_SCRATCH_INTEL_GPU});
// Conditionally add thread scratch for heapless mode
if (DebugSessionImp::isHeaplessMode(device, pStateSaveArea->regHeaderV3)) {
if (DebugSessionImp::isHeaplessMode(device, pStateSaveArea->regHeaderV3) || pStateSaveArea->versionHeader.version.major == 5) {
regsetTypes.push_back(ZET_DEBUG_REGSET_TYPE_THREAD_SCRATCH_INTEL_GPU);
}
@@ -1545,7 +1541,7 @@ ze_result_t DebugSession::getRegisterSetProperties(Device *device, uint32_t *pCo
}
// Handle unsupported version case
if (pStateSaveArea->versionHeader.version.major > 3) {
if (pStateSaveArea->versionHeader.version.major > 5) {
PRINT_DEBUGGER_ERROR_LOG("Unsupported version of State Save Area Header\n", "");
DEBUG_BREAK_IF(true);
return ZE_RESULT_ERROR_UNKNOWN;
@@ -1606,14 +1602,8 @@ ze_result_t DebugSessionImp::registersAccessHelper(const EuThread *thread, const
ze_result_t DebugSessionImp::cmdRegisterAccessHelper(const EuThread::ThreadId &threadId, SIP::sip_command &command, bool write) {
auto stateSaveAreaHeader = getStateSaveAreaHeader();
const SIP::regset_desc *regdesc = nullptr;
if (stateSaveAreaHeader->versionHeader.version.major == 3) {
regdesc = &stateSaveAreaHeader->regHeaderV3.cmd;
} else if (stateSaveAreaHeader->versionHeader.version.major < 3) {
regdesc = &stateSaveAreaHeader->regHeader.cmd;
} else {
PRINT_DEBUGGER_ERROR_LOG("%s: Unsupported version of State Save Area Header\n", __func__);
DEBUG_BREAK_IF(true);
SIP::regset_desc regdesc;
if (getCommandRegisterDescriptor(stateSaveAreaHeader, &regdesc) != ZE_RESULT_SUCCESS) {
return ZE_RESULT_ERROR_UNKNOWN;
}
@@ -1622,7 +1612,7 @@ ze_result_t DebugSessionImp::cmdRegisterAccessHelper(const EuThread::ThreadId &t
if (connectedDevice->getNEODevice()->getSipExternalLibInterface()) {
type = connectedDevice->getNEODevice()->getSipExternalLibInterface()->getSipLibCommandRegisterType();
}
ze_result_t result = registersAccessHelper(allThreads[threadId].get(), regdesc, 0, 1, type, &command, write);
ze_result_t result = registersAccessHelper(allThreads[threadId].get(), &regdesc, 0, 1, type, &command, write);
if (result != ZE_RESULT_SUCCESS) {
PRINT_DEBUGGER_ERROR_LOG("Failed to access CMD for thread %s\n", EuThread::toString(threadId).c_str());
}
@@ -1788,7 +1778,7 @@ ze_result_t DebugSessionImp::readFifo(uint64_t vmHandle, std::vector<EuThread::T
auto stateSaveAreaHeader = getStateSaveAreaHeader();
if (!stateSaveAreaHeader) {
return ZE_RESULT_ERROR_UNKNOWN;
} else if (stateSaveAreaHeader->versionHeader.version.major != 3) {
} else if (stateSaveAreaHeader->versionHeader.version.major < 3) {
return ZE_RESULT_SUCCESS;
}
@@ -1796,9 +1786,11 @@ ze_result_t DebugSessionImp::readFifo(uint64_t vmHandle, std::vector<EuThread::T
// Drain the fifo
uint32_t drainRetries = 2, lastHead = ~0u;
const uint64_t offsetTail = (sizeof(SIP::StateSaveArea)) + offsetof(struct SIP::intelgt_state_save_area_V3, fifo_tail);
const uint64_t offsetFifoSize = (sizeof(SIP::StateSaveArea)) + offsetof(struct SIP::intelgt_state_save_area_V3, fifo_size);
const uint64_t offsetFifo = gpuVa + (stateSaveAreaHeader->versionHeader.size * 8) + stateSaveAreaHeader->regHeaderV3.fifo_offset;
uint64_t offsetTail;
uint64_t offsetFifoSize;
uint64_t offsetFifo;
getFifoOffsets(stateSaveAreaHeader, offsetTail, offsetFifoSize, offsetFifo, gpuVa);
while (drainRetries--) {
constexpr uint32_t failsafeTimeoutWait = 50;

View File

@@ -8,13 +8,12 @@
#pragma once
#include "shared/source/built_ins/sip.h"
#include "shared/source/debugger/DebuggerStateSaveHeader.h"
#include "shared/source/helpers/string.h"
#include "level_zero/tools/source/debug/debug_session.h"
#include "level_zero/zet_intel_gpu_debug.h"
#include "common/StateSaveAreaHeader.h"
#include <atomic>
#include <chrono>
#include <cmath>
@@ -159,9 +158,11 @@ struct DebugSessionImp : DebugSession {
const NEO::StateSaveAreaHeader *getStateSaveAreaHeader();
void dumpDebugSurfaceToFile(uint64_t vmHandle, uint64_t gpuVa, const std::string &path);
void validateAndSetStateSaveAreaHeader(uint64_t vmHandle, uint64_t gpuVa);
bool getRegHeaderSize(const NEO::StateSaveAreaHeader *pStateSaveArea, size_t size, size_t &regHeaderSize);
virtual void readStateSaveAreaHeader(){};
MOCKABLE_VIRTUAL ze_result_t readFifo(uint64_t vmHandle, std::vector<EuThread::ThreadId> &threadsWithAttention);
MOCKABLE_VIRTUAL ze_result_t isValidNode(uint64_t vmHandle, uint64_t gpuVa, SIP::fifo_node &node);
void getFifoOffsets(const NEO::StateSaveAreaHeader *stateSaveAreaHeader, uint64_t &offsetTail, uint64_t &offsetFifoSize, uint64_t &offsetFifo, uint64_t gpuVa);
virtual uint64_t getContextStateSaveAreaGpuVa(uint64_t memoryHandle) = 0;
virtual size_t getContextStateSaveAreaSize(uint64_t memoryHandle) = 0;
@@ -172,6 +173,7 @@ struct DebugSessionImp : DebugSession {
void slmSipVersionCheck();
MOCKABLE_VIRTUAL ze_result_t cmdRegisterAccessHelper(const EuThread::ThreadId &threadId, SIP::sip_command &command, bool write);
MOCKABLE_VIRTUAL ze_result_t waitForCmdReady(EuThread::ThreadId threadId, uint16_t retryCount);
ze_result_t getCommandRegisterDescriptor(const NEO::StateSaveAreaHeader *stateSaveAreaHeader, SIP::regset_desc *regdesc);
uint32_t getRegisterSize(uint32_t type) override;

View File

@@ -8,6 +8,7 @@
#include "level_zero/tools/source/debug/debug_session_sip_external_lib.h"
#include "shared/source/device/device.h"
#include "shared/source/sip_external_lib/sip_external_lib.h"
#include "level_zero/core/source/device/device.h"
@@ -40,4 +41,37 @@ uint32_t DebugSessionImp::getSipRegisterType(zet_debug_regset_type_intel_gpu_t z
return static_cast<uint32_t>(zeRegisterType);
}
bool DebugSessionImp::getRegHeaderSize(const NEO::StateSaveAreaHeader *pStateSaveArea, size_t size, size_t &regHeaderSize) {
if (pStateSaveArea->versionHeader.version.major == 3) {
DEBUG_BREAK_IF(size != sizeof(NEO::StateSaveAreaHeader::regHeaderV3) + sizeof(NEO::StateSaveAreaHeader::versionHeader));
regHeaderSize = sizeof(SIP::intelgt_state_save_area_V3);
return true;
} else if (pStateSaveArea->versionHeader.version.major < 3) {
DEBUG_BREAK_IF(size != sizeof(NEO::StateSaveAreaHeader::regHeader) + sizeof(NEO::StateSaveAreaHeader::versionHeader));
regHeaderSize = sizeof(SIP::intelgt_state_save_area);
return true;
}
return false;
}
ze_result_t DebugSessionImp::getCommandRegisterDescriptor(const NEO::StateSaveAreaHeader *stateSaveAreaHeader, SIP::regset_desc *regdesc) {
if (stateSaveAreaHeader->versionHeader.version.major == 3) {
*regdesc = std::move(stateSaveAreaHeader->regHeaderV3.cmd);
} else if (stateSaveAreaHeader->versionHeader.version.major < 3) {
*regdesc = std::move(stateSaveAreaHeader->regHeader.cmd);
} else {
PRINT_DEBUGGER_ERROR_LOG("%s: Unsupported version of State Save Area Header\n", __func__);
DEBUG_BREAK_IF(true);
return ZE_RESULT_ERROR_UNKNOWN;
}
return ZE_RESULT_SUCCESS;
}
void DebugSessionImp::getFifoOffsets(const NEO::StateSaveAreaHeader *stateSaveAreaHeader, uint64_t &offsetTail, uint64_t &offsetFifoSize, uint64_t &offsetFifo, uint64_t gpuVa) {
offsetTail = (sizeof(SIP::StateSaveArea)) + offsetof(struct SIP::intelgt_state_save_area_V3, fifo_tail);
offsetFifoSize = (sizeof(SIP::StateSaveArea)) + offsetof(struct SIP::intelgt_state_save_area_V3, fifo_size);
offsetFifo = gpuVa + (stateSaveAreaHeader->versionHeader.size * 8) + stateSaveAreaHeader->regHeaderV3.fifo_offset;
}
} // namespace L0

View File

@@ -7,6 +7,7 @@
#include "level_zero/tools/source/debug/windows/debug_session.h"
#include "shared/source/debugger/DebuggerStateSaveHeader.h"
#include "shared/source/device/device.h"
#include "shared/source/execution_environment/root_device_environment.h"
#include "shared/source/gmm_helper/gmm_helper.h"
@@ -17,8 +18,6 @@
#include "level_zero/core/source/gfx_core_helpers/l0_gfx_core_helper.h"
#include "common/StateSaveAreaHeader.h"
namespace L0 {
DebugSession *createDebugSessionHelper(const zet_debug_config_t &config, Device *device, int debugFd, void *params);

View File

@@ -7,6 +7,7 @@
#pragma once
#include "shared/source/debugger/DebuggerStateSaveHeader.h"
#include "shared/source/debugger/debugger_l0.h"
#include "shared/source/os_interface/os_interface.h"
#include "shared/test/common/mocks/mock_device.h"
@@ -17,8 +18,6 @@
#include "level_zero/core/test/unit_tests/mocks/mock_built_ins.h"
#include "level_zero/core/test/unit_tests/mocks/mock_device.h"
#include "common/StateSaveAreaHeader.h"
namespace L0 {
namespace ult {

View File

@@ -5,6 +5,7 @@
*
*/
#include "shared/source/debugger/DebuggerStateSaveHeader.h"
#include "shared/source/helpers/gfx_core_helper.h"
#include "shared/source/sip_external_lib/sip_external_lib.h"
#include "shared/test/common/libult/global_environment.h"
@@ -26,7 +27,6 @@
#include "level_zero/tools/test/unit_tests/sources/debug/mock_debug_session.h"
#include "level_zero/zet_intel_gpu_debug.h"
#include "common/StateSaveAreaHeader.h"
#include "encode_surface_state_args.h"
#include <list>
@@ -2164,25 +2164,6 @@ TEST(DebugSessionTest, GivenSwFifoWhenStateSaveAreaVersionIsLessThanThreeDuringF
EXPECT_EQ(ZE_RESULT_SUCCESS, session->readFifo(0, threadsWithAttention));
}
TEST(DebugSessionTest, GivenSwFifoWhenStateSaveAreaVersionIsGreaterThanThreeDuringFifoReadThenFifoIsNotReadAndSuccessIsReturned) {
auto stateSaveAreaHeader = MockSipData::createStateSaveAreaHeader(2);
reinterpret_cast<NEO::StateSaveAreaHeader *>(stateSaveAreaHeader.data())->versionHeader.version.major = 4;
zet_debug_config_t config = {};
config.pid = 0x1234;
auto hwInfo = *NEO::defaultHwInfo.get();
NEO::MockDevice *neoDevice(NEO::MockDevice::createWithNewExecutionEnvironment<NEO::MockDevice>(&hwInfo, 0));
MockDeviceImp deviceImp(neoDevice);
auto session = std::make_unique<MockDebugSession>(config, &deviceImp);
session->stateSaveAreaHeader.clear();
session->stateSaveAreaHeader.resize(stateSaveAreaHeader.size());
memcpy_s(session->stateSaveAreaHeader.data(), session->stateSaveAreaHeader.size(), stateSaveAreaHeader.data(), stateSaveAreaHeader.size());
std::vector<EuThread::ThreadId> threadsWithAttention;
EXPECT_EQ(ZE_RESULT_SUCCESS, session->readFifo(0, threadsWithAttention));
}
TEST_F(DebugSessionTestSwFifoFixture, GivenSwFifoWhenReadingSwFifoAndIsValidNodeFailsThenFifoReadReturnsError) {
EXPECT_FALSE(session->stateSaveAreaHeader.empty());
std::vector<EuThread::ThreadId> threadsWithAttention;
@@ -3108,7 +3089,7 @@ TEST_F(DebugSessionRegistersAccessTestV3, givenSsaHeaderVersionGreaterThan3WhenT
}
TEST_F(DebugSessionRegistersAccessTestV3, givenSsaHeaderVersionGreaterThan3WhenGetSbaRegsetDescCalledThenNullIsReturned) {
reinterpret_cast<NEO::StateSaveAreaHeader *>(session->stateSaveAreaHeader.data())->versionHeader.version.major = 4;
reinterpret_cast<NEO::StateSaveAreaHeader *>(session->stateSaveAreaHeader.data())->versionHeader.version.major = 99;
auto pStateSaveAreaHeader = session->getStateSaveAreaHeader();
EXPECT_EQ(DebugSessionImp::getSbaRegsetDesc(session->getConnectedDevice(), *pStateSaveAreaHeader), nullptr);
@@ -5394,5 +5375,172 @@ TEST_F(DebugSessionRegistersAccessTestV3, givenSipExternalLibWhenCmdRegisterAcce
rootEnv.sipExternalLib.reset(originalSipLib);
}
// Tests for getSbaRegsetDesc function
TEST_F(DebugSessionRegistersAccessTestV3, GivenGetSbaRegsetDescWhenVersionMajorIs3AndHeaplessModeThenReturnsHeaplessDescriptor) {
NEO::StateSaveAreaHeader header = {};
header.versionHeader.version.major = 3;
header.regHeaderV3.sip_flags = SIP::SIP_FLAG_HEAPLESS;
auto result = L0::DebugSessionImp::getSbaRegsetDesc(deviceImp.get(), header);
ASSERT_NE(result, nullptr);
EXPECT_EQ(result->num, 0u);
EXPECT_EQ(result->offset, 0u);
}
TEST_F(DebugSessionRegistersAccessTestV3, GivenGetSbaRegsetDescWhenVersionMajorIs3AndNotHeaplessModeThenReturnsSbaDescriptor) {
NEO::StateSaveAreaHeader header = {};
header.versionHeader.version.major = 3;
header.regHeaderV3.sip_flags = 0; // Not heapless
auto result = L0::DebugSessionImp::getSbaRegsetDesc(deviceImp.get(), header);
ASSERT_NE(result, nullptr);
EXPECT_EQ(result->num, ZET_DEBUG_SBA_COUNT_INTEL_GPU);
EXPECT_EQ(result->bits, 64u);
EXPECT_EQ(result->bytes, 8u);
}
TEST_F(DebugSessionRegistersAccessTestV3, GivenGetSbaRegsetDescWhenVersionMajorIs5ThenReturnsHeaplessDescriptor) {
NEO::StateSaveAreaHeader header = {};
header.versionHeader.version.major = 5;
auto result = L0::DebugSessionImp::getSbaRegsetDesc(deviceImp.get(), header);
ASSERT_NE(result, nullptr);
EXPECT_EQ(result->num, 0u);
EXPECT_EQ(result->offset, 0u);
}
TEST_F(DebugSessionRegistersAccessTestV3, GivenGetSbaRegsetDescWhenVersionMajorIs2ThenReturnsSbaDescriptor) {
NEO::StateSaveAreaHeader header = {};
header.versionHeader.version.major = 2;
auto result = L0::DebugSessionImp::getSbaRegsetDesc(deviceImp.get(), header);
ASSERT_NE(result, nullptr);
EXPECT_EQ(result->num, ZET_DEBUG_SBA_COUNT_INTEL_GPU);
EXPECT_EQ(result->bits, 64u);
EXPECT_EQ(result->bytes, 8u);
}
TEST_F(DebugSessionRegistersAccessTestV3, GivenGetSbaRegsetDescWhenVersionMajorIs6ThenReturnsNullptr) {
NEO::StateSaveAreaHeader header = {};
header.versionHeader.version.major = 6;
auto result = L0::DebugSessionImp::getSbaRegsetDesc(deviceImp.get(), header);
EXPECT_EQ(result, nullptr);
}
TEST_F(DebugSessionRegistersAccessTestV3, GivenGetSbaRegsetDescWhenVersionMajorIs7ThenReturnsNullptr) {
NEO::StateSaveAreaHeader header = {};
header.versionHeader.version.major = 7;
auto result = L0::DebugSessionImp::getSbaRegsetDesc(deviceImp.get(), header);
EXPECT_EQ(result, nullptr);
}
TEST_F(DebugSessionRegistersAccessTestV3, givenVersion3WithoutHeaplessModeWhenGetRegisterSetPropertiesCalledThenThreadScratchRegsetNotIncluded) {
// Test the false branch of: isHeaplessMode(device, pStateSaveArea->regHeaderV3) || version.major == 5
// Version 3, no heapless flag, no SIP external lib -> THREAD_SCRATCH should NOT be included
auto neoDevice = deviceImp->getNEODevice();
auto &rootEnv = *neoDevice->getExecutionEnvironment()->rootDeviceEnvironments[neoDevice->getRootDeviceIndex()];
auto originalSipLib = rootEnv.sipExternalLib.release();
// Don't set SIP external lib to ensure isHeaplessMode returns false
rootEnv.sipExternalLib.reset(nullptr);
uint32_t count = 0;
auto ret = DebugSession::getRegisterSetProperties(deviceImp.get(), &count, nullptr);
EXPECT_EQ(ZE_RESULT_SUCCESS, ret);
ASSERT_GT(count, 0u);
std::vector<zet_debug_regset_properties_t> props(count);
ret = DebugSession::getRegisterSetProperties(deviceImp.get(), &count, props.data());
EXPECT_EQ(ZE_RESULT_SUCCESS, ret);
bool threadScratchFound = false;
for (auto &p : props) {
if (p.type == ZET_DEBUG_REGSET_TYPE_THREAD_SCRATCH_INTEL_GPU) {
threadScratchFound = true;
break;
}
}
EXPECT_FALSE(threadScratchFound);
rootEnv.sipExternalLib.reset(originalSipLib);
}
TEST_F(DebugSessionRegistersAccessTestV3, givenVersion5WhenGetRegisterSetPropertiesCalledThenThreadScratchRegsetIncluded) {
// Test the true branch of the second part: version.major == 5
// This should include THREAD_SCRATCH regardless of heapless mode
class MockSipExternalLibForV5 : public MockSipExternalLib {
public:
int getSipKernelBinary(NEO::Device &device, NEO::SipKernelType type, std::vector<char> &retBinary, std::vector<char> &stateSaveAreaHeader) override {
// Create a proper StateSaveAreaHeader with version 5
stateSaveAreaHeader.resize(sizeof(NEO::StateSaveAreaHeader));
auto pHeader = reinterpret_cast<NEO::StateSaveAreaHeader *>(stateSaveAreaHeader.data());
pHeader->versionHeader.version.major = 5;
pHeader->versionHeader.version.minor = 0;
pHeader->versionHeader.version.patch = 0;
pHeader->versionHeader.size = sizeof(NEO::StateSaveAreaHeader) / 8;
return 0;
}
bool createRegisterDescriptorMap() override { return true; }
SIP::regset_desc *getRegsetDescFromMap(uint32_t type) override { return nullptr; }
bool getSipLibRegisterAccess(void *sipHandle, SipLibThreadId sipThreadId, uint32_t sipRegisterType, uint32_t *registerCount, uint32_t *registerStartOffset) override { return true; }
uint32_t getSipLibCommandRegisterType() override { return 0; }
};
auto neoDevice = deviceImp->getNEODevice();
auto &rootEnv = *neoDevice->getExecutionEnvironment()->rootDeviceEnvironments[neoDevice->getRootDeviceIndex()];
auto originalSipLib = rootEnv.sipExternalLib.release();
rootEnv.sipExternalLib.reset(new MockSipExternalLibForV5());
// Create a version 5 state save area header manually
NEO::StateSaveAreaHeader stateSaveAreaHeader5 = {};
stateSaveAreaHeader5.versionHeader.version.major = 5;
stateSaveAreaHeader5.versionHeader.version.minor = 0;
stateSaveAreaHeader5.versionHeader.version.patch = 0;
stateSaveAreaHeader5.versionHeader.size = sizeof(NEO::StateSaveAreaHeader) / 8;
memcpy(stateSaveAreaHeader5.versionHeader.magic, "tssarea", 8);
// Initialize regHeaderV3 with minimal valid data (used for V5)
stateSaveAreaHeader5.regHeaderV3.num_slices = 1;
stateSaveAreaHeader5.regHeaderV3.num_subslices_per_slice = 1;
stateSaveAreaHeader5.regHeaderV3.num_eus_per_subslice = 8;
stateSaveAreaHeader5.regHeaderV3.num_threads_per_eu = 7;
stateSaveAreaHeader5.regHeaderV3.grf = {0, 128, 512, 64};
auto mockBuiltins = new MockBuiltins();
mockBuiltins->stateSaveAreaHeader.assign(reinterpret_cast<char *>(&stateSaveAreaHeader5),
reinterpret_cast<char *>(&stateSaveAreaHeader5) + sizeof(NEO::StateSaveAreaHeader));
MockRootDeviceEnvironment::resetBuiltins(neoDevice->getExecutionEnvironment()->rootDeviceEnvironments[0].get(), mockBuiltins);
uint32_t count = 0;
auto ret = DebugSession::getRegisterSetProperties(deviceImp.get(), &count, nullptr);
EXPECT_EQ(ZE_RESULT_SUCCESS, ret);
ASSERT_GT(count, 0u);
std::vector<zet_debug_regset_properties_t> props(count);
ret = DebugSession::getRegisterSetProperties(deviceImp.get(), &count, props.data());
EXPECT_EQ(ZE_RESULT_SUCCESS, ret);
bool threadScratchFound = false;
for (auto &p : props) {
if (p.type == ZET_DEBUG_REGSET_TYPE_THREAD_SCRATCH_INTEL_GPU) {
threadScratchFound = true;
break;
}
}
EXPECT_TRUE(threadScratchFound);
rootEnv.sipExternalLib.reset(originalSipLib);
}
} // namespace ult
} // namespace L0

View File

@@ -5,6 +5,7 @@
*
*/
#include "shared/source/debugger/DebuggerStateSaveHeader.h"
#include "shared/source/device/device.h"
#include "shared/source/os_interface/linux/drm_debug.h"
#include "shared/source/os_interface/linux/i915_prelim.h"
@@ -24,8 +25,6 @@
#include "level_zero/tools/test/unit_tests/sources/debug/debug_session_common.h"
#include "level_zero/tools/test/unit_tests/sources/debug/linux/debug_session_fixtures_linux.h"
#include "common/StateSaveAreaHeader.h"
#include <atomic>
#include <queue>
#include <type_traits>

View File

@@ -10,6 +10,7 @@
// prevent including any other headers to avoid redefinition errors
#define _I915_DRM_H_
#include "shared/source/debugger/DebuggerStateSaveHeader.h"
#include "shared/source/gmm_helper/gmm_helper.h"
#include "shared/source/helpers/aligned_memory.h"
#include "shared/source/helpers/basic_math.h"
@@ -41,8 +42,6 @@
#include "level_zero/tools/test/unit_tests/sources/debug/mock_debug_session.h"
#include "level_zero/zet_intel_gpu_debug.h"
#include "common/StateSaveAreaHeader.h"
#include <fcntl.h>
namespace NEO {

View File

@@ -5,6 +5,7 @@
*
*/
#include "shared/source/debugger/DebuggerStateSaveHeader.h"
#include "shared/source/os_interface/linux/drm_debug.h"
#include "shared/source/os_interface/linux/xe/eudebug/eudebug_interface_upstream.h"
#include "shared/source/os_interface/os_interface.h"
@@ -24,8 +25,6 @@
#include "level_zero/tools/test/unit_tests/sources/debug/debug_session_common.h"
#include "level_zero/tools/test/unit_tests/sources/debug/linux/debug_session_fixtures_linux.h"
#include "common/StateSaveAreaHeader.h"
#include <atomic>
#include <queue>
#include <type_traits>

View File

@@ -5,6 +5,7 @@
*
*/
#include "shared/source/debugger/DebuggerStateSaveHeader.h"
#include "shared/source/gmm_helper/gmm_helper.h"
#include "shared/source/helpers/aligned_memory.h"
#include "shared/source/helpers/basic_math.h"
@@ -41,8 +42,6 @@
#include "level_zero/tools/test/unit_tests/sources/debug/mock_debug_session.h"
#include "level_zero/zet_intel_gpu_debug.h"
#include "common/StateSaveAreaHeader.h"
#include <fcntl.h>
#include <fstream>
#include <type_traits>

View File

@@ -315,7 +315,7 @@ TEST_F(DebugApiTest, givenNonZeroCountAndNullRegsetPointerWhenGetRegisterSetProp
TEST_F(DebugApiTest, givenSsaHeaderVersionGreaterThan3WhenGetRegisterSetPropertiesCalledThenUnknownIsReturned) {
auto stateSaveAreaHeader = MockSipData::createStateSaveAreaHeader(3);
auto versionHeader = &reinterpret_cast<SIP::StateSaveAreaHeader *>(stateSaveAreaHeader.data())->versionHeader;
versionHeader->version.major = 4;
versionHeader->version.major = 99;
mockBuiltins->stateSaveAreaHeader = stateSaveAreaHeader;
uint32_t count = 0;
EXPECT_EQ(ZE_RESULT_ERROR_UNKNOWN, zetDebugGetRegisterSetProperties(device->toHandle(), &count, nullptr));

View File

@@ -6,6 +6,7 @@
*/
#include "shared/source/built_ins/sip.h"
#include "shared/source/debugger/DebuggerStateSaveHeader.h"
#include "shared/source/os_interface/windows/wddm_allocation.h"
#include "shared/source/os_interface/windows/wddm_debug.h"
#include "shared/test/common/helpers/stream_capture.h"
@@ -22,8 +23,6 @@
#include "level_zero/tools/test/unit_tests/sources/debug/debug_session_common.h"
#include "level_zero/tools/test/unit_tests/sources/debug/mock_debug_session.h"
#include "common/StateSaveAreaHeader.h"
namespace L0 {
namespace ult {

View File

@@ -9,6 +9,7 @@
#include "shared/source/built_ins/built_ins.h"
#include "shared/source/debug_settings/debug_settings_manager.h"
#include "shared/source/debugger/DebuggerStateSaveHeader.h"
#include "shared/source/debugger/debugger.h"
#include "shared/source/debugger/debugger_l0.h"
#include "shared/source/device/device.h"
@@ -27,8 +28,6 @@
#include "shared/source/sip_external_lib/sip_external_lib.h"
#include "shared/source/utilities/io_functions.h"
#include "common/StateSaveAreaHeader.h"
namespace NEO {
SipClassType SipKernel::classType = SipClassType::init;

View File

@@ -0,0 +1,23 @@
/*
* Copyright (C) 2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#pragma once
#include "config.h"
#include <stdint.h>
#ifdef BRANCH_TYPE
#define STRINGIFY_HELPER(x) #x
#define STRINGIFY(x) STRINGIFY_HELPER(x)
// clang-format off
#define BRANCH_HEADER_PATH STRINGIFY(BRANCH_TYPE/StateSaveAreaHeaderWrapper.h)
// clang-format on
#include BRANCH_HEADER_PATH
#else
#include "StateSaveAreaHeaderWrapper.h"
#endif

View File

@@ -0,0 +1,24 @@
/*
* Copyright (C) 2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#pragma once
#include "common/StateSaveAreaHeader.h"
namespace NEO {
// NOLINTBEGIN
struct StateSaveAreaHeader {
struct SIP::StateSaveArea versionHeader;
union {
struct SIP::intelgt_state_save_area regHeader;
struct SIP::intelgt_state_save_area_V3 regHeaderV3;
uint64_t totalWmtpDataSize;
};
};
// NOLINTEND
} // namespace NEO

View File

@@ -10,7 +10,7 @@
#include "shared/source/helpers/non_copyable_or_moveable.h"
#include "shared/source/memory_manager/memory_manager.h"
#include "common/StateSaveAreaHeader.h"
#include "DebuggerStateSaveHeader.h"
#include <cstdint>
#include <memory>
@@ -23,18 +23,6 @@ class GraphicsAllocation;
class LinearStream;
class OSInterface;
// NOLINTBEGIN
struct StateSaveAreaHeader {
struct SIP::StateSaveArea versionHeader;
union {
struct SIP::intelgt_state_save_area regHeader;
struct SIP::intelgt_state_save_area_V3 regHeaderV3;
uint64_t totalWmtpDataSize;
};
};
// NOLINTEND
#pragma pack(1)
struct SbaTrackedAddresses {
char magic[8] = "sbaarea";

View File

@@ -5,14 +5,13 @@
*
*/
#include "shared/source/debugger/DebuggerStateSaveHeader.h"
#include "shared/source/debugger/debugger_l0.h"
#include "shared/source/device/device.h"
#include "shared/source/helpers/gfx_core_helper.h"
#include "shared/source/memory_manager/memory_allocation.h"
#include "shared/test/common/mocks/mock_sip.h"
#include "common/StateSaveAreaHeader.h"
#include <cassert>
namespace NEO {
@@ -31,104 +30,99 @@ void clearUseFlags() {
called = false;
}
std::vector<char> createStateSaveAreaHeader(uint32_t version) {
return createStateSaveAreaHeader(version, 128);
}
std::vector<char> createStateSaveAreaHeader(uint32_t version, uint16_t grfNum) {
return createStateSaveAreaHeader(version, grfNum, 1);
}
std::vector<char> createStateSaveAreaHeader(uint32_t version, uint16_t grfNum, uint16_t mmeNum) {
SIP::StateSaveAreaHeader stateSaveAreaHeader = {
{
// versionHeader
"tssarea", // magic
0, // reserved1
{ // version
1, // major
0, // minor
0}, // patch
40, // size
{0, 0, 0}, // reserved2
},
{
// regHeader
1, // num_slices
2, // num_subslices_per_slice
16, // num_eus_per_subslice
7, // num_threads_per_eu
0, // state_area_offset
6144, // state_save_size
0, // slm_area_offset
0, // slm_bank_size
0, // slm_bank_valid
4740, // sr_magic_offset
{0, grfNum, 256, 32}, // grf
{4096, 1, 256, 32}, // addr
{4128, 2, 32, 4}, // flag
{4156, 1, 32, 4}, // emask
{4160, 2, 128, 16}, // sr
{4192, 1, 128, 16}, // cr
{4256, 1, 96, 12}, // notification
{4288, 1, 128, 16}, // tdr
{4320, 10, 256, 32}, // acc
{4320, 10, 256, 32}, // mme
{4672, 1, 32, 4}, // ce
{4704, 1, 128, 16}, // sp
{0, 0, 0, 0}, // cmd
{4640, 1, 128, 16}, // tm
{0, 1, 32, 4}, // fc
{4736, 1, 32, 4}, // dbg
},
SIP::StateSaveArea versionHeaderV1 = {
// versionHeader
"tssarea", // magic
0, // reserved1
{ // version
1, // major
0, // minor
0}, // patch
40, // size
{0, 0, 0}, // reserved2
};
SIP::intelgt_state_save_area regHeaderV1 = {
// regHeader
1, // num_slices
2, // num_subslices_per_slice
16, // num_eus_per_subslice
7, // num_threads_per_eu
0, // state_area_offset
6144, // state_save_size
0, // slm_area_offset
0, // slm_bank_size
0, // slm_bank_valid
4740, // sr_magic_offset
{0, grfNum, 256, 32}, // grf
{4096, 1, 256, 32}, // addr
{4128, 2, 32, 4}, // flag
{4156, 1, 32, 4}, // emask
{4160, 2, 128, 16}, // sr
{4192, 1, 128, 16}, // cr
{4256, 1, 96, 12}, // notification
{4288, 1, 128, 16}, // tdr
{4320, 10, 256, 32}, // acc
{4320, 10, 256, 32}, // mme
{4672, 1, 32, 4}, // ce
{4704, 1, 128, 16}, // sp
{0, 0, 0, 0}, // cmd
{4640, 1, 128, 16}, // tm
{0, 1, 32, 4}, // fc
{4736, 1, 32, 4}, // dbg
};
NEO::StateSaveAreaHeader stateSaveAreaHeader = {};
stateSaveAreaHeader.versionHeader = versionHeaderV1;
stateSaveAreaHeader.regHeader = regHeaderV1;
SIP::StateSaveArea versionHeaderV2 = {
// versionHeader
"tssarea", // magic
0, // reserved1
{ // version
2, // major
0, // minor
0}, // patch
44, // size
{0, 0, 0}, // reserved2
};
SIP::StateSaveAreaHeader stateSaveAreaHeader2 = {
{
// versionHeader
"tssarea", // magic
0, // reserved1
{ // version
2, // major
0, // minor
0}, // patch
44, // size
{0, 0, 0}, // reserved2
},
{
// regHeader
1, // num_slices
1, // num_subslices_per_slice
8, // num_eus_per_subslice
7, // num_threads_per_eu
0, // state_area_offset
6144, // state_save_size
0, // slm_area_offset
0, // slm_bank_size
0, // slm_bank_valid
4740, // sr_magic_offset
{0, grfNum, 256, 32}, // grf
{4096, 1, 256, 32}, // addr
{4128, 2, 32, 4}, // flag
{4156, 1, 32, 4}, // emask
{4160, 2, 128, 16}, // sr
{4192, 1, 128, 16}, // cr
{4256, 1, 96, 12}, // notification
{4288, 1, 128, 16}, // tdr
{4320, 10, 256, 32}, // acc
{4320, mmeNum, 256, 32}, // mme
{4672, 1, 32, 4}, // ce
{4704, 1, 128, 16}, // sp
{4768, 1, 128 * 8, 128}, // cmd
{4640, 1, 128, 16}, // tm
{0, 1, 32, 4}, // fc
{4736, 1, 32, 4}, // dbg
{4744, 1, 64, 8}, // ctx
{4752, 1, 64, 8}, // dbg_reg
},
SIP::intelgt_state_save_area regHeaderV2 = {
// regHeader
1, // num_slices
1, // num_subslices_per_slice
8, // num_eus_per_subslice
7, // num_threads_per_eu
0, // state_area_offset
6144, // state_save_size
0, // slm_area_offset
0, // slm_bank_size
0, // slm_bank_valid
4740, // sr_magic_offset
{0, grfNum, 256, 32}, // grf
{4096, 1, 256, 32}, // addr
{4128, 2, 32, 4}, // flag
{4156, 1, 32, 4}, // emask
{4160, 2, 128, 16}, // sr
{4192, 1, 128, 16}, // cr
{4256, 1, 96, 12}, // notification
{4288, 1, 128, 16}, // tdr
{4320, 10, 256, 32}, // acc
{4320, mmeNum, 256, 32}, // mme
{4672, 1, 32, 4}, // ce
{4704, 1, 128, 16}, // sp
{4768, 1, 128 * 8, 128}, // cmd
{4640, 1, 128, 16}, // tm
{0, 1, 32, 4}, // fc
{4736, 1, 32, 4}, // dbg
{4744, 1, 64, 8}, // ctx
{4752, 1, 64, 8}, // dbg_reg
};
NEO::StateSaveAreaHeader stateSaveAreaHeader2 = {};
stateSaveAreaHeader2.versionHeader = versionHeaderV2;
stateSaveAreaHeader2.regHeader = regHeaderV2;
SIP::StateSaveArea versionHeader = {
SIP::StateSaveArea versionHeaderV3 = {
// versionHeader
"tssarea", // magic
0, // reserved1
@@ -180,7 +174,7 @@ std::vector<char> createStateSaveAreaHeader(uint32_t version, uint16_t grfNum, u
{4768, 1, 64, 8}, // msg
};
NEO::StateSaveAreaHeader stateSaveAreaHeader3 = {};
stateSaveAreaHeader3.versionHeader = versionHeader;
stateSaveAreaHeader3.versionHeader = versionHeaderV3;
stateSaveAreaHeader3.regHeaderV3 = regHeaderV3;
NEO::StateSaveAreaHeader stateSaveAreaHeader4 = {
@@ -223,6 +217,14 @@ std::vector<char> createStateSaveAreaHeader(uint32_t version, uint16_t grfNum, u
return std::vector<char>(begin, begin + sizeOfHeader);
}
std::vector<char> createStateSaveAreaHeader(uint32_t version) {
return createStateSaveAreaHeader(version, 128);
}
std::vector<char> createStateSaveAreaHeader(uint32_t version, uint16_t grfNum) {
return createStateSaveAreaHeader(version, grfNum, 1);
}
} // namespace MockSipData
bool SipKernel::initSipKernel(SipKernelType type, Device &device) {

View File

@@ -8,6 +8,7 @@
#include "shared/test/common/mocks/mock_compilers.h"
#include "shared/source/compiler_interface/compiler_options.h"
#include "shared/source/debugger/DebuggerStateSaveHeader.h"
#include "shared/source/helpers/hw_info.h"
#include "shared/source/os_interface/os_inc_base.h"
#include "shared/test/common/helpers/mock_file_io.h"
@@ -16,7 +17,6 @@
#include "shared/test/common/mocks/mock_sip.h"
#include "cif/macros/enable.h"
#include "common/StateSaveAreaHeader.h"
#include "ocl_igc_interface/fcl_ocl_device_ctx.h"
#include "ocl_igc_interface/igc_ocl_device_ctx.h"

View File

@@ -7,11 +7,10 @@
#include "shared/test/common/mocks/mock_sip.h"
#include "shared/source/debugger/DebuggerStateSaveHeader.h"
#include "shared/source/helpers/string.h"
#include "shared/source/memory_manager/memory_allocation.h"
#include "common/StateSaveAreaHeader.h"
namespace NEO {
static constexpr SIP::StateSaveAreaHeaderV3 mockSipStateSaveAreaHeaderV3 = {

View File

@@ -7,6 +7,7 @@
#include "shared/source/built_ins/built_ins.h"
#include "shared/source/command_stream/command_stream_receiver.h"
#include "shared/source/debugger/DebuggerStateSaveHeader.h"
#include "shared/source/debugger/debugger_l0.h"
#include "shared/source/helpers/aligned_memory.h"
#include "shared/source/helpers/gfx_core_helper.h"
@@ -32,8 +33,6 @@
#include "shared/test/common/test_macros/hw_test.h"
#include "shared/test/common/test_macros/test.h"
#include "common/StateSaveAreaHeader.h"
#include <map>
using namespace NEO;