Date: Sat, 28 Feb 2015 20:37:39 +0000 (UTC) From: Konstantin Belousov <kib@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r279406 - in head/sys: amd64/amd64 i386/i386 Message-ID: <201502282037.t1SKbdTI072217@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: kib Date: Sat Feb 28 20:37:38 2015 New Revision: 279406 URL: https://svnweb.freebsd.org/changeset/base/279406 Log: Supposed fix for some SandyBridge mobile CPUs hang on AP startup when x2APIC mode is detected and enabled. Current theory is that switching the APIC mode while an IPI is in flight might be the issue. Postpone switching to x2APIC mode until we are guaranteed that all starting IPIs are already send and aknowledged. Use aps_ready signal as an indication that the BSP is done with us. Tested by: adrian Sponsored by: The FreeBSD Foundation MFC after: 2 months Modified: head/sys/amd64/amd64/mp_machdep.c head/sys/i386/i386/mp_machdep.c Modified: head/sys/amd64/amd64/mp_machdep.c ============================================================================== --- head/sys/amd64/amd64/mp_machdep.c Sat Feb 28 20:30:29 2015 (r279405) +++ head/sys/amd64/amd64/mp_machdep.c Sat Feb 28 20:37:38 2015 (r279406) @@ -705,12 +705,6 @@ init_secondary(void) wrmsr(MSR_STAR, msr); wrmsr(MSR_SF_MASK, PSL_NT|PSL_T|PSL_I|PSL_C|PSL_D); - /* - * On real hardware, switch to x2apic mode if possible. - * Disable local APIC until BSP directed APs to run. - */ - lapic_xapic_mode(); - /* signal our startup to the BSP. */ mp_naps++; @@ -718,6 +712,14 @@ init_secondary(void) while (!aps_ready) ia32_pause(); + /* + * On real hardware, switch to x2apic mode if possible. Do it + * after aps_ready was signalled, to avoid manipulating the + * mode while BSP might still want to send some IPI to us + * (second startup IPI is ignored on modern hardware etc). + */ + lapic_xapic_mode(); + /* Initialize the PAT MSR. */ pmap_init_pat(); Modified: head/sys/i386/i386/mp_machdep.c ============================================================================== --- head/sys/i386/i386/mp_machdep.c Sat Feb 28 20:30:29 2015 (r279405) +++ head/sys/i386/i386/mp_machdep.c Sat Feb 28 20:37:38 2015 (r279406) @@ -719,12 +719,6 @@ init_secondary(void) load_cr0(cr0); CHECK_WRITE(0x38, 5); - /* - * On real hardware, switch to x2apic mode if possible. - * Disable local APIC until BSP directed APs to run. - */ - lapic_xapic_mode(); - /* signal our startup to the BSP. */ mp_naps++; CHECK_WRITE(0x39, 6); @@ -742,6 +736,14 @@ init_secondary(void) lidt(&r_idt); #endif + /* + * On real hardware, switch to x2apic mode if possible. Do it + * after aps_ready was signalled, to avoid manipulating the + * mode while BSP might still want to send some IPI to us + * (second startup IPI is ignored on modern hardware etc). + */ + lapic_xapic_mode(); + /* Initialize the PAT MSR if present. */ pmap_init_pat();
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201502282037.t1SKbdTI072217>