intel_iommu exposed EIM (extended interrupt mode) feature, which in turn made the guest think that using x2APIC is a good idea. It was not: QEMU clamped all addresses to 8 bits (effectively allowing only APIC IDs below 8 in cluster mode) and 0xff was also interpreted as x2APIC broadcast even in physical mode.
This series forbids EIM unless KVM is configured to use full 32 bit addresses and doesn't have the broadcast quirk. On top of this, it would be great if we had a mechanism that enabled EIM whenever it can be used -- it is disabled by default now. Peter Xu (1): intel_iommu: add "eim" property Radim Krčmář (4): apic: add global apic_get_class() apic: add send_msi() to APICCommonClass intel_iommu: pass whole remapped addresses to apic intel_iommu: do not allow EIM without KVM support hw/i386/intel_iommu.c | 41 +++++++++++++++++++++++++++++------------ hw/i386/kvm/apic.c | 19 +++++++++++++------ hw/i386/xen/xen_apic.c | 6 ++++++ hw/intc/apic.c | 6 ++++++ hw/intc/apic_common.c | 14 ++++++++++++++ include/hw/i386/apic_internal.h | 7 +++++++ include/hw/i386/intel_iommu.h | 1 + target-i386/kvm-stub.c | 5 +++++ target-i386/kvm.c | 13 +++++++++++++ target-i386/kvm_i386.h | 1 + 10 files changed, 95 insertions(+), 18 deletions(-) -- 2.10.0