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.)

Reply via email to