|
@@ -2227,6 +2227,11 @@ out:
|
|
|
return r;
|
|
|
}
|
|
|
|
|
|
+static void cpuid_mask(u32 *word, int wordnum)
|
|
|
+{
|
|
|
+ *word &= boot_cpu_data.x86_capability[wordnum];
|
|
|
+}
|
|
|
+
|
|
|
static void do_cpuid_1_ent(struct kvm_cpuid_entry2 *entry, u32 function,
|
|
|
u32 index)
|
|
|
{
|
|
@@ -2301,7 +2306,9 @@ static void do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
|
|
|
break;
|
|
|
case 1:
|
|
|
entry->edx &= kvm_supported_word0_x86_features;
|
|
|
+ cpuid_mask(&entry->edx, 0);
|
|
|
entry->ecx &= kvm_supported_word4_x86_features;
|
|
|
+ cpuid_mask(&entry->ecx, 4);
|
|
|
/* we support x2apic emulation even if host does not support
|
|
|
* it since we emulate x2apic in software */
|
|
|
entry->ecx |= F(X2APIC);
|
|
@@ -2392,7 +2399,9 @@ static void do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
|
|
|
break;
|
|
|
case 0x80000001:
|
|
|
entry->edx &= kvm_supported_word1_x86_features;
|
|
|
+ cpuid_mask(&entry->edx, 1);
|
|
|
entry->ecx &= kvm_supported_word6_x86_features;
|
|
|
+ cpuid_mask(&entry->ecx, 6);
|
|
|
break;
|
|
|
}
|
|
|
|