[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 43/49] target/i386: do not rely on ExtSaveArea for accelerator-sup
From: |
Paolo Bonzini |
Subject: |
[PULL 43/49] target/i386: do not rely on ExtSaveArea for accelerator-supported XCR0 bits |
Date: |
Thu, 31 Oct 2024 18:52:07 +0100 |
Right now, QEMU is using the "feature" and "bits" fields of ExtSaveArea
to query the accelerator for the support status of extended save areas.
This is a problem for AVX10, which attaches two feature bits (AVX512F
and AVX10) to the same extended save states.
To keep the AVX10 hacks to the minimum, limit usage of esa->features
and esa->bits. Instead, just query the accelerator for the 0xD leaf.
Do it in common code and clear esa->size if an extended save state is
unsupported.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
Link: 20241031085233.425388-3-tao1.su@linux.intel.com">https://lore.kernel.org/r/20241031085233.425388-3-tao1.su@linux.intel.com
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
target/i386/cpu.c | 33 +++++++++++++++++++++++++++++++--
target/i386/kvm/kvm-cpu.c | 4 ----
2 files changed, 31 insertions(+), 6 deletions(-)
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index f08e9b8f1bc..1ee4d988caf 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -7102,6 +7102,15 @@ static void x86_cpu_set_sgxlepubkeyhash(CPUX86State *env)
#endif
}
+static bool cpuid_has_xsave_feature(CPUX86State *env, const ExtSaveArea *esa)
+{
+ if (!esa->size) {
+ return false;
+ }
+
+ return (env->features[esa->feature] & esa->bits);
+}
+
static void x86_cpu_reset_hold(Object *obj, ResetType type)
{
CPUState *cs = CPU(obj);
@@ -7210,7 +7219,7 @@ static void x86_cpu_reset_hold(Object *obj, ResetType
type)
if (!((1 << i) & CPUID_XSTATE_XCR0_MASK)) {
continue;
}
- if (env->features[esa->feature] & esa->bits) {
+ if (cpuid_has_xsave_feature(env, esa)) {
xcr0 |= 1ull << i;
}
}
@@ -7348,7 +7357,7 @@ static void x86_cpu_enable_xsave_components(X86CPU *cpu)
mask = 0;
for (i = 0; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
const ExtSaveArea *esa = &x86_ext_save_areas[i];
- if (env->features[esa->feature] & esa->bits) {
+ if (cpuid_has_xsave_feature(env, esa)) {
mask |= (1ULL << i);
}
}
@@ -8020,6 +8029,26 @@ static void
x86_cpu_register_feature_bit_props(X86CPUClass *xcc,
static void x86_cpu_post_initfn(Object *obj)
{
+ static bool first = true;
+ uint64_t supported_xcr0;
+ int i;
+
+ if (first) {
+ first = false;
+
+ supported_xcr0 =
+ ((uint64_t) x86_cpu_get_supported_feature_word(NULL,
FEAT_XSAVE_XCR0_HI) << 32) |
+ x86_cpu_get_supported_feature_word(NULL, FEAT_XSAVE_XCR0_LO);
+
+ for (i = XSTATE_SSE_BIT + 1; i < XSAVE_STATE_AREA_COUNT; i++) {
+ ExtSaveArea *esa = &x86_ext_save_areas[i];
+
+ if (!(supported_xcr0 & (1 << i))) {
+ esa->size = 0;
+ }
+ }
+ }
+
accel_cpu_instance_init(CPU(obj));
}
diff --git a/target/i386/kvm/kvm-cpu.c b/target/i386/kvm/kvm-cpu.c
index 6bf8dcfc607..99d1941cf51 100644
--- a/target/i386/kvm/kvm-cpu.c
+++ b/target/i386/kvm/kvm-cpu.c
@@ -143,10 +143,6 @@ static void kvm_cpu_xsave_init(void)
if (!esa->size) {
continue;
}
- if ((x86_cpu_get_supported_feature_word(NULL, esa->feature) &
esa->bits)
- != esa->bits) {
- continue;
- }
host_cpuid(0xd, i, &eax, &ebx, &ecx, &edx);
if (eax != 0) {
assert(esa->size == eax);
--
2.47.0
- [PULL 27/49] ci: always invoke meson through pyvenv, (continued)
- [PULL 27/49] ci: always invoke meson through pyvenv, Paolo Bonzini, 2024/10/31
- [PULL 26/49] docs/nitro-enclave: Documentation for nitro-enclave machine type, Paolo Bonzini, 2024/10/31
- [PULL 38/49] target/i386: make flag variables unsigned, Paolo Bonzini, 2024/10/31
- [PULL 40/49] target/i386: use higher-precision arithmetic to compute CF, Paolo Bonzini, 2024/10/31
- [PULL 48/49] target/i386: Add AVX512 state when AVX10 is supported, Paolo Bonzini, 2024/10/31
- [PULL 29/49] target/i386: Tidy cc_op_str usage, Paolo Bonzini, 2024/10/31
- [PULL 32/49] target/i386: Introduce cc_op_size, Paolo Bonzini, 2024/10/31
- [PULL 41/49] target/i386: use + to put flags together, Paolo Bonzini, 2024/10/31
- [PULL 33/49] target/i386: Wrap cc_op_live with a validity check, Paolo Bonzini, 2024/10/31
- [PULL 37/49] target/i386: add a note about gen_jcc1, Paolo Bonzini, 2024/10/31
- [PULL 43/49] target/i386: do not rely on ExtSaveArea for accelerator-supported XCR0 bits,
Paolo Bonzini <=
- [PULL 44/49] target/i386: return bool from x86_cpu_filter_features, Paolo Bonzini, 2024/10/31
- [PULL 46/49] target/i386: add CPUID.24 features for AVX10, Paolo Bonzini, 2024/10/31
- [PULL 14/49] qom: let object_new use a module if the type is not present, Paolo Bonzini, 2024/10/31