We need to wait first for pending to clear before sending the IPI assert signal. Likewise, if we always do it this way, we don't need to wait for pending to clear afterward because next time we will wait again anyway. Deassert does not seem necessary according to Intel SDM Vol 3, which says an IPI is sent when ICR low is written.
NB: This is not the same code as for STARTUP or INIT IPIs. --- i386/i386/smp.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/i386/i386/smp.c b/i386/i386/smp.c index 4513b7f2..dc3a8ba5 100644 --- a/i386/i386/smp.c +++ b/i386/i386/smp.c @@ -54,17 +54,11 @@ static void smp_send_ipi(unsigned logical_id, unsigned vector) cpu_intr_save(&flags); - apic_send_ipi(NO_SHORTHAND, FIXED, LOGICAL, ASSERT, EDGE, vector, logical_id); - do { cpu_pause(); } while(lapic->icr_low.delivery_status == SEND_PENDING); - apic_send_ipi(NO_SHORTHAND, FIXED, LOGICAL, DE_ASSERT, EDGE, vector, logical_id); - - do { - cpu_pause(); - } while(lapic->icr_low.delivery_status == SEND_PENDING); + apic_send_ipi(NO_SHORTHAND, FIXED, LOGICAL, ASSERT, EDGE, vector, logical_id); cpu_intr_restore(flags); } -- 2.45.2