Module Name:    src
Committed By:   maxv
Date:           Sun Jul  1 08:32:41 UTC 2018

Modified Files:
        src/sys/arch/x86/x86: fpu.c vm_machdep.c

Log Message:
Use a variable-sized memcpy, instead of copying the PCB and then adding
the extra bytes. The PCB embeds the biggest static FPU state, but our
real FPU state may be smaller (FNSAVE), so we don't need to memcpy the
extra unused bytes.


To generate a diff of this commit:
cvs rdiff -u -r1.45 -r1.46 src/sys/arch/x86/x86/fpu.c
cvs rdiff -u -r1.34 -r1.35 src/sys/arch/x86/x86/vm_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/x86/x86/fpu.c
diff -u src/sys/arch/x86/x86/fpu.c:1.45 src/sys/arch/x86/x86/fpu.c:1.46
--- src/sys/arch/x86/x86/fpu.c:1.45	Sun Jul  1 07:18:56 2018
+++ src/sys/arch/x86/x86/fpu.c	Sun Jul  1 08:32:41 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu.c,v 1.45 2018/07/01 07:18:56 maxv Exp $	*/
+/*	$NetBSD: fpu.c,v 1.46 2018/07/01 08:32:41 maxv Exp $	*/
 
 /*
  * Copyright (c) 2008 The NetBSD Foundation, Inc.  All
@@ -96,7 +96,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fpu.c,v 1.45 2018/07/01 07:18:56 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu.c,v 1.46 2018/07/01 08:32:41 maxv Exp $");
 
 #include "opt_multiprocessor.h"
 
@@ -723,17 +723,10 @@ fpu_save_area_reset(struct lwp *l)
 void
 fpu_save_area_fork(struct pcb *pcb2, const struct pcb *pcb1)
 {
-	ssize_t extra;
+	const uint8_t *src = (const uint8_t *)&pcb1->pcb_savefpu;
+	uint8_t *dst = (uint8_t *)&pcb2->pcb_savefpu;
 
-	/*
-	 * The pcb itself has been copied, but the xsave area
-	 * extends further.
-	 */
-	extra = offsetof(struct pcb, pcb_savefpu) + x86_fpu_save_size -
-	    sizeof (struct pcb);
-
-	if (extra > 0)
-		memcpy(pcb2 + 1, pcb1 + 1, extra);
+	memcpy(dst, src, x86_fpu_save_size);
 
 	KASSERT(pcb2->pcb_fpcpu == NULL);
 }

Index: src/sys/arch/x86/x86/vm_machdep.c
diff -u src/sys/arch/x86/x86/vm_machdep.c:1.34 src/sys/arch/x86/x86/vm_machdep.c:1.35
--- src/sys/arch/x86/x86/vm_machdep.c:1.34	Tue Jun 19 07:23:44 2018
+++ src/sys/arch/x86/x86/vm_machdep.c	Sun Jul  1 08:32:41 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: vm_machdep.c,v 1.34 2018/06/19 07:23:44 maxv Exp $	*/
+/*	$NetBSD: vm_machdep.c,v 1.35 2018/07/01 08:32:41 maxv Exp $	*/
 
 /*-
  * Copyright (c) 1982, 1986 The Regents of the University of California.
@@ -80,7 +80,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.34 2018/06/19 07:23:44 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.35 2018/07/01 08:32:41 maxv Exp $");
 
 #include "opt_mtrr.h"
 
@@ -155,13 +155,13 @@ cpu_lwp_fork(struct lwp *l1, struct lwp 
 		KASSERT(l1 == &lwp0);
 	}
 
-	/* Copy the PCB from parent. */
-	memcpy(pcb2, pcb1, sizeof(struct pcb));
+	/* Copy the PCB from parent, except the FPU state. */
+	memcpy(pcb2, pcb1, offsetof(struct pcb, pcb_savefpu));
 
 	/* FPU state not installed. */
 	pcb2->pcb_fpcpu = NULL;
 
-	/* Copy any additional fpu state */
+	/* Copy FPU state. */
 	fpu_save_area_fork(pcb2, pcb1);
 
 	/* Never inherit CPU Debug Registers */

Reply via email to