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);