Source-Changes-HG archive

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

[src/trunk]: src/sys/arch/powerpc Cleanup AltiVec data stream issues with con...



details:   https://anonhg.NetBSD.org/src/rev/26ef75899207
branches:  trunk
changeset: 534430:26ef75899207
user:      matt <matt%NetBSD.org@localhost>
date:      Thu Jul 25 23:46:47 2002 +0000

description:
Cleanup AltiVec data stream issues with context switching.  Don't stop
data streams on execptions/interrupts since the processor will suspend
them for us.  Only stop them on 1) process exit, 2) another process gets
its address space loaded, and 3) (for completeness only) we save a process's
AltiVec context.

diffstat:

 sys/arch/powerpc/mpc6xx/altivec.c     |   6 +++-
 sys/arch/powerpc/powerpc/trap.c       |  37 +++++++++++++++++++++++-----------
 sys/arch/powerpc/powerpc/trap_subr.S  |   9 +-------
 sys/arch/powerpc/powerpc/vm_machdep.c |   6 +++-
 4 files changed, 34 insertions(+), 24 deletions(-)

diffs (189 lines):

diff -r 85d73eaff919 -r 26ef75899207 sys/arch/powerpc/mpc6xx/altivec.c
--- a/sys/arch/powerpc/mpc6xx/altivec.c Thu Jul 25 23:41:33 2002 +0000
+++ b/sys/arch/powerpc/mpc6xx/altivec.c Thu Jul 25 23:46:47 2002 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: altivec.c,v 1.4 2002/07/18 22:51:58 matt Exp $ */
+/*     $NetBSD: altivec.c,v 1.5 2002/07/25 23:46:47 matt Exp $ */
 
 /*
  * Copyright (C) 1996 Wolfgang Solfrank.
@@ -166,8 +166,10 @@
        __asm __volatile ("mtmsr %0; isync" :: "r"(msr));
 
        /*
-        * Note that we aren't using any CPU resources
+        * Note that we aren't using any CPU resources and stop any
+        * data streams.
         */
+       __asm __volatile ("dssall;sync");
        pcb->pcb_veccpu = NULL;
        curcpu()->ci_vecproc = NULL;
        tf->srr1 &= ~PSL_VEC;
diff -r 85d73eaff919 -r 26ef75899207 sys/arch/powerpc/powerpc/trap.c
--- a/sys/arch/powerpc/powerpc/trap.c   Thu Jul 25 23:41:33 2002 +0000
+++ b/sys/arch/powerpc/powerpc/trap.c   Thu Jul 25 23:46:47 2002 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: trap.c,v 1.64 2002/07/24 04:59:33 chs Exp $    */
+/*     $NetBSD: trap.c,v 1.65 2002/07/25 23:46:47 matt Exp $   */
 
 /*
  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -75,6 +75,7 @@
 trap(struct trapframe *frame)
 {
        struct proc *p = curproc;
+       struct pcb *pcb = &p->p_addr->u_pcb;
        struct cpu_info * const ci = curcpu();
        int type = frame->exc;
        int ftype, rv;
@@ -85,9 +86,9 @@
                type |= EXC_USER;
 
 #ifdef DIAGNOSTIC
-       if (curpcb->pcb_pmreal != curpm)
-               panic("trap: curpm (%p) != curpcb->pcb_pmreal (%p)",
-                   curpm, curpcb->pcb_pmreal);
+       if (pcb->pcb_pmreal != curpm)
+               panic("trap: curpm (%p) != pcb->pcb_pmreal (%p)",
+                   curpm, pcb->pcb_pmreal);
 #endif
 
        uvmexp.traps++;
@@ -146,7 +147,7 @@
                } else {
                        rv = EFAULT;
                }
-               if ((fb = p->p_addr->u_pcb.pcb_onfault) != NULL) {
+               if ((fb = pcb->pcb_onfault) != NULL) {
                        frame->srr0 = (*fb)[0];
                        frame->fixreg[1] = (*fb)[1];
                        frame->fixreg[2] = (*fb)[2];
@@ -232,11 +233,11 @@
                        save_fpu(ci->ci_fpuproc);
                }
 #if defined(MULTIPROCESSOR)
-               if (p->p_addr->u_pcb.pcb_fpcpu)
+               if (pcb->pcb_fpcpu)
                        save_fpu_proc(p);
 #endif
                ci->ci_fpuproc = p;
-               p->p_addr->u_pcb.pcb_fpcpu = ci;
+               pcb->pcb_fpcpu = ci;
                enable_fpu(p);
                break;
 
@@ -281,12 +282,12 @@
                        save_vec(ci->ci_vecproc);
                }
 #if defined(MULTIPROCESSOR)
-               if (p->p_addr->u_pcb.pcb_veccpu)
+               if (pcb->pcb_veccpu)
                        save_vec_proc(p);
 #endif
                ci->ci_vecproc = p;
                enable_vec(p);
-               p->p_addr->u_pcb.pcb_veccpu = ci;
+               pcb->pcb_veccpu = ci;
                break;
 #else
                KERNEL_PROC_LOCK(p);
@@ -328,7 +329,7 @@
        case EXC_MCHK: {
                faultbuf *fb;
 
-               if ((fb = p->p_addr->u_pcb.pcb_onfault) != NULL) {
+               if ((fb = pcb->pcb_onfault) != NULL) {
                        frame->srr0 = (*fb)[0];
                        frame->fixreg[1] = (*fb)[1];
                        frame->fixreg[2] = (*fb)[2];
@@ -370,11 +371,23 @@
         * If someone stole the fp or vector unit while we were away,
         * disable it
         */
