------------------------------
 
 TBD
+
+x2APIC
+------
+When KVM_X2APIC_API_USE_32BIT_IDS is enabled, KVM activates a hack/quirk that
+allows sending events to a single vCPU using its x2APIC ID even if the target
+vCPU has legacy xAPIC enabled, e.g. to bring up hotplugged vCPUs via INIT-SIPI
+on VMs with > 255 vCPUs.  A side effect of the quirk is that, if multiple vCPUs
+have the same physical APIC ID, KVM will deliver events targeting that APIC ID
+only to the vCPU with the lowest vCPU ID.  If KVM_X2APIC_API_USE_32BIT_IDS is
+not enabled, KVM follows x86 architecture when processing interrupts (all vCPUs
+matching the target APIC ID receive the interrupt).
 
                struct kvm_lapic *apic = vcpu->arch.apic;
                struct kvm_lapic **cluster;
                enum kvm_apic_logical_mode logical_mode;
+               u32 x2apic_id, physical_id;
                u16 mask;
                u32 ldr;
                u8 xapic_id;
-               u32 x2apic_id;
 
                if (!kvm_apic_present(vcpu))
                        continue;
                xapic_id = kvm_xapic_id(apic);
                x2apic_id = kvm_x2apic_id(apic);
 
-               /* Hotplug hack: see kvm_apic_match_physical_addr(), ... */
-               if ((apic_x2apic_mode(apic) || x2apic_id > 0xff) &&
-                               x2apic_id <= new->max_apic_id)
-                       new->phys_map[x2apic_id] = apic;
                /*
-                * ... xAPIC ID of VCPUs with APIC ID > 0xff will wrap-around,
-                * prevent them from masking VCPUs with APIC ID <= 0xff.
+                * Apply KVM's hotplug hack if userspace has enable 32-bit APIC
+                * IDs.  Allow sending events to vCPUs by their x2APIC ID even
+                * if the target vCPU is in legacy xAPIC mode, and silently
+                * ignore aliased xAPIC IDs (the x2APIC ID is truncated to 8
+                * bits, causing IDs > 0xff to wrap and collide).
+                *
+                * Honor the architectural (and KVM's non-optimized) behavior
+                * if userspace has not enabled 32-bit x2APIC IDs.  Each APIC
+                * is supposed to process messages independently.  If multiple
+                * vCPUs have the same effective APIC ID, e.g. due to the
+                * x2APIC wrap or because the guest manually modified its xAPIC
+                * IDs, events targeting that ID are supposed to be recognized
+                * by all vCPUs with said ID.
                 */
-               if (!apic_x2apic_mode(apic) && !new->phys_map[xapic_id])
-                       new->phys_map[xapic_id] = apic;
+               if (kvm->arch.x2apic_format) {
+                       /* See also kvm_apic_match_physical_addr(). */
+                       if ((apic_x2apic_mode(apic) || x2apic_id > 0xff) &&
+                           x2apic_id <= new->max_apic_id)
+                               new->phys_map[x2apic_id] = apic;
+
+                       if (!apic_x2apic_mode(apic) && !new->phys_map[xapic_id])
+                               new->phys_map[xapic_id] = apic;
+               } else {
+                       /*
+                        * Disable the optimized map if the physical APIC ID is
+                        * already mapped, i.e. is aliased to multiple vCPUs.
+                        * The optimized map requires a strict 1:1 mapping
+                        * between IDs and vCPUs.
+                        */
+                       if (apic_x2apic_mode(apic))
+                               physical_id = x2apic_id;
+                       else
+                               physical_id = xapic_id;
+
+                       if (new->phys_map[physical_id]) {
+                               kvfree(new);
+                               new = NULL;
+                               goto out;
+                       }
+                       new->phys_map[physical_id] = apic;
+               }
 
                if (new->logical_mode == KVM_APIC_MODE_MAP_DISABLED ||
                    !kvm_apic_sw_enabled(apic))