Skip to content

Commit b580e4e

Browse files
feature: Enable Support for reading updated StateSaveHeaders
Related-To: NEO-16518 Signed-off-by: Neil R. Spruit <[email protected]>
1 parent a52f526 commit b580e4e

File tree

22 files changed

+385
-181
lines changed

22 files changed

+385
-181
lines changed

config.h.in

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2018-2024 Intel Corporation
2+
* Copyright (C) 2018-2025 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -9,5 +9,6 @@
99
#define CONFIG_H
1010

1111
#cmakedefine NEO_ARCH "${NEO_ARCH}"
12+
#cmakedefine BRANCH_TYPE @BRANCH_TYPE@
1213

1314
#endif /* CONFIG_H */

level_zero/core/test/unit_tests/sources/device/test_l0_device.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include "shared/source/command_container/implicit_scaling.h"
99
#include "shared/source/command_stream/wait_status.h"
10+
#include "shared/source/debugger/DebuggerStateSaveHeader.h"
1011
#include "shared/source/helpers/api_specific_config.h"
1112
#include "shared/source/helpers/bit_helpers.h"
1213
#include "shared/source/helpers/compiler_product_helper.h"
@@ -61,7 +62,6 @@
6162
#include "level_zero/core/test/unit_tests/mocks/mock_memory_manager.h"
6263
#include "level_zero/driver_experimental/zex_common.h"
6364

64-
#include "common/StateSaveAreaHeader.h"
6565
#include "gtest/gtest.h"
6666

6767
#include <memory>

