Module Name:    src
Committed By:   dsl
Date:           Sun Dec  8 20:45:30 UTC 2013

Modified Files:
        src/sys/arch/i386/i386: freebsd_machdep.c ibcs2_machdep.c machdep.c
            process_machdep.c svr4_machdep.c trap.c
        src/sys/arch/i386/include: freebsd_machdep.h npx.h
        src/sys/arch/i386/isa: npx.c

Log Message:
Rename the fields of 'struct envxmm' (itself badly named) so that they
  are different from those used for the x87 fpu.
Use a union to describe the 64bit 'address' field so that it correctly
  spilt for 32bit binaries.
The freebsd emulation defined its own 'struct freebsd_env87' that the
  code just assumed matched the netbsd one.
  Since this is a hardware structure, just use the netbsd one.
This shouldn't change the binaries except that 'en_fos' used to be
  incorrectly a 32bit field.


To generate a diff of this commit:
cvs rdiff -u -r1.55 -r1.56 src/sys/arch/i386/i386/freebsd_machdep.c
cvs rdiff -u -r1.40 -r1.41 src/sys/arch/i386/i386/ibcs2_machdep.c
cvs rdiff -u -r1.739 -r1.740 src/sys/arch/i386/i386/machdep.c
cvs rdiff -u -r1.74 -r1.75 src/sys/arch/i386/i386/process_machdep.c
cvs rdiff -u -r1.96 -r1.97 src/sys/arch/i386/i386/svr4_machdep.c
cvs rdiff -u -r1.266 -r1.267 src/sys/arch/i386/i386/trap.c
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/i386/include/freebsd_machdep.h
cvs rdiff -u -r1.26 -r1.27 src/sys/arch/i386/include/npx.h
cvs rdiff -u -r1.146 -r1.147 src/sys/arch/i386/isa/npx.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/i386/i386/freebsd_machdep.c
diff -u src/sys/arch/i386/i386/freebsd_machdep.c:1.55 src/sys/arch/i386/i386/freebsd_machdep.c:1.56
--- src/sys/arch/i386/i386/freebsd_machdep.c:1.55	Thu Dec 10 14:13:50 2009
+++ src/sys/arch/i386/i386/freebsd_machdep.c	Sun Dec  8 20:45:30 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: freebsd_machdep.c,v 1.55 2009/12/10 14:13:50 matt Exp $	*/
+/*	$NetBSD: freebsd_machdep.c,v 1.56 2013/12/08 20:45:30 dsl Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2000 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: freebsd_machdep.c,v 1.55 2009/12/10 14:13:50 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: freebsd_machdep.c,v 1.56 2013/12/08 20:45:30 dsl Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_vm86.h"
@@ -65,7 +65,7 @@ freebsd_setregs(struct lwp *l, struct ex
 
 	setregs(l, epp, stack);
 	if (i386_use_fxsave)
-		pcb->pcb_savefpu.sv_xmm.sv_env.en_cw = __FreeBSD_NPXCW__;
+		pcb->pcb_savefpu.sv_xmm.sv_env.fx_cw = __FreeBSD_NPXCW__;
 	else
 		pcb->pcb_savefpu.sv_87.sv_env.en_cw = __FreeBSD_NPXCW__;
 }
@@ -285,8 +285,7 @@ netbsd_to_freebsd_ptrace_regs(struct reg
 	fregs->freebsd_ptrace_regs.tf_esp = nregs->r_esp;
 	fregs->freebsd_ptrace_regs.tf_ss = nregs->r_ss;
 
-	fregs->freebsd_ptrace_fpregs.sv_env =
-		*(struct freebsd_env87 *)&nframe->sv_env;
+	fregs->freebsd_ptrace_fpregs.sv_env = nframe->sv_env;
 	memcpy(fregs->freebsd_ptrace_fpregs.sv_ac, nframe->sv_ac,
 	      sizeof(fregs->freebsd_ptrace_fpregs.sv_ac));
 	fregs->freebsd_ptrace_fpregs.sv_ex_sw = 
@@ -336,8 +335,7 @@ freebsd_to_netbsd_ptrace_regs(struct fre
 	nregs->r_esp = fregs->freebsd_ptrace_regs.tf_esp;
 	nregs->r_ss = fregs->freebsd_ptrace_regs.tf_ss;
 
-	nframe->sv_env =
-		*(struct env87 *)&fregs->freebsd_ptrace_fpregs.sv_env;
+	nframe->sv_env = fregs->freebsd_ptrace_fpregs.sv_env;
 	memcpy(nframe->sv_ac, fregs->freebsd_ptrace_fpregs.sv_ac,
 	      sizeof(nframe->sv_ac));
 	nframe->sv_ex_sw =

Index: src/sys/arch/i386/i386/ibcs2_machdep.c
diff -u src/sys/arch/i386/i386/ibcs2_machdep.c:1.40 src/sys/arch/i386/i386/ibcs2_machdep.c:1.41
--- src/sys/arch/i386/i386/ibcs2_machdep.c:1.40	Sun Feb 14 11:09:54 2010
+++ src/sys/arch/i386/i386/ibcs2_machdep.c	Sun Dec  8 20:45:30 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: ibcs2_machdep.c,v 1.40 2010/02/14 11:09:54 drochner Exp $	*/
+/*	$NetBSD: ibcs2_machdep.c,v 1.41 2013/12/08 20:45:30 dsl Exp $	*/
 
 /*-
  * Copyright (c) 1997, 2000 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ibcs2_machdep.c,v 1.40 2010/02/14 11:09:54 drochner Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ibcs2_machdep.c,v 1.41 2013/12/08 20:45:30 dsl Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_vm86.h"
@@ -69,7 +69,7 @@ ibcs2_setregs(struct lwp *l, struct exec
 
 	setregs(l, epp, stack);
 	if (i386_use_fxsave)
-		pcb->pcb_savefpu.sv_xmm.sv_env.en_cw = __iBCS2_NPXCW__;
+		pcb->pcb_savefpu.sv_xmm.sv_env.fx_cw = __iBCS2_NPXCW__;
 	else
 		pcb->pcb_savefpu.sv_87.sv_env.en_cw = __iBCS2_NPXCW__;
 	tf = l->l_md.md_regs;

Index: src/sys/arch/i386/i386/machdep.c
diff -u src/sys/arch/i386/i386/machdep.c:1.739 src/sys/arch/i386/i386/machdep.c:1.740
--- src/sys/arch/i386/i386/machdep.c:1.739	Sun Dec  1 01:05:16 2013
+++ src/sys/arch/i386/i386/machdep.c	Sun Dec  8 20:45:30 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.739 2013/12/01 01:05:16 christos Exp $	*/
+/*	$NetBSD: machdep.c,v 1.740 2013/12/08 20:45:30 dsl Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 1998, 2000, 2004, 2006, 2008, 2009
@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.739 2013/12/01 01:05:16 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.740 2013/12/08 20:45:30 dsl Exp $");
 
 #include "opt_beep.h"
 #include "opt_compat_ibcs2.h"
@@ -886,8 +886,8 @@ setregs(struct lwp *l, struct exec_packa
 
 	l->l_md.md_flags &= ~MDL_USEDFPU;
 	if (i386_use_fxsave) {
-		pcb->pcb_savefpu.sv_xmm.sv_env.en_cw = control;
-		pcb->pcb_savefpu.sv_xmm.sv_env.en_mxcsr = __INITIAL_MXCSR__;
+		pcb->pcb_savefpu.sv_xmm.sv_env.fx_cw = control;
+		pcb->pcb_savefpu.sv_xmm.sv_env.fx_mxcsr = __INITIAL_MXCSR__;
 	} else
 		pcb->pcb_savefpu.sv_87.sv_env.en_cw = control;
 	memcpy(&pcb->pcb_fsd, &gdt[GUDATA_SEL], sizeof(pcb->pcb_fsd));

Index: src/sys/arch/i386/i386/process_machdep.c
diff -u src/sys/arch/i386/i386/process_machdep.c:1.74 src/sys/arch/i386/i386/process_machdep.c:1.75
--- src/sys/arch/i386/i386/process_machdep.c:1.74	Sun Dec  1 01:05:16 2013
+++ src/sys/arch/i386/i386/process_machdep.c	Sun Dec  8 20:45:30 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: process_machdep.c,v 1.74 2013/12/01 01:05:16 christos Exp $	*/
+/*	$NetBSD: process_machdep.c,v 1.75 2013/12/08 20:45:30 dsl Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2000, 2001, 2008 The NetBSD Foundation, Inc.
@@ -52,7 +52,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.74 2013/12/01 01:05:16 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.75 2013/12/08 20:45:30 dsl Exp $");
 
 #include "opt_vm86.h"
 #include "opt_ptrace.h"
@@ -132,14 +132,12 @@ process_xmm_to_s87(const struct savexmm 
 	int i;
 
 	/* FPU control/status */
