diff --git a/level_zero/tools/source/debug/windows/debug_session.cpp b/level_zero/tools/source/debug/windows/debug_session.cpp index 358df9abbc..cd03603dcf 100644 --- a/level_zero/tools/source/debug/windows/debug_session.cpp +++ b/level_zero/tools/source/debug/windows/debug_session.cpp @@ -456,10 +456,18 @@ ze_result_t DebugSessionWindows::readMemory(ze_device_thread_t thread, const zet return status; } - if (desc->type != ZET_DEBUG_MEMORY_SPACE_TYPE_DEFAULT) { - return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; + if (desc->type == ZET_DEBUG_MEMORY_SPACE_TYPE_DEFAULT) { + status = readDefaultMemory(thread, desc, size, buffer); + } else { + auto threadId = convertToThreadId(thread); + status = readSLMMemory(threadId, desc, size, buffer); } + return status; +} + +ze_result_t DebugSessionWindows::readDefaultMemory(ze_device_thread_t thread, const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer) { + if (isVAElf(desc, size)) { return readElfSpace(desc, size, buffer); } @@ -493,10 +501,18 @@ ze_result_t DebugSessionWindows::writeMemory(ze_device_thread_t thread, const ze return status; } - if (desc->type != ZET_DEBUG_MEMORY_SPACE_TYPE_DEFAULT) { - return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; + if (desc->type == ZET_DEBUG_MEMORY_SPACE_TYPE_DEFAULT) { + status = writeDefaultMemory(thread, desc, size, buffer); + } else { + auto threadId = convertToThreadId(thread); + status = writeSLMMemory(threadId, desc, size, buffer); } + return status; +} + +ze_result_t DebugSessionWindows::writeDefaultMemory(ze_device_thread_t thread, const zet_debug_memory_space_desc_t *desc, size_t size, const void *buffer) { + uint64_t memoryHandle = DebugSessionWindows::invalidHandle; if (DebugSession::isThreadAll(thread)) { diff --git a/level_zero/tools/source/debug/windows/debug_session.h b/level_zero/tools/source/debug/windows/debug_session.h index 6e8273b116..c6eabbb50d 100644 --- a/level_zero/tools/source/debug/windows/debug_session.h +++ b/level_zero/tools/source/debug/windows/debug_session.h @@ -31,7 +31,10 @@ struct DebugSessionWindows : DebugSessionImp { bool closeConnection() override; ze_result_t readMemory(ze_device_thread_t thread, const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer) override; + ze_result_t readDefaultMemory(ze_device_thread_t thread, const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer); ze_result_t writeMemory(ze_device_thread_t thread, const zet_debug_memory_space_desc_t *desc, size_t size, const void *buffer) override; + ze_result_t writeDefaultMemory(ze_device_thread_t thread, const zet_debug_memory_space_desc_t *desc, size_t size, const void *buffer); + ze_result_t acknowledgeEvent(const zet_debug_event_t *event) override; static ze_result_t translateNtStatusToZeResult(NTSTATUS status); diff --git a/level_zero/tools/test/unit_tests/sources/debug/windows/test_debug_api_windows.cpp b/level_zero/tools/test/unit_tests/sources/debug/windows/test_debug_api_windows.cpp index 808508c355..5e3e1f6ae7 100644 --- a/level_zero/tools/test/unit_tests/sources/debug/windows/test_debug_api_windows.cpp +++ b/level_zero/tools/test/unit_tests/sources/debug/windows/test_debug_api_windows.cpp @@ -1613,6 +1613,35 @@ TEST_F(DebugApiWindowsTest, WhenCallingReadMemoryForExpectedFailureCasesThenErro EXPECT_EQ(ZE_RESULT_ERROR_NOT_AVAILABLE, retVal); } +TEST_F(DebugApiWindowsTest, GivenSipNotUpdatingSipCmdThenAccessToSlmFailsGracefully) { + auto session = std::make_unique(zet_debug_config_t{0x1234}, device); + ASSERT_NE(nullptr, session); + + SIP::version version = {2, 0, 0}; + initStateSaveArea(session->stateSaveAreaHeader, version); + session->stateSaveAreaVA = reinterpret_cast(session->stateSaveAreaHeader.data()); + session->debugHandle = MockDebugSessionWindows::mockDebugHandle; + + mockWddm->srcReadBuffer = mockWddm->dstWriteBuffer = session->stateSaveAreaHeader.data(); + mockWddm->srcReadBufferBaseAddress = mockWddm->dstWriteBufferBaseAddress = session->stateSaveAreaVA; + session->wddm = mockWddm; + + ze_device_thread_t thread = {0, 0, 0, 0}; + session->allThreads[EuThread::ThreadId(0, thread)]->stopThread(1u); + + zet_debug_memory_space_desc_t desc; + desc.type = ZET_DEBUG_MEMORY_SPACE_TYPE_SLM; + desc.address = 0x10000000; + + char output[bufferSize]; + + auto retVal = session->readMemory(thread, &desc, bufferSize, output); + EXPECT_EQ(ZE_RESULT_ERROR_NOT_AVAILABLE, retVal); + + retVal = session->writeMemory(thread, &desc, bufferSize, output); + EXPECT_EQ(ZE_RESULT_ERROR_NOT_AVAILABLE, retVal); +} + TEST_F(DebugApiWindowsTest, GivenModuleDebugAreaVaWhenReadingModuleDebugAreaThenGpuMemoryIsRead) { auto session = std::make_unique(zet_debug_config_t{0x1234}, device); ASSERT_NE(nullptr, session);