feature: Add support for V3 state save header

Related-to: NEO-8396

Signed-off-by: Brandon Yates <brandon.yates@intel.com>
This commit is contained in:
Brandon Yates
2024-06-25 03:03:26 +00:00
committed by Compute-Runtime-Automation
parent ef37b140de
commit ab92499b56
16 changed files with 744 additions and 101 deletions

View File

@@ -10,6 +10,7 @@
#include "shared/source/built_ins/built_ins.h"
#include "shared/source/debug_settings/debug_settings_manager.h"
#include "shared/source/debugger/debugger.h"
#include "shared/source/debugger/debugger_l0.h"
#include "shared/source/device/device.h"
#include "shared/source/execution_environment/execution_environment.h"
#include "shared/source/execution_environment/root_device_environment.h"
@@ -93,16 +94,26 @@ size_t SipKernel::getStateSaveAreaSize(Device *device) const {
return maxDbgSurfaceSize;
}
auto hdr = reinterpret_cast<const SIP::StateSaveAreaHeader *>(stateSaveAreaHeader.data());
DEBUG_BREAK_IF(hdr->versionHeader.size * 8 != sizeof(SIP::StateSaveAreaHeader));
auto hdr = reinterpret_cast<const NEO::StateSaveAreaHeader *>(stateSaveAreaHeader.data());
auto numSlices = NEO::GfxCoreHelper::getHighestEnabledSlice(hwInfo);
auto stateSaveAreaSize = numSlices *
hdr->regHeader.num_subslices_per_slice *
hdr->regHeader.num_eus_per_subslice *
hdr->regHeader.num_threads_per_eu *
hdr->regHeader.state_save_size +
hdr->versionHeader.size * 8 + hdr->regHeader.state_area_offset;
size_t stateSaveAreaSize = 0;
if (hdr->versionHeader.version.major >= 3) {
stateSaveAreaSize = numSlices *
hdr->regHeaderV3.num_subslices_per_slice *
hdr->regHeaderV3.num_eus_per_subslice *
hdr->regHeaderV3.num_threads_per_eu *
hdr->regHeaderV3.state_save_size +
hdr->versionHeader.size * 8 + hdr->regHeaderV3.state_area_offset;
} else {
stateSaveAreaSize = numSlices *
hdr->regHeader.num_subslices_per_slice *
hdr->regHeader.num_eus_per_subslice *
hdr->regHeader.num_threads_per_eu *
hdr->regHeader.state_save_size +
hdr->versionHeader.size * 8 + hdr->regHeader.state_area_offset;
}
return alignUp(stateSaveAreaSize, MemoryConstants::pageSize);
}

View File