-	s87->sv_env.en_cw = sxmm->sv_env.en_cw;
-	s87->sv_env.en_sw = sxmm->sv_env.en_sw;
+	s87->sv_env.en_cw = sxmm->sv_env.fx_cw;
+	s87->sv_env.en_sw = sxmm->sv_env.fx_sw;
 	/* tag word handled below */
-	s87->sv_env.en_fip = sxmm->sv_env.en_fip;
-	s87->sv_env.en_fcs = sxmm->sv_env.en_fcs;
-	s87->sv_env.en_opcode = sxmm->sv_env.en_opcode;
-	s87->sv_env.en_foo = sxmm->sv_env.en_foo;
-	s87->sv_env.en_fos = sxmm->sv_env.en_fos;
+	s87->sv_env.en_ip = sxmm->sv_env.fx_ip;
+	s87->sv_env.en_opcode = sxmm->sv_env.fx_opcode;
+	s87->sv_env.en_dp = sxmm->sv_env.fx_dp;
 
 	/* Tag word and registers. */
 	s87->sv_env.en_tw = 0;
@@ -147,7 +145,7 @@ process_xmm_to_s87(const struct savexmm 
 	for (i = 0; i < 8; i++) {
 		s87->sv_env.en_tw |=
 		    (xmm_to_s87_tag(sxmm->sv_ac[i].fp_bytes, i,
-		     sxmm->sv_env.en_tw) << (i * 2));
+		     sxmm->sv_env.fx_tw) << (i * 2));
 
 		s87->sv_ex_tw |=
 		    (xmm_to_s87_tag(sxmm->sv_ac[i].fp_bytes, i,
@@ -166,21 +164,19 @@ process_s87_to_xmm(const struct save87 *
 	int i;
 
 	/* FPU control/status */
-	sxmm->sv_env.en_cw = s87->sv_env.en_cw;
-	sxmm->sv_env.en_sw = s87->sv_env.en_sw;
+	sxmm->sv_env.fx_cw = s87->sv_env.en_cw;
+	sxmm->sv_env.fx_sw = s87->sv_env.en_sw;
 	/* tag word handled below */
-	sxmm->sv_env.en_fip = s87->sv_env.en_fip;
-	sxmm->sv_env.en_fcs = s87->sv_env.en_fcs;
-	sxmm->sv_env.en_opcode = s87->sv_env.en_opcode;
-	sxmm->sv_env.en_foo = s87->sv_env.en_foo;
-	sxmm->sv_env.en_fos = s87->sv_env.en_fos;
+	sxmm->sv_env.fx_ip = s87->sv_env.en_ip;
+	sxmm->sv_env.fx_opcode = s87->sv_env.en_opcode;
+	sxmm->sv_env.fx_dp = s87->sv_env.en_dp;
 
 	/* Tag word and registers. */
 	for (i = 0; i < 8; i++) {
 		if (((s87->sv_env.en_tw >> (i * 2)) & 3) == 3)
-			sxmm->sv_env.en_tw &= ~(1U << i);
+			sxmm->sv_env.fx_tw &= ~(1U << i);
 		else
-			sxmm->sv_env.en_tw |= (1U << i);
+			sxmm->sv_env.fx_tw |= (1U << i);
 
 #if 0
 		/*
@@ -257,15 +253,15 @@ process_read_fpregs(struct lwp *l, struc
 		 * save it temporarily.
 		 */
 		if (i386_use_fxsave) {
-			uint32_t mxcsr = frame->sv_xmm.sv_env.en_mxcsr;
-			uint16_t cw = frame->sv_xmm.sv_env.en_cw;
+			uint32_t mxcsr = frame->sv_xmm.sv_env.fx_mxcsr;
+			uint16_t cw = frame->sv_xmm.sv_env.fx_cw;
 
 			/* XXX Don't zero XMM regs? */
 			memset(&frame->sv_xmm, 0, sizeof(frame->sv_xmm));
-			frame->sv_xmm.sv_env.en_cw = cw;
-			frame->sv_xmm.sv_env.en_mxcsr = mxcsr;
-			frame->sv_xmm.sv_env.en_sw = 0x0000;
-			frame->sv_xmm.sv_env.en_tw = 0x00;
+			frame->sv_xmm.sv_env.fx_cw = cw;
+			frame->sv_xmm.sv_env.fx_mxcsr = mxcsr;
+			frame->sv_xmm.sv_env.fx_sw = 0x0000;
+			frame->sv_xmm.sv_env.fx_tw = 0x00;
 		} else {
 			uint16_t cw = frame->sv_87.sv_env.en_cw;
 
@@ -414,15 +410,15 @@ process_machdep_read_xmmregs(struct lwp 
 		 * The initial control word was already set by setregs(),
 		 * so save it temporarily.
 		 */
-		uint32_t mxcsr = frame->sv_xmm.sv_env.en_mxcsr;
-		uint16_t cw = frame->sv_xmm.sv_env.en_cw;
+		uint32_t mxcsr = frame->sv_xmm.sv_env.fx_mxcsr;
+		uint16_t cw = frame->sv_xmm.sv_env.fx_cw;
 
 		/* XXX Don't zero XMM regs? */
 		memset(&frame->sv_xmm, 0, sizeof(frame->sv_xmm));
-		frame->sv_xmm.sv_env.en_cw = cw;
-		frame->sv_xmm.sv_env.en_mxcsr = mxcsr;
-		frame->sv_xmm.sv_env.en_sw = 0x0000;
-		frame->sv_xmm.sv_env.en_tw = 0x00;
+		frame->sv_xmm.sv_env.fx_cw = cw;
+		frame->sv_xmm.sv_env.fx_mxcsr = mxcsr;
+		frame->sv_xmm.sv_env.fx_sw = 0x0000;
+		frame->sv_xmm.sv_env.fx_tw = 0x00;
 
 		l->l_md.md_flags |= MDL_USEDFPU;  
 	}

Index: src/sys/arch/i386/i386/svr4_machdep.c
diff -u src/sys/arch/i386/i386/svr4_machdep.c:1.96 src/sys/arch/i386/i386/svr4_machdep.c:1.97
--- src/sys/arch/i386/i386/svr4_machdep.c:1.96	Sun Feb 14 11:09:54 2010
+++ src/sys/arch/i386/i386/svr4_machdep.c	Sun Dec  8 20:45:30 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: svr4_machdep.c,v 1.96 2010/02/14 11:09:54 drochner Exp $	 */
+/*	$NetBSD: svr4_machdep.c,v 1.97 2013/12/08 20:45:30 dsl Exp $	 */
 
 /*-
  * Copyright (c) 1994, 2000 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: svr4_machdep.c,v 1.96 2010/02/14 11:09:54 drochner Exp $");
+__KERNEL_RCSID(0, "$NetBSD: svr4_machdep.c,v 1.97 2013/12/08 20:45:30 dsl Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_vm86.h"
@@ -116,7 +116,7 @@ svr4_setregs(struct lwp *l, struct exec_
 
 	setregs(l, epp, stack);
 	if (i386_use_fxsave)
-		pcb->pcb_savefpu.sv_xmm.sv_env.en_cw = __SVR4_NPXCW__;
+		pcb->pcb_savefpu.sv_xmm.sv_env.fx_cw = __SVR4_NPXCW__;
 	else
 		pcb->pcb_savefpu.sv_87.sv_env.en_cw = __SVR4_NPXCW__;
 	tf->tf_cs = GSEL(GUCODEBIG_SEL, SEL_UPL);

Index: src/sys/arch/i386/i386/trap.c
diff -u src/sys/arch/i386/i386/trap.c:1.266 src/sys/arch/i386/i386/trap.c:1.267
--- src/sys/arch/i386/i386/trap.c:1.266	Sat Dec  8 12:36:30 2012
+++ src/sys/arch/i386/i386/trap.c	Sun Dec  8 20:45:30 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: trap.c,v 1.266 2012/12/08 12:36:30 kiyohara Exp $	*/
+/*	$NetBSD: trap.c,v 1.267 2013/12/08 20:45:30 dsl Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2000, 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -68,7 +68,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.266 2012/12/08 12:36:30 kiyohara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.267 2013/12/08 20:45:30 dsl Exp $");
 
 #include "opt_ddb.h"
 #include "opt_kgdb.h"
@@ -203,7 +203,7 @@ xmm_si_code(struct lwp *l)
 		return 0;
 	}
 	pcb = lwp_getpcb(l);
-	mxcsr = pcb->pcb_savefpu.sv_xmm.sv_env.en_mxcsr;
+	mxcsr = pcb->pcb_savefpu.sv_xmm.sv_env.fx_mxcsr;
 
 	/*
          * Since we only have a single status and control register,

Index: src/sys/arch/i386/include/freebsd_machdep.h
diff -u src/sys/arch/i386/include/freebsd_machdep.h:1.9 src/sys/arch/i386/include/freebsd_machdep.h:1.10
--- src/sys/arch/i386/include/freebsd_machdep.h:1.9	Wed Sep 14 15:00:16 2005
+++ src/sys/arch/i386/include/freebsd_machdep.h	Sun Dec  8 20:45:30 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: freebsd_machdep.h,v 1.9 2005/09/14 15:00:16 he Exp $	*/
+/*	$NetBSD: freebsd_machdep.h,v 1.10 2013/12/08 20:45:30 dsl Exp $	*/
 
 /*
  * Copyright (c) 1986, 1989, 1991, 1993
@@ -143,16 +143,7 @@ struct freebsd_trapframe {
 };
 
 /* Environment information of floating point unit */
-struct freebsd_env87 {
-	long	en_cw;		/* control word (16bits) */
-	long	en_sw;		/* status word (16bits) */
-	long	en_tw;		/* tag word (16bits) */
-	long	en_fip;		/* floating point instruction pointer */
-	u_short	en_fcs;		/* floating code segment selector */
-	u_short	en_opcode;	/* opcode last executed (11 bits ) */
-	long	en_foo;		/* floating operand offset */
-	long	en_fos;		/* floating operand segment selector */
-};
+#define freebsd_env87 env87
 
 /* Contents of each floating point accumulator */
 struct freebsd_fpacc87 {

Index: src/sys/arch/i386/include/npx.h
diff -u src/sys/arch/i386/include/npx.h:1.26 src/sys/arch/i386/include/npx.h:1.27
--- src/sys/arch/i386/include/npx.h:1.26	Mon Nov 11 11:10:45 2013
+++ src/sys/arch/i386/include/npx.h	Sun Dec  8 20:45:30 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: npx.h,v 1.26 2013/11/11 11:10:45 joerg Exp $	*/
+/*	$NetBSD: npx.h,v 1.27 2013/12/08 20:45:30 dsl Exp $	*/
 
 /*-
  * Copyright (c) 1990 The Regents of the University of California.
@@ -42,16 +42,28 @@
 #ifndef	_I386_NPX_H_
 #define	_I386_NPX_H_
 
-/* Environment information of floating point unit */
+union fp_addr {
+	uint64_t fa_64;	/* Linear address for 64bit systems */
+	struct {
+		uint32_t fa_off;	/* Linear address for 32 bit */
+		uint16_t fa_seg;	/* Code/data (etc) segment */
+		uint16_t fa_pad;
+	} fa_32;
+} __packed;
+
+/*
+ * Environment information of floating point unit (fsave instruction).
+ * Note that the 'tag word' contains 2 bits per register and is relative
+ * to the stack top.
+ * The fxsave version is 1 bit per register indexed by register number.
+ */
 struct env87 {
 	long	 en_cw;		/* control word (16bits) */
 	long	 en_sw;		/* status word (16bits) */
 	long	 en_tw;		/* tag word (16bits) */
-	long	 en_fip;	/* floating point instruction pointer */
-	uint16_t en_fcs;	/* floating code segment selector */
-	uint16_t en_opcode;	/* opcode last executed (11 bits ) */
-	long	 en_foo;	/* floating operand offset */
-	long	 en_fos;	/* floating operand segment selector */
+	union fp_addr en_ip;	/* floating point instruction pointer */
+#define en_opcode en_ip.fa_32.fa_pad	/* opcode last executed (11bits) */
+	union fp_addr en_dp;	/* floating operand offset */
 };
 
 /* Contents of each floating point accumulator */
@@ -77,21 +89,17 @@ struct save87 {
 #endif
 };
 
-/* Environment of FPU/MMX/SSE/SSE2. */
+/* Environment of FPU/MMX/SSE/SSE2 (fxsave instruction). */
 struct envxmm {
-/*0*/	uint16_t en_cw;		/* FPU Control Word */
-	uint16_t en_sw;		/* FPU Status Word */
-	uint8_t  en_tw;		/* FPU Tag Word (abridged) */
-	uint8_t  en_rsvd0;
-	uint16_t en_opcode;	/* FPU Opcode */
-	uint32_t en_fip;	/* FPU Instruction Pointer */
-	uint16_t en_fcs;	/* FPU IP selector */
-	uint16_t en_rsvd1;
-/*16*/	uint32_t en_foo;	/* FPU Data pointer */
-	uint16_t en_fos;	/* FPU Data pointer selector */
-	uint16_t en_rsvd2;
-	uint32_t en_mxcsr;	/* MXCSR Register State */
-	uint32_t en_rsvd3;
+/*0*/	uint16_t fx_cw;		/* FPU Control Word */
+	uint16_t fx_sw;		/* FPU Status Word */
+	uint8_t  fx_tw;		/* FPU Tag Word (abridged) */
+	uint8_t  fx_reserved1;
+	uint16_t fx_opcode;	/* FPU Opcode */
+	union fp_addr fx_ip;	/* FPU Instruction Pointer */
+/*16*/	union fp_addr fx_dp;	/* FPU Data pointer */
+	uint32_t fx_mxcsr;	/* MXCSR Register State */
+	uint32_t fx_mxcsr_mask;
 };
 
 /* FPU regsters in the extended save format. */

Index: src/sys/arch/i386/isa/npx.c
diff -u src/sys/arch/i386/isa/npx.c:1.146 src/sys/arch/i386/isa/npx.c:1.147
--- src/sys/arch/i386/isa/npx.c:1.146	Sun Dec  1 01:05:16 2013
+++ src/sys/arch/i386/isa/npx.c	Sun Dec  8 20:45:30 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: npx.c,v 1.146 2013/12/01 01:05:16 christos Exp $	*/
+/*	$NetBSD: npx.c,v 1.147 2013/12/08 20:45:30 dsl Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -96,7 +96,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: npx.c,v 1.146 2013/12/01 01:05:16 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: npx.c,v 1.147 2013/12/08 20:45:30 dsl Exp $");
 
 #if 0
 #define IPRINTF(x)	printf x
@@ -435,7 +435,7 @@ npxintr(void *arg, struct intrframe *fra
 	fpu_save(addr);
 	fwait();
         if (i386_use_fxsave) {
-		fldcw(&addr->sv_xmm.sv_env.en_cw);
+		fldcw(&addr->sv_xmm.sv_env.fx_cw);
 		/*
 		 * FNINIT doesn't affect MXCSR or the XMM registers;
 		 * no need to re-load MXCSR here.
@@ -452,8 +452,8 @@ npxintr(void *arg, struct intrframe *fra
 	 * words, so the complete exception state can be recovered.
 	 */
         if (i386_use_fxsave) {
-		addr->sv_xmm.sv_ex_sw = addr->sv_xmm.sv_env.en_sw;
-		addr->sv_xmm.sv_ex_tw = addr->sv_xmm.sv_env.en_tw;
+		addr->sv_xmm.sv_ex_sw = addr->sv_xmm.sv_env.fx_sw;
+		addr->sv_xmm.sv_ex_tw = addr->sv_xmm.sv_env.fx_tw;
 	} else {
 		addr->sv_87.sv_ex_sw = addr->sv_87.sv_env.en_sw;
 		addr->sv_87.sv_ex_tw = addr->sv_87.sv_env.en_tw;
@@ -610,7 +610,7 @@ npxdna(struct cpu_info *ci)
 		fninit();
 		if (i386_use_fxsave) {
 			fldcw(&pcb->pcb_savefpu.
-			    sv_xmm.sv_env.en_cw);
+			    sv_xmm.sv_env.fx_cw);
 		} else {
 			fldcw(&pcb->pcb_savefpu.
 			    sv_87.sv_env.en_cw);
@@ -916,11 +916,11 @@ static const uint8_t fpetable[128] = {
 
 #define GET_FPU_CW(pcb) \
     (i386_use_fxsave ? \
-	pcb->pcb_savefpu.sv_xmm.sv_env.en_cw : \
+	pcb->pcb_savefpu.sv_xmm.sv_env.fx_cw : \
 	pcb->pcb_savefpu.sv_87.sv_env.en_cw)
 #define GET_FPU_SW(pcb) \
     (i386_use_fxsave ? \
-	pcb->pcb_savefpu.sv_xmm.sv_env.en_sw : \
+	pcb->pcb_savefpu.sv_xmm.sv_env.fx_sw : \
 	pcb->pcb_savefpu.sv_87.sv_env.en_sw)
 
 /*

Reply via email to