Module Name: src Committed By: maxv Date: Tue Jun 19 09:25:13 UTC 2018
Modified Files: src/sys/arch/x86/x86: fpu.c Log Message: When using EagerFPU, create the fpu state in execve at IPL_HIGH. A preemption could occur in the middle, and we don't want that to happen, because the context switch would use the partially-constructed fpu state. The procedure becomes: splhigh unbusy the current cpu's fpu create a new fpu state in memory install the state on the current cpu's fpu splx Disabling preemption also ensures that x86_fpu_eager doesn't change in the middle. In LazyFPU mode we drop IPL_HIGH right away. Add more KASSERTs. To generate a diff of this commit: cvs rdiff -u -r1.38 -r1.39 src/sys/arch/x86/x86/fpu.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.38 src/sys/arch/x86/x86/fpu.c:1.39 --- src/sys/arch/x86/x86/fpu.c:1.38 Mon Jun 18 20:20:27 2018 +++ src/sys/arch/x86/x86/fpu.c Tue Jun 19 09:25:13 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: fpu.c,v 1.38 2018/06/18 20:20:27 maxv Exp $ */ +/* $NetBSD: fpu.c,v 1.39 2018/06/19 09:25:13 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.38 2018/06/18 20:20:27 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: fpu.c,v 1.39 2018/06/19 09:25:13 maxv Exp $"); #include "opt_multiprocessor.h" @@ -624,10 +624,22 @@ fpu_save_area_clear(struct lwp *l, unsig { union savefpu *fpu_save; struct pcb *pcb; + int s; - fpusave_lwp(l, false); + KASSERT(l == curlwp); + KASSERT((l->l_flag & LW_SYSTEM) == 0); fpu_save = process_fpframe(l); pcb = lwp_getpcb(l); + + s = splhigh(); + if (x86_fpu_eager) { + KASSERT(pcb->pcb_fpcpu == NULL || + pcb->pcb_fpcpu == curcpu()); + fpusave_cpu(false); + } else { + splx(s); + fpusave_lwp(l, false); + } KASSERT(pcb->pcb_fpcpu == NULL); if (i386_use_fxsave) { @@ -650,13 +662,9 @@ fpu_save_area_clear(struct lwp *l, unsig } pcb->pcb_fpu_dflt_cw = x87_cw; - /* - * If using eager-switch, install the FPU state on the current - * CPU. - */ if (x86_fpu_eager) { - KASSERT(l == curlwp); - fpu_eagerswitch(NULL, l); + fpu_eagerrestore(l); + splx(s); } }