{ FEAT_7_0_EDX, CPUID_7_0_EDX_AMX_TILE },
},
},
+ [XSTATE_APX_BIT] = {
+ .size = sizeof(XSaveAPX),
+ .features = {
+ { FEAT_7_1_EDX, CPUID_7_1_EDX_APXF },
+ },
+ },
};
uint32_t xsave_area_size(uint64_t mask, bool compacted)
env->features[FEAT_KVM] = 0;
}
+ /*
+ * Since Intel MPX had been previously deprecated, APX re-purposes the
+ * 128-byte XSAVE area that had been previously allocated by MPX (state
+ * component indices 3 and 4, making up a 128-byte area located at an
+ * offset of 960 bytes into an un-compacted XSAVE buffer), as a single
+ * state component housing 128-bytes of storage for EGPRs (8-bytes * 16
+ * registers).
+ *
+ * Check the conflict between MPX and APX before initializing xsave
+ * components.
+ */
+ if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_MPX) &&
+ (env->features[FEAT_7_1_EDX] & CPUID_7_1_EDX_APXF)) {
+ mark_unavailable_features(cpu, FEAT_7_0_EBX, CPUID_7_0_EBX_MPX,
+ "this feature is conflict with APX");
+ mark_unavailable_features(cpu, FEAT_7_1_EDX, CPUID_7_1_EDX_APXF,
+ "this feature is conflict with MPX");
+ }
+
x86_cpu_enable_xsave_components(cpu);
/* CPUID[EAX=7,ECX=0].EBX always increased level automatically: */
#define XSTATE_ARCH_LBR_BIT 15
#define XSTATE_XTILE_CFG_BIT 17
#define XSTATE_XTILE_DATA_BIT 18
+#define XSTATE_APX_BIT 19
#define XSTATE_FP_MASK (1ULL << XSTATE_FP_BIT)
#define XSTATE_SSE_MASK (1ULL << XSTATE_SSE_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)
+#define XSTATE_APX_MASK (1ULL << XSTATE_APX_BIT)
#define XSTATE_DYNAMIC_MASK (XSTATE_XTILE_DATA_MASK)
XSTATE_BNDCSR_MASK | XSTATE_OPMASK_MASK | \
XSTATE_ZMM_Hi256_MASK | \
XSTATE_Hi16_ZMM_MASK | XSTATE_PKRU_MASK | \
- XSTATE_XTILE_CFG_MASK | XSTATE_XTILE_DATA_MASK)
+ XSTATE_XTILE_CFG_MASK | \
+ XSTATE_XTILE_DATA_MASK | XSTATE_APX_MASK)
/* CPUID feature bits available in XSS */
#define CPUID_XSTATE_XSS_MASK (XSTATE_ARCH_LBR_MASK | XSTATE_CET_U_MASK | \
#define CPUID_7_1_EDX_PREFETCHITI (1U << 14)
/* Support for Advanced Vector Extensions 10 */
#define CPUID_7_1_EDX_AVX10 (1U << 19)
+/* Support for Advanced Performance Extensions */
+#define CPUID_7_1_EDX_APXF (1U << 21)
/* Indicate bit 7 of the IA32_SPEC_CTRL MSR is supported */
#define CPUID_7_2_EDX_PSFD (1U << 0)
#define ARCH_LBR_NR_ENTRIES 32
+#define EGPR_NUM 16
+
/* CPU can't have 0xFFFFFFFF APIC ID, use that value to distinguish
* that APIC ID hasn't been set yet
*/
uint8_t xtiledata[8][1024];
} XSaveXTILEDATA;
+/* Ext. save area 19: APX state */
+typedef struct XSaveAPX {
+ uint64_t egprs[EGPR_NUM];
+} XSaveAPX;
+
QEMU_BUILD_BUG_ON(sizeof(XSaveAVX) != 0x100);
QEMU_BUILD_BUG_ON(sizeof(XSaveBNDREG) != 0x40);
QEMU_BUILD_BUG_ON(sizeof(XSaveBNDCSR) != 0x40);
QEMU_BUILD_BUG_ON(sizeof(XSaveArchLBR) != 0x328);
QEMU_BUILD_BUG_ON(sizeof(XSaveXTILECFG) != 0x40);
QEMU_BUILD_BUG_ON(sizeof(XSaveXTILEDATA) != 0x2000);
+QEMU_BUILD_BUG_ON(sizeof(XSaveAPX) != 0x80);
typedef struct ExtSaveArea {
uint32_t offset, size;
const FeatureMask features[2];
} ExtSaveArea;
-#define XSAVE_STATE_AREA_COUNT (XSTATE_XTILE_DATA_BIT + 1)
+#define XSAVE_STATE_AREA_COUNT (XSTATE_APX_BIT + 1)
extern ExtSaveArea x86_ext_save_areas[XSAVE_STATE_AREA_COUNT];