Index: local_apic.c =================================================================== RCS file: /usr/cvs/src/sys/i386/i386/local_apic.c,v retrieving revision 1.38 diff -u -r1.38 local_apic.c --- local_apic.c 6 Mar 2007 17:16:47 -0000 1.38 +++ local_apic.c 12 Mar 2007 19:27:59 -0000 @@ -813,6 +813,7 @@ ("No ISR handler for vector %u", vector)); setidt(vector, ioint_handlers[vector / 32], SDT_SYS386IGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL)); + smp_rendezvous(NULL, NULL, NULL, NULL); } /* Release an APIC vector when it's no longer in use. */ Index: mp_machdep.c =================================================================== RCS file: /usr/cvs/src/sys/i386/i386/mp_machdep.c,v retrieving revision 1.276 diff -u -r1.276 mp_machdep.c --- mp_machdep.c 6 Mar 2007 17:16:47 -0000 1.276 +++ mp_machdep.c 20 Mar 2007 16:52:46 -0000 @@ -916,13 +916,20 @@ /* wait for pending status end */ lapic_ipi_wait(-1); - /* do an INIT IPI: deassert RESET */ - lapic_ipi_raw(APIC_DEST_ALLESELF | APIC_TRIGMOD_LEVEL | - APIC_LEVEL_DEASSERT | APIC_DESTMODE_PHY | APIC_DELMODE_INIT, 0); - - /* wait for pending status end */ - DELAY(10000); /* wait ~10mS */ - lapic_ipi_wait(-1); + /* + * do an INIT IPI: deassert RESET on older systems to reset APIC ID + * arbitration. XXX: Should we only do this once? + */ + if (strcmp(cpu_vendor, "GenuineIntel") != 0 || + (cpu_id & 0xf00) != 0xf00) { + lapic_ipi_raw(APIC_DEST_ALLESELF | APIC_TRIGMOD_LEVEL | + APIC_LEVEL_DEASSERT | APIC_DESTMODE_PHY | APIC_DELMODE_INIT, + 0); + + /* wait for pending status end */ + DELAY(10000); /* wait ~10mS */ + lapic_ipi_wait(-1); + } /* * next we do a STARTUP IPI: the previous INIT IPI might still be