Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch Rename fpu_eagerswitch to fpu_switch, and add fpu_x...



details:   https://anonhg.NetBSD.org/src/rev/bd7a5140235d
branches:  trunk
changeset: 460011:bd7a5140235d
user:      maxv <maxv%NetBSD.org@localhost>
date:      Fri Oct 04 11:47:07 2019 +0000

description:
Rename fpu_eagerswitch to fpu_switch, and add fpu_xstate_reload to
simplify.

diffstat:

 sys/arch/amd64/amd64/locore.S |   4 +-
 sys/arch/i386/i386/locore.S   |   6 ++--
 sys/arch/x86/include/fpu.h    |   4 +--
 sys/arch/x86/x86/fpu.c        |  57 +++++++++++++++---------------------------
 4 files changed, 27 insertions(+), 44 deletions(-)

diffs (178 lines):

diff -r c800e53f6ed4 -r bd7a5140235d sys/arch/amd64/amd64/locore.S
--- a/sys/arch/amd64/amd64/locore.S     Fri Oct 04 11:43:07 2019 +0000
+++ b/sys/arch/amd64/amd64/locore.S     Fri Oct 04 11:47:07 2019 +0000
@@ -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 @@
        /* 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)
diff -r c800e53f6ed4 -r bd7a5140235d sys/arch/i386/i386/locore.S
--- a/sys/arch/i386/i386/locore.S       Fri Oct 04 11:43:07 2019 +0000
+++ b/sys/arch/i386/i386/locore.S       Fri Oct 04 11:47:07 2019 +0000
@@ -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 @@
        pushl   %edx
        pushl   %edi
        pushl   %esi
-       call    _C_LABEL(fpu_eagerswitch)
+       call    _C_LABEL(fpu_switch)
        addl    $8,%esp
        popl    %edx
 
diff -r c800e53f6ed4 -r bd7a5140235d sys/arch/x86/include/fpu.h
--- a/sys/arch/x86/include/fpu.h        Fri Oct 04 11:43:07 2019 +0000
+++ b/sys/arch/x86/include/fpu.h        Fri Oct 04 11:47:07 2019 +0000
@@ -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 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 *);
diff -r c800e53f6ed4 -r bd7a5140235d sys/arch/x86/x86/fpu.c
--- a/sys/arch/x86/x86/fpu.c    Fri Oct 04 11:43:07 2019 +0000
+++ b/sys/arch/x86/x86/fpu.c    Fri Oct 04 11:47:07 2019 +0000
@@ -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_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 @@
        }
 }
 
+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 @@
 
        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_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 @@
                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 @@
                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);



Home | Main Index | Thread Index | Old Index