switch (id) {
        case AVIC_IPI_FAILURE_INVALID_INT_TYPE:
                /*
-                * AVIC hardware handles the generation of
-                * IPIs when the specified Message Type is Fixed
-                * (also known as fixed delivery mode) and
-                * the Trigger Mode is edge-triggered. The hardware
-                * also supports self and broadcast delivery modes
-                * specified via the Destination Shorthand(DSH)
-                * field of the ICRL. Logical and physical APIC ID
-                * formats are supported. All other IPI types cause
-                * a #VMEXIT, which needs to emulated.
+                * Emulate IPIs that are not handled by AVIC hardware, which
+                * only virtualizes Fixed, Edge-Triggered INTRs.  The exit is
+                * a trap, e.g. ICR holds the correct value and RIP has been
+                * advanced, KVM is responsible only for emulating the IPI.
+                * Sadly, hardware may sometimes leave the BUSY flag set, in
+                * which case KVM needs to emulate the ICR write as well in
+                * order to clear the BUSY flag.
                 */
-               kvm_lapic_reg_write(apic, APIC_ICR2, icrh);
-               kvm_lapic_reg_write(apic, APIC_ICR, icrl);
+               if (icrl & APIC_ICR_BUSY)
+                       kvm_apic_write_nodecode(vcpu, APIC_ICR);
+               else
+                       kvm_apic_send_ipi(apic, icrl, icrh);
                break;
        case AVIC_IPI_FAILURE_TARGET_NOT_RUNNING:
                /*