On Tue, Oct 18, 2016 at 06:26:54PM +0200, Radim Krčmář wrote: > 2016-10-18 12:56-0200, Eduardo Habkost: > > On Fri, Oct 14, 2016 at 01:21:55PM +0200, Igor Mammedov wrote: > >> Signed-off-by: Igor Mammedov <imamm...@redhat.com> > >> --- > >> v4: > >> - restore kvm_has_x2apic_api() and use it to avoid side-effects > >> of kvm_enable_x2apic(). x2APIC API will be enabled by iommu > >> if it's present or not enabled at all. > >> v3: > >> - drop kvm_has_x2apic_api() and reuse kvm_enable_x2apic() instead > >> --- > >> diff --git a/hw/i386/kvm/apic.c b/hw/i386/kvm/apic.c > >> @@ -34,7 +34,11 @@ static void kvm_put_apic_state(APICCommonState *s, > >> struct kvm_lapic_state *kapic > >> int i; > >> > >> memset(kapic, 0, sizeof(*kapic)); > >> - kvm_apic_set_reg(kapic, 0x2, s->id << 24); > >> + if (kvm_has_x2apic_api() && s->apicbase & MSR_IA32_APICBASE_EXTD) { > >> + kvm_apic_set_reg(kapic, 0x2, s->initial_apic_id); > > > > What happens if: > > > > * x2apic is enabled on CPUID; > > * guest sets MSR_IA32_APICBASE_EXTD; an > > * the x2apic API is not enabled? > > KVM expects APIC ID to be in upper 8 bits of the register then. > Guest APIC mode does not come into play if the x2APIC API is not > enabled. This is to keep compatibility with old KVMs that used xAPIC > format regardless of APIC mode. > > > Does that mean kvm_{put,get}_apic_state() was already broken, or > > is the x2apic ID translated to the old format by the kernel when > > the x2apic API is disabled? > > The latter. KVM stores the 8 bits in an appropriate format, but it > doesn't really matter to QEMU: the exchange format without enabled > x2APIC API is defined to be the xAPIC one. (KVM used to keep always > keep ID in xAPIC format and trapped x2APIC ID reads to shift the value.)
Thanks for the clarification! Reviewed-by: Eduardo Habkost <ehabk...@redhat.com> -- Eduardo