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