Source-Changes-HG archive

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

[src/netbsd-8]: src/sys/arch Pull up the following, requested by maxv in tick...



details:   https://anonhg.NetBSD.org/src/rev/dfb13cff5ed4
branches:  netbsd-8
changeset: 320513:dfb13cff5ed4
user:      martin <martin%NetBSD.org@localhost>
date:      Tue Jul 10 15:35:26 2018 +0000

description:
Pull up the following, requested by maxv in ticket #910:

        sys/arch/amd64/amd64/locore.S   r1.167 (patch)
        sys/arch/i386/i386/locore.S     r1.158 (patch)
        sys/arch/x86/x86/fpu.c          r1.44 (patch)

Don't switch the FPU when leaving a softint. This fixes
several problems when EagerFPU is enabled.

diffstat:

 sys/arch/amd64/amd64/locore.S |  28 +++++++++++++---------------
 sys/arch/i386/i386/locore.S   |  30 +++++++++++++++---------------
 sys/arch/x86/x86/fpu.c        |  18 ++++++++++++++++--
 3 files changed, 44 insertions(+), 32 deletions(-)

diffs (146 lines):

diff -r 226b20198c1a -r dfb13cff5ed4 sys/arch/amd64/amd64/locore.S
--- a/sys/arch/amd64/amd64/locore.S     Tue Jul 10 15:32:28 2018 +0000
+++ b/sys/arch/amd64/amd64/locore.S     Tue Jul 10 15:35:26 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: locore.S,v 1.123.6.7 2018/06/23 11:39:01 martin Exp $  */
+/*     $NetBSD: locore.S,v 1.123.6.8 2018/07/10 15:35:26 martin Exp $  */
 
 /*
  * Copyright-o-rama!
@@ -1094,20 +1094,6 @@
        popq    %rdx
 #endif
 
-#ifndef XEN
-       /* RDI/RSI got clobbered. */
-       movq    %r13,%rdi
-       movq    %r12,%rsi
-
-       pushq   %rdx
-       movb    _C_LABEL(x86_fpu_eager),%dl
-       testb   %dl,%dl
-       jz      .Lno_eagerfpu
-       callq   _C_LABEL(fpu_eagerswitch)
-.Lno_eagerfpu:
-       popq    %rdx
-#endif
-
        /* Switch to newlwp's stack. */
        movq    L_PCB(%r12),%r14
        movq    PCB_RSP(%r14),%rsp
@@ -1148,6 +1134,18 @@
 #endif
 .Lring0_switched:
 
+#ifndef XEN
+       pushq   %rdx
+       movb    _C_LABEL(x86_fpu_eager),%dl
+       testb   %dl,%dl
+       jz      .Lno_eagerfpu
+       movq    %r13,%rdi
+       movq    %r12,%rsi
+       callq   _C_LABEL(fpu_eagerswitch)
+.Lno_eagerfpu:
+       popq    %rdx
+#endif
+
        /* Don't bother with the rest if switching to a system process. */
        testl   $LW_SYSTEM,L_FLAG(%r12)
        jnz     switch_return
diff -r 226b20198c1a -r dfb13cff5ed4 sys/arch/i386/i386/locore.S
--- a/sys/arch/i386/i386/locore.S       Tue Jul 10 15:32:28 2018 +0000
+++ b/sys/arch/i386/i386/locore.S       Tue Jul 10 15:35:26 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: locore.S,v 1.145.6.4 2018/06/23 11:39:02 martin Exp $  */
+/*     $NetBSD: locore.S,v 1.145.6.5 2018/07/10 15:35:26 martin Exp $  */
 
 /*
  * Copyright-o-rama!
@@ -128,7 +128,7 @@
  */
 
 #include <machine/asm.h>
-__KERNEL_RCSID(0, "$NetBSD: locore.S,v 1.145.6.4 2018/06/23 11:39:02 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: locore.S,v 1.145.6.5 2018/07/10 15:35:26 martin Exp $");
 
 #include "opt_compat_oldboot.h"
 #include "opt_copy_symtab.h"
@@ -1089,19 +1089,6 @@
        movl    %ebp,PCB_EBP(%eax)
 skip_save:
 
-#ifndef XEN
-       pushl   %edx
-       movb    _C_LABEL(x86_fpu_eager),%dl
-       testb   %dl,%dl
-       jz      .Lno_eagerfpu
-       pushl   %edi
-       pushl   %esi
-       call    _C_LABEL(fpu_eagerswitch)
-       addl    $8,%esp
-.Lno_eagerfpu:
-       popl    %edx
-#endif
-
        /* Switch to newlwp's stack. */
        movl    L_PCB(%edi),%ebx
        movl    PCB_EBP(%ebx),%ebp
@@ -1129,6 +1116,19 @@
        movl    %eax,TSS_ESP0(%ecx)
 #endif
 
+#ifndef XEN
+       pushl   %edx
+       movb    _C_LABEL(x86_fpu_eager),%dl
+       testb   %dl,%dl
+       jz      .Lno_eagerfpu
+       pushl   %edi
+       pushl   %esi
+       call    _C_LABEL(fpu_eagerswitch)
+       addl    $8,%esp
+.Lno_eagerfpu:
+       popl    %edx
+#endif
+
        /* Don't bother with the rest if switching to a system process. */
        testl   $LW_SYSTEM,L_FLAG(%edi)
        jnz     switch_return
diff -r 226b20198c1a -r dfb13cff5ed4 sys/arch/x86/x86/fpu.c
--- a/sys/arch/x86/x86/fpu.c    Tue Jul 10 15:32:28 2018 +0000
+++ b/sys/arch/x86/x86/fpu.c    Tue Jul 10 15:35:26 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: fpu.c,v 1.12.8.2 2018/06/23 11:39:02 martin Exp $      */
+/*     $NetBSD: fpu.c,v 1.12.8.3 2018/07/10 15:35:26 martin 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.12.8.2 2018/06/23 11:39:02 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu.c,v 1.12.8.3 2018/07/10 15:35:26 martin Exp $");
 
 #include "opt_multiprocessor.h"
 
@@ -306,6 +306,20 @@
        int s;
 
        s = splhigh();
+#ifdef DIAGNOSTIC
+       if (oldlwp != NULL) {
+               struct pcb *pcb = lwp_getpcb(oldlwp);
+               struct cpu_info *ci = curcpu();
+               if (pcb->pcb_fpcpu == NULL) {
+                       KASSERT(ci->ci_fpcurlwp != oldlwp);
+               } else if (pcb->pcb_fpcpu == ci) {
+                       KASSERT(ci->ci_fpcurlwp == oldlwp);
+               } else {
+                       panic("%s: oldlwp's state installed elsewhere",
+                           __func__);
+               }
+       }
+#endif
        fpusave_cpu(true);
        if (!(newlwp->l_flag & LW_SYSTEM))
                fpu_eagerrestore(newlwp);



Home | Main Index | Thread Index | Old Index