svm: Do not expose x2APIC when enable AVIC
authorSuravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Wed, 4 May 2016 19:09:50 +0000 (14:09 -0500)
committerPaolo Bonzini <pbonzini@redhat.com>
Wed, 18 May 2016 16:04:30 +0000 (18:04 +0200)
Since AVIC only virtualizes xAPIC hardware for the guest, this patch
disable x2APIC support in guest CPUID.

Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/svm.c

index 8c85b8ee68b630a113002f26f6610b749c5ca949..7f9c4af7b012ff97b36d7dafe705f26d64926445 100644 (file)
@@ -4572,14 +4572,26 @@ static u64 svm_get_mt_mask(struct kvm_vcpu *vcpu, gfn_t gfn, bool is_mmio)
 static void svm_cpuid_update(struct kvm_vcpu *vcpu)
 {
        struct vcpu_svm *svm = to_svm(vcpu);
+       struct kvm_cpuid_entry2 *entry;
 
        /* Update nrips enabled cache */
        svm->nrips_enabled = !!guest_cpuid_has_nrips(&svm->vcpu);
+
+       if (!kvm_vcpu_apicv_active(vcpu))
+               return;
+
+       entry = kvm_find_cpuid_entry(vcpu, 1, 0);
+       if (entry)
+               entry->ecx &= ~bit(X86_FEATURE_X2APIC);
 }
 
 static void svm_set_supported_cpuid(u32 func, struct kvm_cpuid_entry2 *entry)
 {
        switch (func) {
+       case 0x1:
+               if (avic)
+                       entry->ecx &= ~bit(X86_FEATURE_X2APIC);
+               break;
        case 0x80000001:
                if (nested)
                        entry->ecx |= (1 << 2); /* Set SVM bit */