-       if (p != ci->ci_fpuproc || p->p_addr->u_pcb.pcb_fpcpu != ci)
+       if ((pcb->pcb_flags & PCB_FPU) &&
+           (p != ci->ci_fpuproc || pcb->pcb_fpcpu != ci)) {
                frame->srr1 &= ~PSL_FP;
+       }
 #ifdef ALTIVEC
-       if (p != ci->ci_vecproc || p->p_addr->u_pcb.pcb_veccpu != ci)
+       if ((pcb->pcb_flags & PCB_ALTIVEC) &&
+           (p != ci->ci_vecproc || pcb->pcb_veccpu != ci)) {
                frame->srr1 &= ~PSL_VEC;
+       }
+       /*
+        * If the new process isn't the current AltiVec process on this
+        * cpu, we need to stop any data streams that are active (since
+        * it will be a different address space).
+        */
+       if (ci->ci_vecproc != NULL && ci->ci_vecproc != p) {
+               __asm __volatile("dssall;sync");
+       }
 #endif
 
        ci->ci_schedstate.spc_curpriority = p->p_priority = p->p_usrpri;
diff -r 85d73eaff919 -r 26ef75899207 sys/arch/powerpc/powerpc/trap_subr.S
--- a/sys/arch/powerpc/powerpc/trap_subr.S      Thu Jul 25 23:41:33 2002 +0000
+++ b/sys/arch/powerpc/powerpc/trap_subr.S      Thu Jul 25 23:46:47 2002 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: trap_subr.S,v 1.24 2002/07/05 18:45:22 matt Exp $      */
+/*     $NetBSD: trap_subr.S,v 1.25 2002/07/25 23:46:47 matt Exp $      */
 
 /*
  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -40,10 +40,6 @@
 #include "opt_altivec.h"
 
 #ifdef ALTIVEC
-#define DSSALL                 /* assumes PSL is in cr registers */ \
-       bc+     4,6,86f;        /* branch is PSL_VEC is false */        \
-       dssall;                 /* stop datastreams */                  \
-86:
 #define        SAVE_VRSAVE(tf,b) \
        mfspr   b,SPR_VRSAVE;                                           \
        stw     b,FRAME_VRSAVE+8(tf);
@@ -52,7 +48,6 @@
        lwz     b,FRAME_VRSAVE+8(tf);                                   \
        mtspr   SPR_VRSAVE,b;
 #else
-#define DSSALL                 86:
 #define SAVE_VRSAVE(tf,b)
 #define RESTORE_VRSAVE(tf,b)
 #endif
@@ -726,7 +721,6 @@
                                           overwritten) */
 s_trap:
        bc      4,17,k_trap             /* branch if PSL_PR is false */
-       DSSALL                          /* stop AltiVec data streams */
        lis     1,_C_LABEL(curpcb)@ha
        lwz     1,_C_LABEL(curpcb)@l(1)
        addi    1,1,USPACE              /* stack is top of user struct */
@@ -885,7 +879,6 @@
        stw     3,IFRAME_SRR1(1);                                       \
        mtcr    3;                                                      \
        bc      4,17,99f;       /* branch if PSL_PR is false */         \
-       DSSALL;                 /* stop AltiVec datastreams */          \
 /* interrupts are recoverable here, and enable translation */          \
        RESTORE_KERN_SRS(3,4);                                          \
        CPU601_KERN_ENTRY(3,4);                                         \
diff -r 85d73eaff919 -r 26ef75899207 sys/arch/powerpc/powerpc/vm_machdep.c
--- a/sys/arch/powerpc/powerpc/vm_machdep.c     Thu Jul 25 23:41:33 2002 +0000
+++ b/sys/arch/powerpc/powerpc/vm_machdep.c     Thu Jul 25 23:46:47 2002 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: vm_machdep.c,v 1.38 2002/07/05 18:45:23 matt Exp $     */
+/*     $NetBSD: vm_machdep.c,v 1.39 2002/07/25 23:46:47 matt Exp $     */
 
 /*
  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -226,8 +226,10 @@
                ci->ci_fpuproc = NULL;
 #endif
 #ifdef ALTIVEC
-       if (pcb->pcb_veccpu)                    /* release the AltiVEC */
+       if (pcb->pcb_veccpu) {                  /* release the AltiVEC */
                ci->ci_vecproc = NULL;
+               __asm __volatile("dssall;sync"); /* stop any streams */
+       }
        if (pcb->pcb_vr != NULL)
                pool_put(&vecpool, pcb->pcb_vr);
 #endif



Home | Main Index | Thread Index | Old Index