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