diff --git a/level_zero/tools/source/debug/debug_session_imp.cpp b/level_zero/tools/source/debug/debug_session_imp.cpp index 5e6d579347..c5630bbce4 100644 --- a/level_zero/tools/source/debug/debug_session_imp.cpp +++ b/level_zero/tools/source/debug/debug_session_imp.cpp @@ -1495,7 +1495,14 @@ 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(); - auto *regdesc = &stateSaveAreaHeader->regHeader.cmd; + 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 { + UNRECOVERABLE_IF(true); + } PRINT_DEBUGGER_INFO_LOG("Access CMD %d for thread %s\n", command.command, EuThread::toString(threadId).c_str()); 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 26f30a6cd4..b9698f5d65 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 @@ -2500,6 +2500,32 @@ TEST_F(MultiTileDebugSessionTest, GivenMultitileDeviceWhenCallingAreRequestedThr using DebugSessionRegistersAccessTestV3 = Test; +TEST_F(DebugSessionRegistersAccessTestV3, GivenSipVersion3WhenCallingResumeThenResumeInCmdRegisterIsWritten) { + session->debugArea.reserved1 = 1u; + + { + auto pStateSaveAreaHeader = session->getStateSaveAreaHeader(); + auto size = pStateSaveAreaHeader->versionHeader.size * 8 + + pStateSaveAreaHeader->regHeaderV3.state_area_offset + + pStateSaveAreaHeader->regHeaderV3.state_save_size * 16; + session->stateSaveAreaHeader.resize(size); + } + session->skipWriteResumeCommand = false; + + ze_device_thread_t thread = {0, 0, 0, 0}; + EuThread::ThreadId threadId(0, thread); + session->allThreads[threadId]->stopThread(1u); + + dumpRegisterState(); + + auto result = session->resume(thread); + EXPECT_EQ(result, ZE_RESULT_SUCCESS); + + EXPECT_EQ(0u, session->readRegistersCallCount); + EXPECT_EQ(0u, session->writeRegistersCallCount); + EXPECT_EQ(1u, session->writeResumeCommandCalled); +} + TEST_F(DebugSessionRegistersAccessTestV3, givenV3StateSaveHeaderWhenCalculatingSrMagicOffsetResultIsCorrect) { auto pStateSaveAreaHeader = session->getStateSaveAreaHeader();