Module Name:    src
Committed By:   dsl
Date:           Sat Jan 25 20:12:53 UTC 2014

Modified Files:
        src/sys/arch/i386/i386: process_machdep.c
        src/sys/arch/i386/include: npx.h

Log Message:
Change the way the x87 fp register is defined so that the copies between
  fsave and fxsave layouts can be done by structure assignments.


To generate a diff of this commit:
cvs rdiff -u -r1.78 -r1.79 src/sys/arch/i386/i386/process_machdep.c
cvs rdiff -u -r1.30 -r1.31 src/sys/arch/i386/include/npx.h

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/process_machdep.c
diff -u src/sys/arch/i386/i386/process_machdep.c:1.78 src/sys/arch/i386/i386/process_machdep.c:1.79
--- src/sys/arch/i386/i386/process_machdep.c:1.78	Sat Jan 25 19:51:31 2014
+++ src/sys/arch/i386/i386/process_machdep.c	Sat Jan 25 20:12:53 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: process_machdep.c,v 1.78 2014/01/25 19:51:31 dsl Exp $	*/
+/*	$NetBSD: process_machdep.c,v 1.79 2014/01/25 20:12:53 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.78 2014/01/25 19:51:31 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.79 2014/01/25 20:12:53 dsl Exp $");
 
 #include "opt_vm86.h"
 #include "opt_ptrace.h"
@@ -95,7 +95,7 @@ void
 process_xmm_to_s87(const struct fxsave *sxmm, struct save87 *s87)
 {
 	unsigned int tag, ab_tag;
-	const struct fpaccxmm *fx_reg;
+	const struct fpaccfx *fx_reg;
 	struct fpacc87 *s87_reg;
 	int i;
 
@@ -136,11 +136,10 @@ process_xmm_to_s87(const struct fxsave *
 	s87->s87_dp = sxmm->fx_dp;
 
 	/* FP registers (in stack order) */
-	fx_reg = sxmm->sv_ac;
+	fx_reg = sxmm->fx_87_ac;
 	s87_reg = s87->s87_ac;
 	for (i = 0; i < 8; fx_reg++, s87_reg++, i++)
-		memcpy(s87_reg->fp_bytes, fx_reg->fp_bytes,
-		    sizeof(s87_reg->fp_bytes));
+		*s87_reg = fx_reg->r;
 
 	/* Tag word and registers. */
 	ab_tag = sxmm->fx_tw & 0xff;	/* Bits set if valid */
@@ -162,7 +161,7 @@ void
 process_s87_to_xmm(const struct save87 *s87, struct fxsave *sxmm)
 {
 	unsigned int tag, ab_tag;
-	struct fpaccxmm *fx_reg;
+	struct fpaccfx *fx_reg;
 	const struct fpacc87 *s87_reg;
 	int i;
 
@@ -203,11 +202,10 @@ process_s87_to_xmm(const struct save87 *
 	sxmm->fx_tw = ab_tag;
 
 	/* FP registers (in stack order) */
-	fx_reg = sxmm->sv_ac;
+	fx_reg = sxmm->fx_87_ac;
 	s87_reg = s87->s87_ac;
 	for (i = 0; i < 8; fx_reg++, s87_reg++, i++)
-		memcpy(fx_reg->fp_bytes, s87_reg->fp_bytes,
-		    sizeof(fx_reg->fp_bytes));
+		fx_reg->r = *s87_reg;
 }
 
 int

Index: src/sys/arch/i386/include/npx.h
diff -u src/sys/arch/i386/include/npx.h:1.30 src/sys/arch/i386/include/npx.h:1.31
--- src/sys/arch/i386/include/npx.h:1.30	Sat Jan 25 19:10:56 2014
+++ src/sys/arch/i386/include/npx.h	Sat Jan 25 20:12:53 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: npx.h,v 1.30 2014/01/25 19:10:56 christos Exp $	*/
+/*	$NetBSD: npx.h,v 1.31 2014/01/25 20:12:53 dsl Exp $	*/
 
 /*-
  * Copyright (c) 1990 The Regents of the University of California.
@@ -57,16 +57,15 @@ union fp_addr {
 	} fa_32;
 } __packed;
 
-/* Contents of each floating point accumulator */
+/* The x87 registers are 80 bits (in ST(n) order) */
 struct fpacc87 {
-#ifdef dontdef	/* too unportable */
-	uint32_t fp_mantlo;	/* mantissa low (31:0) */
-	uint32_t fp_manthi;	/* mantissa high (63:32) */
-	int	 fp_exp:15;	/* exponent */
-	int	 fp_sgn:1;	/* mantissa sign */
-#else
-	uint8_t	 fp_bytes[10];
-#endif
+	uint64_t	f87_mantissa;	/* mantissa */
+	uint16_t	f87_exp_sign;	/* exponent and sign */
+} __packed;
+
+/* The x87 registers padded out for fxsave */
+struct fpaccfx {
+	struct fpacc87 r __aligned(16);
 };
 
 /*
@@ -96,12 +95,6 @@ struct save87 {
 __CTASSERT(sizeof (struct save87) == 108 + 16);
 #endif
 
-/* FPU regsters in the extended save format. */
-struct fpaccxmm {
-	uint8_t fp_bytes[10];
-	uint8_t fp_rsvd[6];
-};
-
 /* SSE/SSE2 registers. */
 struct xmmreg {
 	uint8_t sse_bytes[16];
@@ -118,7 +111,7 @@ struct fxsave {
 /*16*/	union fp_addr fx_dp;	/* FPU Data pointer */
 	uint32_t fx_mxcsr;	/* MXCSR Register State */
 	uint32_t fx_mxcsr_mask;
-	struct fpaccxmm sv_ac[8];	/* ST/MM regs */
+	struct fpaccfx fx_87_ac[8];	/* 8 x87 registers */
 	struct xmmreg sv_xmmregs[8];	/* XMM regs */
 	uint8_t sv_rsvd[16 * 14];
 	/* 512-bytes --- end of hardware portion of save area */

Reply via email to