forked from mirrors/linux
		
	KVM: x86: Fix APIC map calculation after re-enabling
Update arch.apic_base before triggering recalculate_apic_map. Otherwise
the recalculation will work against the previous state of the APIC and
will fail to build the correct map when an APIC is hardware-enabled
again.
This fixes a regression of 1e08ec4a13.
Cc: stable@vger.kernel.org
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
			
			
This commit is contained in:
		
							parent
							
								
									f41bfc9423
								
							
						
					
					
						commit
						e66d2ae7c6
					
				
					 1 changed files with 4 additions and 4 deletions
				
			
		| 
						 | 
					@ -1350,6 +1350,10 @@ void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!kvm_vcpu_is_bsp(apic->vcpu))
 | 
				
			||||||
 | 
							value &= ~MSR_IA32_APICBASE_BSP;
 | 
				
			||||||
 | 
						vcpu->arch.apic_base = value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* update jump label if enable bit changes */
 | 
						/* update jump label if enable bit changes */
 | 
				
			||||||
	if ((vcpu->arch.apic_base ^ value) & MSR_IA32_APICBASE_ENABLE) {
 | 
						if ((vcpu->arch.apic_base ^ value) & MSR_IA32_APICBASE_ENABLE) {
 | 
				
			||||||
		if (value & MSR_IA32_APICBASE_ENABLE)
 | 
							if (value & MSR_IA32_APICBASE_ENABLE)
 | 
				
			||||||
| 
						 | 
					@ -1359,10 +1363,6 @@ void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value)
 | 
				
			||||||
		recalculate_apic_map(vcpu->kvm);
 | 
							recalculate_apic_map(vcpu->kvm);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!kvm_vcpu_is_bsp(apic->vcpu))
 | 
					 | 
				
			||||||
		value &= ~MSR_IA32_APICBASE_BSP;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	vcpu->arch.apic_base = value;
 | 
					 | 
				
			||||||
	if ((old_value ^ value) & X2APIC_ENABLE) {
 | 
						if ((old_value ^ value) & X2APIC_ENABLE) {
 | 
				
			||||||
		if (value & X2APIC_ENABLE) {
 | 
							if (value & X2APIC_ENABLE) {
 | 
				
			||||||
			u32 id = kvm_apic_id(apic);
 | 
								u32 id = kvm_apic_id(apic);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue