Merge branch 'kvm-5.16-fixes' into kvm-master
[sfrench/cifs-2.6.git] / arch / x86 / kvm / lapic.c
index 4388d22df5002928e69b40d3210878180963d00c..759952dd122284b183c3735bad40717495920304 100644 (file)
@@ -2321,13 +2321,14 @@ EXPORT_SYMBOL_GPL(kvm_apic_update_apicv);
 void kvm_lapic_reset(struct kvm_vcpu *vcpu, bool init_event)
 {
        struct kvm_lapic *apic = vcpu->arch.apic;
+       u64 msr_val;
        int i;
 
        if (!init_event) {
-               vcpu->arch.apic_base = APIC_DEFAULT_PHYS_BASE |
-                                      MSR_IA32_APICBASE_ENABLE;
+               msr_val = APIC_DEFAULT_PHYS_BASE | MSR_IA32_APICBASE_ENABLE;
                if (kvm_vcpu_is_reset_bsp(vcpu))
-                       vcpu->arch.apic_base |= MSR_IA32_APICBASE_BSP;
+                       msr_val |= MSR_IA32_APICBASE_BSP;
+               kvm_lapic_set_base(vcpu, msr_val);
        }
 
        if (!apic)
@@ -2336,11 +2337,9 @@ void kvm_lapic_reset(struct kvm_vcpu *vcpu, bool init_event)
        /* Stop the timer in case it's a reset to an active apic */
        hrtimer_cancel(&apic->lapic_timer.timer);
 
-       if (!init_event) {
-               apic->base_address = APIC_DEFAULT_PHYS_BASE;
-
+       /* The xAPIC ID is set at RESET even if the APIC was already enabled. */
+       if (!init_event)
                kvm_apic_set_xapic_id(apic, vcpu->vcpu_id);
-       }
        kvm_apic_set_version(apic->vcpu);
 
        for (i = 0; i < KVM_APIC_LVT_NUM; i++)
@@ -2481,6 +2480,11 @@ int kvm_create_lapic(struct kvm_vcpu *vcpu, int timer_advance_ns)
                lapic_timer_advance_dynamic = false;
        }
 
+       /*
+        * Stuff the APIC ENABLE bit in lieu of temporarily incrementing
+        * apic_hw_disabled; the full RESET value is set by kvm_lapic_reset().
+        */
+       vcpu->arch.apic_base = MSR_IA32_APICBASE_ENABLE;
        static_branch_inc(&apic_sw_disabled.key); /* sw disabled at reset */
        kvm_iodevice_init(&apic->dev, &apic_mmio_ops);
 
@@ -2947,5 +2951,7 @@ int kvm_apic_accept_events(struct kvm_vcpu *vcpu)
 void kvm_lapic_exit(void)
 {
        static_key_deferred_flush(&apic_hw_disabled);
+       WARN_ON(static_branch_unlikely(&apic_hw_disabled.key));
        static_key_deferred_flush(&apic_sw_disabled);
+       WARN_ON(static_branch_unlikely(&apic_sw_disabled.key));
 }