Skip to content

Commit be7c45b

Browse files
Fix registering and unregistering module debug handle
- do not unregister module handle if not registered before Signed-off-by: Mateusz Hoppe <[email protected]>
1 parent b626752 commit be7c45b

File tree

4 files changed

+51
-2
lines changed

4 files changed

+51
-2
lines changed

level_zero/core/source/debugger/linux/debugger_l0_linux.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ bool DebuggerL0::attachZebinModuleToSegmentAllocations(const StackVec<NEO::Graph
5050
}
5151

5252
bool DebuggerL0::removeZebinModule(uint32_t moduleHandle) {
53-
if (device->getRootDeviceEnvironment().osInterface == nullptr) {
53+
if (device->getRootDeviceEnvironment().osInterface == nullptr || moduleHandle == 0) {
5454
return false;
5555
}
5656
auto drm = device->getRootDeviceEnvironment().osInterface->getDriverModel()->as<NEO::Drm>();

level_zero/core/source/module/module_imp.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ struct ModuleImp : public Module {
8888
auto tempHandle = debugModuleHandle;
8989
auto tempDevice = device;
9090
delete this;
91-
if (tempDevice->getL0Debugger()) {
91+
if (tempDevice->getL0Debugger() && tempHandle != 0) {
9292
tempDevice->getL0Debugger()->removeZebinModule(tempHandle);
9393
}
9494
return ZE_RESULT_SUCCESS;

level_zero/core/test/unit_tests/sources/debugger/linux/test_l0_debugger_linux.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,13 @@ TEST_F(L0DebuggerLinuxTest, givenModuleHandleWhenRemoveZebinModuleIsCalledThenHa
220220
EXPECT_EQ(20u, drmMock->unregisteredHandle);
221221
}
222222

223+
TEST_F(L0DebuggerLinuxTest, givenModuleHandleZeroWhenRemoveZebinModuleIsCalledThenDrmUnregisterIsNotCalled) {
224+
uint32_t handle = 0;
225+
226+
EXPECT_FALSE(device->getL0Debugger()->removeZebinModule(handle));
227+
EXPECT_EQ(0u, drmMock->unregisterCalledCount);
228+
}
229+
223230
HWTEST_F(L0DebuggerLinuxTest, givenDebuggingEnabledAndCommandQueuesAreCreatedAndDestroyedThanDebuggerL0IsNotified) {
224231
auto debuggerL0Hw = static_cast<MockDebuggerL0Hw<FamilyType> *>(device->getL0Debugger());
225232

level_zero/core/test/unit_tests/sources/debugger/test_module_with_debug.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,48 @@ HWTEST_F(ModuleWithZebinAndL0DebuggerTest, GivenZebinWhenModuleIsInitializedAndD
644644
EXPECT_EQ(6u, getMockDebuggerL0Hw<FamilyType>()->removedZebinModuleHandle);
645645
}
646646

647+
HWTEST_F(ModuleWithZebinAndL0DebuggerTest, GivenModuleDebugHandleZeroWhenInitializingAndDestoryingModuleThenHandleIsNotPassedToDebugger) {
648+
NEO::MockCompilerEnableGuard mock(true);
649+
auto cip = new NEO::MockCompilerInterfaceCaptureBuildOptions();
650+
neoDevice->getExecutionEnvironment()->rootDeviceEnvironments[neoDevice->getRootDeviceIndex()]->compilerInterface.reset(cip);
651+
uint8_t binary[10];
652+
ze_module_desc_t moduleDesc = {};
653+
moduleDesc.format = ZE_MODULE_FORMAT_IL_SPIRV;
654+
moduleDesc.pInputModule = binary;
655+
moduleDesc.inputSize = 10;
656+
657+
uint32_t kernelHeap = 0;
658+
auto kernelInfo = std::make_unique<KernelInfo>();
659+
kernelInfo->heapInfo.KernelHeapSize = 1;
660+
kernelInfo->heapInfo.pKernelHeap = &kernelHeap;
661+
662+
auto kernelImmutableData = ::std::make_unique<KernelImmutableData>(device);
663+
kernelImmutableData->initialize(kernelInfo.get(), device, 0, nullptr, nullptr, false);
664+
std::unique_ptr<MockModule> moduleMock = std::make_unique<MockModule>(device, nullptr, ModuleType::User);
665+
moduleMock->translationUnit = std::make_unique<MockModuleTranslationUnit>(device);
666+
moduleMock->kernelImmDatas.push_back(std::move(kernelImmutableData));
667+
668+
auto zebin = ZebinTestData::ValidEmptyProgram();
669+
moduleMock->translationUnit = std::make_unique<MockModuleTranslationUnit>(device);
670+
moduleMock->translationUnit->unpackedDeviceBinarySize = zebin.storage.size();
671+
moduleMock->translationUnit->unpackedDeviceBinary.reset(new char[zebin.storage.size()]);
672+
memcpy_s(moduleMock->translationUnit->unpackedDeviceBinary.get(), moduleMock->translationUnit->unpackedDeviceBinarySize,
673+
zebin.storage.data(), zebin.storage.size());
674+
675+
getMockDebuggerL0Hw<FamilyType>()->moduleHandleToReturn = 0u;
676+
EXPECT_TRUE(moduleMock->initialize(&moduleDesc, neoDevice));
677+
678+
EXPECT_EQ(1u, getMockDebuggerL0Hw<FamilyType>()->segmentCountWithAttachedModuleHandle);
679+
EXPECT_EQ(getMockDebuggerL0Hw<FamilyType>()->moduleHandleToReturn, moduleMock->debugModuleHandle);
680+
681+
getMockDebuggerL0Hw<FamilyType>()->removedZebinModuleHandle = std::numeric_limits<uint32_t>::max();
682+
683+
moduleMock->destroy();
684+
moduleMock.release();
685+
686+
EXPECT_EQ(std::numeric_limits<uint32_t>::max(), getMockDebuggerL0Hw<FamilyType>()->removedZebinModuleHandle);
687+
}
688+
647689
using NotifyModuleLoadTest = Test<ModuleFixture>;
648690

649691
HWTEST_F(NotifyModuleLoadTest, givenDebuggingEnabledWhenModuleIsCreatedAndFullyLinkedThenIsaAllocationsAreCopiedAndResident) {

0 commit comments

Comments
 (0)