Merge branch 'misc.namei' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[linux-2.6-microblaze.git] / arch / x86 / kvm / lapic.c
index ba5a278..76fb009 100644 (file)
@@ -192,6 +192,9 @@ void kvm_recalculate_apic_map(struct kvm *kvm)
        if (atomic_read_acquire(&kvm->arch.apic_map_dirty) == CLEAN)
                return;
 
+       WARN_ONCE(!irqchip_in_kernel(kvm),
+                 "Dirty APIC map without an in-kernel local APIC");
+
        mutex_lock(&kvm->arch.apic_map_lock);
        /*
         * Read kvm->arch.apic_map_dirty before kvm->arch.apic_map
@@ -2265,9 +2268,6 @@ void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value)
        u64 old_value = vcpu->arch.apic_base;
        struct kvm_lapic *apic = vcpu->arch.apic;
 
-       if (!apic)
-               value |= MSR_IA32_APICBASE_BSP;
-
        vcpu->arch.apic_base = value;
 
        if ((old_value ^ value) & MSR_IA32_APICBASE_ENABLE)
@@ -2323,6 +2323,13 @@ void kvm_lapic_reset(struct kvm_vcpu *vcpu, bool init_event)
        struct kvm_lapic *apic = vcpu->arch.apic;
        int i;
 
+       if (!init_event) {
+               vcpu->arch.apic_base = APIC_DEFAULT_PHYS_BASE |
+                                      MSR_IA32_APICBASE_ENABLE;
+               if (kvm_vcpu_is_reset_bsp(vcpu))
+                       vcpu->arch.apic_base |= MSR_IA32_APICBASE_BSP;
+       }
+
        if (!apic)
                return;
 
@@ -2330,8 +2337,8 @@ void kvm_lapic_reset(struct kvm_vcpu *vcpu, bool init_event)
        hrtimer_cancel(&apic->lapic_timer.timer);
 
        if (!init_event) {
-               kvm_lapic_set_base(vcpu, APIC_DEFAULT_PHYS_BASE |
-                                        MSR_IA32_APICBASE_ENABLE);
+               apic->base_address = APIC_DEFAULT_PHYS_BASE;
+
                kvm_apic_set_xapic_id(apic, vcpu->vcpu_id);
        }
        kvm_apic_set_version(apic->vcpu);
@@ -2364,9 +2371,7 @@ void kvm_lapic_reset(struct kvm_vcpu *vcpu, bool init_event)
        apic->highest_isr_cache = -1;
        update_divide_count(apic);
        atomic_set(&apic->lapic_timer.pending, 0);
-       if (kvm_vcpu_is_bsp(vcpu))
-               kvm_lapic_set_base(vcpu,
-                               vcpu->arch.apic_base | MSR_IA32_APICBASE_BSP);
+
        vcpu->arch.pv_eoi.msr_val = 0;
        apic_update_ppr(apic);
        if (vcpu->arch.apicv_active) {
@@ -2476,11 +2481,6 @@ int kvm_create_lapic(struct kvm_vcpu *vcpu, int timer_advance_ns)
                lapic_timer_advance_dynamic = false;
        }
 
-       /*
-        * APIC is created enabled. This will prevent kvm_lapic_set_base from
-        * thinking that APIC state has changed.
-        */
-       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);