diff --git a/level_zero/core/test/unit_tests/sources/device/test_l0_device.cpp b/level_zero/core/test/unit_tests/sources/device/test_l0_device.cpp index 6e18f55099..13704c84d6 100644 --- a/level_zero/core/test/unit_tests/sources/device/test_l0_device.cpp +++ b/level_zero/core/test/unit_tests/sources/device/test_l0_device.cpp @@ -296,7 +296,7 @@ TEST(L0DeviceTest, givenMidThreadPreemptionAndIncorrectStateSaveAreaHeaderWhenCr MockSipData::mockSipKernel->mockStateSaveAreaHeader = MockSipData::createStateSaveAreaHeader(1); auto header = reinterpret_cast(MockSipData::mockSipKernel->mockStateSaveAreaHeader.data()); - header->versionHeader.version.major = 4u; + header->versionHeader.version.major = 5u; std::unique_ptr driverHandle(new DriverHandleImp); auto hwInfo = *NEO::defaultHwInfo; diff --git a/shared/source/built_ins/sip.cpp b/shared/source/built_ins/sip.cpp index 0892a39768..23f62156ac 100644 --- a/shared/source/built_ins/sip.cpp +++ b/shared/source/built_ins/sip.cpp @@ -98,7 +98,9 @@ size_t SipKernel::getStateSaveAreaSize(Device *device) const { auto numSlices = NEO::GfxCoreHelper::getHighestEnabledSlice(hwInfo); size_t stateSaveAreaSize = 0; - if (hdr->versionHeader.version.major == 3) { + if (hdr->versionHeader.version.major == 4) { + stateSaveAreaSize = static_cast(hdr->totalWmtpDataSize); + } else if (hdr->versionHeader.version.major == 3) { stateSaveAreaSize = numSlices * hdr->regHeaderV3.num_subslices_per_slice * hdr->regHeaderV3.num_eus_per_subslice * diff --git a/shared/source/debugger/debugger_l0.h b/shared/source/debugger/debugger_l0.h index ed44803952..4837d6c27d 100644 --- a/shared/source/debugger/debugger_l0.h +++ b/shared/source/debugger/debugger_l0.h @@ -29,6 +29,7 @@ struct StateSaveAreaHeader { union { struct SIP::intelgt_state_save_area regHeader; struct SIP::intelgt_state_save_area_V3 regHeaderV3; + uint64_t totalWmtpDataSize; }; }; diff --git a/shared/test/common/helpers/sip_init.cpp b/shared/test/common/helpers/sip_init.cpp index d82a62a7cb..803553def1 100644 --- a/shared/test/common/helpers/sip_init.cpp +++ b/shared/test/common/helpers/sip_init.cpp @@ -24,6 +24,7 @@ bool called = false; bool returned = true; bool useMockSip = false; bool uninitializedSipRequested = false; +uint64_t totalWmtpDataSize = 32 * MemoryConstants::megaByte; void clearUseFlags() { calledType = SipKernelType::count; @@ -182,6 +183,20 @@ std::vector createStateSaveAreaHeader(uint32_t version, uint16_t grfNum, u stateSaveAreaHeader3.versionHeader = versionHeader; stateSaveAreaHeader3.regHeaderV3 = regHeaderV3; + NEO::StateSaveAreaHeader stateSaveAreaHeader4 = { + { + // versionHeader + "tssarea", // magic + 0, // reserved1 + { // version + 4, // major + 0, // minor + 0}, // patch + 8, // size + {0, 0, 0}, // reserved2 + }}; + stateSaveAreaHeader4.totalWmtpDataSize = totalWmtpDataSize; + char *begin = nullptr; unsigned long sizeOfHeader = 0u; if (version == 1) { @@ -201,6 +216,9 @@ std::vector createStateSaveAreaHeader(uint32_t version, uint16_t grfNum, u stateSaveAreaHeader3.regHeaderV3.num_threads_per_eu * stateSaveAreaHeader3.regHeaderV3.state_save_size); sizeOfHeader = offsetof(NEO::StateSaveAreaHeader, regHeaderV3.msg) + sizeof(NEO::StateSaveAreaHeader::regHeaderV3.msg); + } else if (version == 4) { + begin = reinterpret_cast(&stateSaveAreaHeader4); + sizeOfHeader = offsetof(NEO::StateSaveAreaHeader, totalWmtpDataSize) + sizeof(stateSaveAreaHeader4.totalWmtpDataSize); } return std::vector(begin, begin + sizeOfHeader); diff --git a/shared/test/common/mocks/mock_sip.h b/shared/test/common/mocks/mock_sip.h index ce7a772334..a7a7908718 100644 --- a/shared/test/common/mocks/mock_sip.h +++ b/shared/test/common/mocks/mock_sip.h @@ -45,6 +45,7 @@ extern bool called; extern bool returned; extern bool useMockSip; extern bool uninitializedSipRequested; +extern uint64_t totalWmtpDataSize; void clearUseFlags(); std::vector createStateSaveAreaHeader(uint32_t version); diff --git a/shared/test/unit_test/built_ins/sip_tests.cpp b/shared/test/unit_test/built_ins/sip_tests.cpp index b48d73ccef..c62bf95693 100644 --- a/shared/test/unit_test/built_ins/sip_tests.cpp +++ b/shared/test/unit_test/built_ins/sip_tests.cpp @@ -406,12 +406,19 @@ TEST_F(StateSaveAreaSipTest, givenCorrectStateSaveAreaHeaderWhenGetStateSaveArea auto stateSaveSize = 0x1800u * numSlices * 8 * 7 + sizeof(NEO::StateSaveAreaHeader); EXPECT_EQ(alignUp(fifoSize + stateSaveSize, MemoryConstants::pageSize), SipKernel::getSipKernel(*pDevice, nullptr).getStateSaveAreaSize(pDevice)); } +TEST_F(StateSaveAreaSipTest, givenStateSaveAreaHeaderVersion4WhenGetStateSaveAreaSizeCalledThenTotalWmtpDataSizeIsReturned) { + VariableBackup backupSipInitType(&MockSipData::useMockSip, true); + MockSipData::mockSipKernel->mockStateSaveAreaHeader = MockSipData::createStateSaveAreaHeader(4); + auto header = reinterpret_cast(MockSipData::mockSipKernel->mockStateSaveAreaHeader.data()); + header->versionHeader.version.major = 4u; + EXPECT_EQ(MockSipData::totalWmtpDataSize, SipKernel::getSipKernel(*pDevice, nullptr).getStateSaveAreaSize(pDevice)); +} TEST_F(StateSaveAreaSipTest, givenNotsupportedStateSaveAreaHeaderVersionWhenGetStateSaveAreaSizeCalledThenNoSizeIsReturned) { VariableBackup backupSipInitType(&MockSipData::useMockSip, true); MockSipData::mockSipKernel->mockStateSaveAreaHeader = MockSipData::createStateSaveAreaHeader(1); auto header = reinterpret_cast(MockSipData::mockSipKernel->mockStateSaveAreaHeader.data()); - header->versionHeader.version.major = 4u; + header->versionHeader.version.major = 5u; EXPECT_EQ(0u, SipKernel::getSipKernel(*pDevice, nullptr).getStateSaveAreaSize(pDevice)); }