Blame SOURCES/kvm-x86-Fix-the-64-byte-boundary-enumeration-for-extende.patch

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