From 3cd4114733f7c2c3a3e5256bf601e166fba3cd32 Mon Sep 17 00:00:00 2001 From: Mateusz Hoppe Date: Tue, 5 Jul 2022 15:55:15 +0000 Subject: [PATCH] Move L0Debugger tests to shared - change tests to non-parameterized when parameters are not needed Related-To: NEO-7075 Signed-off-by: Mateusz Hoppe --- level_zero/core/test/aub_tests/CMakeLists.txt | 1 - level_zero/core/test/common/CMakeLists.txt | 22 - .../core/test/unit_tests/CMakeLists.txt | 1 - .../gen11/enable_l0_mocks_gen11.cpp | 2 +- .../gen12lp/enable_l0_mocks_gen12lp.cpp | 2 +- .../unit_tests/gen9/enable_l0_mocks_gen9.cpp | 2 +- .../core/test/unit_tests/mocks/CMakeLists.txt | 2 - .../sources/debugger/CMakeLists.txt | 1 - .../sources/debugger/l0_debugger_fixture.h | 2 +- .../debugger/linux/test_l0_debugger_linux.cpp | 6 +- .../sources/debugger/test_l0_debugger_1.cpp | 199 +----- .../test_l0_debugger_sba_tracking.cpp | 421 +++---------- .../debugger/test_module_with_debug.cpp | 2 +- .../xe_hp_core/enable_l0_mocks_xe_hp_core.cpp | 2 +- .../enable_l0_mocks_xe_hpc_core.cpp | 2 +- .../enable_l0_mocks_xe_hpg_core.cpp | 2 +- shared/test/common/libult/gen11.cpp | 5 +- shared/test/common/libult/gen12lp.cpp | 4 +- shared/test/common/libult/gen8.cpp | 4 +- shared/test/common/libult/gen9.cpp | 5 +- shared/test/common/libult/xe_hp_core.cpp | 4 +- shared/test/common/libult/xe_hpc_core.cpp | 4 +- shared/test/common/libult/xe_hpg_core.cpp | 4 +- shared/test/common/mocks/CMakeLists.txt | 2 + .../test/common}/mocks/debugger_l0_create.cpp | 3 +- .../test/common}/mocks/mock_l0_debugger.h | 9 +- shared/test/unit_test/debugger/CMakeLists.txt | 11 + .../unit_test/debugger/test_l0_debugger.cpp | 579 ++++++++++++++++++ .../test_l0_debugger_single_address_space.cpp | 92 +-- .../unit_test/mocks/debugger_l0_create.cpp | 21 + 30 files changed, 744 insertions(+), 672 deletions(-) rename {level_zero/core/test/unit_tests => shared/test/common}/mocks/debugger_l0_create.cpp (88%) rename {level_zero/core/test/unit_tests => shared/test/common}/mocks/mock_l0_debugger.h (95%) create mode 100644 shared/test/unit_test/debugger/CMakeLists.txt create mode 100644 shared/test/unit_test/debugger/test_l0_debugger.cpp rename {level_zero/core/test/unit_tests/sources => shared/test/unit_test}/debugger/test_l0_debugger_single_address_space.cpp (79%) create mode 100644 shared/test/unit_test/mocks/debugger_l0_create.cpp diff --git a/level_zero/core/test/aub_tests/CMakeLists.txt b/level_zero/core/test/aub_tests/CMakeLists.txt index f52e879c54..fd20310a5b 100644 --- a/level_zero/core/test/aub_tests/CMakeLists.txt +++ b/level_zero/core/test/aub_tests/CMakeLists.txt @@ -55,7 +55,6 @@ target_sources(${TARGET_NAME} PRIVATE $ $ $ - $ ) if(TARGET ${BUILTINS_SPIRV_LIB_NAME}) target_sources(${TARGET_NAME} PRIVATE diff --git a/level_zero/core/test/common/CMakeLists.txt b/level_zero/core/test/common/CMakeLists.txt index c469b3968c..33c9a5c04b 100644 --- a/level_zero/core/test/common/CMakeLists.txt +++ b/level_zero/core/test/common/CMakeLists.txt @@ -44,25 +44,3 @@ apply_macro_for_each_core_type("TESTED") add_custom_target(l0_common_test_kernels DEPENDS ${l0_test_kernel_outputs} ${l0_bindless_test_kernel_outputs} copy_compiler_files) set_target_properties(l0_common_test_kernels PROPERTIES FOLDER ${TARGET_NAME_L0}) add_dependencies(prepare_test_kernels_for_l0 l0_common_test_kernels) - -macro(macro_for_each_core_type) - foreach(BRANCH_DIR ${BRANCH_DIR_LIST}) - set(ENABLE_L0_MOCKS_CPP ${NEO_SOURCE_DIR}/level_zero/core/test/unit_tests${BRANCH_DIR}${CORE_TYPE_LOWER}/enable_l0_mocks_${CORE_TYPE_LOWER}.cpp) - if(EXISTS ${ENABLE_L0_MOCKS_CPP}) - list(APPEND LIBULT_L0_SOURCES ${ENABLE_L0_MOCKS_CPP}) - endif() - endforeach() -endmacro() - -apply_macro_for_each_core_type("TESTED") - -add_library(l0_libult OBJECT EXCLUDE_FROM_ALL - ${LIBULT_L0_SOURCES} -) - -set_target_properties(l0_libult PROPERTIES POSITION_INDEPENDENT_CODE ON) -set_target_properties(l0_libult PROPERTIES FOLDER ${TARGET_NAME_L0}) -set_property(TARGET l0_libult APPEND_STRING PROPERTY COMPILE_FLAGS ${ASAN_FLAGS} ${TSAN_FLAGS}) -target_include_directories(l0_libult PRIVATE $) -target_compile_definitions(l0_libult PRIVATE $) -create_project_source_tree(l0_libult) diff --git a/level_zero/core/test/unit_tests/CMakeLists.txt b/level_zero/core/test/unit_tests/CMakeLists.txt index d2410e8464..e4a50c84fa 100644 --- a/level_zero/core/test/unit_tests/CMakeLists.txt +++ b/level_zero/core/test/unit_tests/CMakeLists.txt @@ -39,7 +39,6 @@ target_sources(${TARGET_NAME} PRIVATE $ $ $ - $ ) set_property(TARGET ${TARGET_NAME} APPEND_STRING PROPERTY COMPILE_FLAGS ${ASAN_FLAGS}) diff --git a/level_zero/core/test/unit_tests/gen11/enable_l0_mocks_gen11.cpp b/level_zero/core/test/unit_tests/gen11/enable_l0_mocks_gen11.cpp index 77c3713165..5b0ab840d8 100644 --- a/level_zero/core/test/unit_tests/gen11/enable_l0_mocks_gen11.cpp +++ b/level_zero/core/test/unit_tests/gen11/enable_l0_mocks_gen11.cpp @@ -5,7 +5,7 @@ * */ -#include "level_zero/core/test/unit_tests/mocks/mock_l0_debugger.h" +#include "shared/test/unit_test/mocks/mock_l0_debugger.h" namespace NEO { diff --git a/level_zero/core/test/unit_tests/gen12lp/enable_l0_mocks_gen12lp.cpp b/level_zero/core/test/unit_tests/gen12lp/enable_l0_mocks_gen12lp.cpp index 638771c07a..2d1eaf7e78 100644 --- a/level_zero/core/test/unit_tests/gen12lp/enable_l0_mocks_gen12lp.cpp +++ b/level_zero/core/test/unit_tests/gen12lp/enable_l0_mocks_gen12lp.cpp @@ -5,7 +5,7 @@ * */ -#include "level_zero/core/test/unit_tests/mocks/mock_l0_debugger.h" +#include "shared/test/unit_test/mocks/mock_l0_debugger.h" namespace NEO { diff --git a/level_zero/core/test/unit_tests/gen9/enable_l0_mocks_gen9.cpp b/level_zero/core/test/unit_tests/gen9/enable_l0_mocks_gen9.cpp index 5ca014b4c1..a81995c9a1 100644 --- a/level_zero/core/test/unit_tests/gen9/enable_l0_mocks_gen9.cpp +++ b/level_zero/core/test/unit_tests/gen9/enable_l0_mocks_gen9.cpp @@ -5,7 +5,7 @@ * */ -#include "level_zero/core/test/unit_tests/mocks/mock_l0_debugger.h" +#include "shared/test/unit_test/mocks/mock_l0_debugger.h" namespace NEO { struct SKLFamily; diff --git a/level_zero/core/test/unit_tests/mocks/CMakeLists.txt b/level_zero/core/test/unit_tests/mocks/CMakeLists.txt index d10297bb57..70ddb2a3a1 100644 --- a/level_zero/core/test/unit_tests/mocks/CMakeLists.txt +++ b/level_zero/core/test/unit_tests/mocks/CMakeLists.txt @@ -8,7 +8,6 @@ set(TARGET_NAME ${TARGET_NAME_L0}_mocks) set(L0_MOCKS_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt - ${CMAKE_CURRENT_SOURCE_DIR}/debugger_l0_create.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mock_built_ins.h ${CMAKE_CURRENT_SOURCE_DIR}/mock_built_ins.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mock_builtin_functions_lib_impl.h @@ -33,7 +32,6 @@ set(L0_MOCKS_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/mock_host_pointer_manager.h ${CMAKE_CURRENT_SOURCE_DIR}/mock_image.h ${CMAKE_CURRENT_SOURCE_DIR}/mock_kernel.h - ${CMAKE_CURRENT_SOURCE_DIR}/mock_l0_debugger.h ${CMAKE_CURRENT_SOURCE_DIR}/mock_memory_manager.h ${CMAKE_CURRENT_SOURCE_DIR}/mock_module.h ${CMAKE_CURRENT_SOURCE_DIR}/mock_sampler.h diff --git a/level_zero/core/test/unit_tests/sources/debugger/CMakeLists.txt b/level_zero/core/test/unit_tests/sources/debugger/CMakeLists.txt index e44c08d65f..803ec17afb 100644 --- a/level_zero/core/test/unit_tests/sources/debugger/CMakeLists.txt +++ b/level_zero/core/test/unit_tests/sources/debugger/CMakeLists.txt @@ -12,7 +12,6 @@ target_sources(${TARGET_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/test_l0_debugger_1.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_l0_debugger_2.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_l0_debugger_sba_tracking.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/test_l0_debugger_single_address_space.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_module_with_debug.cpp ) diff --git a/level_zero/core/test/unit_tests/sources/debugger/l0_debugger_fixture.h b/level_zero/core/test/unit_tests/sources/debugger/l0_debugger_fixture.h index c781bc5119..39aaa7a961 100644 --- a/level_zero/core/test/unit_tests/sources/debugger/l0_debugger_fixture.h +++ b/level_zero/core/test/unit_tests/sources/debugger/l0_debugger_fixture.h @@ -11,11 +11,11 @@ #include "shared/test/common/mocks/mock_builtins.h" #include "shared/test/common/mocks/mock_compilers.h" #include "shared/test/common/mocks/mock_device.h" +#include "shared/test/common/mocks/mock_l0_debugger.h" #include "shared/test/common/mocks/mock_memory_operations_handler.h" #include "shared/test/common/mocks/mock_sip.h" #include "level_zero/core/test/unit_tests/mocks/mock_driver_handle.h" -#include "level_zero/core/test/unit_tests/mocks/mock_l0_debugger.h" namespace L0 { namespace ult { diff --git a/level_zero/core/test/unit_tests/sources/debugger/linux/test_l0_debugger_linux.cpp b/level_zero/core/test/unit_tests/sources/debugger/linux/test_l0_debugger_linux.cpp index 6828a1e7c4..81fafea510 100644 --- a/level_zero/core/test/unit_tests/sources/debugger/linux/test_l0_debugger_linux.cpp +++ b/level_zero/core/test/unit_tests/sources/debugger/linux/test_l0_debugger_linux.cpp @@ -95,7 +95,7 @@ TEST(L0DebuggerLinux, givenVmBindAndPerContextVmEnabledInDrmWhenInitializingDebu executionEnvironment->rootDeviceEnvironments[0]->osInterface.reset(osInterface); executionEnvironment->rootDeviceEnvironments[0]->osInterface->setDriverModel(std::unique_ptr(drmMock)); - auto result = WhiteBox::initDebuggingInOs(osInterface); + auto result = NEO::WhiteBox::initDebuggingInOs(osInterface); EXPECT_TRUE(result); EXPECT_TRUE(drmMock->registerClassesCalled); } @@ -117,7 +117,7 @@ TEST(L0DebuggerLinux, givenVmBindNotAvailableInDrmWhenInitializingDebuggingInOsT executionEnvironment->rootDeviceEnvironments[0]->osInterface.reset(osInterface); executionEnvironment->rootDeviceEnvironments[0]->osInterface->setDriverModel(std::unique_ptr(drmMock)); - auto result = WhiteBox::initDebuggingInOs(osInterface); + auto result = NEO::WhiteBox::initDebuggingInOs(osInterface); EXPECT_FALSE(result); EXPECT_FALSE(drmMock->registerClassesCalled); } @@ -139,7 +139,7 @@ TEST(L0DebuggerLinux, givenPerContextVmNotEnabledWhenInitializingDebuggingInOsTh executionEnvironment->rootDeviceEnvironments[0]->osInterface.reset(osInterface); executionEnvironment->rootDeviceEnvironments[0]->osInterface->setDriverModel(std::unique_ptr(drmMock)); - auto result = WhiteBox::initDebuggingInOs(osInterface); + auto result = NEO::WhiteBox::initDebuggingInOs(osInterface); EXPECT_FALSE(result); EXPECT_FALSE(drmMock->registerClassesCalled); } diff --git a/level_zero/core/test/unit_tests/sources/debugger/test_l0_debugger_1.cpp b/level_zero/core/test/unit_tests/sources/debugger/test_l0_debugger_1.cpp index bb4963cc52..ab7ee4d290 100644 --- a/level_zero/core/test/unit_tests/sources/debugger/test_l0_debugger_1.cpp +++ b/level_zero/core/test/unit_tests/sources/debugger/test_l0_debugger_1.cpp @@ -24,20 +24,19 @@ namespace ult { using L0DebuggerTest = Test; using L0DebuggerParameterizedTests = L0DebuggerHwParameterizedFixture; -TEST_P(L0DebuggerParameterizedTests, givenL0DebuggerWhenCallingIsLegacyThenFalseIsReturned) { +TEST_F(L0DebuggerTest, givenL0DebuggerWhenCallingIsLegacyThenFalseIsReturned) { EXPECT_FALSE(neoDevice->getDebugger()->isLegacy()); } -TEST_P(L0DebuggerParameterizedTests, givenL0DebuggerWhenGettingSourceLevelDebuggerThenNullptrReturned) { +TEST_F(L0DebuggerTest, givenL0DebuggerWhenGettingSourceLevelDebuggerThenNullptrReturned) { EXPECT_EQ(nullptr, neoDevice->getSourceLevelDebugger()); } -TEST_P(L0DebuggerParameterizedTests, givenL0DebuggerWhenGettingL0DebuggerThenValidDebuggerInstanceIsReturned) { +TEST_F(L0DebuggerTest, givenL0DebuggerWhenGettingL0DebuggerThenValidDebuggerInstanceIsReturned) { EXPECT_NE(nullptr, device->getL0Debugger()); } -TEST_P(L0DebuggerParameterizedTests, givenL0DebuggerWhenGettingSipAllocationThenValidSipTypeIsReturned) { - neoDevice->setDebuggerActive(true); +TEST_F(L0DebuggerTest, givenL0DebuggerWhenGettingSipAllocationThenValidSipTypeIsReturned) { auto systemRoutine = SipKernel::getSipKernel(*neoDevice).getSipAllocation(); ASSERT_NE(nullptr, systemRoutine); @@ -51,12 +50,12 @@ TEST_P(L0DebuggerParameterizedTests, givenL0DebuggerWhenGettingSipAllocationThen EXPECT_EQ(expectedSipAllocation, systemRoutine); } -TEST_P(L0DebuggerParameterizedTests, givenL0DebuggerWhenGettingSipTypeThenDebugBindlessIsReturned) { +TEST_F(L0DebuggerTest, givenL0DebuggerWhenGettingSipTypeThenDebugBindlessIsReturned) { auto sipType = SipKernel::getSipKernelType(*neoDevice); EXPECT_EQ(NEO::SipKernelType::DbgBindless, sipType); } -TEST_P(L0DebuggerParameterizedTests, givenL0DebuggerWhenGettingStateSaveAreaHeaderThenValidSipTypeIsReturned) { +TEST_F(L0DebuggerTest, givenL0DebuggerWhenGettingStateSaveAreaHeaderThenValidSipTypeIsReturned) { auto &stateSaveAreaHeader = SipKernel::getSipKernel(*neoDevice).getStateSaveAreaHeader(); auto sipType = SipKernel::getSipKernelType(*neoDevice); @@ -65,82 +64,17 @@ TEST_P(L0DebuggerParameterizedTests, givenL0DebuggerWhenGettingStateSaveAreaHead EXPECT_EQ(expectedStateSaveAreaHeader, stateSaveAreaHeader); } -TEST_P(L0DebuggerParameterizedTests, givenProgramDebuggingEnabledWhenDebuggerIsCreatedThenFusedEusAreDisabled) { +TEST_F(L0DebuggerTest, givenProgramDebuggingEnabledWhenDebuggerIsCreatedThenFusedEusAreDisabled) { EXPECT_TRUE(driverHandle->enableProgramDebugging); EXPECT_FALSE(neoDevice->getHardwareInfo().capabilityTable.fusedEuEnabled); } -TEST_P(L0DebuggerParameterizedTests, givenProgramDebuggingEnabledWhenDebuggerIsCreatedThenCompressionIsDisabled) { +TEST_F(L0DebuggerTest, givenProgramDebuggingEnabledWhenDebuggerIsCreatedThenCompressionIsDisabled) { EXPECT_TRUE(driverHandle->enableProgramDebugging); EXPECT_FALSE(neoDevice->getHardwareInfo().capabilityTable.ftrRenderCompressedBuffers); EXPECT_FALSE(neoDevice->getHardwareInfo().capabilityTable.ftrRenderCompressedImages); } -TEST(Debugger, givenL0DebuggerOFFWhenGettingStateSaveAreaHeaderThenValidSipTypeIsReturned) { - auto executionEnvironment = new NEO::ExecutionEnvironment(); - executionEnvironment->prepareRootDeviceEnvironments(1); - - auto isHexadecimalArrayPreferred = HwHelper::get(defaultHwInfo->platform.eRenderCoreFamily).isSipKernelAsHexadecimalArrayPreferred(); - if (!isHexadecimalArrayPreferred) { - auto mockBuiltIns = new NEO::MockBuiltins(); - executionEnvironment->rootDeviceEnvironments[0]->builtins.reset(mockBuiltIns); - } - auto hwInfo = *NEO::defaultHwInfo.get(); - hwInfo.featureTable.flags.ftrLocalMemory = true; - executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(&hwInfo); - executionEnvironment->rootDeviceEnvironments[0]->initGmm(); - executionEnvironment->initializeMemoryManager(); - - auto neoDevice = NEO::MockDevice::create(executionEnvironment, 0u); - NEO::DeviceVector devices; - devices.push_back(std::unique_ptr(neoDevice)); - auto driverHandle = std::make_unique>(); - driverHandle->enableProgramDebugging = false; - - driverHandle->initialize(std::move(devices)); - auto sipType = SipKernel::getSipKernelType(*neoDevice); - - if (isHexadecimalArrayPreferred) { - SipKernel::initSipKernel(sipType, *neoDevice); - } - auto &stateSaveAreaHeader = SipKernel::getSipKernel(*neoDevice).getStateSaveAreaHeader(); - - if (isHexadecimalArrayPreferred) { - auto sipKernel = neoDevice->getRootDeviceEnvironment().sipKernels[static_cast(sipType)].get(); - ASSERT_NE(sipKernel, nullptr); - auto &expectedStateSaveAreaHeader = sipKernel->getStateSaveAreaHeader(); - EXPECT_EQ(expectedStateSaveAreaHeader, stateSaveAreaHeader); - } else { - auto &expectedStateSaveAreaHeader = neoDevice->getBuiltIns()->getSipKernel(sipType, *neoDevice).getStateSaveAreaHeader(); - EXPECT_EQ(expectedStateSaveAreaHeader, stateSaveAreaHeader); - } -} - -TEST(Debugger, givenDebuggingEnabledInExecEnvWhenAllocatingIsaThenSingleBankIsUsed) { - auto executionEnvironment = new NEO::ExecutionEnvironment(); - executionEnvironment->prepareRootDeviceEnvironments(1); - executionEnvironment->setDebuggingEnabled(); - - auto hwInfo = *NEO::defaultHwInfo.get(); - hwInfo.featureTable.flags.ftrLocalMemory = true; - executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(&hwInfo); - executionEnvironment->rootDeviceEnvironments[0]->initGmm(); - executionEnvironment->initializeMemoryManager(); - - std::unique_ptr neoDevice(NEO::MockDevice::create(executionEnvironment, 0u)); - - auto allocation = neoDevice->getMemoryManager()->allocateGraphicsMemoryWithProperties( - {neoDevice->getRootDeviceIndex(), 4096, NEO::AllocationType::KERNEL_ISA, neoDevice->getDeviceBitfield()}); - - if (allocation->getMemoryPool() == MemoryPool::LocalMemory) { - EXPECT_EQ(1u, allocation->storageInfo.getMemoryBanks()); - } else { - EXPECT_EQ(0u, allocation->storageInfo.getMemoryBanks()); - } - - neoDevice->getMemoryManager()->freeGraphicsMemory(allocation); -} - using L0DebuggerPerContextAddressSpaceTest = Test; HWTEST_F(L0DebuggerPerContextAddressSpaceTest, givenDebuggingEnabledWhenCommandListIsExecutedThenValidKernelDebugCommandsAreAdded) { using MI_LOAD_REGISTER_IMM = typename FamilyType::MI_LOAD_REGISTER_IMM; @@ -596,123 +530,6 @@ HWTEST2_F(L0DebuggerSimpleTest, givenUseCsrImmediateSubmissionDisabledCommandLis commandList->destroy(); } -HWTEST_F(L0DebuggerSimpleTest, whenAllocateCalledThenDebuggerIsCreated) { - auto debugger = DebuggerL0Hw::allocate(neoDevice); - EXPECT_NE(nullptr, debugger); - delete debugger; -} - -HWTEST_F(L0DebuggerSimpleTest, givenDebuggerWithoutMemoryOperationsHandlerWhenNotifyingModuleAllocationsThenNoAllocationIsResident) { - auto debugger = std::make_unique>(neoDevice); - - StackVec allocs; - NEO::GraphicsAllocation alloc(0, NEO::AllocationType::INTERNAL_HOST_MEMORY, - reinterpret_cast(0x1234), 0x1000, 0, sizeof(uint32_t), - MemoryPool::System4KBPages, MemoryManager::maxOsContextCount); - allocs.push_back(&alloc); - - debugger->notifyModuleLoadAllocations(allocs); -} - -HWTEST_F(L0DebuggerTest, givenDebuggerWhenCreatedThenModuleHeapDebugAreaIsCreated) { - auto mockBlitMemoryToAllocation = [](const NEO::Device &device, NEO::GraphicsAllocation *memory, size_t offset, const void *hostPtr, - Vec3 size) -> NEO::BlitOperationResult { - memcpy(memory->getUnderlyingBuffer(), hostPtr, size.x); - return BlitOperationResult::Success; - }; - VariableBackup blitMemoryToAllocationFuncBackup( - &NEO::BlitHelperFunctions::blitMemoryToAllocation, mockBlitMemoryToAllocation); - - memoryOperationsHandler->makeResidentCalledCount = 0; - auto debugger = std::make_unique>(neoDevice); - auto debugArea = debugger->getModuleDebugArea(); - - EXPECT_EQ(1, memoryOperationsHandler->makeResidentCalledCount); - - auto allocation = neoDevice->getMemoryManager()->allocateGraphicsMemoryWithProperties( - {neoDevice->getRootDeviceIndex(), 4096, NEO::AllocationType::KERNEL_ISA, neoDevice->getDeviceBitfield()}); - - EXPECT_EQ(allocation->storageInfo.getMemoryBanks(), debugArea->storageInfo.getMemoryBanks()); - - DebugAreaHeader *header = reinterpret_cast(debugArea->getUnderlyingBuffer()); - EXPECT_EQ(1u, header->pgsize); - uint64_t isShared = debugArea->storageInfo.getNumBanks() == 1 ? 1 : 0; - EXPECT_EQ(isShared, header->isShared); - - EXPECT_STREQ("dbgarea", header->magic); - EXPECT_EQ(sizeof(DebugAreaHeader), header->size); - EXPECT_EQ(sizeof(DebugAreaHeader), header->scratchBegin); - EXPECT_EQ(MemoryConstants::pageSize64k - sizeof(DebugAreaHeader), header->scratchEnd); - - neoDevice->getMemoryManager()->freeGraphicsMemory(allocation); -} - -HWTEST_P(L0DebuggerParameterizedTests, givenBindlessSipWhenModuleHeapDebugAreaIsCreatedThenReservedFieldIsSet) { - DebugManagerStateRestore restorer; - NEO::DebugManager.flags.UseBindlessDebugSip.set(1); - - auto mockBlitMemoryToAllocation = [](const NEO::Device &device, NEO::GraphicsAllocation *memory, size_t offset, const void *hostPtr, - Vec3 size) -> NEO::BlitOperationResult { - memcpy(memory->getUnderlyingBuffer(), hostPtr, size.x); - return BlitOperationResult::Success; - }; - VariableBackup blitMemoryToAllocationFuncBackup( - &NEO::BlitHelperFunctions::blitMemoryToAllocation, mockBlitMemoryToAllocation); - - memoryOperationsHandler->makeResidentCalledCount = 0; - auto debugger = std::make_unique>(neoDevice); - auto debugArea = debugger->getModuleDebugArea(); - - DebugAreaHeader *header = reinterpret_cast(debugArea->getUnderlyingBuffer()); - EXPECT_EQ(1u, header->reserved1); -} - -HWTEST_P(L0DebuggerParameterizedTests, givenUseBindlessDebugSipZeroWhenModuleHeapDebugAreaIsCreatedThenReservedFieldIsSet) { - DebugManagerStateRestore restorer; - NEO::DebugManager.flags.UseBindlessDebugSip.set(0); - - auto mockBlitMemoryToAllocation = [](const NEO::Device &device, NEO::GraphicsAllocation *memory, size_t offset, const void *hostPtr, - Vec3 size) -> NEO::BlitOperationResult { - memcpy(memory->getUnderlyingBuffer(), hostPtr, size.x); - return BlitOperationResult::Success; - }; - VariableBackup blitMemoryToAllocationFuncBackup( - &NEO::BlitHelperFunctions::blitMemoryToAllocation, mockBlitMemoryToAllocation); - - memoryOperationsHandler->makeResidentCalledCount = 0; - auto debugger = std::make_unique>(neoDevice); - auto debugArea = debugger->getModuleDebugArea(); - - DebugAreaHeader *header = reinterpret_cast(debugArea->getUnderlyingBuffer()); - EXPECT_EQ(1u, header->reserved1); -} - -TEST(Debugger, givenNonLegacyDebuggerWhenInitializingDeviceCapsThenUnrecoverableIsCalled) { - class MockDebugger : public NEO::Debugger { - public: - MockDebugger() { - isLegacyMode = false; - } - - void captureStateBaseAddress(NEO::LinearStream &cmdStream, SbaAddresses sba) override{}; - size_t getSbaTrackingCommandsSize(size_t trackedAddressCount) override { - return 0; - } - }; - auto executionEnvironment = new NEO::ExecutionEnvironment(); - auto mockBuiltIns = new NEO::MockBuiltins(); - executionEnvironment->prepareRootDeviceEnvironments(1); - executionEnvironment->rootDeviceEnvironments[0]->builtins.reset(mockBuiltIns); - executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get()); - executionEnvironment->rootDeviceEnvironments[0]->initGmm(); - - auto debugger = new MockDebugger; - executionEnvironment->rootDeviceEnvironments[0]->debugger.reset(debugger); - executionEnvironment->initializeMemoryManager(); - - EXPECT_THROW(NEO::MockDevice::create(executionEnvironment, 0u), std::exception); -} - using NotXeHPOrDG2 = AreNotGfxCores; HWTEST2_F(L0DebuggerTest, givenNotAtsOrDg2AndDebugIsActiveThenDisableL3CacheInGmmHelperIsNotSet, NotXeHPOrDG2) { EXPECT_FALSE(static_cast(neoDevice->getGmmHelper())->allResourcesUncached); diff --git a/level_zero/core/test/unit_tests/sources/debugger/test_l0_debugger_sba_tracking.cpp b/level_zero/core/test/unit_tests/sources/debugger/test_l0_debugger_sba_tracking.cpp index fc621e0f19..35388466f6 100644 --- a/level_zero/core/test/unit_tests/sources/debugger/test_l0_debugger_sba_tracking.cpp +++ b/level_zero/core/test/unit_tests/sources/debugger/test_l0_debugger_sba_tracking.cpp @@ -6,6 +6,7 @@ */ #include "shared/source/gen_common/reg_configs_common.h" +#include "shared/source/helpers/register_offsets.h" #include "shared/test/common/cmd_parse/gen_cmd_parse.h" #include "shared/test/common/mocks/mock_gmm_helper.h" #include "shared/test/common/test_macros/hw_test.h" @@ -31,19 +32,6 @@ struct PerContextAddressSpaceFixture : public Test { DebugManagerStateRestore restorer; }; -struct L0DebuggerSimpleParameterizedTest : public ::testing::TestWithParam, DeviceFixture { - void SetUp() override { - NEO::DebugManager.flags.DebuggerForceSbaTrackingMode.set(GetParam()); - DeviceFixture::SetUp(); - } - - void TearDown() override { - DeviceFixture::TearDown(); - } - - DebugManagerStateRestore restorer; -}; - using L0DebuggerPerContextAddressSpaceTest = Test; using L0DebuggerTest = Test; @@ -125,73 +113,6 @@ HWTEST_P(L0DebuggerParameterizedTests, givenL0DebuggerWhenCreatedThenPerContextS } } -using L0DebuggerMultiSubDeviceTest = Test; - -HWTEST_F(L0DebuggerMultiSubDeviceTest, givenMultiSubDevicesWhenSbaTrackingBuffersAllocatedThenThereIsSeparatePhysicalStorageForEveryContext) { - auto debugger = std::make_unique>(neoDevice); - - const auto &engines = neoDevice->getAllEngines(); - EXPECT_LE(1u, engines.size()); - - for (auto &engine : engines) { - - auto contextId = engine.osContext->getContextId(); - const auto &storageInfo = debugger->perContextSbaAllocations[contextId]->storageInfo; - - EXPECT_FALSE(storageInfo.cloningOfPageTables); - EXPECT_EQ(DeviceBitfield{maxNBitValue(numSubDevices)}, storageInfo.memoryBanks); - EXPECT_EQ(DeviceBitfield{maxNBitValue(numSubDevices)}, storageInfo.pageTablesVisibility); - EXPECT_EQ(engine.osContext->getDeviceBitfield().to_ulong(), storageInfo.memoryBanks.to_ulong()); - EXPECT_TRUE(storageInfo.tileInstanced); - - for (uint32_t i = 0; i < numSubDevices; i++) { - auto sbaHeader = reinterpret_cast(ptrOffset(debugger->perContextSbaAllocations[contextId]->getUnderlyingBuffer(), - debugger->perContextSbaAllocations[contextId]->getUnderlyingBufferSize() * i)); - - EXPECT_STREQ("sbaarea", sbaHeader->magic); - EXPECT_EQ(0u, sbaHeader->BindlessSamplerStateBaseAddress); - EXPECT_EQ(0u, sbaHeader->BindlessSurfaceStateBaseAddress); - EXPECT_EQ(0u, sbaHeader->DynamicStateBaseAddress); - EXPECT_EQ(0u, sbaHeader->GeneralStateBaseAddress); - EXPECT_EQ(0u, sbaHeader->IndirectObjectBaseAddress); - EXPECT_EQ(0u, sbaHeader->InstructionBaseAddress); - EXPECT_EQ(0u, sbaHeader->SurfaceStateBaseAddress); - EXPECT_EQ(0u, sbaHeader->Version); - } - if (!debugger->singleAddressSpaceSbaTracking) { - EXPECT_EQ(debugger->sbaTrackingGpuVa.address, debugger->perContextSbaAllocations[contextId]->getGpuAddress()); - } else { - EXPECT_NE(debugger->sbaTrackingGpuVa.address, debugger->perContextSbaAllocations[contextId]->getGpuAddress()); - } - } - - const auto &subDevice0Engines = neoDevice->getSubDevice(0)->getAllEngines(); - const auto &subDevice1Engines = neoDevice->getSubDevice(1)->getAllEngines(); - - auto subDeviceEngineSets = {subDevice0Engines, subDevice1Engines}; - uint64_t subDeviceIndex = 0; - for (const auto &subDeviceEngines : subDeviceEngineSets) { - for (auto &engine : subDeviceEngines) { - - auto contextId = engine.osContext->getContextId(); - const auto &storageInfo = debugger->perContextSbaAllocations[contextId]->storageInfo; - - EXPECT_FALSE(storageInfo.cloningOfPageTables); - EXPECT_EQ(DeviceBitfield{1llu << subDeviceIndex}, storageInfo.memoryBanks); - EXPECT_EQ(DeviceBitfield{1llu << subDeviceIndex}, storageInfo.pageTablesVisibility); - EXPECT_EQ(engine.osContext->getDeviceBitfield().to_ulong(), storageInfo.memoryBanks.to_ulong()); - EXPECT_FALSE(storageInfo.tileInstanced); - - if (!debugger->singleAddressSpaceSbaTracking) { - EXPECT_EQ(debugger->sbaTrackingGpuVa.address, debugger->perContextSbaAllocations[contextId]->getGpuAddress()); - } else { - EXPECT_NE(debugger->sbaTrackingGpuVa.address, debugger->perContextSbaAllocations[contextId]->getGpuAddress()); - } - } - subDeviceIndex++; - } -} - using NotGen8Or11 = AreNotGfxCores; using Gen12Plus = IsAtLeastGfxCore; @@ -409,267 +330,87 @@ HWTEST2_F(L0DebuggerTest, givenDebuggingEnabledWhenCommandListIsExecutedThenSbaB commandList->destroy(); } -HWTEST_F(PerContextAddressSpaceFixture, givenNonZeroGpuVasWhenProgrammingSbaTrackingThenCorrectCmdsAreAddedToStream) { - using MI_STORE_DATA_IMM = typename FamilyType::MI_STORE_DATA_IMM; - auto debugger = std::make_unique>(neoDevice); - debugger->singleAddressSpaceSbaTracking = 0; - debugger->sbaTrackingGpuVa.address = 0x45670000; - auto expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(NEO::SbaTrackedAddresses, GeneralStateBaseAddress); - - StackVec buffer(4096); - NEO::LinearStream cmdStream(buffer.begin(), buffer.size()); - uint64_t gsba = 0x60000; - uint64_t ssba = 0x1234567000; - uint64_t iba = 0xfff80000; - uint64_t ioba = 0x8100000; - uint64_t dsba = 0xffffffffaaaa0000; - - NEO::Debugger::SbaAddresses sbaAddresses = {}; - sbaAddresses.GeneralStateBaseAddress = gsba; - sbaAddresses.SurfaceStateBaseAddress = ssba; - sbaAddresses.InstructionBaseAddress = iba; - sbaAddresses.IndirectObjectBaseAddress = ioba; - sbaAddresses.DynamicStateBaseAddress = dsba; - sbaAddresses.BindlessSurfaceStateBaseAddress = ssba; - - debugger->programSbaTrackingCommands(cmdStream, sbaAddresses); - - GenCmdList cmdList; - ASSERT_TRUE(FamilyType::PARSE::parseCommandBuffer(cmdList, cmdStream.getCpuBase(), cmdStream.getUsed())); - - EXPECT_EQ(6 * sizeof(MI_STORE_DATA_IMM), cmdStream.getUsed()); - - auto sdiItor = find(cmdList.begin(), cmdList.end()); - ASSERT_NE(cmdList.end(), sdiItor); - auto cmdSdi = genCmdCast(*sdiItor); - - EXPECT_EQ(static_cast(gsba & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0()); - EXPECT_EQ(static_cast(gsba >> 32), cmdSdi->getDataDword1()); - EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress()); - EXPECT_TRUE(cmdSdi->getStoreQword()); - - sdiItor++; - cmdSdi = genCmdCast(*sdiItor); - - expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(NEO::SbaTrackedAddresses, SurfaceStateBaseAddress); - EXPECT_EQ(static_cast(ssba & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0()); - EXPECT_EQ(static_cast(ssba >> 32), cmdSdi->getDataDword1()); - EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress()); - EXPECT_TRUE(cmdSdi->getStoreQword()); - - sdiItor++; - cmdSdi = genCmdCast(*sdiItor); - - expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(NEO::SbaTrackedAddresses, DynamicStateBaseAddress); - - EXPECT_EQ(static_cast(dsba & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0()); - EXPECT_EQ(static_cast(dsba >> 32), cmdSdi->getDataDword1()); - EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress()); - EXPECT_TRUE(cmdSdi->getStoreQword()); - - sdiItor++; - cmdSdi = genCmdCast(*sdiItor); - - expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(NEO::SbaTrackedAddresses, IndirectObjectBaseAddress); - EXPECT_EQ(static_cast(ioba & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0()); - EXPECT_EQ(static_cast(ioba >> 32), cmdSdi->getDataDword1()); - EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress()); - EXPECT_TRUE(cmdSdi->getStoreQword()); - - sdiItor++; - cmdSdi = genCmdCast(*sdiItor); - - expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(NEO::SbaTrackedAddresses, InstructionBaseAddress); - EXPECT_EQ(static_cast(iba & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0()); - EXPECT_EQ(static_cast(iba >> 32), cmdSdi->getDataDword1()); - EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress()); - EXPECT_TRUE(cmdSdi->getStoreQword()); - - sdiItor++; - cmdSdi = genCmdCast(*sdiItor); - - expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(NEO::SbaTrackedAddresses, BindlessSurfaceStateBaseAddress); - EXPECT_EQ(static_cast(ssba & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0()); - EXPECT_EQ(static_cast(ssba >> 32), cmdSdi->getDataDword1()); - EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress()); - EXPECT_TRUE(cmdSdi->getStoreQword()); -} - -HWTEST_F(PerContextAddressSpaceFixture, givenCanonizedGpuVasWhenProgrammingSbaTrackingThenNonCanonicalAddressesAreStored) { - using MI_STORE_DATA_IMM = typename FamilyType::MI_STORE_DATA_IMM; - auto debugger = std::make_unique>(neoDevice); - - debugger->sbaTrackingGpuVa.address = 0x45670000; - auto expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(NEO::SbaTrackedAddresses, GeneralStateBaseAddress); - - StackVec buffer(4096); - NEO::LinearStream cmdStream(buffer.begin(), buffer.size()); - uint64_t gsba = 0xffff800000060000; - uint64_t ssba = 0xffff801234567000; - uint64_t iba = 0xffff8000fff80000; - uint64_t ioba = 0xffff800008100000; - uint64_t dsba = 0xffff8000aaaa0000; - - NEO::Debugger::SbaAddresses sbaAddresses = {}; - sbaAddresses.GeneralStateBaseAddress = gsba; - sbaAddresses.SurfaceStateBaseAddress = ssba; - sbaAddresses.InstructionBaseAddress = iba; - sbaAddresses.IndirectObjectBaseAddress = ioba; - sbaAddresses.DynamicStateBaseAddress = dsba; - sbaAddresses.BindlessSurfaceStateBaseAddress = ssba; - - debugger->programSbaTrackingCommands(cmdStream, sbaAddresses); - - GenCmdList cmdList; - ASSERT_TRUE(FamilyType::PARSE::parseCommandBuffer(cmdList, cmdStream.getCpuBase(), cmdStream.getUsed())); - - EXPECT_EQ(6 * sizeof(MI_STORE_DATA_IMM), cmdStream.getUsed()); - - auto sdiItor = find(cmdList.begin(), cmdList.end()); - ASSERT_NE(cmdList.end(), sdiItor); - auto cmdSdi = genCmdCast(*sdiItor); - - EXPECT_EQ(static_cast(gsba & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0()); - EXPECT_EQ(static_cast(gsba >> 32), cmdSdi->getDataDword1()); - EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress()); - EXPECT_TRUE(cmdSdi->getStoreQword()); - - sdiItor++; - cmdSdi = genCmdCast(*sdiItor); - - expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(NEO::SbaTrackedAddresses, SurfaceStateBaseAddress); - - EXPECT_EQ(static_cast(ssba & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0()); - EXPECT_EQ(static_cast(ssba >> 32), cmdSdi->getDataDword1()); - EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress()); - EXPECT_TRUE(cmdSdi->getStoreQword()); - - sdiItor++; - cmdSdi = genCmdCast(*sdiItor); - - expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(NEO::SbaTrackedAddresses, DynamicStateBaseAddress); - EXPECT_EQ(static_cast(dsba & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0()); - EXPECT_EQ(static_cast(dsba >> 32), cmdSdi->getDataDword1()); - EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress()); - EXPECT_TRUE(cmdSdi->getStoreQword()); - - sdiItor++; - cmdSdi = genCmdCast(*sdiItor); - - expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(NEO::SbaTrackedAddresses, IndirectObjectBaseAddress); - EXPECT_EQ(static_cast(ioba & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0()); - EXPECT_EQ(static_cast(ioba >> 32), cmdSdi->getDataDword1()); - EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress()); - EXPECT_TRUE(cmdSdi->getStoreQword()); - - sdiItor++; - cmdSdi = genCmdCast(*sdiItor); - - expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(NEO::SbaTrackedAddresses, InstructionBaseAddress); - EXPECT_EQ(static_cast(iba & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0()); - EXPECT_EQ(static_cast(iba >> 32), cmdSdi->getDataDword1()); - EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress()); - EXPECT_TRUE(cmdSdi->getStoreQword()); - - sdiItor++; - cmdSdi = genCmdCast(*sdiItor); - - expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(NEO::SbaTrackedAddresses, BindlessSurfaceStateBaseAddress); - EXPECT_EQ(static_cast(ssba & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0()); - EXPECT_EQ(static_cast(ssba >> 32), cmdSdi->getDataDword1()); - EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress()); - EXPECT_TRUE(cmdSdi->getStoreQword()); -} - -HWTEST2_P(L0DebuggerSimpleParameterizedTest, givenZeroGpuVasWhenProgrammingSbaTrackingThenStreamIsNotUsed, Gen12Plus) { - using MI_STORE_DATA_IMM = typename FamilyType::MI_STORE_DATA_IMM; - auto debugger = std::make_unique>(neoDevice); - - debugger->sbaTrackingGpuVa.address = 0x45670000; - - StackVec buffer(4096); - NEO::LinearStream cmdStream(buffer.begin(), buffer.size()); - uint64_t gsba = 0; - uint64_t ssba = 0; - - NEO::Debugger::SbaAddresses sbaAddresses = {}; - sbaAddresses.GeneralStateBaseAddress = gsba; - sbaAddresses.SurfaceStateBaseAddress = ssba; - - debugger->programSbaTrackingCommands(cmdStream, sbaAddresses); - - EXPECT_EQ(0u, cmdStream.getUsed()); -} - -HWTEST2_P(L0DebuggerSimpleParameterizedTest, givenNotChangedSurfaceStateWhenCapturingSBAThenNoTrackingCmdsAreAdded, Gen12Plus) { - auto debugger = std::make_unique>(neoDevice); - - debugger->sbaTrackingGpuVa.address = 0x45670000; - - NEO::CommandContainer container; - container.initialize(neoDevice, nullptr, true); - - NEO::Debugger::SbaAddresses sba = {}; - sba.SurfaceStateBaseAddress = 0x123456000; - - debugger->captureStateBaseAddress(*container.getCommandStream(), sba); - auto sizeUsed = container.getCommandStream()->getUsed(); - - EXPECT_NE(0u, sizeUsed); - sba.SurfaceStateBaseAddress = 0; - - debugger->captureStateBaseAddress(*container.getCommandStream(), sba); - auto sizeUsed2 = container.getCommandStream()->getUsed(); - - EXPECT_EQ(sizeUsed, sizeUsed2); -} - -HWTEST2_P(L0DebuggerSimpleParameterizedTest, givenChangedBaseAddressesWhenCapturingSBAThenTrackingCmdsAreAdded, Gen12Plus) { - auto debugger = std::make_unique>(neoDevice); - - debugger->sbaTrackingGpuVa.address = 0x45670000; - { - NEO::CommandContainer container; - container.initialize(neoDevice, nullptr, true); - - NEO::Debugger::SbaAddresses sba = {}; - sba.SurfaceStateBaseAddress = 0x123456000; - - debugger->captureStateBaseAddress(*container.getCommandStream(), sba); - auto sizeUsed = container.getCommandStream()->getUsed(); - - EXPECT_NE(0u, sizeUsed); - } - - { - NEO::CommandContainer container; - container.initialize(neoDevice, nullptr, true); - - NEO::Debugger::SbaAddresses sba = {}; - sba.GeneralStateBaseAddress = 0x123456000; - - debugger->captureStateBaseAddress(*container.getCommandStream(), sba); - auto sizeUsed = container.getCommandStream()->getUsed(); - - EXPECT_NE(0u, sizeUsed); - } - - { - NEO::CommandContainer container; - container.initialize(neoDevice, nullptr, true); - - NEO::Debugger::SbaAddresses sba = {}; - sba.BindlessSurfaceStateBaseAddress = 0x123456000; - - debugger->captureStateBaseAddress(*container.getCommandStream(), sba); - auto sizeUsed = container.getCommandStream()->getUsed(); - - EXPECT_NE(0u, sizeUsed); - } -} - INSTANTIATE_TEST_CASE_P(SBAModesForDebugger, L0DebuggerParameterizedTests, ::testing::Values(0, 1)); -INSTANTIATE_TEST_CASE_P(SBAModesForDebugger, L0DebuggerSimpleParameterizedTest, ::testing::Values(0, 1)); + +struct L0DebuggerSingleAddressSpace : public Test { + void SetUp() override { + NEO::DebugManager.flags.DebuggerForceSbaTrackingMode.set(1); + Test::SetUp(); + } + + void TearDown() override { + Test::TearDown(); + } + + DebugManagerStateRestore restorer; +}; + +HWTEST2_F(L0DebuggerSingleAddressSpace, givenDebuggingEnabledWhenCommandListIsExecutedThenValidKernelDebugCommandsAreAdded, IsAtLeastGen12lp) { + using MI_LOAD_REGISTER_IMM = typename FamilyType::MI_LOAD_REGISTER_IMM; + using STATE_SIP = typename FamilyType::STATE_SIP; + + ze_command_queue_desc_t queueDesc = {}; + ze_result_t returnValue; + auto commandQueue = whiteboxCast(CommandQueue::create(productFamily, device, neoDevice->getDefaultEngine().commandStreamReceiver, &queueDesc, false, false, returnValue)); + ASSERT_NE(nullptr, commandQueue->commandStream); + + auto usedSpaceBefore = commandQueue->commandStream->getUsed(); + + ze_command_list_handle_t commandLists[] = { + CommandList::create(productFamily, device, NEO::EngineGroupType::RenderCompute, 0u, returnValue)->toHandle()}; + uint32_t numCommandLists = sizeof(commandLists) / sizeof(commandLists[0]); + + auto result = commandQueue->executeCommandLists(numCommandLists, commandLists, nullptr, true); + ASSERT_EQ(ZE_RESULT_SUCCESS, result); + + auto usedSpaceAfter = commandQueue->commandStream->getUsed(); + ASSERT_GT(usedSpaceAfter, usedSpaceBefore); + + GenCmdList cmdList; + ASSERT_TRUE(FamilyType::PARSE::parseCommandBuffer( + cmdList, ptrOffset(commandQueue->commandStream->getCpuBase(), 0), usedSpaceAfter)); + + auto miLoadImm = findAll(cmdList.begin(), cmdList.end()); + + size_t gpr15RegisterCount = 0; + + size_t gprMiLoadindex = std::numeric_limits::max(); + + for (size_t i = 0; i < miLoadImm.size(); i++) { + MI_LOAD_REGISTER_IMM *miLoad = genCmdCast(*miLoadImm[i]); + ASSERT_NE(nullptr, miLoad); + + if (miLoad->getRegisterOffset() == CS_GPR_R15) { + gpr15RegisterCount++; + gprMiLoadindex = i; + } + if (miLoad->getRegisterOffset() == CS_GPR_R15 + 4) { + gpr15RegisterCount++; + } + } + + // 2 LRI commands to store SBA buffer address + EXPECT_EQ(2u, gpr15RegisterCount); + + auto sbaGpuVa = getMockDebuggerL0Hw()->getSbaTrackingBuffer(commandQueue->getCsr()->getOsContext().getContextId())->getGpuAddress(); + uint32_t low = sbaGpuVa & 0xffffffff; + uint32_t high = (sbaGpuVa >> 32) & 0xffffffff; + + MI_LOAD_REGISTER_IMM *miLoad = genCmdCast(*miLoadImm[gprMiLoadindex]); + EXPECT_EQ(CS_GPR_R15, miLoad->getRegisterOffset()); + EXPECT_EQ(low, miLoad->getDataDword()); + + miLoad = genCmdCast(*miLoadImm[gprMiLoadindex + 1]); + EXPECT_EQ(CS_GPR_R15 + 4, miLoad->getRegisterOffset()); + EXPECT_EQ(high, miLoad->getDataDword()); + + for (auto i = 0u; i < numCommandLists; i++) { + auto commandList = CommandList::fromHandle(commandLists[i]); + commandList->destroy(); + } + + commandQueue->destroy(); +} } // namespace ult } // namespace L0 diff --git a/level_zero/core/test/unit_tests/sources/debugger/test_module_with_debug.cpp b/level_zero/core/test/unit_tests/sources/debugger/test_module_with_debug.cpp index 92b639bf0a..b0c815c688 100644 --- a/level_zero/core/test/unit_tests/sources/debugger/test_module_with_debug.cpp +++ b/level_zero/core/test/unit_tests/sources/debugger/test_module_with_debug.cpp @@ -12,12 +12,12 @@ #include "shared/test/common/helpers/unit_test_helper.h" #include "shared/test/common/mocks/mock_compilers.h" #include "shared/test/common/mocks/mock_elf.h" +#include "shared/test/common/mocks/mock_l0_debugger.h" #include "shared/test/common/test_macros/hw_test.h" #include "shared/test/unit_test/compiler_interface/linker_mock.h" #include "level_zero/core/source/module/module_imp.h" #include "level_zero/core/test/unit_tests/fixtures/module_fixture.h" -#include "level_zero/core/test/unit_tests/mocks/mock_l0_debugger.h" #include "level_zero/core/test/unit_tests/mocks/mock_module.h" #include "level_zero/core/test/unit_tests/sources/debugger/l0_debugger_fixture.h" diff --git a/level_zero/core/test/unit_tests/xe_hp_core/enable_l0_mocks_xe_hp_core.cpp b/level_zero/core/test/unit_tests/xe_hp_core/enable_l0_mocks_xe_hp_core.cpp index dc6ca38eca..f9c90f2acd 100644 --- a/level_zero/core/test/unit_tests/xe_hp_core/enable_l0_mocks_xe_hp_core.cpp +++ b/level_zero/core/test/unit_tests/xe_hp_core/enable_l0_mocks_xe_hp_core.cpp @@ -5,7 +5,7 @@ * */ -#include "level_zero/core/test/unit_tests/mocks/mock_l0_debugger.h" +#include "shared/test/unit_test/mocks/mock_l0_debugger.h" namespace NEO { struct XeHpFamily; diff --git a/level_zero/core/test/unit_tests/xe_hpc_core/enable_l0_mocks_xe_hpc_core.cpp b/level_zero/core/test/unit_tests/xe_hpc_core/enable_l0_mocks_xe_hpc_core.cpp index 710b5276f6..d6f92613ff 100644 --- a/level_zero/core/test/unit_tests/xe_hpc_core/enable_l0_mocks_xe_hpc_core.cpp +++ b/level_zero/core/test/unit_tests/xe_hpc_core/enable_l0_mocks_xe_hpc_core.cpp @@ -5,7 +5,7 @@ * */ -#include "level_zero/core/test/unit_tests/mocks/mock_l0_debugger.h" +#include "shared/test/unit_test/mocks/mock_l0_debugger.h" namespace NEO { struct XE_HPC_COREFamily; diff --git a/level_zero/core/test/unit_tests/xe_hpg_core/enable_l0_mocks_xe_hpg_core.cpp b/level_zero/core/test/unit_tests/xe_hpg_core/enable_l0_mocks_xe_hpg_core.cpp index da65f6a229..6d3602cda3 100644 --- a/level_zero/core/test/unit_tests/xe_hpg_core/enable_l0_mocks_xe_hpg_core.cpp +++ b/level_zero/core/test/unit_tests/xe_hpg_core/enable_l0_mocks_xe_hpg_core.cpp @@ -5,7 +5,7 @@ * */ -#include "level_zero/core/test/unit_tests/mocks/mock_l0_debugger.h" +#include "shared/test/unit_test/mocks/mock_l0_debugger.h" namespace NEO { struct XE_HPG_COREFamily; diff --git a/shared/test/common/libult/gen11.cpp b/shared/test/common/libult/gen11.cpp index 02f7d043bd..c7cf308408 100644 --- a/shared/test/common/libult/gen11.cpp +++ b/shared/test/common/libult/gen11.cpp @@ -8,12 +8,13 @@ #include "shared/source/gen11/hw_cmds.h" #include "shared/source/helpers/populate_factory.h" #include "shared/test/common/libult/ult_command_stream_receiver.h" +#include "shared/test/common/mocks/mock_l0_debugger.h" namespace NEO { typedef ICLFamily Family; -static auto gfxCore = IGFX_GEN11_CORE; +constexpr auto gfxCore = IGFX_GEN11_CORE; extern CommandStreamReceiverCreateFunc commandStreamReceiverFactory[2 * IGFX_MAX_CORE]; @@ -30,5 +31,7 @@ struct enableGen11 { static enableGen11 enable; +static MockDebuggerL0HwPopulateFactory mockDebuggerGen11; + template class UltCommandStreamReceiver; } // namespace NEO diff --git a/shared/test/common/libult/gen12lp.cpp b/shared/test/common/libult/gen12lp.cpp index 5ec09ca37e..441f2c0af8 100644 --- a/shared/test/common/libult/gen12lp.cpp +++ b/shared/test/common/libult/gen12lp.cpp @@ -8,12 +8,13 @@ #include "shared/source/gen12lp/hw_cmds.h" #include "shared/source/helpers/populate_factory.h" #include "shared/test/common/libult/ult_command_stream_receiver.h" +#include "shared/test/common/mocks/mock_l0_debugger.h" namespace NEO { typedef TGLLPFamily Family; -static auto gfxCore = IGFX_GEN12LP_CORE; +constexpr auto gfxCore = IGFX_GEN12LP_CORE; extern CommandStreamReceiverCreateFunc commandStreamReceiverFactory[2 * IGFX_MAX_CORE]; @@ -29,6 +30,7 @@ struct enableGen12LP { }; static enableGen12LP enable; +static MockDebuggerL0HwPopulateFactory mockDebuggerGen12lp; template class UltCommandStreamReceiver; } // namespace NEO diff --git a/shared/test/common/libult/gen8.cpp b/shared/test/common/libult/gen8.cpp index 6e36a9d9be..19ca0e6612 100644 --- a/shared/test/common/libult/gen8.cpp +++ b/shared/test/common/libult/gen8.cpp @@ -8,12 +8,13 @@ #include "shared/source/gen8/hw_cmds.h" #include "shared/source/helpers/populate_factory.h" #include "shared/test/common/libult/ult_command_stream_receiver.h" +#include "shared/test/common/mocks/mock_l0_debugger.h" namespace NEO { typedef BDWFamily Family; -static const auto gfxCore = IGFX_GEN8_CORE; +constexpr auto gfxCore = IGFX_GEN8_CORE; extern CommandStreamReceiverCreateFunc commandStreamReceiverFactory[2 * IGFX_MAX_CORE]; @@ -29,6 +30,7 @@ struct enableGen8 { }; static enableGen8 enable; +static MockDebuggerL0HwPopulateFactory mockDebuggerGen8; template class UltCommandStreamReceiver; } // namespace NEO diff --git a/shared/test/common/libult/gen9.cpp b/shared/test/common/libult/gen9.cpp index b023112225..cef24241e9 100644 --- a/shared/test/common/libult/gen9.cpp +++ b/shared/test/common/libult/gen9.cpp @@ -8,12 +8,13 @@ #include "shared/source/gen9/hw_cmds.h" #include "shared/source/helpers/populate_factory.h" #include "shared/test/common/libult/ult_command_stream_receiver.h" +#include "shared/test/common/mocks/mock_l0_debugger.h" namespace NEO { typedef SKLFamily Family; -static const auto gfxCore = IGFX_GEN9_CORE; +constexpr auto gfxCore = IGFX_GEN9_CORE; extern CommandStreamReceiverCreateFunc commandStreamReceiverFactory[2 * IGFX_MAX_CORE]; @@ -30,5 +31,7 @@ struct enableGen9 { static enableGen9 enable; +static MockDebuggerL0HwPopulateFactory mockDebuggerGen9; + template class UltCommandStreamReceiver; } // namespace NEO diff --git a/shared/test/common/libult/xe_hp_core.cpp b/shared/test/common/libult/xe_hp_core.cpp index f7e47588ac..abfd9d6cfd 100644 --- a/shared/test/common/libult/xe_hp_core.cpp +++ b/shared/test/common/libult/xe_hp_core.cpp @@ -8,12 +8,13 @@ #include "shared/source/helpers/populate_factory.h" #include "shared/source/xe_hp_core/hw_cmds.h" #include "shared/test/common/libult/ult_command_stream_receiver.h" +#include "shared/test/common/mocks/mock_l0_debugger.h" namespace NEO { typedef XeHpFamily Family; -static auto gfxCore = IGFX_XE_HP_CORE; +constexpr auto gfxCore = IGFX_XE_HP_CORE; extern CommandStreamReceiverCreateFunc commandStreamReceiverFactory[2 * IGFX_MAX_CORE]; @@ -29,6 +30,7 @@ struct enableXeHpCore { }; static enableXeHpCore enable; +static MockDebuggerL0HwPopulateFactory mockDebuggerXE_HP_CORE; template class UltCommandStreamReceiver; } // namespace NEO diff --git a/shared/test/common/libult/xe_hpc_core.cpp b/shared/test/common/libult/xe_hpc_core.cpp index 1593a27ab3..18d9f606d6 100644 --- a/shared/test/common/libult/xe_hpc_core.cpp +++ b/shared/test/common/libult/xe_hpc_core.cpp @@ -8,12 +8,13 @@ #include "shared/source/helpers/populate_factory.h" #include "shared/source/xe_hpc_core/hw_cmds.h" #include "shared/test/common/libult/ult_command_stream_receiver.h" +#include "shared/test/common/mocks/mock_l0_debugger.h" namespace NEO { typedef XE_HPC_COREFamily Family; -static auto gfxCore = IGFX_XE_HPC_CORE; +constexpr auto gfxCore = IGFX_XE_HPC_CORE; extern CommandStreamReceiverCreateFunc commandStreamReceiverFactory[2 * IGFX_MAX_CORE]; @@ -29,6 +30,7 @@ struct enableXeHpcCore { }; static enableXeHpcCore enable; +static MockDebuggerL0HwPopulateFactory mockDebuggerXeHpcCore; template class UltCommandStreamReceiver; } // namespace NEO diff --git a/shared/test/common/libult/xe_hpg_core.cpp b/shared/test/common/libult/xe_hpg_core.cpp index b33557e585..719e47470d 100644 --- a/shared/test/common/libult/xe_hpg_core.cpp +++ b/shared/test/common/libult/xe_hpg_core.cpp @@ -8,12 +8,13 @@ #include "shared/source/helpers/populate_factory.h" #include "shared/source/xe_hpg_core/hw_cmds.h" #include "shared/test/common/libult/ult_command_stream_receiver.h" +#include "shared/test/common/mocks/mock_l0_debugger.h" namespace NEO { typedef XE_HPG_COREFamily Family; -static auto gfxCore = IGFX_XE_HPG_CORE; +constexpr auto gfxCore = IGFX_XE_HPG_CORE; extern CommandStreamReceiverCreateFunc commandStreamReceiverFactory[2 * IGFX_MAX_CORE]; @@ -29,6 +30,7 @@ struct enableXeHpgCore { }; static enableXeHpgCore enable; +static MockDebuggerL0HwPopulateFactory mockDebuggerXeHpgCore; template class UltCommandStreamReceiver; } // namespace NEO diff --git a/shared/test/common/mocks/CMakeLists.txt b/shared/test/common/mocks/CMakeLists.txt index fd358b01b5..40384bdc97 100644 --- a/shared/test/common/mocks/CMakeLists.txt +++ b/shared/test/common/mocks/CMakeLists.txt @@ -15,6 +15,7 @@ set_property(GLOBAL PROPERTY NEO_CORE_tests_compiler_mocks ${NEO_CORE_tests_comp set(NEO_CORE_tests_mocks ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt + ${CMAKE_CURRENT_SOURCE_DIR}/debugger_l0_create.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mock_allocation_properties.h ${CMAKE_CURRENT_SOURCE_DIR}/mock_aub_center.h ${CMAKE_CURRENT_SOURCE_DIR}/mock_aub_csr.h @@ -66,6 +67,7 @@ set(NEO_CORE_tests_mocks ${CMAKE_CURRENT_SOURCE_DIR}/mock_io_functions.h ${CMAKE_CURRENT_SOURCE_DIR}/mock_kernel_info.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mock_kernel_info.h + ${CMAKE_CURRENT_SOURCE_DIR}/mock_l0_debugger.h ${CMAKE_CURRENT_SOURCE_DIR}/mock_logical_state_helper.h ${CMAKE_CURRENT_SOURCE_DIR}/mock_lrca_helper.h ${CMAKE_CURRENT_SOURCE_DIR}/mock_memory_manager.h diff --git a/level_zero/core/test/unit_tests/mocks/debugger_l0_create.cpp b/shared/test/common/mocks/debugger_l0_create.cpp similarity index 88% rename from level_zero/core/test/unit_tests/mocks/debugger_l0_create.cpp rename to shared/test/common/mocks/debugger_l0_create.cpp index 964da6e69e..003866e781 100644 --- a/level_zero/core/test/unit_tests/mocks/debugger_l0_create.cpp +++ b/shared/test/common/mocks/debugger_l0_create.cpp @@ -6,8 +6,7 @@ */ #include "shared/source/device/device.h" - -#include "level_zero/core/test/unit_tests/mocks/mock_l0_debugger.h" +#include "shared/test/common/mocks/mock_l0_debugger.h" NEO::DebugerL0CreateFn mockDebuggerL0HwFactory[IGFX_MAX_CORE]; diff --git a/level_zero/core/test/unit_tests/mocks/mock_l0_debugger.h b/shared/test/common/mocks/mock_l0_debugger.h similarity index 95% rename from level_zero/core/test/unit_tests/mocks/mock_l0_debugger.h rename to shared/test/common/mocks/mock_l0_debugger.h index a562d15df8..0d485c0bf8 100644 --- a/level_zero/core/test/unit_tests/mocks/mock_l0_debugger.h +++ b/shared/test/common/mocks/mock_l0_debugger.h @@ -11,9 +11,7 @@ extern NEO::DebugerL0CreateFn mockDebuggerL0HwFactory[]; -namespace L0 { -namespace ult { - +namespace NEO { template struct WhiteBox; @@ -98,8 +96,7 @@ struct WhiteBox : public NEO::DebuggerL0 { template struct MockDebuggerL0HwPopulateFactory { MockDebuggerL0HwPopulateFactory() { - mockDebuggerL0HwFactory[productFamily] = L0::ult::MockDebuggerL0Hw::allocate; + mockDebuggerL0HwFactory[productFamily] = MockDebuggerL0Hw::allocate; } }; -} // namespace ult -} // namespace L0 \ No newline at end of file +} // namespace NEO \ No newline at end of file diff --git a/shared/test/unit_test/debugger/CMakeLists.txt b/shared/test/unit_test/debugger/CMakeLists.txt new file mode 100644 index 0000000000..46fd9a6221 --- /dev/null +++ b/shared/test/unit_test/debugger/CMakeLists.txt @@ -0,0 +1,11 @@ +# +# Copyright (C) 2022 Intel Corporation +# +# SPDX-License-Identifier: MIT +# + +target_sources(${TARGET_NAME} PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt + ${CMAKE_CURRENT_SOURCE_DIR}/test_l0_debugger.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/test_l0_debugger_single_address_space.cpp +) diff --git a/shared/test/unit_test/debugger/test_l0_debugger.cpp b/shared/test/unit_test/debugger/test_l0_debugger.cpp new file mode 100644 index 0000000000..d0ae2836bb --- /dev/null +++ b/shared/test/unit_test/debugger/test_l0_debugger.cpp @@ -0,0 +1,579 @@ +/* + * Copyright (C) 2020-2022 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#include "shared/source/built_ins/sip.h" +#include "shared/source/gen_common/reg_configs_common.h" +#include "shared/source/helpers/hw_helper.h" +#include "shared/source/helpers/preamble.h" +#include "shared/source/os_interface/device_factory.h" +#include "shared/test/common/cmd_parse/gen_cmd_parse.h" +#include "shared/test/common/fixtures/device_fixture.h" +#include "shared/test/common/helpers/debug_manager_state_restore.h" +#include "shared/test/common/helpers/default_hw_info.h" +#include "shared/test/common/mocks/mock_builtins.h" +#include "shared/test/common/mocks/mock_device.h" +#include "shared/test/common/mocks/mock_gmm_helper.h" +#include "shared/test/common/mocks/mock_l0_debugger.h" +#include "shared/test/common/mocks/mock_memory_operations_handler.h" +#include "shared/test/common/test_macros/hw_test.h" + +using namespace NEO; + +TEST(Debugger, givenL0DebuggerOFFWhenGettingStateSaveAreaHeaderThenValidSipTypeIsReturned) { + auto executionEnvironment = new NEO::ExecutionEnvironment(); + executionEnvironment->prepareRootDeviceEnvironments(1); + + auto isHexadecimalArrayPreferred = NEO::HwHelper::get(NEO::defaultHwInfo->platform.eRenderCoreFamily).isSipKernelAsHexadecimalArrayPreferred(); + if (!isHexadecimalArrayPreferred) { + auto mockBuiltIns = new NEO::MockBuiltins(); + executionEnvironment->rootDeviceEnvironments[0]->builtins.reset(mockBuiltIns); + } + auto hwInfo = *NEO::defaultHwInfo.get(); + hwInfo.featureTable.flags.ftrLocalMemory = true; + executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(&hwInfo); + executionEnvironment->rootDeviceEnvironments[0]->initGmm(); + executionEnvironment->initializeMemoryManager(); + + std::unique_ptr neoDevice(NEO::MockDevice::create(executionEnvironment, 0u)); + auto sipType = SipKernel::getSipKernelType(*neoDevice); + + if (isHexadecimalArrayPreferred) { + SipKernel::initSipKernel(sipType, *neoDevice); + } + auto &stateSaveAreaHeader = SipKernel::getSipKernel(*neoDevice).getStateSaveAreaHeader(); + + if (isHexadecimalArrayPreferred) { + auto sipKernel = neoDevice->getRootDeviceEnvironment().sipKernels[static_cast(sipType)].get(); + ASSERT_NE(sipKernel, nullptr); + auto &expectedStateSaveAreaHeader = sipKernel->getStateSaveAreaHeader(); + EXPECT_EQ(expectedStateSaveAreaHeader, stateSaveAreaHeader); + } else { + auto &expectedStateSaveAreaHeader = neoDevice->getBuiltIns()->getSipKernel(sipType, *neoDevice).getStateSaveAreaHeader(); + EXPECT_EQ(expectedStateSaveAreaHeader, stateSaveAreaHeader); + } +} + +TEST(Debugger, givenDebuggingEnabledInExecEnvWhenAllocatingIsaThenSingleBankIsUsed) { + auto executionEnvironment = new NEO::ExecutionEnvironment(); + executionEnvironment->prepareRootDeviceEnvironments(1); + executionEnvironment->setDebuggingEnabled(); + + auto hwInfo = *NEO::defaultHwInfo.get(); + hwInfo.featureTable.flags.ftrLocalMemory = true; + executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(&hwInfo); + executionEnvironment->rootDeviceEnvironments[0]->initGmm(); + executionEnvironment->initializeMemoryManager(); + + std::unique_ptr neoDevice(NEO::MockDevice::create(executionEnvironment, 0u)); + + auto allocation = neoDevice->getMemoryManager()->allocateGraphicsMemoryWithProperties( + {neoDevice->getRootDeviceIndex(), 4096, NEO::AllocationType::KERNEL_ISA, neoDevice->getDeviceBitfield()}); + + if (allocation->getMemoryPool() == MemoryPool::LocalMemory) { + EXPECT_EQ(1u, allocation->storageInfo.getMemoryBanks()); + } else { + EXPECT_EQ(0u, allocation->storageInfo.getMemoryBanks()); + } + + neoDevice->getMemoryManager()->freeGraphicsMemory(allocation); +} + +using L0DebuggerTest = Test; + +HWTEST_F(L0DebuggerTest, GivenDeviceWhenAllocateCalledThenDebuggerIsCreated) { + auto debugger = DebuggerL0Hw::allocate(pDevice); + EXPECT_NE(nullptr, debugger); + delete debugger; +} + +HWTEST_F(L0DebuggerTest, givenDebuggerWithoutMemoryOperationsHandlerWhenNotifyingModuleAllocationsThenNoAllocationIsResident) { + auto debugger = std::make_unique>(pDevice); + + StackVec allocs; + NEO::GraphicsAllocation alloc(0, NEO::AllocationType::INTERNAL_HOST_MEMORY, + reinterpret_cast(0x1234), 0x1000, 0, sizeof(uint32_t), + MemoryPool::System4KBPages, MemoryManager::maxOsContextCount); + allocs.push_back(&alloc); + + debugger->notifyModuleLoadAllocations(allocs); +} + +HWTEST_F(L0DebuggerTest, givenDebuggerWhenCreatedThenModuleHeapDebugAreaIsCreated) { + auto mockBlitMemoryToAllocation = [](const NEO::Device &device, NEO::GraphicsAllocation *memory, size_t offset, const void *hostPtr, + Vec3 size) -> NEO::BlitOperationResult { + memcpy(memory->getUnderlyingBuffer(), hostPtr, size.x); + return BlitOperationResult::Success; + }; + VariableBackup blitMemoryToAllocationFuncBackup( + &NEO::BlitHelperFunctions::blitMemoryToAllocation, mockBlitMemoryToAllocation); + + auto memoryOperationsHandler = new NEO::MockMemoryOperations(); + + memoryOperationsHandler->makeResidentCalledCount = 0; + pDevice->executionEnvironment->rootDeviceEnvironments[0]->memoryOperationsInterface.reset(memoryOperationsHandler); + + auto neoDevice = pDevice; + auto debugger = std::make_unique>(neoDevice); + auto debugArea = debugger->getModuleDebugArea(); + + EXPECT_EQ(1, memoryOperationsHandler->makeResidentCalledCount); + + auto allocation = neoDevice->getMemoryManager()->allocateGraphicsMemoryWithProperties( + {neoDevice->getRootDeviceIndex(), 4096, NEO::AllocationType::KERNEL_ISA, neoDevice->getDeviceBitfield()}); + + EXPECT_EQ(allocation->storageInfo.getMemoryBanks(), debugArea->storageInfo.getMemoryBanks()); + + DebugAreaHeader *header = reinterpret_cast(debugArea->getUnderlyingBuffer()); + EXPECT_EQ(1u, header->pgsize); + uint64_t isShared = debugArea->storageInfo.getNumBanks() == 1 ? 1 : 0; + EXPECT_EQ(isShared, header->isShared); + + EXPECT_STREQ("dbgarea", header->magic); + EXPECT_EQ(sizeof(DebugAreaHeader), header->size); + EXPECT_EQ(sizeof(DebugAreaHeader), header->scratchBegin); + EXPECT_EQ(MemoryConstants::pageSize64k - sizeof(DebugAreaHeader), header->scratchEnd); + + neoDevice->getMemoryManager()->freeGraphicsMemory(allocation); +} + +HWTEST_F(L0DebuggerTest, givenBindlessSipWhenModuleHeapDebugAreaIsCreatedThenReservedFieldIsSet) { + DebugManagerStateRestore restorer; + NEO::DebugManager.flags.UseBindlessDebugSip.set(1); + + auto mockBlitMemoryToAllocation = [](const NEO::Device &device, NEO::GraphicsAllocation *memory, size_t offset, const void *hostPtr, + Vec3 size) -> NEO::BlitOperationResult { + memcpy(memory->getUnderlyingBuffer(), hostPtr, size.x); + return BlitOperationResult::Success; + }; + VariableBackup blitMemoryToAllocationFuncBackup( + &NEO::BlitHelperFunctions::blitMemoryToAllocation, mockBlitMemoryToAllocation); + + auto memoryOperationsHandler = new NEO::MockMemoryOperations(); + pDevice->executionEnvironment->rootDeviceEnvironments[0]->memoryOperationsInterface.reset(memoryOperationsHandler); + + memoryOperationsHandler->makeResidentCalledCount = 0; + auto neoDevice = pDevice; + auto debugger = std::make_unique>(neoDevice); + auto debugArea = debugger->getModuleDebugArea(); + + DebugAreaHeader *header = reinterpret_cast(debugArea->getUnderlyingBuffer()); + EXPECT_EQ(1u, header->reserved1); +} + +HWTEST_F(L0DebuggerTest, givenUseBindlessDebugSipZeroWhenModuleHeapDebugAreaIsCreatedThenReservedFieldIsSet) { + DebugManagerStateRestore restorer; + NEO::DebugManager.flags.UseBindlessDebugSip.set(0); + + auto mockBlitMemoryToAllocation = [](const NEO::Device &device, NEO::GraphicsAllocation *memory, size_t offset, const void *hostPtr, + Vec3 size) -> NEO::BlitOperationResult { + memcpy(memory->getUnderlyingBuffer(), hostPtr, size.x); + return BlitOperationResult::Success; + }; + VariableBackup blitMemoryToAllocationFuncBackup( + &NEO::BlitHelperFunctions::blitMemoryToAllocation, mockBlitMemoryToAllocation); + + auto memoryOperationsHandler = new NEO::MockMemoryOperations(); + pDevice->executionEnvironment->rootDeviceEnvironments[0]->memoryOperationsInterface.reset(memoryOperationsHandler); + + memoryOperationsHandler->makeResidentCalledCount = 0; + auto neoDevice = pDevice; + auto debugger = std::make_unique>(neoDevice); + auto debugArea = debugger->getModuleDebugArea(); + + DebugAreaHeader *header = reinterpret_cast(debugArea->getUnderlyingBuffer()); + EXPECT_EQ(1u, header->reserved1); +} + +TEST(Debugger, givenNonLegacyDebuggerWhenInitializingDeviceCapsThenUnrecoverableIsCalled) { + class MockDebugger : public NEO::Debugger { + public: + MockDebugger() { + isLegacyMode = false; + } + + void captureStateBaseAddress(NEO::LinearStream &cmdStream, SbaAddresses sba) override{}; + size_t getSbaTrackingCommandsSize(size_t trackedAddressCount) override { + return 0; + } + }; + auto executionEnvironment = new NEO::ExecutionEnvironment(); + auto mockBuiltIns = new NEO::MockBuiltins(); + executionEnvironment->prepareRootDeviceEnvironments(1); + executionEnvironment->rootDeviceEnvironments[0]->builtins.reset(mockBuiltIns); + executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get()); + executionEnvironment->rootDeviceEnvironments[0]->initGmm(); + + auto debugger = new MockDebugger; + executionEnvironment->rootDeviceEnvironments[0]->debugger.reset(debugger); + executionEnvironment->initializeMemoryManager(); + + EXPECT_THROW(NEO::MockDevice::create(executionEnvironment, 0u), std::exception); +} + +using PerContextAddressSpaceL0DebuggerTest = L0DebuggerTest; + +HWTEST_F(PerContextAddressSpaceL0DebuggerTest, givenCanonizedGpuVasWhenProgrammingSbaTrackingThenNonCanonicalAddressesAreStored) { + using MI_STORE_DATA_IMM = typename FamilyType::MI_STORE_DATA_IMM; + DebugManagerStateRestore restorer; + NEO::DebugManager.flags.DebuggerForceSbaTrackingMode.set(0); + + auto debugger = std::make_unique>(pDevice); + + debugger->sbaTrackingGpuVa.address = 0x45670000; + auto expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(NEO::SbaTrackedAddresses, GeneralStateBaseAddress); + + StackVec buffer(4096); + NEO::LinearStream cmdStream(buffer.begin(), buffer.size()); + uint64_t gsba = 0xffff800000060000; + uint64_t ssba = 0xffff801234567000; + uint64_t iba = 0xffff8000fff80000; + uint64_t ioba = 0xffff800008100000; + uint64_t dsba = 0xffff8000aaaa0000; + + NEO::Debugger::SbaAddresses sbaAddresses = {}; + sbaAddresses.GeneralStateBaseAddress = gsba; + sbaAddresses.SurfaceStateBaseAddress = ssba; + sbaAddresses.InstructionBaseAddress = iba; + sbaAddresses.IndirectObjectBaseAddress = ioba; + sbaAddresses.DynamicStateBaseAddress = dsba; + sbaAddresses.BindlessSurfaceStateBaseAddress = ssba; + + debugger->programSbaTrackingCommands(cmdStream, sbaAddresses); + + GenCmdList cmdList; + ASSERT_TRUE(FamilyType::PARSE::parseCommandBuffer(cmdList, cmdStream.getCpuBase(), cmdStream.getUsed())); + + EXPECT_EQ(6 * sizeof(MI_STORE_DATA_IMM), cmdStream.getUsed()); + + auto sdiItor = find(cmdList.begin(), cmdList.end()); + ASSERT_NE(cmdList.end(), sdiItor); + auto cmdSdi = genCmdCast(*sdiItor); + + EXPECT_EQ(static_cast(gsba & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0()); + EXPECT_EQ(static_cast(gsba >> 32), cmdSdi->getDataDword1()); + EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress()); + EXPECT_TRUE(cmdSdi->getStoreQword()); + + sdiItor++; + cmdSdi = genCmdCast(*sdiItor); + + expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(NEO::SbaTrackedAddresses, SurfaceStateBaseAddress); + + EXPECT_EQ(static_cast(ssba & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0()); + EXPECT_EQ(static_cast(ssba >> 32), cmdSdi->getDataDword1()); + EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress()); + EXPECT_TRUE(cmdSdi->getStoreQword()); + + sdiItor++; + cmdSdi = genCmdCast(*sdiItor); + + expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(NEO::SbaTrackedAddresses, DynamicStateBaseAddress); + EXPECT_EQ(static_cast(dsba & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0()); + EXPECT_EQ(static_cast(dsba >> 32), cmdSdi->getDataDword1()); + EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress()); + EXPECT_TRUE(cmdSdi->getStoreQword()); + + sdiItor++; + cmdSdi = genCmdCast(*sdiItor); + + expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(NEO::SbaTrackedAddresses, IndirectObjectBaseAddress); + EXPECT_EQ(static_cast(ioba & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0()); + EXPECT_EQ(static_cast(ioba >> 32), cmdSdi->getDataDword1()); + EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress()); + EXPECT_TRUE(cmdSdi->getStoreQword()); + + sdiItor++; + cmdSdi = genCmdCast(*sdiItor); + + expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(NEO::SbaTrackedAddresses, InstructionBaseAddress); + EXPECT_EQ(static_cast(iba & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0()); + EXPECT_EQ(static_cast(iba >> 32), cmdSdi->getDataDword1()); + EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress()); + EXPECT_TRUE(cmdSdi->getStoreQword()); + + sdiItor++; + cmdSdi = genCmdCast(*sdiItor); + + expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(NEO::SbaTrackedAddresses, BindlessSurfaceStateBaseAddress); + EXPECT_EQ(static_cast(ssba & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0()); + EXPECT_EQ(static_cast(ssba >> 32), cmdSdi->getDataDword1()); + EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress()); + EXPECT_TRUE(cmdSdi->getStoreQword()); +} + +HWTEST_F(PerContextAddressSpaceL0DebuggerTest, givenNonZeroGpuVasWhenProgrammingSbaTrackingThenCorrectCmdsAreAddedToStream) { + using MI_STORE_DATA_IMM = typename FamilyType::MI_STORE_DATA_IMM; + DebugManagerStateRestore restorer; + NEO::DebugManager.flags.DebuggerForceSbaTrackingMode.set(0); + + auto debugger = std::make_unique>(pDevice); + debugger->singleAddressSpaceSbaTracking = 0; + debugger->sbaTrackingGpuVa.address = 0x45670000; + auto expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(NEO::SbaTrackedAddresses, GeneralStateBaseAddress); + + StackVec buffer(4096); + NEO::LinearStream cmdStream(buffer.begin(), buffer.size()); + uint64_t gsba = 0x60000; + uint64_t ssba = 0x1234567000; + uint64_t iba = 0xfff80000; + uint64_t ioba = 0x8100000; + uint64_t dsba = 0xffffffffaaaa0000; + + NEO::Debugger::SbaAddresses sbaAddresses = {}; + sbaAddresses.GeneralStateBaseAddress = gsba; + sbaAddresses.SurfaceStateBaseAddress = ssba; + sbaAddresses.InstructionBaseAddress = iba; + sbaAddresses.IndirectObjectBaseAddress = ioba; + sbaAddresses.DynamicStateBaseAddress = dsba; + sbaAddresses.BindlessSurfaceStateBaseAddress = ssba; + + debugger->programSbaTrackingCommands(cmdStream, sbaAddresses); + + GenCmdList cmdList; + ASSERT_TRUE(FamilyType::PARSE::parseCommandBuffer(cmdList, cmdStream.getCpuBase(), cmdStream.getUsed())); + + EXPECT_EQ(6 * sizeof(MI_STORE_DATA_IMM), cmdStream.getUsed()); + + auto sdiItor = find(cmdList.begin(), cmdList.end()); + ASSERT_NE(cmdList.end(), sdiItor); + auto cmdSdi = genCmdCast(*sdiItor); + + EXPECT_EQ(static_cast(gsba & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0()); + EXPECT_EQ(static_cast(gsba >> 32), cmdSdi->getDataDword1()); + EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress()); + EXPECT_TRUE(cmdSdi->getStoreQword()); + + sdiItor++; + cmdSdi = genCmdCast(*sdiItor); + + expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(NEO::SbaTrackedAddresses, SurfaceStateBaseAddress); + EXPECT_EQ(static_cast(ssba & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0()); + EXPECT_EQ(static_cast(ssba >> 32), cmdSdi->getDataDword1()); + EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress()); + EXPECT_TRUE(cmdSdi->getStoreQword()); + + sdiItor++; + cmdSdi = genCmdCast(*sdiItor); + + expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(NEO::SbaTrackedAddresses, DynamicStateBaseAddress); + + EXPECT_EQ(static_cast(dsba & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0()); + EXPECT_EQ(static_cast(dsba >> 32), cmdSdi->getDataDword1()); + EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress()); + EXPECT_TRUE(cmdSdi->getStoreQword()); + + sdiItor++; + cmdSdi = genCmdCast(*sdiItor); + + expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(NEO::SbaTrackedAddresses, IndirectObjectBaseAddress); + EXPECT_EQ(static_cast(ioba & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0()); + EXPECT_EQ(static_cast(ioba >> 32), cmdSdi->getDataDword1()); + EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress()); + EXPECT_TRUE(cmdSdi->getStoreQword()); + + sdiItor++; + cmdSdi = genCmdCast(*sdiItor); + + expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(NEO::SbaTrackedAddresses, InstructionBaseAddress); + EXPECT_EQ(static_cast(iba & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0()); + EXPECT_EQ(static_cast(iba >> 32), cmdSdi->getDataDword1()); + EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress()); + EXPECT_TRUE(cmdSdi->getStoreQword()); + + sdiItor++; + cmdSdi = genCmdCast(*sdiItor); + + expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(NEO::SbaTrackedAddresses, BindlessSurfaceStateBaseAddress); + EXPECT_EQ(static_cast(ssba & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0()); + EXPECT_EQ(static_cast(ssba >> 32), cmdSdi->getDataDword1()); + EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress()); + EXPECT_TRUE(cmdSdi->getStoreQword()); +} + +using L0DebuggerMultiSubDeviceTest = L0DebuggerTest; + +HWTEST_F(L0DebuggerMultiSubDeviceTest, givenMultiSubDevicesWhenSbaTrackingBuffersAllocatedThenThereIsSeparatePhysicalStorageForEveryContext) { + + if (is32bit) { + GTEST_SKIP(); + } + + DebugManagerStateRestore restorer; + DebugManager.flags.CreateMultipleRootDevices.set(1); + constexpr auto numSubDevices = 2u; + DebugManager.flags.CreateMultipleSubDevices.set(2); + auto executionEnvironment = new NEO::ExecutionEnvironment; + auto devices = NEO::DeviceFactory::createDevices(*executionEnvironment); + auto neoDevice = devices[0].get(); + + auto debugger = std::make_unique>(neoDevice); + + const auto &engines = neoDevice->getAllEngines(); + EXPECT_LE(1u, engines.size()); + + for (auto &engine : engines) { + + auto contextId = engine.osContext->getContextId(); + const auto &storageInfo = debugger->perContextSbaAllocations[contextId]->storageInfo; + + EXPECT_FALSE(storageInfo.cloningOfPageTables); + EXPECT_EQ(DeviceBitfield{maxNBitValue(numSubDevices)}, storageInfo.memoryBanks); + EXPECT_EQ(DeviceBitfield{maxNBitValue(numSubDevices)}, storageInfo.pageTablesVisibility); + EXPECT_EQ(engine.osContext->getDeviceBitfield().to_ulong(), storageInfo.memoryBanks.to_ulong()); + EXPECT_TRUE(storageInfo.tileInstanced); + + for (uint32_t i = 0; i < numSubDevices; i++) { + auto sbaHeader = reinterpret_cast(ptrOffset(debugger->perContextSbaAllocations[contextId]->getUnderlyingBuffer(), + debugger->perContextSbaAllocations[contextId]->getUnderlyingBufferSize() * i)); + + EXPECT_STREQ("sbaarea", sbaHeader->magic); + EXPECT_EQ(0u, sbaHeader->BindlessSamplerStateBaseAddress); + EXPECT_EQ(0u, sbaHeader->BindlessSurfaceStateBaseAddress); + EXPECT_EQ(0u, sbaHeader->DynamicStateBaseAddress); + EXPECT_EQ(0u, sbaHeader->GeneralStateBaseAddress); + EXPECT_EQ(0u, sbaHeader->IndirectObjectBaseAddress); + EXPECT_EQ(0u, sbaHeader->InstructionBaseAddress); + EXPECT_EQ(0u, sbaHeader->SurfaceStateBaseAddress); + EXPECT_EQ(0u, sbaHeader->Version); + } + if (!debugger->singleAddressSpaceSbaTracking) { + EXPECT_EQ(debugger->sbaTrackingGpuVa.address, debugger->perContextSbaAllocations[contextId]->getGpuAddress()); + } else { + EXPECT_NE(debugger->sbaTrackingGpuVa.address, debugger->perContextSbaAllocations[contextId]->getGpuAddress()); + } + } + + const auto &subDevice0Engines = neoDevice->getSubDevice(0)->getAllEngines(); + const auto &subDevice1Engines = neoDevice->getSubDevice(1)->getAllEngines(); + + auto subDeviceEngineSets = {subDevice0Engines, subDevice1Engines}; + uint64_t subDeviceIndex = 0; + for (const auto &subDeviceEngines : subDeviceEngineSets) { + for (auto &engine : subDeviceEngines) { + + auto contextId = engine.osContext->getContextId(); + const auto &storageInfo = debugger->perContextSbaAllocations[contextId]->storageInfo; + + EXPECT_FALSE(storageInfo.cloningOfPageTables); + EXPECT_EQ(DeviceBitfield{1llu << subDeviceIndex}, storageInfo.memoryBanks); + EXPECT_EQ(DeviceBitfield{1llu << subDeviceIndex}, storageInfo.pageTablesVisibility); + EXPECT_EQ(engine.osContext->getDeviceBitfield().to_ulong(), storageInfo.memoryBanks.to_ulong()); + EXPECT_FALSE(storageInfo.tileInstanced); + + if (!debugger->singleAddressSpaceSbaTracking) { + EXPECT_EQ(debugger->sbaTrackingGpuVa.address, debugger->perContextSbaAllocations[contextId]->getGpuAddress()); + } else { + EXPECT_NE(debugger->sbaTrackingGpuVa.address, debugger->perContextSbaAllocations[contextId]->getGpuAddress()); + } + } + subDeviceIndex++; + } +} + +struct L0DebuggerSimpleParameterizedTest : public ::testing::TestWithParam, DeviceFixture { + void SetUp() override { + NEO::DebugManager.flags.DebuggerForceSbaTrackingMode.set(GetParam()); + DeviceFixture::SetUp(); + } + + void TearDown() override { + DeviceFixture::TearDown(); + } + + DebugManagerStateRestore restorer; +}; + +using Gen12Plus = IsAtLeastGfxCore; + +HWTEST2_P(L0DebuggerSimpleParameterizedTest, givenZeroGpuVasWhenProgrammingSbaTrackingThenStreamIsNotUsed, Gen12Plus) { + using MI_STORE_DATA_IMM = typename FamilyType::MI_STORE_DATA_IMM; + auto debugger = std::make_unique>(pDevice); + + debugger->sbaTrackingGpuVa.address = 0x45670000; + + StackVec buffer(4096); + NEO::LinearStream cmdStream(buffer.begin(), buffer.size()); + uint64_t gsba = 0; + uint64_t ssba = 0; + + NEO::Debugger::SbaAddresses sbaAddresses = {}; + sbaAddresses.GeneralStateBaseAddress = gsba; + sbaAddresses.SurfaceStateBaseAddress = ssba; + + debugger->programSbaTrackingCommands(cmdStream, sbaAddresses); + + EXPECT_EQ(0u, cmdStream.getUsed()); +} + +HWTEST2_P(L0DebuggerSimpleParameterizedTest, givenNotChangedSurfaceStateWhenCapturingSBAThenNoTrackingCmdsAreAdded, Gen12Plus) { + auto debugger = std::make_unique>(pDevice); + + debugger->sbaTrackingGpuVa.address = 0x45670000; + + NEO::CommandContainer container; + container.initialize(pDevice, nullptr, true); + + NEO::Debugger::SbaAddresses sba = {}; + sba.SurfaceStateBaseAddress = 0x123456000; + + debugger->captureStateBaseAddress(*container.getCommandStream(), sba); + auto sizeUsed = container.getCommandStream()->getUsed(); + + EXPECT_NE(0u, sizeUsed); + sba.SurfaceStateBaseAddress = 0; + + debugger->captureStateBaseAddress(*container.getCommandStream(), sba); + auto sizeUsed2 = container.getCommandStream()->getUsed(); + + EXPECT_EQ(sizeUsed, sizeUsed2); +} + +HWTEST2_P(L0DebuggerSimpleParameterizedTest, givenChangedBaseAddressesWhenCapturingSBAThenTrackingCmdsAreAdded, Gen12Plus) { + auto debugger = std::make_unique>(pDevice); + + debugger->sbaTrackingGpuVa.address = 0x45670000; + { + NEO::CommandContainer container; + container.initialize(pDevice, nullptr, true); + + NEO::Debugger::SbaAddresses sba = {}; + sba.SurfaceStateBaseAddress = 0x123456000; + + debugger->captureStateBaseAddress(*container.getCommandStream(), sba); + auto sizeUsed = container.getCommandStream()->getUsed(); + + EXPECT_NE(0u, sizeUsed); + } + + { + NEO::CommandContainer container; + container.initialize(pDevice, nullptr, true); + + NEO::Debugger::SbaAddresses sba = {}; + sba.GeneralStateBaseAddress = 0x123456000; + + debugger->captureStateBaseAddress(*container.getCommandStream(), sba); + auto sizeUsed = container.getCommandStream()->getUsed(); + + EXPECT_NE(0u, sizeUsed); + } + + { + NEO::CommandContainer container; + container.initialize(pDevice, nullptr, true); + + NEO::Debugger::SbaAddresses sba = {}; + sba.BindlessSurfaceStateBaseAddress = 0x123456000; + + debugger->captureStateBaseAddress(*container.getCommandStream(), sba); + auto sizeUsed = container.getCommandStream()->getUsed(); + + EXPECT_NE(0u, sizeUsed); + } +} + +INSTANTIATE_TEST_CASE_P(SBAModesForDebugger, L0DebuggerSimpleParameterizedTest, ::testing::Values(0, 1)); diff --git a/level_zero/core/test/unit_tests/sources/debugger/test_l0_debugger_single_address_space.cpp b/shared/test/unit_test/debugger/test_l0_debugger_single_address_space.cpp similarity index 79% rename from level_zero/core/test/unit_tests/sources/debugger/test_l0_debugger_single_address_space.cpp rename to shared/test/unit_test/debugger/test_l0_debugger_single_address_space.cpp index acafafeaa2..2784426214 100644 --- a/level_zero/core/test/unit_tests/sources/debugger/test_l0_debugger_single_address_space.cpp +++ b/shared/test/unit_test/debugger/test_l0_debugger_single_address_space.cpp @@ -8,14 +8,11 @@ #include "shared/source/command_container/command_encoder.h" #include "shared/test/common/cmd_parse/gen_cmd_parse.h" #include "shared/test/common/fixtures/device_fixture.h" +#include "shared/test/common/helpers/debug_manager_state_restore.h" +#include "shared/test/common/mocks/mock_l0_debugger.h" #include "shared/test/common/test_macros/hw_test.h" -#include "level_zero/core/source/cmdlist/cmdlist.h" -#include "level_zero/core/test/unit_tests/mocks/mock_cmdqueue.h" -#include "level_zero/core/test/unit_tests/sources/debugger/l0_debugger_fixture.h" - -namespace L0 { -namespace ult { +namespace NEO { struct SingleAddressSpaceFixture : public Test { void SetUp() override { @@ -30,19 +27,6 @@ struct SingleAddressSpaceFixture : public Test { DebugManagerStateRestore restorer; }; -struct L0DebuggerSingleAddressSpace : public Test { - void SetUp() override { - NEO::DebugManager.flags.DebuggerForceSbaTrackingMode.set(1); - Test::SetUp(); - } - - void TearDown() override { - Test::TearDown(); - } - - DebugManagerStateRestore restorer; -}; - HWTEST_F(SingleAddressSpaceFixture, givenDebugFlagForceSbaTrackingModeSetWhenDebuggerIsCreatedThenItHasCorrectSingleAddressSpaceValue) { DebugManagerStateRestore restorer; NEO::DebugManager.flags.DebuggerForceSbaTrackingMode.set(1); @@ -336,72 +320,4 @@ HWTEST2_F(SingleAddressSpaceFixture, GivenAllZeroSbaAddressesWhenProgrammingSbaT pDevice->getMemoryManager()->freeGraphicsMemory(streamAllocation); } -HWTEST2_F(L0DebuggerSingleAddressSpace, givenDebuggingEnabledWhenCommandListIsExecutedThenValidKernelDebugCommandsAreAdded, IsAtLeastGen12lp) { - using MI_LOAD_REGISTER_IMM = typename FamilyType::MI_LOAD_REGISTER_IMM; - using STATE_SIP = typename FamilyType::STATE_SIP; - - ze_command_queue_desc_t queueDesc = {}; - ze_result_t returnValue; - auto commandQueue = whiteboxCast(CommandQueue::create(productFamily, device, neoDevice->getDefaultEngine().commandStreamReceiver, &queueDesc, false, false, returnValue)); - ASSERT_NE(nullptr, commandQueue->commandStream); - - auto usedSpaceBefore = commandQueue->commandStream->getUsed(); - - ze_command_list_handle_t commandLists[] = { - CommandList::create(productFamily, device, NEO::EngineGroupType::RenderCompute, 0u, returnValue)->toHandle()}; - uint32_t numCommandLists = sizeof(commandLists) / sizeof(commandLists[0]); - - auto result = commandQueue->executeCommandLists(numCommandLists, commandLists, nullptr, true); - ASSERT_EQ(ZE_RESULT_SUCCESS, result); - - auto usedSpaceAfter = commandQueue->commandStream->getUsed(); - ASSERT_GT(usedSpaceAfter, usedSpaceBefore); - - GenCmdList cmdList; - ASSERT_TRUE(FamilyType::PARSE::parseCommandBuffer( - cmdList, ptrOffset(commandQueue->commandStream->getCpuBase(), 0), usedSpaceAfter)); - - auto miLoadImm = findAll(cmdList.begin(), cmdList.end()); - - size_t gpr15RegisterCount = 0; - - size_t gprMiLoadindex = std::numeric_limits::max(); - - for (size_t i = 0; i < miLoadImm.size(); i++) { - MI_LOAD_REGISTER_IMM *miLoad = genCmdCast(*miLoadImm[i]); - ASSERT_NE(nullptr, miLoad); - - if (miLoad->getRegisterOffset() == CS_GPR_R15) { - gpr15RegisterCount++; - gprMiLoadindex = i; - } - if (miLoad->getRegisterOffset() == CS_GPR_R15 + 4) { - gpr15RegisterCount++; - } - } - - // 2 LRI commands to store SBA buffer address - EXPECT_EQ(2u, gpr15RegisterCount); - - auto sbaGpuVa = getMockDebuggerL0Hw()->getSbaTrackingBuffer(commandQueue->getCsr()->getOsContext().getContextId())->getGpuAddress(); - uint32_t low = sbaGpuVa & 0xffffffff; - uint32_t high = (sbaGpuVa >> 32) & 0xffffffff; - - MI_LOAD_REGISTER_IMM *miLoad = genCmdCast(*miLoadImm[gprMiLoadindex]); - EXPECT_EQ(CS_GPR_R15, miLoad->getRegisterOffset()); - EXPECT_EQ(low, miLoad->getDataDword()); - - miLoad = genCmdCast(*miLoadImm[gprMiLoadindex + 1]); - EXPECT_EQ(CS_GPR_R15 + 4, miLoad->getRegisterOffset()); - EXPECT_EQ(high, miLoad->getDataDword()); - - for (auto i = 0u; i < numCommandLists; i++) { - auto commandList = CommandList::fromHandle(commandLists[i]); - commandList->destroy(); - } - - commandQueue->destroy(); -} - -} // namespace ult -} // namespace L0 +} // namespace NEO \ No newline at end of file diff --git a/shared/test/unit_test/mocks/debugger_l0_create.cpp b/shared/test/unit_test/mocks/debugger_l0_create.cpp new file mode 100644 index 0000000000..003866e781 --- /dev/null +++ b/shared/test/unit_test/mocks/debugger_l0_create.cpp @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2020-2022 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#include "shared/source/device/device.h" +#include "shared/test/common/mocks/mock_l0_debugger.h" + +NEO::DebugerL0CreateFn mockDebuggerL0HwFactory[IGFX_MAX_CORE]; + +namespace NEO { + +std::unique_ptr DebuggerL0::create(NEO::Device *device) { + initDebuggingInOs(device->getRootDeviceEnvironment().osInterface.get()); + auto debugger = mockDebuggerL0HwFactory[device->getHardwareInfo().platform.eRenderCoreFamily](device); + return std::unique_ptr(debugger); +} + +} // namespace NEO \ No newline at end of file