Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 7 Jun 2004 10:43:21 +0100
From:      David Malone <dwmalone@maths.tcd.ie>
To:        src-committers@FreeBSD.ORG, cvs-src@FreeBSD.ORG, cvs-all@FreeBSD.ORG
Subject:   Re: cvs commit: src/sys/amd64/amd64 fpu.c
Message-ID:  <20040607094321.GA32159@walton.maths.tcd.ie>
In-Reply-To: <20040606091758.GA6354@VARK.homeunix.com>
References:  <200406060916.i569G2m2097113@repoman.freebsd.org> <20040606091758.GA6354@VARK.homeunix.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, Jun 06, 2004 at 02:17:58AM -0700, David Schultz wrote:
> It would be great if someone could pick this up and devise the
> appropriate fix.  I want to see this bug fixed, but I don't have the
> hardware to do amd64 kernel hacking.  I'm happy to help anyone who is
> interested.

I think I've figured out the problem. On SMP systems, fpuinit() is
called before enable_sse() for secondary processors. The ldmxcsr
instruction counts as a sse instruction, so you get an illegal
instruction fault. The patch below switches the order of fpuinit()
and enable_sse() and fixes the problem on my system anyway.

	David.


Index: mp_machdep.c
===================================================================
RCS file: /cvs/FreeBSD-CVS/src/sys/amd64/amd64/mp_machdep.c,v
retrieving revision 1.237
diff -u -r1.237 mp_machdep.c
--- mp_machdep.c	16 May 2004 22:11:50 -0000	1.237
+++ mp_machdep.c	7 Jun 2004 09:36:08 -0000
@@ -429,12 +429,12 @@
 	/* set up CPU registers and state */
 	cpu_setregs();
 
-	/* set up FPU state on the AP */
-	fpuinit();
-
 	/* set up SSE registers */
 	enable_sse();
 
+	/* set up FPU state on the AP */
+	fpuinit();
+
 	/* A quick check from sanity claus */
 	if (PCPU_GET(apic_id) != lapic_id()) {
 		printf("SMP: cpuid = %d\n", PCPU_GET(cpuid));



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040607094321.GA32159>