AMD64 - Enable floating point context switching
authorMatthew Dillon <dillon@apollo.backplane.com>
Wed, 8 Jul 2009 03:12:52 +0000 (20:12 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Wed, 8 Jul 2009 03:12:52 +0000 (20:12 -0700)
The FP code was only partially enabled.  Enable all the code.  This fixes
FP context switching between user processes.

sys/platform/pc64/amd64/genassym.c
sys/platform/pc64/amd64/machdep.c
sys/platform/pc64/amd64/swtch.s
sys/platform/pc64/amd64/vm_machdep.c

index b36116d..a40ebe6 100644 (file)
@@ -135,8 +135,10 @@ ASSYM(PCB_FLAGS, offsetof(struct pcb, pcb_flags));
 ASSYM(PCB_ONFAULT, offsetof(struct pcb, pcb_onfault));
 ASSYM(PCB_FSBASE, offsetof(struct pcb, pcb_fsbase));
 ASSYM(PCB_GSBASE, offsetof(struct pcb, pcb_gsbase));
+ASSYM(PCB_SAVEFPU, offsetof(struct pcb, pcb_save));
 
 ASSYM(PCB_SIZE, sizeof(struct pcb));
+ASSYM(PCB_SAVEFPU_SIZE, sizeof(union savefpu));
 
 ASSYM(TF_R15, offsetof(struct trapframe, tf_r15));
 ASSYM(TF_R14, offsetof(struct trapframe, tf_r14));
@@ -182,6 +184,7 @@ ASSYM(TD_NEST_COUNT, offsetof(struct thread, td_nest_count));
 ASSYM(TD_MPCOUNT, offsetof(struct thread, td_mpcount));
 #endif
 ASSYM(TD_FLAGS, offsetof(struct thread, td_flags));
+ASSYM(TD_SAVEFPU, offsetof(struct thread, td_savefpu));
 ASSYM(TDF_RUNNING, TDF_RUNNING);
 ASSYM(TDF_USINGFP, TDF_USINGFP);
 ASSYM(TDF_KERNELFP, TDF_KERNELFP);
index c370a60..b3519f9 100644 (file)
@@ -1098,10 +1098,8 @@ exec_setregs(u_long entry, u_long stack, u_long ps_strings)
        wrmsr(MSR_FSBASE, 0);   /* Set MSR values for return to userland */
        wrmsr(MSR_KGSBASE, 0);
 
-#if NNPX > 0
        /* Initialize the npx (if any) for the current process. */
        npxinit(__INITIAL_NPXCW__);
-#endif
        crit_exit();
 
        pcb->pcb_ds = _udatasel;
index 4bf13e7..d3c46f8 100644 (file)
@@ -176,7 +176,7 @@ ENTRY(cpu_heavy_switch)
        movq    %rax,PCB_DR0(%rdx)
 1:
  
-#if NNPX > 0
+#if 1
        /*
         * Save the FP state if we have used the FP.  Note that calling
         * npxsave will NULL out PCPU(npxthread).
@@ -188,7 +188,7 @@ ENTRY(cpu_heavy_switch)
        call    npxsave                 /* do it in a big C function */
        movq    %r12,%rdi               /* restore %rdi */
 1:
-#endif /* NNPX > 0 */
+#endif
 
        /*
         * Switch to the next thread, which was passed as an argument
@@ -503,7 +503,7 @@ ENTRY(savectx)
        movq    %r14,PCB_R14(%rcx)
        movq    %r15,PCB_R15(%rcx)
 
-#if NNPX > 0
+#if 1
        /*
         * If npxthread == NULL, then the npx h/w state is irrelevant and the
         * state had better already be in the pcb.  This is true for forks
@@ -535,7 +535,7 @@ ENTRY(savectx)
        movq    %rcx,%rsi
        movq    %rax,%rdi
        call    bcopy
-#endif /* NNPX > 0 */
+#endif
 
 1:
        CHECKNZ((%rsp), %r9)
@@ -633,7 +633,7 @@ ENTRY(cpu_lwkt_switch)
        pushq   %r15
        pushfq
 
-#if NNPX > 0
+#if 1
        /*
         * Save the FP state if we have used the FP.  Note that calling
         * npxsave will NULL out PCPU(npxthread).
@@ -649,7 +649,7 @@ ENTRY(cpu_lwkt_switch)
        call    npxsave                 /* do it in a big C function */
        movq    %r12,%rdi               /* restore %rdi */
 1:
-#endif /* NNPX > 0 */
+#endif
 
        movq    %rdi,%rax               /* switch to this thread */
        pushq   $cpu_lwkt_restore
index c6b5876..c774f7b 100644 (file)
@@ -102,11 +102,9 @@ cpu_fork(struct lwp *lp1, struct lwp *lp2, int flags)
                return;
        }
 
-#if NNPX > 0
        /* Ensure that lp1's pcb is up to date. */
        if (mdcpu->gd_npxthread == lp1->lwp_thread)
                npxsave(lp1->lwp_thread->td_savefpu);
-#endif
        
        /*
         * Copy lp1's PCB.  This really only applies to the
@@ -254,9 +252,7 @@ cpu_lwp_exit(void)
 {
        struct thread *td = curthread;
        struct pcb *pcb;
-#if NNPX > 0
        npxexit();
-#endif /* NNPX */
        pcb = td->td_pcb;
        KKASSERT(pcb->pcb_ext == NULL); /* Some i386 functionality was dropped */
         if (pcb->pcb_flags & PCB_DBREGS) {