CET xsaves component size is queried through CPUID.(EAX=0xD, ECX=11)
and CPUID.(EAX=0xD, ECX=12).

Signed-off-by: Zhang Yi Z <yi.z.zh...@linux.intel.com>
Signed-off-by: Yang Weijiang <weijiang.y...@intel.com>
---
 arch/x86/kvm/cpuid.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
index 7bcfa61375c0..5bac31e58955 100644
--- a/arch/x86/kvm/cpuid.c
+++ b/arch/x86/kvm/cpuid.c
@@ -565,6 +565,7 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 
*entry, u32 function,
        case 0xd: {
                int idx, i;
                u64 supported = kvm_supported_xcr0();
+               u64 sv_supported;
 
                entry->eax &= supported;
                entry->ebx = xstate_required_size(supported, false);
@@ -584,18 +585,23 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 
*entry, u32 function,
                                entry[i].eax &= kvm_cpuid_D_1_eax_x86_features;
                                cpuid_mask(&entry[i].eax, CPUID_D_1_EAX);
                                entry[i].ebx = 0;
+                               sv_supported = entry[i].ecx +
+                                       ((u64)entry[i].edx << 32);
                                if (entry[i].eax & (F(XSAVES)|F(XSAVEC)))
                                        entry[i].ebx =
                                                xstate_required_size(supported,
                                                                     true);
-                       } else {
+                       } else if (!(entry[i].ecx & 1)) {
                                if (entry[i].eax == 0 || !(supported & mask))
                                        continue;
-                               if (WARN_ON_ONCE(entry[i].ecx & 1))
+                               entry[i].ecx = 0;
+                               entry[i].edx = 0;
+                       } else {
+                               if (entry[i].eax == 0 || !(sv_supported & mask))
                                        continue;
+                               entry[i].ecx = 1;
+                               entry[i].edx = 0;
                        }
-                       entry[i].ecx = 0;
-                       entry[i].edx = 0;
                        entry[i].flags |=
                               KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
                        ++*nent;
-- 
2.17.1

Reply via email to