Initial FP exception flags incorrect on amd64

David Schultz das at FreeBSD.ORG
Tue Jun 1 23:48:52 PDT 2004


I discovered that new processes on amd64 have the inexact flag
raised by default, at least on sledge.  However, all the sticky
flags should be clear initially.  Here is a program that
demonstrates the problem:

#include <stdio.h>

int
main(int argc, char *argv[])
{
	int r;

	__asm("stmxcsr %0" : "=m" (r));
	printf("got 0x%02x, expecting 0x00\n", r & 0x3f);
}

I don't have any amd64 hardware of my own to test kernel patches
on, but if I were to make a wild guess as to how to solve the
problem, it would be the following patch.  I would appreciate it
if someone could address the problem, or at least let me know
whether my proposed fix works.

Index: sys/amd64/amd64/fpu.c
===================================================================
RCS file: /cvs/src/sys/amd64/amd64/fpu.c,v
retrieving revision 1.149
diff -u -r1.149 fpu.c
--- fpu.c	5 Apr 2004 21:25:51 -0000	1.149
+++ fpu.c	2 Jun 2004 06:08:34 -0000
@@ -73,6 +73,7 @@
 #define	fnstsw(addr)		__asm __volatile("fnstsw %0" : "=m" (*(addr)))
 #define	fxrstor(addr)		__asm("fxrstor %0" : : "m" (*(addr)))
 #define	fxsave(addr)		__asm __volatile("fxsave %0" : "=m" (*(addr)))
+#define	stmxcsr(addr)		__asm("stmxcsr %0" : "=m" (*(addr)))
 #define	start_emulating()	__asm("smsw %%ax; orb %0,%%al; lmsw %%ax" \
 				      : : "n" (CR0_TS) : "ax")
 #define	stop_emulating()	__asm("clts")
@@ -119,6 +120,8 @@
 	fninit();
 	control = __INITIAL_FPUCW__;
 	fldcw(&control);
+	control = __INITIAL_MXCSR__;
+	stmxcsr(&control);
 	fxsave(&fpu_cleanstate);
 	start_emulating();
 	fpu_cleanstate_ready = 1;



More information about the freebsd-amd64 mailing list