level_zero/tools/source/debug/debug_session_imp.cpp

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1034,13 +1034,7 @@ void DebugSessionImp::validateAndSetStateSaveAreaHeader(uint64_t vmHandle, uint6
10341034
if (0 == strcmp(pStateSaveArea->versionHeader.magic, "tssarea")) {
10351035
size_t size = pStateSaveArea->versionHeader.size * 8u;
10361036
size_t regHeaderSize = 0;
1037-
if (pStateSaveArea->versionHeader.version.major == 3) {
1038-
DEBUG_BREAK_IF(size != sizeof(NEO::StateSaveAreaHeader));
1039-
regHeaderSize = sizeof(SIP::intelgt_state_save_area_V3);
1040-
} else if (pStateSaveArea->versionHeader.version.major < 3) {
1041-
DEBUG_BREAK_IF(size != sizeof(NEO::StateSaveAreaHeader::regHeader) + sizeof(NEO::StateSaveAreaHeader::versionHeader));
1042-
regHeaderSize = sizeof(SIP::intelgt_state_save_area);
1043-
} else {
1037+
if (!getRegHeaderSize(pStateSaveArea, size, regHeaderSize)) {
10441038
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);
10451039
DEBUG_BREAK_IF(true);
10461040
return;
@@ -1104,12 +1098,14 @@ const SIP::regset_desc *DebugSessionImp::getSbaRegsetDesc(L0::Device *device, co
11041098

11051099
static const SIP::regset_desc sbaHeapless = {0, 0, 0, 0};
11061100
static const SIP::regset_desc sba = {0, ZET_DEBUG_SBA_COUNT_INTEL_GPU, 64, 8};
1107-
if (ssah.versionHeader.version.major > 3) {
1101+
if (ssah.versionHeader.version.major > 5) {
11081102
DEBUG_BREAK_IF(true);
11091103
PRINT_DEBUGGER_ERROR_LOG("Unsupported version of State Save Area Header\n", "");
11101104
return nullptr;
11111105
} else if (ssah.versionHeader.version.major == 3 && isHeaplessMode(device, ssah.regHeaderV3)) {
11121106
return &sbaHeapless;
1107+
} else if (ssah.versionHeader.version.major == 5) {
1108+
return &sbaHeapless;
11131109
} else {
11141110
return &sba;
11151111
}
@@ -1522,14 +1518,14 @@ ze_result_t DebugSession::getRegisterSetProperties(Device *device, uint32_t *pCo
15221518
ZET_DEBUG_REGSET_TYPE_DBG_INTEL_GPU,
15231519
ZET_DEBUG_REGSET_TYPE_FC_INTEL_GPU};
15241520

1525-
// Add V3-specific register types
1526-
if (pStateSaveArea->versionHeader.version.major == 3) {
1521+
// Add V3/V5-specific register types
1522+
if (pStateSaveArea->versionHeader.version.major >= 3) {
15271523
regsetTypes.insert(regsetTypes.end(), {ZET_DEBUG_REGSET_TYPE_MSG_INTEL_GPU,
15281524
ZET_DEBUG_REGSET_TYPE_MODE_FLAGS_INTEL_GPU,
15291525
ZET_DEBUG_REGSET_TYPE_DEBUG_SCRATCH_INTEL_GPU});
15301526

15311527
// Conditionally add thread scratch for heapless mode
1532-
if (DebugSessionImp::isHeaplessMode(device, pStateSaveArea->regHeaderV3)) {
1528+
if (DebugSessionImp::isHeaplessMode(device, pStateSaveArea->regHeaderV3) || pStateSaveArea->versionHeader.version.major == 5) {
15331529
regsetTypes.push_back(ZET_DEBUG_REGSET_TYPE_THREAD_SCRATCH_INTEL_GPU);
15341530
}
15351531

@@ -1545,7 +1541,7 @@ ze_result_t DebugSession::getRegisterSetProperties(Device *device, uint32_t *pCo
15451541
}
15461542

15471543
// Handle unsupported version case
1548-
if (pStateSaveArea->versionHeader.version.major > 3) {
1544+
if (pStateSaveArea->versionHeader.version.major > 5) {
15491545
PRINT_DEBUGGER_ERROR_LOG("Unsupported version of State Save Area Header\n", "");
15501546
DEBUG_BREAK_IF(true);
15511547
return ZE_RESULT_ERROR_UNKNOWN;
@@ -1606,14 +1602,8 @@ ze_result_t DebugSessionImp::registersAccessHelper(const EuThread *thread, const
16061602

16071603
ze_result_t DebugSessionImp::cmdRegisterAccessHelper(const EuThread::ThreadId &threadId, SIP::sip_command &command, bool write) {
16081604
auto stateSaveAreaHeader = getStateSaveAreaHeader();
1609-
const SIP::regset_desc *regdesc = nullptr;
1610-
if (stateSaveAreaHeader->versionHeader.version.major == 3) {
1611-
regdesc = &stateSaveAreaHeader->regHeaderV3.cmd;
1612-
} else if (stateSaveAreaHeader->versionHeader.version.major < 3) {
1613-
regdesc = &stateSaveAreaHeader->regHeader.cmd;
1614-
} else {
1615-
PRINT_DEBUGGER_ERROR_LOG("%s: Unsupported version of State Save Area Header\n", __func__);
1616-
DEBUG_BREAK_IF(true);
1605+
SIP::regset_desc regdesc;
1606+
if (getCommandRegisterDescriptor(stateSaveAreaHeader, &regdesc) != ZE_RESULT_SUCCESS) {
16171607
return ZE_RESULT_ERROR_UNKNOWN;
16181608
}
16191609

@@ -1622,7 +1612,7 @@ ze_result_t DebugSessionImp::cmdRegisterAccessHelper(const EuThread::ThreadId &t
16221612
if (connectedDevice->getNEODevice()->getSipExternalLibInterface()) {
16231613
type = connectedDevice->getNEODevice()->getSipExternalLibInterface()->getSipLibCommandRegisterType();
16241614
}
1625-
ze_result_t result = registersAccessHelper(allThreads[threadId].get(), regdesc, 0, 1, type, &command, write);
1615+
ze_result_t result = registersAccessHelper(allThreads[threadId].get(), &regdesc, 0, 1, type, &command, write);
16261616
if (result != ZE_RESULT_SUCCESS) {
16271617
PRINT_DEBUGGER_ERROR_LOG("Failed to access CMD for thread %s\n", EuThread::toString(threadId).c_str());
16281618
}
@@ -1788,17 +1778,19 @@ ze_result_t DebugSessionImp::readFifo(uint64_t vmHandle, std::vector<EuThread::T
17881778
auto stateSaveAreaHeader = getStateSaveAreaHeader();
17891779
if (!stateSaveAreaHeader) {
17901780
return ZE_RESULT_ERROR_UNKNOWN;
1791-
} else if (stateSaveAreaHeader->versionHeader.version.major != 3) {
1781+
} else if (stateSaveAreaHeader->versionHeader.version.major < 3) {
17921782
return ZE_RESULT_SUCCESS;
17931783
}
17941784

17951785
auto gpuVa = getContextStateSaveAreaGpuVa(vmHandle);
17961786

17971787
// Drain the fifo
17981788
uint32_t drainRetries = 2, lastHead = ~0u;
1799-
const uint64_t offsetTail = (sizeof(SIP::StateSaveArea)) + offsetof(struct SIP::intelgt_state_save_area_V3, fifo_tail);
1800-
const uint64_t offsetFifoSize = (sizeof(SIP::StateSaveArea)) + offsetof(struct SIP::intelgt_state_save_area_V3, fifo_size);
1801-
const uint64_t offsetFifo = gpuVa + (stateSaveAreaHeader->versionHeader.size * 8) + stateSaveAreaHeader->regHeaderV3.fifo_offset;
1789+
1790+
uint64_t offsetTail;
1791+
uint64_t offsetFifoSize;
1792+
uint64_t offsetFifo;
1793+
getFifoOffsets(stateSaveAreaHeader, offsetTail, offsetFifoSize, offsetFifo, gpuVa);
18021794

18031795
while (drainRetries--) {
18041796
constexpr uint32_t failsafeTimeoutWait = 50;

level_zero/tools/source/debug/debug_session_imp.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,12 @@
88
#pragma once
99

1010
#include "shared/source/built_ins/sip.h"
11+
#include "shared/source/debugger/DebuggerStateSaveHeader.h"
1112
#include "shared/source/helpers/string.h"
1213

1314
#include "level_zero/tools/source/debug/debug_session.h"
1415
#include "level_zero/zet_intel_gpu_debug.h"
1516

16-
#include "common/StateSaveAreaHeader.h"
17-
1817
#include <atomic>
1918
#include <chrono>
2019
#include <cmath>
@@ -159,9 +158,11 @@ struct DebugSessionImp : DebugSession {
159158
const NEO::StateSaveAreaHeader *getStateSaveAreaHeader();
160159
void dumpDebugSurfaceToFile(uint64_t vmHandle, uint64_t gpuVa, const std::string &path);
161160
void validateAndSetStateSaveAreaHeader(uint64_t vmHandle, uint64_t gpuVa);
161+
bool getRegHeaderSize(const NEO::StateSaveAreaHeader *pStateSaveArea, size_t size, size_t &regHeaderSize);
162162
virtual void readStateSaveAreaHeader(){};
163163
MOCKABLE_VIRTUAL ze_result_t readFifo(uint64_t vmHandle, std::vector<EuThread::ThreadId> &threadsWithAttention);
164164
MOCKABLE_VIRTUAL ze_result_t isValidNode(uint64_t vmHandle, uint64_t gpuVa, SIP::fifo_node &node);
165+
void getFifoOffsets(const NEO::StateSaveAreaHeader *stateSaveAreaHeader, uint64_t &offsetTail, uint64_t &offsetFifoSize, uint64_t &offsetFifo, uint64_t gpuVa);
165166

166167
virtual uint64_t getContextStateSaveAreaGpuVa(uint64_t memoryHandle) = 0;
167168
virtual size_t getContextStateSaveAreaSize(uint64_t memoryHandle) = 0;
@@ -172,6 +173,7 @@ struct DebugSessionImp : DebugSession {
172173
void slmSipVersionCheck();
173174
MOCKABLE_VIRTUAL ze_result_t cmdRegisterAccessHelper(const EuThread::ThreadId &threadId, SIP::sip_command &command, bool write);
174175
MOCKABLE_VIRTUAL ze_result_t waitForCmdReady(EuThread::ThreadId threadId, uint16_t retryCount);
176+
ze_result_t getCommandRegisterDescriptor(const NEO::StateSaveAreaHeader *stateSaveAreaHeader, SIP::regset_desc *regdesc);
175177

176178
uint32_t getRegisterSize(uint32_t type) override;
177179

level_zero/tools/source/debug/debug_session_sip_external_lib.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "level_zero/tools/source/debug/debug_session_sip_external_lib.h"
99

1010
#include "shared/source/device/device.h"
11+
#include "shared/source/sip_external_lib/sip_external_lib.h"
1112

1213
#include "level_zero/core/source/device/device.h"
1314

@@ -40,4 +41,37 @@ uint32_t DebugSessionImp::getSipRegisterType(zet_debug_regset_type_intel_gpu_t z
4041
return static_cast<uint32_t>(zeRegisterType);
4142
}
4243

44+
bool DebugSessionImp::getRegHeaderSize(const NEO::StateSaveAreaHeader *pStateSaveArea, size_t size, size_t &regHeaderSize) {
45+
if (pStateSaveArea->versionHeader.version.major == 3) {
46+
DEBUG_BREAK_IF(size != sizeof(NEO::StateSaveAreaHeader::regHeaderV3) + sizeof(NEO::StateSaveAreaHeader::versionHeader));
47+
regHeaderSize = sizeof(SIP::intelgt_state_save_area_V3);
48+
return true;
49+
} else if (pStateSaveArea->versionHeader.version.major < 3) {
50+
DEBUG_BREAK_IF(size != sizeof(NEO::StateSaveAreaHeader::regHeader) + sizeof(NEO::StateSaveAreaHeader::versionHeader));
51+
regHeaderSize = sizeof(SIP::intelgt_state_save_area);
52+
return true;
53+
}
54+
55+
return false;
56+
}
57+
58+
ze_result_t DebugSessionImp::getCommandRegisterDescriptor(const NEO::StateSaveAreaHeader *stateSaveAreaHeader, SIP::regset_desc *regdesc) {
59+
if (stateSaveAreaHeader->versionHeader.version.major == 3) {
60+
*regdesc = std::move(stateSaveAreaHeader->regHeaderV3.cmd);
61+
} else if (stateSaveAreaHeader->versionHeader.version.major < 3) {
62+
*regdesc = std::move(stateSaveAreaHeader->regHeader.cmd);
63+
} else {
64+
PRINT_DEBUGGER_ERROR_LOG("%s: Unsupported version of State Save Area Header\n", __func__);
65+
DEBUG_BREAK_IF(true);
66+
return ZE_RESULT_ERROR_UNKNOWN;
67+
}
68+
return ZE_RESULT_SUCCESS;
69+
}
70+
71+
void DebugSessionImp::getFifoOffsets(const NEO::StateSaveAreaHeader *stateSaveAreaHeader, uint64_t &offsetTail, uint64_t &offsetFifoSize, uint64_t &offsetFifo, uint64_t gpuVa) {
72+
offsetTail = (sizeof(SIP::StateSaveArea)) + offsetof(struct SIP::intelgt_state_save_area_V3, fifo_tail);
73+
offsetFifoSize = (sizeof(SIP::StateSaveArea)) + offsetof(struct SIP::intelgt_state_save_area_V3, fifo_size);
74+
offsetFifo = gpuVa + (stateSaveAreaHeader->versionHeader.size * 8) + stateSaveAreaHeader->regHeaderV3.fifo_offset;
75+
}
76+
4377
} // namespace L0

level_zero/tools/source/debug/windows/debug_session.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include "level_zero/tools/source/debug/windows/debug_session.h"
99

10+
#include "shared/source/debugger/DebuggerStateSaveHeader.h"
1011
#include "shared/source/device/device.h"
1112
#include "shared/source/execution_environment/root_device_environment.h"
1213
#include "shared/source/gmm_helper/gmm_helper.h"
@@ -17,8 +18,6 @@
1718

1819
#include "level_zero/core/source/gfx_core_helpers/l0_gfx_core_helper.h"
1920

20-
#include "common/StateSaveAreaHeader.h"
21-
2221
namespace L0 {
2322

2423
DebugSession *createDebugSessionHelper(const zet_debug_config_t &config, Device *device, int debugFd, void *params);

level_zero/tools/test/unit_tests/sources/debug/debug_session_common.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#pragma once
99

10+
#include "shared/source/debugger/DebuggerStateSaveHeader.h"
1011
#include "shared/source/debugger/debugger_l0.h"
1112
#include "shared/source/os_interface/os_interface.h"
1213
#include "shared/test/common/mocks/mock_device.h"
@@ -17,8 +18,6 @@
1718
#include "level_zero/core/test/unit_tests/mocks/mock_built_ins.h"
1819
#include "level_zero/core/test/unit_tests/mocks/mock_device.h"
1920

20-
#include "common/StateSaveAreaHeader.h"
21-
2221
namespace L0 {
2322
namespace ult {
2423

0 commit comments

Comments
 (0)