@@ -5418,15 +5418,23 @@ TEST_F(DebugApiLinuxTest, WhenCallingThreadControlForResumeThenProperIoctlsIsCal
54185418TEST_F (DebugApiLinuxTest, GivenStoppedAndRunningThreadWhenCheckStoppedThreadsAndGenerateEventsCalledThenThreadStoppedEventsGeneratedOnlyForNewlyStoppedThreads) {
54195419 zet_debug_config_t config = {};
54205420 config.pid = 0x1234 ;
5421+ const auto memoryHandle = 1u ;
54215422
54225423 auto sessionMock = std::make_unique<MockDebugSessionLinuxi915>(config, device, 10 );
54235424 ASSERT_NE (nullptr , sessionMock);
5425+ SIP::version version = {2 , 0 , 0 };
5426+ initStateSaveArea (sessionMock->stateSaveAreaHeader , version, device);
54245427
54255428 auto handler = new MockIoctlHandler;
54265429 sessionMock->ioctlHandler .reset (handler);
5430+ handler->setPreadMemory (sessionMock->stateSaveAreaHeader .data (), sessionMock->stateSaveAreaHeader .size (), 0x1000 );
5431+
5432+ DebugSessionLinuxi915::BindInfo cssaInfo = {0x1000 , sessionMock->stateSaveAreaHeader .size ()};
5433+ sessionMock->clientHandleToConnection [MockDebugSessionLinuxi915::mockClientHandle]->vmToContextStateSaveAreaBindInfo [memoryHandle] = cssaInfo;
5434+
54275435 EuThread::ThreadId thread = {0 , 0 , 0 , 0 , 0 };
54285436 EuThread::ThreadId thread1 = {0 , 0 , 0 , 0 , 1 };
5429- const auto memoryHandle = 1u ;
5437+
54305438 sessionMock->allThreads [thread.packed ]->stopThread (memoryHandle);
54315439 sessionMock->allThreads [thread.packed ]->reportAsStopped ();
54325440
@@ -5449,7 +5457,7 @@ TEST_F(DebugApiLinuxTest, GivenStoppedAndRunningThreadWhenCheckStoppedThreadsAnd
54495457
54505458 sessionMock->checkStoppedThreadsAndGenerateEvents (threads, memoryHandle, 0 );
54515459
5452- EXPECT_EQ (1 , handler->ioctlCalled );
5460+ EXPECT_EQ (3 , handler->ioctlCalled );
54535461 EXPECT_EQ (1u , handler->euControlArgs .size ());
54545462 EXPECT_EQ (2u , sessionMock->numThreadsPassedToThreadControl );
54555463 EXPECT_EQ (uint32_t (PRELIM_I915_DEBUG_EU_THREADS_CMD_STOPPED), handler->euControlArgs [0 ].euControl .cmd );
@@ -5471,6 +5479,61 @@ TEST_F(DebugApiLinuxTest, GivenStoppedAndRunningThreadWhenCheckStoppedThreadsAnd
54715479 EXPECT_EQ (thread1.thread , event.info .thread .thread .thread );
54725480}
54735481
5482+ TEST_F (DebugApiLinuxTest, GivenStoppedThreadResumeCausingPageFaultAndFEBitSetWhenCheckStoppedThreadsAndGenerateEventsCalledThenThreadStoppedEventIsNotGenerated) {
5483+ zet_debug_config_t config = {};
5484+ config.pid = 0x1234 ;
5485+ const auto memoryHandle = 1u ;
5486+
5487+ auto sessionMock = std::make_unique<MockDebugSessionLinuxi915>(config, device, 10 );
5488+ ASSERT_NE (nullptr , sessionMock);
5489+ SIP::version version = {2 , 0 , 0 };
5490+ initStateSaveArea (sessionMock->stateSaveAreaHeader , version, device);
5491+
5492+ auto handler = new MockIoctlHandler;
5493+ sessionMock->ioctlHandler .reset (handler);
5494+ handler->setPreadMemory (sessionMock->stateSaveAreaHeader .data (), sessionMock->stateSaveAreaHeader .size (), 0x1000 );
5495+
5496+ DebugSessionLinuxi915::BindInfo cssaInfo = {0x1000 , sessionMock->stateSaveAreaHeader .size ()};
5497+ sessionMock->clientHandleToConnection [MockDebugSessionLinuxi915::mockClientHandle]->vmToContextStateSaveAreaBindInfo [memoryHandle] = cssaInfo;
5498+
5499+ EuThread::ThreadId thread = {0 , 0 , 0 , 0 , 0 };
5500+
5501+ sessionMock->allThreads [thread.packed ]->stopThread (memoryHandle);
5502+ sessionMock->allThreads [thread.packed ]->reportAsStopped ();
5503+ sessionMock->allThreads [thread.packed ]->resumeThread ();
5504+ std::vector<EuThread::ThreadId> threads;
5505+ threads.push_back (thread);
5506+
5507+ for (auto thread : threads) {
5508+ sessionMock->stoppedThreads [thread.packed ] = 3 ;
5509+ }
5510+
5511+ auto regDesc = sessionMock->typeToRegsetDesc (ZET_DEBUG_REGSET_TYPE_CR_INTEL_GPU);
5512+ uint32_t cr0[2 ] = {};
5513+ cr0[1 ] = 1 << 26 ;
5514+
5515+ memcpy_s (sessionMock->stateSaveAreaHeader .data () +
5516+ threadSlotOffset (reinterpret_cast <SIP::StateSaveAreaHeader *>(sessionMock->stateSaveAreaHeader .data ()), thread.slice , thread.subslice , thread.eu , thread.thread ) +
5517+ regOffsetInThreadSlot (regDesc, 0 ),
5518+ regDesc->bytes , cr0, sizeof (cr0));
5519+
5520+ std::unique_ptr<uint8_t []> bitmask;
5521+ size_t bitmaskSize = 0 ;
5522+ auto &hwInfo = neoDevice->getHardwareInfo ();
5523+ auto &l0GfxCoreHelper = neoDevice->getRootDeviceEnvironment ().getHelper <L0GfxCoreHelper>();
5524+ l0GfxCoreHelper.getAttentionBitmaskForSingleThreads (threads, hwInfo, bitmask, bitmaskSize);
5525+
5526+ handler->outputBitmaskSize = bitmaskSize;
5527+ handler->outputBitmask = std::move (bitmask);
5528+
5529+ sessionMock->checkStoppedThreadsAndGenerateEvents (threads, memoryHandle, 0 );
5530+
5531+ EXPECT_EQ (1 , handler->ioctlCalled );
5532+
5533+ EXPECT_FALSE (sessionMock->allThreads [thread.packed ]->isStopped ());
5534+ EXPECT_EQ (0u , sessionMock->apiEvents .size ());
5535+ }
5536+
54745537TEST_F (DebugApiLinuxTest, GivenNoAttentionBitsWhenMultipleThreadsPassedToCheckStoppedThreadsAndGenerateEventsThenThreadsStateNotCheckedAndEventsNotGenerated) {
54755538 zet_debug_config_t config = {};
54765539 config.pid = 0x1234 ;
@@ -5547,6 +5610,7 @@ TEST_F(DebugApiLinuxTest, GivenNoAttentionBitsWhenSingleThreadPassedToCheckStopp
55475610
55485611 handler->outputBitmaskSize = bitmaskSize;
55495612 handler->outputBitmask = std::move (bitmask);
5613+ sessionMock->skipCheckForceExceptionBit = true ;
55505614
55515615 sessionMock->checkStoppedThreadsAndGenerateEvents ({thread1}, memoryHandle, 0 );
55525616
0 commit comments