Author: nwhitehorn
Date: Thu Mar 12 21:15:38 2015
New Revision: 279937
URL: https://svnweb.freebsd.org/changeset/base/279937

Log:
  Provide VSX context in ucontext(3) API.

Modified:
  head/sys/powerpc/include/ucontext.h
  head/sys/powerpc/powerpc/exec_machdep.c

Modified: head/sys/powerpc/include/ucontext.h
==============================================================================
--- head/sys/powerpc/include/ucontext.h Thu Mar 12 20:14:48 2015        
(r279936)
+++ head/sys/powerpc/include/ucontext.h Thu Mar 12 21:15:38 2015        
(r279937)
@@ -46,6 +46,7 @@ typedef struct __mcontext {
        uint32_t        mc_av[2];
        register_t      mc_frame[42];
        uint64_t        mc_fpreg[33];
+       uint64_t        mc_vsxfpreg[32];        /* low-order half of VSR0-31 */
 } mcontext_t __aligned(16);
 
 #if defined(_KERNEL) && defined(__powerpc64__)
@@ -60,6 +61,7 @@ typedef struct __mcontext32 {
        uint32_t        mc_av[2];
        uint32_t        mc_frame[42];
        uint64_t        mc_fpreg[33];
+       uint64_t        mc_vsxfpreg[32];        /* low-order half of VSR0-31 */
 } mcontext32_t __aligned(16);
 #endif
 

Modified: head/sys/powerpc/powerpc/exec_machdep.c
==============================================================================
--- head/sys/powerpc/powerpc/exec_machdep.c     Thu Mar 12 20:14:48 2015        
(r279936)
+++ head/sys/powerpc/powerpc/exec_machdep.c     Thu Mar 12 21:15:38 2015        
(r279937)
@@ -393,12 +393,17 @@ grab_mcontext(struct thread *td, mcontex
                }
                mcp->mc_flags |= _MC_FP_VALID;
                memcpy(&mcp->mc_fpscr, &pcb->pcb_fpu.fpscr, sizeof(double));
-               memcpy(mcp->mc_fpreg, pcb->pcb_fpu.fpr, 32*sizeof(double));
                for (i = 0; i < 32; i++)
                        memcpy(&mcp->mc_fpreg[i], &pcb->pcb_fpu.fpr[i].fpr,
                            sizeof(double));
        }
 
+       if (pcb->pcb_flags & PCB_VSX) {
+               for (i = 0; i < 32; i++)
+                       memcpy(&mcp->mc_vsxfpreg[i],
+                           &pcb->pcb_fpu.fpr[i].vsr[2], sizeof(double));
+       }
+
        /*
         * Repeat for Altivec context
         */
@@ -415,8 +420,6 @@ grab_mcontext(struct thread *td, mcontex
                memcpy(mcp->mc_avec, pcb->pcb_vec.vr, sizeof(mcp->mc_avec));
        }
 
-       /* XXX VSX context */
-
        mcp->mc_len = sizeof(*mcp);
 
        return (0);
@@ -474,9 +477,12 @@ set_mcontext(struct thread *td, mcontext
                pcb->pcb_flags |= PCB_FPREGS;
                memcpy(&pcb->pcb_fpu.fpscr, &mcp->mc_fpscr, sizeof(double));
                bzero(pcb->pcb_fpu.fpr, sizeof(pcb->pcb_fpu.fpr));
-               for (i = 0; i < 32; i++)
+               for (i = 0; i < 32; i++) {
                        memcpy(&pcb->pcb_fpu.fpr[i].fpr, &mcp->mc_fpreg[i],
                            sizeof(double));
+                       memcpy(&pcb->pcb_fpu.fpr[i].vsr[2],
+                           &mcp->mc_vsxfpreg[i], sizeof(double));
+               }
        }
 
        if (mcp->mc_flags & _MC_AV_VALID) {
@@ -490,8 +496,6 @@ set_mcontext(struct thread *td, mcontext
                memcpy(pcb->pcb_vec.vr, mcp->mc_avec, sizeof(mcp->mc_avec));
        }
 
-       /* XXX VSX context */
-
        return (0);
 }
 
@@ -721,6 +725,7 @@ grab_mcontext32(struct thread *td, mcont
        for (i = 0; i < 42; i++)
                mcp->mc_frame[i] = mcp64.mc_frame[i];
        memcpy(mcp->mc_fpreg,mcp64.mc_fpreg,sizeof(mcp64.mc_fpreg));
+       memcpy(mcp->mc_vsxfpreg,mcp64.mc_vsxfpreg,sizeof(mcp64.mc_vsxfpreg));
 
        return (0);
 }
@@ -756,6 +761,7 @@ set_mcontext32(struct thread *td, mconte
                mcp64.mc_frame[i] = mcp->mc_frame[i];
        mcp64.mc_srr1 |= (td->td_frame->srr1 & 0xFFFFFFFF00000000ULL);
        memcpy(mcp64.mc_fpreg,mcp->mc_fpreg,sizeof(mcp64.mc_fpreg));
+       memcpy(mcp64.mc_vsxfpreg,mcp->mc_vsxfpreg,sizeof(mcp64.mc_vsxfpreg));
 
        error = set_mcontext(td, &mcp64);
 
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to