diff options
Diffstat (limited to 'arch/x86/kvm/lapic.c')
| -rw-r--r-- | arch/x86/kvm/lapic.c | 20 | 
1 files changed, 13 insertions, 7 deletions
| diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 76fb00921203..d6ac32f3f650 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -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); @@ -2942,5 +2946,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));  } |