Module Name:    src
Committed By:   dsl
Date:           Tue Feb  4 22:48:26 UTC 2014

Modified Files:
        src/sys/arch/i386/i386: machdep.c process_machdep.c

Log Message:
Now that the sv_xmm and sv_87 fields in the pcb are the same size as the
  hardware ones, and those in the mcontext, ptrace and core files we
  can really safely cast and copy between the types.
Remove a couple of temporary buffers and add CTASSERT()s that the sizes
  do actually match.


To generate a diff of this commit:
cvs rdiff -u -r1.745 -r1.746 src/sys/arch/i386/i386/machdep.c
cvs rdiff -u -r1.80 -r1.81 src/sys/arch/i386/i386/process_machdep.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/machdep.c
diff -u src/sys/arch/i386/i386/machdep.c:1.745 src/sys/arch/i386/i386/machdep.c:1.746
--- src/sys/arch/i386/i386/machdep.c:1.745	Sun Feb  2 22:41:20 2014
+++ src/sys/arch/i386/i386/machdep.c	Tue Feb  4 22:48:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.745 2014/02/02 22:41:20 dsl Exp $	*/
+/*	$NetBSD: machdep.c,v 1.746 2014/02/04 22:48:26 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.745 2014/02/02 22:41:20 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.746 2014/02/04 22:48:26 dsl Exp $");
 
 #include "opt_beep.h"
 #include "opt_compat_ibcs2.h"
@@ -1644,14 +1644,18 @@ cpu_getmcontext(struct lwp *l, mcontext_
 		if (pcb->pcb_fpcpu)
 			fpusave_lwp(l, true);
 		if (i386_use_fxsave) {
-			memcpy(&mcp->__fpregs.__fp_reg_set.__fp_xmm_state.__fp_xmm,
+			__CTASSERT(sizeof pcb->pcb_savefpu.sv_xmm ==
+			    sizeof mcp->__fpregs.__fp_reg_set.__fp_xmm_state);
+			memcpy(&mcp->__fpregs.__fp_reg_set.__fp_xmm_state,
 			    &pcb->pcb_savefpu.sv_xmm,
-			    sizeof (mcp->__fpregs.__fp_reg_set.__fp_xmm_state.__fp_xmm));
+			    sizeof (mcp->__fpregs.__fp_reg_set.__fp_xmm_state));
 			*flags |= _UC_FXSAVE;
 		} else {
-			memcpy(&mcp->__fpregs.__fp_reg_set.__fpchip_state.__fp_state,
+			__CTASSERT(sizeof pcb->pcb_savefpu.sv_87 ==
+			    sizeof mcp->__fpregs.__fp_reg_set.__fpchip_state);
+			memcpy(&mcp->__fpregs.__fp_reg_set.__fpchip_state,
 			    &pcb->pcb_savefpu.sv_87,
-			    sizeof (mcp->__fpregs.__fp_reg_set.__fpchip_state.__fp_state));
+			    sizeof (mcp->__fpregs.__fp_reg_set.__fpchip_state));
 		}
 #if 0
 		/* Apparently nothing ever touches this. */
@@ -1742,26 +1746,30 @@ cpu_setmcontext(struct lwp *l, const mco
 
 	/* Restore floating point register context, if any. */
 	if ((flags & _UC_FPU) != 0) {
+		__CTASSERT(sizeof pcb->pcb_savefpu.sv_xmm ==
+		    sizeof mcp->__fpregs.__fp_reg_set.__fp_xmm_state);
+		__CTASSERT(sizeof pcb->pcb_savefpu.sv_87 ==
+		    sizeof mcp->__fpregs.__fp_reg_set.__fpchip_state);
+
 		if (flags & _UC_FXSAVE) {
 			if (i386_use_fxsave) {
-				memcpy(
-					&pcb->pcb_savefpu.sv_xmm,
-					&mcp->__fpregs.__fp_reg_set.__fp_xmm_state.__fp_xmm,
-					sizeof (pcb->pcb_savefpu.sv_xmm));
+				memcpy(&pcb->pcb_savefpu.sv_xmm,
+				    &mcp->__fpregs.__fp_reg_set.__fp_xmm_state,
+				    sizeof (pcb->pcb_savefpu.sv_xmm));
 			} else {
 				/* This is a weird corner case */
-				process_xmm_to_s87((struct fxsave *)
-				    &mcp->__fpregs.__fp_reg_set.__fp_xmm_state.__fp_xmm,
+				process_xmm_to_s87((const struct fxsave *)
+				    &mcp->__fpregs.__fp_reg_set.__fp_xmm_state,
 				    &pcb->pcb_savefpu.sv_87);
 			}
 		} else {
 			if (i386_use_fxsave) {
-				process_s87_to_xmm((struct save87 *)
-				    &mcp->__fpregs.__fp_reg_set.__fpchip_state.__fp_state,
+				process_s87_to_xmm((const struct save87 *)
+				    &mcp->__fpregs.__fp_reg_set.__fpchip_state,
 				    &pcb->pcb_savefpu.sv_xmm);
 			} else {
 				memcpy(&pcb->pcb_savefpu.sv_87,
-				    &mcp->__fpregs.__fp_reg_set.__fpchip_state.__fp_state,
+				    &mcp->__fpregs.__fp_reg_set.__fpchip_state,
 				    sizeof (pcb->pcb_savefpu.sv_87));
 			}
 		}

Index: src/sys/arch/i386/i386/process_machdep.c
diff -u src/sys/arch/i386/i386/process_machdep.c:1.80 src/sys/arch/i386/i386/process_machdep.c:1.81
--- src/sys/arch/i386/i386/process_machdep.c:1.80	Sun Jan 26 19:16:17 2014
+++ src/sys/arch/i386/i386/process_machdep.c	Tue Feb  4 22:48:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: process_machdep.c,v 1.80 2014/01/26 19:16:17 dsl Exp $	*/
+/*	$NetBSD: process_machdep.c,v 1.81 2014/02/04 22:48:26 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.80 2014/01/26 19:16:17 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.81 2014/02/04 22:48:26 dsl Exp $");
 
 #include "opt_vm86.h"
 #include "opt_ptrace.h"
@@ -277,12 +277,9 @@ process_read_fpregs(struct lwp *l, struc
 		l->l_md.md_flags |= MDL_USEDFPU;
 	}
 
+	__CTASSERT(sizeof *regs == sizeof (struct save87));
 	if (i386_use_fxsave) {
-		struct save87 s87;
-
-		/* XXX Yuck */
-		process_xmm_to_s87(&frame->sv_xmm, &s87);
-		memcpy(regs, &s87, sizeof(*regs));
+		process_xmm_to_s87(&frame->sv_xmm, (struct save87 *)regs);
 	} else
 		memcpy(regs, &frame->sv_87, sizeof(*regs));
 	return (0);
@@ -356,11 +353,7 @@ process_write_fpregs(struct lwp *l, cons
 	}
 
 	if (i386_use_fxsave) {
-		struct save87 s87;
-
-		/* XXX Yuck. */
-		memcpy(&s87, regs, sizeof(*regs));
-		process_s87_to_xmm(&s87, &frame->sv_xmm);
+		process_s87_to_xmm((const struct save87 *)regs, &frame->sv_xmm);
 	} else
 		memcpy(&frame->sv_87, regs, sizeof(*regs));
 	return (0);

Reply via email to