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 */