]> git.baikalelectronics.ru Git - kernel.git/commitdiff
KVM: x86: Initialize number of APIC LVT entries during APIC creation
authorSean Christopherson <seanjc@google.com>
Fri, 8 Jul 2022 22:38:51 +0000 (15:38 -0700)
committerSean Christopherson <seanjc@google.com>
Fri, 8 Jul 2022 22:55:28 +0000 (15:55 -0700)
Initialize the number of LVT entries during APIC creation, else the field
will be incorrectly left '0' if userspace never invokes KVM_X86_SETUP_MCE.

Add and use a helper to calculate the number of entries even though
MCG_CMCI_P is not set by default in vcpu->arch.mcg_cap.  Relying on that
to always be true is unnecessarily risky, and subtle/confusing as well.

Fixes: 7dbdcb4e6022 ("KVM: x86: Add Corrected Machine Check Interrupt (CMCI) emulation to lapic.")
Reported-by: Xiaoyao Li <xiaoyao.li@intel.com>
Cc: Jue Wang <juew@google.com>
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/lapic.c

index 6ff17d5a2ae34f9e7cb8e599d5569f18c2a189fc..1540d01ecb67d1ad2804830c4e44a3bd4f72bde4 100644 (file)
@@ -405,6 +405,11 @@ static inline bool kvm_lapic_lvt_supported(struct kvm_lapic *apic, int lvt_index
        return apic->nr_lvt_entries > lvt_index;
 }
 
+static inline int kvm_apic_calc_nr_lvt_entries(struct kvm_vcpu *vcpu)
+{
+       return KVM_APIC_MAX_NR_LVT_ENTRIES - !(vcpu->arch.mcg_cap & MCG_CMCI_P);
+}
+
 void kvm_apic_set_version(struct kvm_vcpu *vcpu)
 {
        struct kvm_lapic *apic = vcpu->arch.apic;
@@ -2561,6 +2566,8 @@ int kvm_create_lapic(struct kvm_vcpu *vcpu, int timer_advance_ns)
        }
        apic->vcpu = vcpu;
 
+       apic->nr_lvt_entries = kvm_apic_calc_nr_lvt_entries(vcpu);
+
        hrtimer_init(&apic->lapic_timer.timer, CLOCK_MONOTONIC,
                     HRTIMER_MODE_ABS_HARD);
        apic->lapic_timer.timer.function = apic_timer_fn;