@@ -10,6 +10,8 @@
#include "shared/source/helpers/non_copyable_or_moveable.h"
#include "shared/source/memory_manager/memory_manager.h"
#include "common/StateSaveAreaHeader.h"
#include <cstdint>
#include <memory>
#include <type_traits>
@@ -21,6 +23,17 @@ class GraphicsAllocation;
class LinearStream;
class OSInterface;
// NOLINTBEGIN
struct StateSaveAreaHeader {
struct SIP::StateSaveArea versionHeader;
union {
struct SIP::intelgt_state_save_area regHeader;
struct SIP::intelgt_state_save_area_V3 regHeaderV3;
};
};
// NOLINTEND
#pragma pack(1)
struct SbaTrackedAddresses {
char magic[8] = "sbaarea";
@@ -55,19 +68,6 @@ struct DebugAreaHeader {
};
static_assert(sizeof(DebugAreaHeader) == 32u * sizeof(uint8_t));
struct alignas(4) DebuggerVersion {
uint8_t major;
uint8_t minor;
uint16_t patch;
};
struct alignas(8) StateSaveAreaHeader {
char magic[8] = "tssarea";
uint64_t reserved1;
struct DebuggerVersion version;
uint8_t size;
uint8_t reserved2[3];
};
#pragma pack()
class DebuggerL0 : public NEO::Debugger, NEO::NonCopyableOrMovableClass {

View File

@@ -5,6 +5,7 @@
*
*/
#include "shared/source/debugger/debugger_l0.h"
#include "shared/source/device/device.h"
#include "shared/source/helpers/gfx_core_helper.h"
#include "shared/source/memory_manager/memory_allocation.h"
@@ -126,6 +127,61 @@ std::vector<char> createStateSaveAreaHeader(uint32_t version, uint16_t grfNum, u
},
};
SIP::StateSaveArea versionHeader = {
// versionHeader
"tssarea", // magic
0, // reserved1
{ // version
3, // major
0, // minor
0}, // patch
53, // size
{0, 0, 0}, // reserved2
};
SIP::intelgt_state_save_area_V3 regHeaderV3 = {
// regHeader
1, // num_slices
1, // num_subslices_per_slice
8, // num_eus_per_subslice
7, // num_threads_per_eu
0, // state_area_offset
6144, // state_save_size
0, // slm_area_offset
0, // slm_bank_size
0, // reserved0
4740, // sr_magic_offset
0, // fifo_offset;
0, // fifo_size;
0, // fifo_head;
0, // fifo_tail;
0, // fifo_version;
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // reserved1[10];
SIP::SIP_FLAG_HEAPLESS, // sip_flags;
{0, grfNum, 256, 32}, // grf
{4096, 1, 256, 32}, // addr
{4128, 2, 32, 4}, // flag
{4156, 1, 32, 4}, // emask
{4160, 2, 128, 16}, // sr
{4192, 1, 128, 16}, // cr
{4256, 1, 96, 12}, // notification
{4288, 1, 128, 16}, // tdr
{4320, 10, 256, 32}, // acc
{4320, mmeNum, 256, 32}, // mme
{4672, 1, 32, 4}, // ce
{4704, 1, 128, 16}, // sp
{4768, 1, 128 * 8, 128}, // cmd
{4640, 1, 128, 16}, // tm
{0, 1, 32, 4}, // fc
{4736, 1, 32, 4}, // dbg
{4744, 1, 64, 8}, // ctx
{4752, 1, 64, 8}, // dbg_reg
{4760, 1, 64, 8}, // scalar
{4768, 1, 64, 8}, // msg
};
NEO::StateSaveAreaHeader stateSaveAreaHeader3 = {};
stateSaveAreaHeader3.versionHeader = versionHeader;
stateSaveAreaHeader3.regHeaderV3 = regHeaderV3;
char *begin = nullptr;
unsigned long sizeOfHeader = 0u;
if (version == 1) {
@@ -134,6 +190,9 @@ std::vector<char> createStateSaveAreaHeader(uint32_t version, uint16_t grfNum, u
} else if (version == 2) {
begin = reinterpret_cast<char *>(&stateSaveAreaHeader2);
sizeOfHeader = offsetof(SIP::StateSaveAreaHeader, regHeader.dbg_reg) + sizeof(SIP::StateSaveAreaHeader::regHeader.dbg_reg);
} else if (version == 3) {
begin = reinterpret_cast<char *>(&stateSaveAreaHeader3);
sizeOfHeader = offsetof(NEO::StateSaveAreaHeader, regHeaderV3.msg) + sizeof(NEO::StateSaveAreaHeader::regHeaderV3.msg);
}
return std::vector<char>(begin, begin + sizeOfHeader);

View File

@@ -6,6 +6,7 @@
*/
#include "shared/source/built_ins/built_ins.h"
#include "shared/source/debugger/debugger_l0.h"
#include "shared/source/helpers/aligned_memory.h"
#include "shared/source/helpers/gfx_core_helper.h"
#include "shared/source/memory_manager/memory_allocation.h"
@@ -399,6 +400,9 @@ TEST_F(StateSaveAreaSipTest, givenCorrectStateSaveAreaHeaderWhenGetStateSaveArea
MockSipData::mockSipKernel->mockStateSaveAreaHeader = MockSipData::createStateSaveAreaHeader(2);
EXPECT_EQ(0x1800u * numSlices * 8 * 7 + alignUp(sizeof(SIP::StateSaveAreaHeader), MemoryConstants::pageSize), SipKernel::getSipKernel(*pDevice, nullptr).getStateSaveAreaSize(pDevice));
MockSipData::mockSipKernel->mockStateSaveAreaHeader = MockSipData::createStateSaveAreaHeader(3);
EXPECT_EQ(0x1800u * numSlices * 8 * 7 + alignUp(sizeof(NEO::StateSaveAreaHeader), MemoryConstants::pageSize), SipKernel::getSipKernel(*pDevice, nullptr).getStateSaveAreaSize(pDevice));
}
TEST(DebugBindlessSip, givenDebuggerAndUseBindlessDebugSipWhenGettingSipTypeThenDebugBindlessTypeIsReturned) {