Provide VSX context in ucontext(3) API.
This commit is contained in:
parent
e3e7e80678
commit
0891b7923f
@ -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
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user