Provide VSX context in ucontext(3) API.

This commit is contained in:
nwhitehorn 2015-03-12 21:15:38 +00:00
parent e3e7e80678
commit 0891b7923f
2 changed files with 14 additions and 6 deletions

View File

@ -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

View File

@ -393,12 +393,17 @@ grab_mcontext(struct thread *td, mcontext_t *mcp, int flags)
}
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, mcontext_t *mcp, int flags)
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_t *mcp)
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_t *mcp)
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, mcontext32_t *mcp, int flags)
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, mcontext32_t *mcp)
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);