Date: Mon, 11 Feb 2008 15:21:45 -0500 From: John Baldwin <jhb@freebsd.org> To: freebsd-amd64@freebsd.org, FUCHIGAMI Masachika <masatic@mbs.sphere.ne.jp> Subject: Re: amd64/120202: [panic] kernel panic at start_all_aps, AP not starts Message-ID: <200802111521.45864.jhb@freebsd.org> In-Reply-To: <200802100710.m1A7A2tI074762@freefall.freebsd.org> References: <200802100710.m1A7A2tI074762@freefall.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Sunday 10 February 2008 02:10:02 am FUCHIGAMI Masachika wrote: > The following reply was made to PR amd64/120202; it has been noted by GNATS. > > From: masatic@mbs.sphere.ne.jp (FUCHIGAMI Masachika) > To: bug-followup@FreeBSD.org > Cc: > Subject: Re: amd64/120202: [panic] kernel panic at start_all_aps, AP not starts > Date: Sun, 10 Feb 2008 16:04:04 +0900 > > I found following patch works well. > IMHO, AP does not accept SIPI because the core shutdowns or send SIPI to itself in BIOS bootup code. > So, i modify the code to send SIPI before AP closes its ears. > > -- > *** mp_machdep.c.orig Mon Oct 8 21:51:01 2007 > --- mp_machdep.c Fri Feb 8 22:34:41 2008 > *************** > *** 788,796 **** > --- 788,798 ---- > lapic_ipi_raw(APIC_DEST_ALLESELF | APIC_TRIGMOD_LEVEL | > APIC_LEVEL_DEASSERT | APIC_DESTMODE_PHY | APIC_DELMODE_INIT, 0); > > /* wait for pending status end */ > + #if 0 > DELAY(10000); /* wait ~10mS */ > + #endif > lapic_ipi_wait(-1); > > /* > * next we do a STARTUP IPI: the previous INIT IPI might still be Removing the wait seems very odd, the pending status should still be there even if we wait. However, this particular IPI is only for older CPUs anyway. Try this patch instead perhaps: Index: amd64/amd64/mp_machdep.c =================================================================== RCS file: /usr/cvs/src/sys/amd64/amd64/mp_machdep.c,v retrieving revision 1.287 diff -u -r1.287 mp_machdep.c --- amd64/amd64/mp_machdep.c 2 Aug 2007 21:17:58 -0000 1.287 +++ amd64/amd64/mp_machdep.c 24 Sep 2007 15:09:43 -0000 @@ -783,13 +783,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 Index: i386/i386/mp_machdep.c =================================================================== RCS file: /usr/cvs/src/sys/i386/i386/mp_machdep.c,v retrieving revision 1.282 diff -u -r1.282 mp_machdep.c --- i386/i386/mp_machdep.c 13 Nov 2007 23:00:24 -0000 1.282 +++ i386/i386/mp_machdep.c 26 Nov 2007 19:09:12 -0000 @@ -907,13 +907,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 -- John Baldwin
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200802111521.45864.jhb>