Module Name:    src
Committed By:   maxv
Date:           Fri Oct  4 11:47:08 UTC 2019

Modified Files:
        src/sys/arch/amd64/amd64: locore.S
        src/sys/arch/i386/i386: locore.S
        src/sys/arch/x86/include: fpu.h
        src/sys/arch/x86/x86: fpu.c

Log Message:
Rename fpu_eagerswitch to fpu_switch, and add fpu_xstate_reload to
simplify.


To generate a diff of this commit:
cvs rdiff -u -r1.187 -r1.188 src/sys/arch/amd64/amd64/locore.S
cvs rdiff -u -r1.169 -r1.170 src/sys/arch/i386/i386/locore.S
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/x86/include/fpu.h
cvs rdiff -u -r1.56 -r1.57 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/amd64/amd64/locore.S
diff -u src/sys/arch/amd64/amd64/locore.S:1.187 src/sys/arch/amd64/amd64/locore.S:1.188
--- src/sys/arch/amd64/amd64/locore.S:1.187	Thu Oct  3 05:06:29 2019
+++ src/sys/arch/amd64/amd64/locore.S	Fri Oct  4 11:47:07 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: locore.S,v 1.187 2019/10/03 05:06:29 maxv Exp $	*/
+/*	$NetBSD: locore.S,v 1.188 2019/10/04 11:47:07 maxv Exp $	*/
 
 /*
  * Copyright-o-rama!
@@ -1150,7 +1150,7 @@ ENTRY(cpu_switchto)
 	/* Switch the FPU. */
 	movq	%r13,%rdi
 	movq	%r12,%rsi
-	callq	_C_LABEL(fpu_eagerswitch)
+	callq	_C_LABEL(fpu_switch)
 
 	/* Don't bother with the rest if switching to a system process. */
 	testl	$LW_SYSTEM,L_FLAG(%r12)

Index: src/sys/arch/i386/i386/locore.S
diff -u src/sys/arch/i386/i386/locore.S:1.169 src/sys/arch/i386/i386/locore.S:1.170
--- src/sys/arch/i386/i386/locore.S:1.169	Thu Oct  3 05:06:29 2019
+++ src/sys/arch/i386/i386/locore.S	Fri Oct  4 11:47:07 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: locore.S,v 1.169 2019/10/03 05:06:29 maxv Exp $	*/
+/*	$NetBSD: locore.S,v 1.170 2019/10/04 11:47:07 maxv Exp $	*/
 
 /*
  * Copyright-o-rama!
@@ -128,7 +128,7 @@
  */
 
 #include <machine/asm.h>
-__KERNEL_RCSID(0, "$NetBSD: locore.S,v 1.169 2019/10/03 05:06:29 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: locore.S,v 1.170 2019/10/04 11:47:07 maxv Exp $");
 
 #include "opt_copy_symtab.h"
 #include "opt_ddb.h"
@@ -1141,7 +1141,7 @@ skip_save:
 	pushl	%edx
 	pushl	%edi
 	pushl	%esi
-	call	_C_LABEL(fpu_eagerswitch)
+	call	_C_LABEL(fpu_switch)
 	addl	$8,%esp
 	popl	%edx
 

Index: src/sys/arch/x86/include/fpu.h
diff -u src/sys/arch/x86/include/fpu.h:1.17 src/sys/arch/x86/include/fpu.h:1.18
--- src/sys/arch/x86/include/fpu.h:1.17	Wed Jun 26 12:30:13 2019
+++ src/sys/arch/x86/include/fpu.h	Fri Oct  4 11:47:08 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu.h,v 1.17 2019/06/26 12:30:13 mgorny Exp $	*/
+/*	$NetBSD: fpu.h,v 1.18 2019/10/04 11:47:08 maxv Exp $	*/
 
 #ifndef	_X86_FPU_H_
 #define	_X86_FPU_H_
@@ -20,8 +20,6 @@ void fpu_area_restore(void *, uint64_t);
 void fpusave_lwp(struct lwp *, bool);
 void fpusave_cpu(bool);
 
-void fpu_eagerswitch(struct lwp *, struct lwp *);
-
 void fpu_set_default_cw(struct lwp *, unsigned int);
 
 void fputrap(struct trapframe *);

