55 *
66 */
77
8+ #include " shared/source/built_ins/sip.h"
89#include " shared/source/os_interface/windows/wddm_allocation.h"
10+ #include " shared/test/common/mocks/mock_sip.h"
911#include " shared/test/common/mocks/windows/mock_wddm_eudebug.h"
1012#include " shared/test/common/test_macros/hw_test.h"
1113
1214#include " level_zero/core/test/unit_tests/fixtures/device_fixture.h"
1315#include " level_zero/tools/source/debug/windows/debug_session.h"
1416
17+ #include " common/StateSaveAreaHeader.h"
18+
1519namespace L0 {
1620namespace ult {
1721
@@ -20,6 +24,8 @@ struct MockDebugSessionWindows : DebugSessionWindows {
2024 using DebugSessionWindows::allElfs;
2125 using DebugSessionWindows::asyncThread;
2226 using DebugSessionWindows::closeAsyncThread;
27+ using DebugSessionWindows::debugArea;
28+ using DebugSessionWindows::debugAreaVA;
2329 using DebugSessionWindows::debugHandle;
2430 using DebugSessionWindows::ElfRange;
2531 using DebugSessionWindows::getSbaBufferGpuVa;
@@ -30,11 +36,16 @@ struct MockDebugSessionWindows : DebugSessionWindows {
3036 using DebugSessionWindows::readAllocationDebugData;
3137 using DebugSessionWindows::readAndHandleEvent;
3238 using DebugSessionWindows::readGpuMemory;
39+ using DebugSessionWindows::readModuleDebugArea;
3340 using DebugSessionWindows::readSbaBuffer;
41+ using DebugSessionWindows::readStateSaveAreaHeader;
3442 using DebugSessionWindows::runEscape;
3543 using DebugSessionWindows::startAsyncThread;
44+ using DebugSessionWindows::stateSaveAreaCaptured;
45+ using DebugSessionWindows::stateSaveAreaVA;
3646 using DebugSessionWindows::wddm;
3747 using DebugSessionWindows::writeGpuMemory;
48+ using L0::DebugSessionImp::getStateSaveAreaHeader;
3849 using L0::DebugSessionImp::isValidGpuAddress;
3950
4051 MockDebugSessionWindows (const zet_debug_config_t &config, L0::Device *device) : DebugSessionWindows(config, device) {}
@@ -336,6 +347,7 @@ TEST_F(DebugApiWindowsTest, givenDebugSessionInitializeCalledAndEventQueueIsNotA
336347
337348 EXPECT_EQ (ZE_RESULT_SUCCESS, result);
338349 EXPECT_TRUE (session->moduleDebugAreaCaptured );
350+ EXPECT_EQ (session->debugAreaVA , 0x12345678U );
339351 EXPECT_EQ (1u , mockWddm->dbgUmdEscapeActionCalled [DBGUMD_ACTION_ATTACH_DEBUGGER]);
340352 EXPECT_EQ (3u , mockWddm->dbgUmdEscapeActionCalled [DBGUMD_ACTION_READ_EVENT]);
341353 EXPECT_EQ (1u , mockWddm->dbgUmdEscapeActionCalled [DBGUMD_ACTION_READ_ALLOCATION_DATA]);
@@ -470,6 +482,27 @@ TEST_F(DebugApiWindowsTest, givenDebugDataEventTypeWhenReadAndHandleEventCalledT
470482 EXPECT_EQ (elf.endVA , 0xa008u );
471483}
472484
485+ TEST_F (DebugApiWindowsTest, givenAllocationEventTypeForStateSaveWhenReadAndHandleEventCalledThenStateSaveIsCaptured) {
486+ zet_debug_config_t config = {};
487+ config.pid = 0x1234 ;
488+ auto session = std::make_unique<MockDebugSessionWindows>(config, device);
489+ session->wddm = mockWddm;
490+
491+ mockWddm->numEvents = 1 ;
492+ mockWddm->eventQueue [0 ].readEventType = DBGUMD_READ_EVENT_ALLOCATION_DATA_INFO;
493+ mockWddm->eventQueue [0 ].eventParamsBuffer .eventParamsBuffer .ReadAdditionalAllocDataParams .NumOfDebugData = 1 ;
494+ GFX_ALLOCATION_DEBUG_DATA_INFO *allocDebugDataInfo = reinterpret_cast <GFX_ALLOCATION_DEBUG_DATA_INFO *>(&mockWddm->eventQueue [0 ].eventParamsBuffer .eventParamsBuffer .ReadAdditionalAllocDataParams .DebugDataBufferPtr );
495+ allocDebugDataInfo->DataType = SIP_CONTEXT_SAVE_AREA;
496+
497+ WddmAllocation::RegistrationData registrationData = {0x12345678 , 0x1000 };
498+ mockWddm->readAllocationDataOutParams .outData = ®istrationData;
499+ mockWddm->readAllocationDataOutParams .outDataSize = sizeof (registrationData);
500+
501+ EXPECT_EQ (ZE_RESULT_SUCCESS, session->readAndHandleEvent (100 ));
502+ EXPECT_EQ (session->stateSaveAreaVA .load (), 0x12345678u );
503+ EXPECT_TRUE (session->stateSaveAreaCaptured );
504+ }
505+
473506TEST_F (DebugApiWindowsTest, givenContextCreateEventTypeWhenReadAndHandleEventCalledThenAllContextsIsSetCorrectly) {
474507 zet_debug_config_t config = {};
475508 config.pid = 0x1234 ;
@@ -927,5 +960,117 @@ TEST_F(DebugApiWindowsTest, WhenCallingReadMemoryForExpectedFailureCasesThenErro
927960 EXPECT_EQ (ZE_RESULT_ERROR_NOT_AVAILABLE, retVal);
928961}
929962
963+ TEST_F (DebugApiWindowsTest, GivenModuleDebugAreaVaWhenReadingModuleDebugAreaThenGpuMemoryIsRead) {
964+ auto session = std::make_unique<MockDebugSessionWindows>(zet_debug_config_t {0x1234 }, device);
965+ ASSERT_NE (nullptr , session);
966+ session->wddm = mockWddm;
967+ session->debugHandle = MockDebugSessionWindows::mockDebugHandle;
968+ session->allContexts .insert (0x12345 );
969+ session->moduleDebugAreaCaptured = true ;
970+ session->debugAreaVA = 0xABCDABCD ;
971+
972+ DebugAreaHeader debugArea;
973+ debugArea.reserved1 = 1 ;
974+ debugArea.pgsize = uint8_t (4 );
975+ debugArea.version = 1 ;
976+ mockWddm->srcReadBuffer = &debugArea;
977+
978+ auto retVal = session->readModuleDebugArea ();
979+ EXPECT_TRUE (retVal);
980+ ASSERT_EQ (1 , mockWddm->dbgUmdEscapeActionCalled [DBGUMD_ACTION_READ_GFX_MEMORY]);
981+ EXPECT_EQ (1u , session->debugArea .reserved1 );
982+ EXPECT_EQ (1u , session->debugArea .version );
983+ EXPECT_EQ (4u , session->debugArea .pgsize );
984+ }
985+
986+ TEST_F (DebugApiWindowsTest, GivenModuleDebugAreaVaWhenReadingModuleDebugAreaReturnsIncorrectDataThenFailIsReturned) {
987+ auto session = std::make_unique<MockDebugSessionWindows>(zet_debug_config_t {0x1234 }, device);
988+ ASSERT_NE (nullptr , session);
989+ session->wddm = mockWddm;
990+ session->debugHandle = MockDebugSessionWindows::mockDebugHandle;
991+ session->allContexts .insert (0x12345 );
992+ session->moduleDebugAreaCaptured = true ;
993+ session->debugAreaVA = 0xABCDABCD ;
994+
995+ DebugAreaHeader debugArea;
996+ debugArea.magic [0 ] = ' x' ;
997+ mockWddm->srcReadBuffer = &debugArea;
998+
999+ auto retVal = session->readModuleDebugArea ();
1000+ EXPECT_FALSE (retVal);
1001+ }
1002+
1003+ TEST_F (DebugApiWindowsTest, GivenErrorInModuleDebugAreaDataWhenReadingModuleDebugAreaThenGpuMemoryIsNotReadAndFalseReturned) {
1004+ auto session = std::make_unique<MockDebugSessionWindows>(zet_debug_config_t {0x1234 }, device);
1005+ ASSERT_NE (nullptr , session);
1006+ session->wddm = mockWddm;
1007+ session->debugHandle = MockDebugSessionWindows::mockDebugHandle;
1008+
1009+ auto retVal = session->readModuleDebugArea ();
1010+ EXPECT_FALSE (retVal);
1011+ ASSERT_EQ (0 , mockWddm->dbgUmdEscapeActionCalled [DBGUMD_ACTION_READ_GFX_MEMORY]);
1012+ session->moduleDebugAreaCaptured = true ;
1013+ retVal = session->readModuleDebugArea ();
1014+ EXPECT_FALSE (retVal);
1015+ ASSERT_EQ (0 , mockWddm->dbgUmdEscapeActionCalled [DBGUMD_ACTION_READ_GFX_MEMORY]);
1016+ session->allContexts .insert (0x12345 );
1017+ mockWddm->escapeReturnStatus = DBGUMD_RETURN_INVALID_ARGS;
1018+ retVal = session->readModuleDebugArea ();
1019+ EXPECT_FALSE (retVal);
1020+ ASSERT_EQ (1 , mockWddm->dbgUmdEscapeActionCalled [DBGUMD_ACTION_READ_GFX_MEMORY]);
1021+ }
1022+
1023+ TEST_F (DebugApiWindowsTest, GivenStateSaveAreaVaWhenReadingStateSaveAreaThenGpuMemoryIsRead) {
1024+ auto session = std::make_unique<MockDebugSessionWindows>(zet_debug_config_t {0x1234 }, device);
1025+ ASSERT_NE (nullptr , session);
1026+ session->wddm = mockWddm;
1027+ session->debugHandle = MockDebugSessionWindows::mockDebugHandle;
1028+ session->allContexts .insert (0x12345 );
1029+ session->stateSaveAreaCaptured = true ;
1030+ session->stateSaveAreaVA .store (0xABCDABCD );
1031+ auto stateSaveAreaHeader = MockSipData::createStateSaveAreaHeader (2 );
1032+ mockWddm->srcReadBuffer = stateSaveAreaHeader.data ();
1033+
1034+ session->readStateSaveAreaHeader ();
1035+ ASSERT_EQ (1 , mockWddm->dbgUmdEscapeActionCalled [DBGUMD_ACTION_READ_GFX_MEMORY]);
1036+ auto stateSaveAreaRead = session->getStateSaveAreaHeader ();
1037+ ASSERT_NE (nullptr , stateSaveAreaRead);
1038+ EXPECT_EQ (0 , memcmp (stateSaveAreaRead, stateSaveAreaHeader.data (), sizeof (SIP::StateSaveAreaHeader)));
1039+ }
1040+
1041+ TEST_F (DebugApiWindowsTest, GivenStateSaveAreaVaWhenReadingStateSaveAreaReturnsIncorrectDataThenStateSaveAreaIsNotUpdated) {
1042+ auto session = std::make_unique<MockDebugSessionWindows>(zet_debug_config_t {0x1234 }, device);
1043+ ASSERT_NE (nullptr , session);
1044+ session->wddm = mockWddm;
1045+ session->debugHandle = MockDebugSessionWindows::mockDebugHandle;
1046+ session->allContexts .insert (0x12345 );
1047+ session->stateSaveAreaCaptured = true ;
1048+ session->stateSaveAreaVA .store (0xABCDABCD );
1049+ auto stateSaveAreaHeader = MockSipData::createStateSaveAreaHeader (2 );
1050+ stateSaveAreaHeader[3 ] = ' x' ;
1051+ mockWddm->srcReadBuffer = stateSaveAreaHeader.data ();
1052+
1053+ session->readStateSaveAreaHeader ();
1054+ ASSERT_EQ (1 , mockWddm->dbgUmdEscapeActionCalled [DBGUMD_ACTION_READ_GFX_MEMORY]);
1055+ auto stateSaveAreaRead = session->getStateSaveAreaHeader ();
1056+ ASSERT_EQ (nullptr , stateSaveAreaRead);
1057+ }
1058+
1059+ TEST_F (DebugApiWindowsTest, GivenErrorCasesWhenReadingStateSaveAreThenMemoryIsNotRead) {
1060+ auto session = std::make_unique<MockDebugSessionWindows>(zet_debug_config_t {0x1234 }, device);
1061+ ASSERT_NE (nullptr , session);
1062+ session->wddm = mockWddm;
1063+ session->debugHandle = MockDebugSessionWindows::mockDebugHandle;
1064+ session->readStateSaveAreaHeader ();
1065+ ASSERT_EQ (0 , mockWddm->dbgUmdEscapeActionCalled [DBGUMD_ACTION_READ_GFX_MEMORY]);
1066+ session->stateSaveAreaCaptured = true ;
1067+ session->readStateSaveAreaHeader ();
1068+ ASSERT_EQ (0 , mockWddm->dbgUmdEscapeActionCalled [DBGUMD_ACTION_READ_GFX_MEMORY]);
1069+ session->allContexts .insert (0x12345 );
1070+ mockWddm->escapeReturnStatus = DBGUMD_RETURN_INVALID_ARGS;
1071+ session->readStateSaveAreaHeader ();
1072+ ASSERT_EQ (1 , mockWddm->dbgUmdEscapeActionCalled [DBGUMD_ACTION_READ_GFX_MEMORY]);
1073+ }
1074+
9301075} // namespace ult
9311076} // namespace L0
0 commit comments