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

Reply via email to