Index: src/sys/arch/x86/x86/fpu.c
diff -u src/sys/arch/x86/x86/fpu.c:1.56 src/sys/arch/x86/x86/fpu.c:1.57
--- src/sys/arch/x86/x86/fpu.c:1.56	Thu Oct  3 05:06:29 2019
+++ src/sys/arch/x86/x86/fpu.c	Fri Oct  4 11:47:08 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpu.c,v 1.56 2019/10/03 05:06:29 maxv Exp $	*/
+/*	$NetBSD: fpu.c,v 1.57 2019/10/04 11:47:08 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.56 2019/10/03 05:06:29 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu.c,v 1.57 2019/10/04 11:47:08 maxv Exp $");
 
 #include "opt_multiprocessor.h"
 
@@ -267,8 +267,10 @@ fpu_lwp_install(struct lwp *l)
 	fpu_area_restore(&pcb->pcb_savefpu, x86_xsave_features);
 }
 
+void fpu_switch(struct lwp *, struct lwp *);
+
 void
-fpu_eagerswitch(struct lwp *oldlwp, struct lwp *newlwp)
+fpu_switch(struct lwp *oldlwp, struct lwp *newlwp)
 {
 	int s;
 
@@ -536,6 +538,17 @@ fpusave_lwp(struct lwp *l, bool save)
 	}
 }
 
+static inline void
+fpu_xstate_reload(union savefpu *fpu_save, uint64_t xstate)
+{
+	/*
+	 * Force a reload of the given xstate during the next XRSTOR.
+	 */
+	if (x86_fpu_save >= FPU_SAVE_XSAVE) {
+		fpu_save->sv_xsave_hdr.xsh_xstate_bv |= xstate;
+	}
+}
+
 void
 fpu_set_default_cw(struct lwp *l, unsigned int x87_cw)
 {
@@ -544,13 +557,8 @@ fpu_set_default_cw(struct lwp *l, unsign
 
 	if (i386_use_fxsave) {
 		fpu_save->sv_xmm.fx_cw = x87_cw;
-
-		/* Force a reload of CW */
-		if ((x87_cw != __INITIAL_NPXCW__) &&
-		    (x86_fpu_save == FPU_SAVE_XSAVE ||
-		    x86_fpu_save == FPU_SAVE_XSAVEOPT)) {
-			fpu_save->sv_xsave_hdr.xsh_xstate_bv |=
-			    XCR0_X87;
+		if (x87_cw != __INITIAL_NPXCW__) {
+			fpu_xstate_reload(fpu_save, XCR0_X87);
 		}
 	} else {
 		fpu_save->sv_87.s87_cw = x87_cw;
@@ -594,14 +602,8 @@ fpu_clear(struct lwp *l, unsigned int x8
 		fpu_save->sv_xmm.fx_mxcsr = __INITIAL_MXCSR__;
 		fpu_save->sv_xmm.fx_mxcsr_mask = x86_fpu_mxcsr_mask;
 		fpu_save->sv_xmm.fx_cw = x87_cw;
-
-		/*
-		 * Force a reload of CW if we're using the non-default
-		 * value.
-		 */
 		if (__predict_false(x87_cw != __INITIAL_NPXCW__)) {
-			fpu_save->sv_xsave_hdr.xsh_xstate_bv |=
-			    XCR0_X87;
+			fpu_xstate_reload(fpu_save, XCR0_X87);
 		}
 		break;
 	}
@@ -781,15 +783,7 @@ process_write_fpregs_xmm(struct lwp *l, 
 		fpu_save->sv_xmm.fx_mxcsr_mask &= x86_fpu_mxcsr_mask;
 		fpu_save->sv_xmm.fx_mxcsr &= fpu_save->sv_xmm.fx_mxcsr_mask;
 
-		/*
-		 * Make sure the x87 and SSE bits are set in xstate_bv.
-		 * Otherwise xrstor will not restore them.
-		 */
-		if (x86_fpu_save == FPU_SAVE_XSAVE ||
-		    x86_fpu_save == FPU_SAVE_XSAVEOPT) {
-			fpu_save->sv_xsave_hdr.xsh_xstate_bv |=
-			    (XCR0_X87 | XCR0_SSE);
-		}
+		fpu_xstate_reload(fpu_save, XCR0_X87 | XCR0_SSE);
 	} else {
 		process_xmm_to_s87(fpregs, &fpu_save->sv_87);
 	}
@@ -805,16 +799,7 @@ process_write_fpregs_s87(struct lwp *l, 
 		fpusave_lwp(l, true);
 		fpu_save = lwp_fpuarea(l);
 		process_s87_to_xmm(fpregs, &fpu_save->sv_xmm);
-
-		/*
-		 * Make sure the x87 and SSE bits are set in xstate_bv.
-		 * Otherwise xrstor will not restore them.
-		 */
-		if (x86_fpu_save == FPU_SAVE_XSAVE ||
-		    x86_fpu_save == FPU_SAVE_XSAVEOPT) {
-			fpu_save->sv_xsave_hdr.xsh_xstate_bv |=
-			    (XCR0_X87 | XCR0_SSE);
-		}
+		fpu_xstate_reload(fpu_save, XCR0_X87 | XCR0_SSE);
 	} else {
 		fpusave_lwp(l, false);
 		fpu_save = lwp_fpuarea(l);

Reply via email to