/* * Copyright (C) 2018 Intel Corporation * * SPDX-License-Identifier: MIT * */ #include "unit_tests/helpers/debug_manager_state_restore.h" #include "unit_tests/source_level_debugger/source_level_debugger_preamble_test.h" #include "gtest/gtest.h" using namespace OCLRT; typedef SKLFamily GfxFamily; #include "unit_tests/source_level_debugger/source_level_debugger_preamble_test.inl" using PreambleTestGen9 = ::testing::Test; GEN9TEST_F(PreambleTestGen9, givenMidThreadPreemptionAndDebuggingActiveWhenPreambleIsPrograamedThenCorrectSipKernelIsUsed) { SourceLevelDebuggerPreambleTest::givenMidThreadPreemptionAndDebuggingActiveWhenPreambleIsPrograamedThenCorrectSipKernelIsUsedTest(); } GEN9TEST_F(PreambleTestGen9, givenMidThreadPreemptionAndDebuggingActiveWhenPreambleSizeIsQueriedThenCorrecrSizeIsReturned) { SourceLevelDebuggerPreambleTest::givenMidThreadPreemptionAndDebuggingActiveWhenPreambleSizeIsQueriedThenCorrecrSizeIsReturnedTest(); } GEN9TEST_F(PreambleTestGen9, givenPreemptionDisabledAndDebuggingActiveWhenPreambleIsProgrammedThenCorrectSipKernelIsUsed) { SourceLevelDebuggerPreambleTest::givenPreemptionDisabledAndDebuggingActiveWhenPreambleIsProgrammedThenCorrectSipKernelIsUsedTest(); } GEN9TEST_F(PreambleTestGen9, givenPreemptionDisabledAndDebuggingActiveWhenPreambleSizeIsQueriedThenCorrecrSizeIsReturned) { SourceLevelDebuggerPreambleTest::givenPreemptionDisabledAndDebuggingActiveWhenPreambleSizeIsQueriedThenCorrecrSizeIsReturnedTest(); } GEN9TEST_F(PreambleTestGen9, givenMidThreadPreemptionAndDisabledDebuggingWhenPreambleIsPrograamedThenCorrectSipKernelIsUsed) { SourceLevelDebuggerPreambleTest::givenMidThreadPreemptionAndDisabledDebuggingWhenPreambleIsPrograamedThenCorrectSipKernelIsUsedTest(); } GEN9TEST_F(PreambleTestGen9, givenMidThreadPreemptionAndDisabledDebuggingWhenPreambleSizeIsQueriedThenCorrecrSizeIsReturned) { SourceLevelDebuggerPreambleTest::givenMidThreadPreemptionAndDisabledDebuggingWhenPreambleSizeIsQueriedThenCorrecrSizeIsReturnedTest(); } GEN9TEST_F(PreambleTestGen9, givenDisabledPreemptionAndDisabledDebuggingWhenPreambleSizeIsQueriedThenCorrecrSizeIsReturned) { SourceLevelDebuggerPreambleTest::givenDisabledPreemptionAndDisabledDebuggingWhenPreambleSizeIsQueriedThenCorrecrSizeIsReturnedTest(); } GEN9TEST_F(PreambleTestGen9, givenKernelDebuggingActiveAndDisabledPreemptionWhenGetAdditionalCommandsSizeIsCalledThen2MiLoadRegisterImmCmdsAndStateSipAreInlcuded) { DebugManagerStateRestore dbgRestore; DebugManager.flags.ForcePreemptionMode.set(static_cast(PreemptionMode::Disabled)); auto mockDevice = std::unique_ptr(MockDevice::createWithNewExecutionEnvironment(nullptr)); mockDevice->setSourceLevelDebuggerActive(false); size_t withoutDebugging = PreambleHelper::getAdditionalCommandsSize(*mockDevice); mockDevice->setSourceLevelDebuggerActive(true); size_t withDebugging = PreambleHelper::getAdditionalCommandsSize(*mockDevice); EXPECT_LT(withoutDebugging, withDebugging); size_t diff = withDebugging - withoutDebugging; size_t sizeExpected = sizeof(typename FamilyType::STATE_SIP) + 2 * sizeof(typename FamilyType::MI_LOAD_REGISTER_IMM); EXPECT_EQ(sizeExpected, diff); } GEN9TEST_F(PreambleTestGen9, givenProgrammingPreambleWhenPreemptionIsTakenIntoAccountThenCSRBaseAddressIsEqualCSRGpuAddress) { using GPGPU_CSR_BASE_ADDRESS = typename FamilyType::GPGPU_CSR_BASE_ADDRESS; auto mockDevice = std::unique_ptr(MockDevice::createWithNewExecutionEnvironment(nullptr)); mockDevice->setPreemptionMode(PreemptionMode::MidThread); auto cmdSizePreemptionMidThread = PreemptionHelper::getRequiredPreambleSize(*mockDevice); std::array preambleBuffer{}; LinearStream preambleStream(&preambleBuffer, preambleBuffer.size()); StackVec preemptionBuffer; preemptionBuffer.resize(cmdSizePreemptionMidThread); LinearStream preemptionStream(&*preemptionBuffer.begin(), preemptionBuffer.size()); uintptr_t csrGpuAddr = 256 * MemoryConstants::kiloByte; MockGraphicsAllocation csrSurface(reinterpret_cast(csrGpuAddr), 1024); PreambleHelper::programPreamble(&preambleStream, *mockDevice, 0U, ThreadArbitrationPolicy::RoundRobin, &csrSurface); PreemptionHelper::programPreamble(preemptionStream, *mockDevice, &csrSurface); HardwareParse hwParserFullPreamble; hwParserFullPreamble.parseCommands(preambleStream, 0); auto cmd = hwParserFullPreamble.getCommand(); EXPECT_NE(nullptr, cmd); EXPECT_EQ(static_cast(csrGpuAddr), cmd->getGpgpuCsrBaseAddress()); HardwareParse hwParserOnlyPreemption; hwParserOnlyPreemption.parseCommands(preemptionStream, 0); cmd = hwParserOnlyPreemption.getCommand(); EXPECT_NE(nullptr, cmd); EXPECT_EQ(static_cast(csrGpuAddr), cmd->getGpgpuCsrBaseAddress()); }