svn commit: r279937 - in head/sys/powerpc: include powerpc

Nathan Whitehorn nwhitehorn at FreeBSD.org
Thu Mar 12 21:15:40 UTC 2015


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


More information about the svn-src-head mailing list