mirror of https://github.com/xemu-project/xemu.git
target/i386: Add XSAVES support for Arch LBR
Define Arch LBR bit in XSS and save/restore structure for XSAVE area size calculation. Signed-off-by: Yang Weijiang <weijiang.yang@intel.com> Message-Id: <20220215195258.29149-6-weijiang.yang@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
301e90675c
commit
10f0abcb3b
|
@ -1411,7 +1411,7 @@ static const X86RegisterInfo32 x86_reg_info_32[CPU_NB_REGS32] = {
|
|||
#undef REGISTER
|
||||
|
||||
/* CPUID feature bits available in XSS */
|
||||
#define CPUID_XSTATE_XSS_MASK (0)
|
||||
#define CPUID_XSTATE_XSS_MASK (XSTATE_ARCH_LBR_MASK)
|
||||
|
||||
ExtSaveArea x86_ext_save_areas[XSAVE_STATE_AREA_COUNT] = {
|
||||
[XSTATE_FP_BIT] = {
|
||||
|
@ -1445,6 +1445,10 @@ ExtSaveArea x86_ext_save_areas[XSAVE_STATE_AREA_COUNT] = {
|
|||
[XSTATE_PKRU_BIT] =
|
||||
{ .feature = FEAT_7_0_ECX, .bits = CPUID_7_0_ECX_PKU,
|
||||
.size = sizeof(XSavePKRU) },
|
||||
[XSTATE_ARCH_LBR_BIT] = {
|
||||
.feature = FEAT_7_0_EDX, .bits = CPUID_7_0_EDX_ARCH_LBR,
|
||||
.offset = 0 /*supervisor mode component, offset = 0 */,
|
||||
.size = sizeof(XSavesArchLBR) },
|
||||
[XSTATE_XTILE_CFG_BIT] = {
|
||||
.feature = FEAT_7_0_EDX, .bits = CPUID_7_0_EDX_AMX_TILE,
|
||||
.size = sizeof(XSaveXTILECFG),
|
||||
|
|
|
@ -544,6 +544,7 @@ typedef enum X86Seg {
|
|||
#define XSTATE_ZMM_Hi256_BIT 6
|
||||
#define XSTATE_Hi16_ZMM_BIT 7
|
||||
#define XSTATE_PKRU_BIT 9
|
||||
#define XSTATE_ARCH_LBR_BIT 15
|
||||
#define XSTATE_XTILE_CFG_BIT 17
|
||||
#define XSTATE_XTILE_DATA_BIT 18
|
||||
|
||||
|
@ -556,6 +557,7 @@ typedef enum X86Seg {
|
|||
#define XSTATE_ZMM_Hi256_MASK (1ULL << XSTATE_ZMM_Hi256_BIT)
|
||||
#define XSTATE_Hi16_ZMM_MASK (1ULL << XSTATE_Hi16_ZMM_BIT)
|
||||
#define XSTATE_PKRU_MASK (1ULL << XSTATE_PKRU_BIT)
|
||||
#define XSTATE_ARCH_LBR_MASK (1ULL << XSTATE_ARCH_LBR_BIT)
|
||||
#define XSTATE_XTILE_CFG_MASK (1ULL << XSTATE_XTILE_CFG_BIT)
|
||||
#define XSTATE_XTILE_DATA_MASK (1ULL << XSTATE_XTILE_DATA_BIT)
|
||||
|
||||
|
@ -870,6 +872,8 @@ uint64_t x86_cpu_get_supported_feature_word(FeatureWord w,
|
|||
#define CPUID_7_0_EDX_SERIALIZE (1U << 14)
|
||||
/* TSX Suspend Load Address Tracking instruction */
|
||||
#define CPUID_7_0_EDX_TSX_LDTRK (1U << 16)
|
||||
/* Architectural LBRs */
|
||||
#define CPUID_7_0_EDX_ARCH_LBR (1U << 19)
|
||||
/* AVX512_FP16 instruction */
|
||||
#define CPUID_7_0_EDX_AVX512_FP16 (1U << 23)
|
||||
/* AMX tile (two-dimensional register) */
|
||||
|
@ -1376,6 +1380,24 @@ typedef struct XSaveXTILEDATA {
|
|||
uint8_t xtiledata[8][1024];
|
||||
} XSaveXTILEDATA;
|
||||
|
||||
typedef struct {
|
||||
uint64_t from;
|
||||
uint64_t to;
|
||||
uint64_t info;
|
||||
} LBREntry;
|
||||
|
||||
#define ARCH_LBR_NR_ENTRIES 32
|
||||
|
||||
/* Ext. save area 19: Supervisor mode Arch LBR state */
|
||||
typedef struct XSavesArchLBR {
|
||||
uint64_t lbr_ctl;
|
||||
uint64_t lbr_depth;
|
||||
uint64_t ler_from;
|
||||
uint64_t ler_to;
|
||||
uint64_t ler_info;
|
||||
LBREntry lbr_records[ARCH_LBR_NR_ENTRIES];
|
||||
} XSavesArchLBR;
|
||||
|
||||
QEMU_BUILD_BUG_ON(sizeof(XSaveAVX) != 0x100);
|
||||
QEMU_BUILD_BUG_ON(sizeof(XSaveBNDREG) != 0x40);
|
||||
QEMU_BUILD_BUG_ON(sizeof(XSaveBNDCSR) != 0x40);
|
||||
|
@ -1385,6 +1407,7 @@ QEMU_BUILD_BUG_ON(sizeof(XSaveHi16_ZMM) != 0x400);
|
|||
QEMU_BUILD_BUG_ON(sizeof(XSavePKRU) != 0x8);
|
||||
QEMU_BUILD_BUG_ON(sizeof(XSaveXTILECFG) != 0x40);
|
||||
QEMU_BUILD_BUG_ON(sizeof(XSaveXTILEDATA) != 0x2000);
|
||||
QEMU_BUILD_BUG_ON(sizeof(XSavesArchLBR) != 0x328);
|
||||
|
||||
typedef struct ExtSaveArea {
|
||||
uint32_t feature, bits;
|
||||
|
|
Loading…
Reference in New Issue