@@ -17,7 +17,10 @@ namespace ult {
1717struct MockDebugSessionWindows : DebugSessionWindows {
1818 using DebugSessionWindows::debugHandle;
1919 using DebugSessionWindows::initialize;
20+ using DebugSessionWindows::moduleDebugAreaCaptured;
2021 using DebugSessionWindows::processId;
22+ using DebugSessionWindows::readAndHandleEvent;
23+ using DebugSessionWindows::wddm;
2124
2225 MockDebugSessionWindows (const zet_debug_config_t &config, L0::Device *device) : DebugSessionWindows(config, device) {}
2326
@@ -28,7 +31,15 @@ struct MockDebugSessionWindows : DebugSessionWindows {
2831 return DebugSessionWindows::initialize ();
2932 }
3033
34+ ze_result_t readAndHandleEvent (uint64_t timeoutMs) override {
35+ if (resultReadAndHandleEvent != ZE_RESULT_FORCE_UINT32) {
36+ return resultReadAndHandleEvent;
37+ }
38+ return DebugSessionWindows::readAndHandleEvent (timeoutMs);
39+ }
40+
3141 ze_result_t resultInitialize = ZE_RESULT_FORCE_UINT32;
42+ ze_result_t resultReadAndHandleEvent = ZE_RESULT_FORCE_UINT32;
3243};
3344
3445struct DebugApiWindowsFixture : public DeviceFixture {
@@ -93,15 +104,39 @@ TEST_F(DebugApiWindowsTest, givenDebugAttachAvailableAndInitializationFailedWhen
93104 EXPECT_EQ (nullptr , debugSession);
94105}
95106
96- TEST_F (DebugApiWindowsTest, givenDebugSessionInitializeCalledThenAttachDebuggerEscapeIsInvoked) {
107+ TEST_F (DebugApiWindowsTest, givenDebugSessionInitializeCalledAndModuleDebugAreaNotCapturedThenAttachDebuggerAndReadEventEscapesAreInvokedAndErrorNotAvailableReturned) {
108+ zet_debug_config_t config = {};
109+ config.pid = 0x1234 ;
110+
111+ // KMD event queue is empty
112+ mockWddm->readEventOutParams .escapeReturnStatus = DBGUMD_RETURN_READ_EVENT_TIMEOUT_EXPIRED;
113+
114+ auto session = std::make_unique<MockDebugSessionWindows>(config, device);
115+ auto result = session->initialize ();
116+
117+ EXPECT_EQ (ZE_RESULT_ERROR_NOT_AVAILABLE, result);
118+ EXPECT_FALSE (session->moduleDebugAreaCaptured );
119+ EXPECT_EQ (1 , mockWddm->dbgUmdEscapeActionCalled [DBGUMD_ACTION_ATTACH_DEBUGGER]);
120+ EXPECT_EQ (1 , mockWddm->dbgUmdEscapeActionCalled [DBGUMD_ACTION_READ_EVENT]);
121+ }
122+
123+ TEST_F (DebugApiWindowsTest, givenDebugSessionInitializeCalledAndModuleDebugAreaCapturedThenAttachDebuggerAndReadEventEscapesAreInvokedAndResultSuccessReturned) {
97124 zet_debug_config_t config = {};
98125 config.pid = 0x1234 ;
99126
127+ GFX_ALLOCATION_DEBUG_DATA_INFO allocDebugDataInfo = {0 };
128+ allocDebugDataInfo.DataType = MODULE_HEAP_DEBUG_AREA;
129+ mockWddm->readEventOutParams .readEventType = DBGUMD_READ_EVENT_ALLOCATION_DATA_INFO;
130+ mockWddm->readEventOutParams .eventParamsBuffer .ReadAdditionalAllocDataParams .NumOfDebugData = 1 ;
131+ mockWddm->readEventOutParams .eventParamsBuffer .ReadAdditionalAllocDataParams .DebugDataBufferPtr = reinterpret_cast <uint64_t >(&allocDebugDataInfo);
132+
100133 auto session = std::make_unique<MockDebugSessionWindows>(config, device);
101134 auto result = session->initialize ();
102135
103136 EXPECT_EQ (ZE_RESULT_SUCCESS, result);
137+ EXPECT_TRUE (session->moduleDebugAreaCaptured );
104138 EXPECT_EQ (1 , mockWddm->dbgUmdEscapeActionCalled [DBGUMD_ACTION_ATTACH_DEBUGGER]);
139+ EXPECT_EQ (1 , mockWddm->dbgUmdEscapeActionCalled [DBGUMD_ACTION_READ_EVENT]);
105140 EXPECT_EQ (session->processId , config.pid );
106141 EXPECT_EQ (session->debugHandle , mockWddm->debugHandle );
107142}
@@ -118,18 +153,52 @@ TEST_F(DebugApiWindowsTest, givenDebugSessionInitializedAndCloseConnectionCalled
118153 zet_debug_config_t config = {};
119154 config.pid = 0x1234 ;
120155
156+ GFX_ALLOCATION_DEBUG_DATA_INFO allocDebugDataInfo = {0 };
157+ allocDebugDataInfo.DataType = MODULE_HEAP_DEBUG_AREA;
158+ mockWddm->readEventOutParams .readEventType = DBGUMD_READ_EVENT_ALLOCATION_DATA_INFO;
159+ mockWddm->readEventOutParams .eventParamsBuffer .ReadAdditionalAllocDataParams .NumOfDebugData = 1 ;
160+ mockWddm->readEventOutParams .eventParamsBuffer .ReadAdditionalAllocDataParams .DebugDataBufferPtr = reinterpret_cast <uint64_t >(&allocDebugDataInfo);
161+
121162 auto session = std::make_unique<MockDebugSessionWindows>(config, device);
122163 auto result = session->initialize ();
123164
124165 EXPECT_EQ (ZE_RESULT_SUCCESS, result);
125166 EXPECT_EQ (1 , mockWddm->dbgUmdEscapeActionCalled [DBGUMD_ACTION_ATTACH_DEBUGGER]);
167+ EXPECT_EQ (1 , mockWddm->dbgUmdEscapeActionCalled [DBGUMD_ACTION_READ_EVENT]);
126168 EXPECT_EQ (session->processId , config.pid );
127169 EXPECT_EQ (session->debugHandle , mockWddm->debugHandle );
128170
129171 EXPECT_TRUE (session->closeConnection ());
130172 EXPECT_EQ (1 , mockWddm->dbgUmdEscapeActionCalled [DBGUMD_ACTION_DETACH_DEBUGGER]);
131173}
132174
175+ TEST_F (DebugApiWindowsTest, givenUnsupportedEventTypeWhenReadAndHandleEventCalledThenResultUnsupportedFeatureIsReturned) {
176+ zet_debug_config_t config = {};
177+ config.pid = 0x1234 ;
178+
179+ auto session = std::make_unique<MockDebugSessionWindows>(config, device);
180+ session->wddm = mockWddm;
181+
182+ for (auto unsupportedEventType : {DBGUMD_READ_EVENT_MODULE_CREATE_NOTIFICATION,
183+ DBGUMD_READ_EVENT_EU_ATTN_BIT_SET,
184+ DBGUMD_READ_EVENT_CONTEXT_CREATE_DESTROY,
185+ DBGUMD_READ_EVENT_DEVICE_CREATE_DESTROY,
186+ DBGUMD_READ_EVENT_CREATE_DEBUG_DATA}) {
187+ mockWddm->readEventOutParams .readEventType = unsupportedEventType;
188+ EXPECT_EQ (ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, session->readAndHandleEvent (100 ));
189+ }
190+ }
191+
192+ TEST_F (DebugApiWindowsTest, givenUnknownEventTypeWhenReadAndHandleEventCalledThenResultUnknownIsReturned) {
193+ zet_debug_config_t config = {};
194+ config.pid = 0x1234 ;
195+
196+ auto session = std::make_unique<MockDebugSessionWindows>(config, device);
197+ session->wddm = mockWddm;
198+ mockWddm->readEventOutParams .readEventType = DBGUMD_READ_EVENT_MAX;
199+ EXPECT_EQ (ZE_RESULT_ERROR_UNKNOWN, session->readAndHandleEvent (100 ));
200+ }
201+
133202TEST (DebugSessionWindowsTest, whenTranslateEscapeErrorStatusCalledThenCorrectZeResultReturned) {
134203 EXPECT_EQ (ZE_RESULT_SUCCESS, DebugSessionWindows::translateEscapeReturnStatusToZeResult (DBGUMD_RETURN_ESCAPE_SUCCESS));
135204 EXPECT_EQ (ZE_RESULT_ERROR_NOT_AVAILABLE, DebugSessionWindows::translateEscapeReturnStatusToZeResult (DBGUMD_RETURN_DEBUGGER_ATTACH_DEVICE_BUSY));
0 commit comments