|
|
@@ -320,6 +320,10 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
|
|
|
F(ADX) | F(SMAP) | F(AVX512F) | F(AVX512PF) | F(AVX512ER) |
|
|
|
F(AVX512CD);
|
|
|
|
|
|
+ /* cpuid 0xD.1.eax */
|
|
|
+ const u32 kvm_supported_word10_x86_features =
|
|
|
+ F(XSAVEOPT) | F(XSAVEC) | F(XGETBV1);
|
|
|
+
|
|
|
/* all calls to cpuid_count() should be made on the same cpu */
|
|
|
get_cpu();
|
|
|
|
|
|
@@ -456,13 +460,18 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
|
|
|
entry->eax &= supported;
|
|
|
entry->edx &= supported >> 32;
|
|
|
entry->flags |= KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
|
|
|
+ if (!supported)
|
|
|
+ break;
|
|
|
+
|
|
|
for (idx = 1, i = 1; idx < 64; ++idx) {
|
|
|
u64 mask = ((u64)1 << idx);
|
|
|
if (*nent >= maxnent)
|
|
|
goto out;
|
|
|
|
|
|
do_cpuid_1_ent(&entry[i], function, idx);
|
|
|
- if (entry[i].eax == 0 || !(supported & mask))
|
|
|
+ if (idx == 1)
|
|
|
+ entry[i].eax &= kvm_supported_word10_x86_features;
|
|
|
+ else if (entry[i].eax == 0 || !(supported & mask))
|
|
|
continue;
|
|
|
entry[i].flags |=
|
|
|
KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
|