79c4324644
Change-Id: I2d302dda68298877c65c99147f5bf22186a59aac
92 lines
3.1 KiB
Diff
92 lines
3.1 KiB
Diff
From ab183c656a2bee466e7c609224cddb75b80d9d6f Mon Sep 17 00:00:00 2001
|
|
From: Jing Liu <jing2.liu@intel.com>
|
|
Date: Wed, 16 Feb 2022 22:04:27 -0800
|
|
Subject: [PATCH 02/10] x86: Fix the 64-byte boundary enumeration for extended
|
|
state
|
|
|
|
from mainline-v7.0.0-rc0
|
|
commit 131266b7565bd437127bd231563572696bb27235
|
|
category: feature
|
|
feature: SPR AMX support for Qemu
|
|
bugzilla: https://gitee.com/openeuler/intel-qemu/issues/I5VHOB
|
|
|
|
Intel-SIG: commit 131266b7565b ("x86: Fix the 64-byte boundary enumeration for extended state")
|
|
|
|
-----------------------------------------------------------
|
|
|
|
x86: Fix the 64-byte boundary enumeration for extended state
|
|
|
|
The extended state subleaves (EAX=0Dh, ECX=n, n>1).ECX[1]
|
|
indicate whether the extended state component locates
|
|
on the next 64-byte boundary following the preceding state
|
|
component when the compacted format of an XSAVE area is
|
|
used.
|
|
|
|
Right now, they are all zero because no supported component
|
|
needed the bit to be set, but the upcoming AMX feature will
|
|
use it. Fix the subleaves value according to KVM's supported
|
|
cpuid.
|
|
|
|
Signed-off-by: Jing Liu <jing2.liu@intel.com>
|
|
Signed-off-by: Yang Zhong <yang.zhong@intel.com>
|
|
Message-Id: <20220217060434.52460-2-yang.zhong@intel.com>
|
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
Signed-off-by: Jason Zeng <jason.zeng@intel.com>
|
|
---
|
|
target/i386/cpu.c | 1 +
|
|
target/i386/cpu.h | 6 ++++++
|
|
target/i386/kvm/kvm-cpu.c | 1 +
|
|
3 files changed, 8 insertions(+)
|
|
|
|
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
|
index d9dca1dafb..532ca45015 100644
|
|
--- a/target/i386/cpu.c
|
|
+++ b/target/i386/cpu.c
|
|
@@ -5507,6 +5507,7 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
|
const ExtSaveArea *esa = &x86_ext_save_areas[count];
|
|
*eax = esa->size;
|
|
*ebx = esa->offset;
|
|
+ *ecx = esa->ecx & ESA_FEATURE_ALIGN64_MASK;
|
|
}
|
|
}
|
|
break;
|
|
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
|
|
index d9296a9abc..52330d1112 100644
|
|
--- a/target/i386/cpu.h
|
|
+++ b/target/i386/cpu.h
|
|
@@ -549,6 +549,11 @@ typedef enum X86Seg {
|
|
#define XSTATE_Hi16_ZMM_MASK (1ULL << XSTATE_Hi16_ZMM_BIT)
|
|
#define XSTATE_PKRU_MASK (1ULL << XSTATE_PKRU_BIT)
|
|
|
|
+#define ESA_FEATURE_ALIGN64_BIT 1
|
|
+
|
|
+#define ESA_FEATURE_ALIGN64_MASK (1U << ESA_FEATURE_ALIGN64_BIT)
|
|
+
|
|
+
|
|
/* CPUID feature words */
|
|
typedef enum FeatureWord {
|
|
FEAT_1_EDX, /* CPUID[1].EDX */
|
|
@@ -1355,6 +1360,7 @@ QEMU_BUILD_BUG_ON(sizeof(XSavePKRU) != 0x8);
|
|
typedef struct ExtSaveArea {
|
|
uint32_t feature, bits;
|
|
uint32_t offset, size;
|
|
+ uint32_t ecx;
|
|
} ExtSaveArea;
|
|
|
|
#define XSAVE_STATE_AREA_COUNT (XSTATE_PKRU_BIT + 1)
|
|
diff --git a/target/i386/kvm/kvm-cpu.c b/target/i386/kvm/kvm-cpu.c
|
|
index d95028018e..ce27d3b1df 100644
|
|
--- a/target/i386/kvm/kvm-cpu.c
|
|
+++ b/target/i386/kvm/kvm-cpu.c
|
|
@@ -104,6 +104,7 @@ static void kvm_cpu_xsave_init(void)
|
|
if (sz != 0) {
|
|
assert(esa->size == sz);
|
|
esa->offset = kvm_arch_get_supported_cpuid(s, 0xd, i, R_EBX);
|
|
+ esa->ecx = kvm_arch_get_supported_cpuid(s, 0xd, i, R_ECX);
|
|
}
|
|
}
|
|
}
|
|
--
|
|
2.27.0
|
|
|