1be5c7
From 6eae12166341c236da023e5117b64b842ae72083 Mon Sep 17 00:00:00 2001
1be5c7
From: Jing Liu <jing2.liu@intel.com>
1be5c7
Date: Wed, 16 Feb 2022 22:04:27 -0800
1be5c7
Subject: [PATCH 05/24] x86: Fix the 64-byte boundary enumeration for extended
1be5c7
 state
1be5c7
1be5c7
RH-Author: Paul Lai <plai@redhat.com>
1be5c7
RH-MergeRequest: 176: Enable KVM AMX support
1be5c7
RH-Commit: [5/13] 64fc93e3b0ad0fc56da9d71b33d9eefd3cbba1d7
1be5c7
RH-Bugzilla: 1916415
1be5c7
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
1be5c7
RH-Acked-by: Igor Mammedov <imammedo@redhat.com>
1be5c7
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
1be5c7
1be5c7
The extended state subleaves (EAX=0Dh, ECX=n, n>1).ECX[1]
1be5c7
indicate whether the extended state component locates
1be5c7
on the next 64-byte boundary following the preceding state
1be5c7
component when the compacted format of an XSAVE area is
1be5c7
used.
1be5c7
1be5c7
Right now, they are all zero because no supported component
1be5c7
needed the bit to be set, but the upcoming AMX feature will
1be5c7
use it.  Fix the subleaves value according to KVM's supported
1be5c7
cpuid.
1be5c7
1be5c7
Signed-off-by: Jing Liu <jing2.liu@intel.com>
1be5c7
Signed-off-by: Yang Zhong <yang.zhong@intel.com>
1be5c7
Message-Id: <20220217060434.52460-2-yang.zhong@intel.com>
1be5c7
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
1be5c7
(cherry picked from commit 131266b7565bd437127bd231563572696bb27235)
1be5c7
Signed-off-by: Paul Lai <plai@redhat.com>
1be5c7
---
1be5c7
 target/i386/cpu.c         | 1 +
1be5c7
 target/i386/cpu.h         | 6 ++++++
1be5c7
 target/i386/kvm/kvm-cpu.c | 1 +
1be5c7
 3 files changed, 8 insertions(+)
1be5c7
1be5c7
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
1be5c7
index dd6935b1dd..f44fad3a2a 100644
1be5c7
--- a/target/i386/cpu.c
1be5c7
+++ b/target/i386/cpu.c
1be5c7
@@ -5495,6 +5495,7 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
1be5c7
                 const ExtSaveArea *esa = &x86_ext_save_areas[count];
1be5c7
                 *eax = esa->size;
1be5c7
                 *ebx = esa->offset;
1be5c7
+                *ecx = esa->ecx & ESA_FEATURE_ALIGN64_MASK;
1be5c7
             }
1be5c7
         }
1be5c7
         break;
1be5c7
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
1be5c7
index c6a6c871f1..5d9702a991 100644
1be5c7
--- a/target/i386/cpu.h
1be5c7
+++ b/target/i386/cpu.h
1be5c7
@@ -548,6 +548,11 @@ typedef enum X86Seg {
1be5c7
 #define XSTATE_Hi16_ZMM_MASK            (1ULL << XSTATE_Hi16_ZMM_BIT)
1be5c7
 #define XSTATE_PKRU_MASK                (1ULL << XSTATE_PKRU_BIT)
1be5c7
 
1be5c7
+#define ESA_FEATURE_ALIGN64_BIT         1
1be5c7
+
1be5c7
+#define ESA_FEATURE_ALIGN64_MASK        (1U << ESA_FEATURE_ALIGN64_BIT)
1be5c7
+
1be5c7
+
1be5c7
 /* CPUID feature words */
1be5c7
 typedef enum FeatureWord {
1be5c7
     FEAT_1_EDX,         /* CPUID[1].EDX */
1be5c7
@@ -1354,6 +1359,7 @@ QEMU_BUILD_BUG_ON(sizeof(XSavePKRU) != 0x8);
1be5c7
 typedef struct ExtSaveArea {
1be5c7
     uint32_t feature, bits;
1be5c7
     uint32_t offset, size;
1be5c7
+    uint32_t ecx;
1be5c7
 } ExtSaveArea;
1be5c7
 
1be5c7
 #define XSAVE_STATE_AREA_COUNT (XSTATE_PKRU_BIT + 1)
1be5c7
diff --git a/target/i386/kvm/kvm-cpu.c b/target/i386/kvm/kvm-cpu.c
1be5c7
index 7b004065ae..86ef7b2712 100644
1be5c7
--- a/target/i386/kvm/kvm-cpu.c
1be5c7
+++ b/target/i386/kvm/kvm-cpu.c
1be5c7
@@ -104,6 +104,7 @@ static void kvm_cpu_xsave_init(void)
1be5c7
             if (sz != 0) {
1be5c7
                 assert(esa->size == sz);
1be5c7
                 esa->offset = kvm_arch_get_supported_cpuid(s, 0xd, i, R_EBX);
1be5c7
+                esa->ecx = kvm_arch_get_supported_cpuid(s, 0xd, i, R_ECX);
1be5c7
             }
1be5c7
         }
1be5c7
     }
1be5c7
-- 
1be5c7
2.35.3
1be5c7