@@ -5418,15 +5418,23 @@ TEST_F(DebugApiLinuxTest, WhenCallingThreadControlForResumeThenProperIoctlsIsCal
5418
5418
TEST_F (DebugApiLinuxTest, GivenStoppedAndRunningThreadWhenCheckStoppedThreadsAndGenerateEventsCalledThenThreadStoppedEventsGeneratedOnlyForNewlyStoppedThreads) {
5419
5419
zet_debug_config_t config = {};
5420
5420
config.pid = 0x1234 ;
5421
+ const auto memoryHandle = 1u ;
5421
5422
5422
5423
auto sessionMock = std::make_unique<MockDebugSessionLinuxi915>(config, device, 10 );
5423
5424
ASSERT_NE (nullptr , sessionMock);
5425
+ SIP::version version = {2 , 0 , 0 };
5426
+ initStateSaveArea (sessionMock->stateSaveAreaHeader , version, device);
5424
5427
5425
5428
auto handler = new MockIoctlHandler;
5426
5429
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
+
5427
5435
EuThread::ThreadId thread = {0 , 0 , 0 , 0 , 0 };
5428
5436
EuThread::ThreadId thread1 = {0 , 0 , 0 , 0 , 1 };
5429
- const auto memoryHandle = 1u ;
5437
+
5430
5438
sessionMock->allThreads [thread.packed ]->stopThread (memoryHandle);
5431
5439
sessionMock->allThreads [thread.packed ]->reportAsStopped ();
5432
5440
@@ -5449,7 +5457,7 @@ TEST_F(DebugApiLinuxTest, GivenStoppedAndRunningThreadWhenCheckStoppedThreadsAnd
5449
5457
5450
5458
sessionMock->checkStoppedThreadsAndGenerateEvents (threads, memoryHandle, 0 );
5451
5459
5452
- EXPECT_EQ (1 , handler->ioctlCalled );
5460
+ EXPECT_EQ (3 , handler->ioctlCalled );
5453
5461
EXPECT_EQ (1u , handler->euControlArgs .size ());
5454
5462
EXPECT_EQ (2u , sessionMock->numThreadsPassedToThreadControl );
5455
5463
EXPECT_EQ (uint32_t (PRELIM_I915_DEBUG_EU_THREADS_CMD_STOPPED), handler->euControlArgs [0 ].euControl .cmd );
@@ -5471,6 +5479,61 @@ TEST_F(DebugApiLinuxTest, GivenStoppedAndRunningThreadWhenCheckStoppedThreadsAnd
5471
5479
EXPECT_EQ (thread1.thread , event.info .thread .thread .thread );
5472
5480
}
5473
5481
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
+
5474
5537
TEST_F (DebugApiLinuxTest, GivenNoAttentionBitsWhenMultipleThreadsPassedToCheckStoppedThreadsAndGenerateEventsThenThreadsStateNotCheckedAndEventsNotGenerated) {
5475
5538
zet_debug_config_t config = {};
5476
5539
config.pid = 0x1234 ;
@@ -5547,6 +5610,7 @@ TEST_F(DebugApiLinuxTest, GivenNoAttentionBitsWhenSingleThreadPassedToCheckStopp
5547
5610
5548
5611
handler->outputBitmaskSize = bitmaskSize;
5549
5612
handler->outputBitmask = std::move (bitmask);
5613
+ sessionMock->skipCheckForceExceptionBit = true ;
5550
5614
5551
5615
sessionMock->checkStoppedThreadsAndGenerateEvents ({thread1}, memoryHandle, 0 );
5552
5616
0 commit comments