Only mess with VFP state on the CPU for curthread for get/set_vfpcontext.

Future changes will use these functions to fetch and store VFP state for
threads other than curthread.

Reviewed by:	andrew, stevek, Michal Meloun <meloun-miracle-cz>
MFC after:	1 month
Differential Revision:	https://reviews.freebsd.org/D12292
This commit is contained in:
John Baldwin 2017-09-14 14:36:56 +00:00
parent 19e1bd0104
commit 21994598e4
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=323581

View File

@ -408,17 +408,18 @@ exec_setregs(struct thread *td, struct image_params *imgp, u_long stack)
static void
get_vfpcontext(struct thread *td, mcontext_vfp_t *vfp)
{
struct pcb *curpcb;
struct pcb *pcb;
curpcb = curthread->td_pcb;
critical_enter();
vfp_store(&curpcb->pcb_vfpstate, false);
memcpy(vfp->mcv_reg, curpcb->pcb_vfpstate.reg,
pcb = td->td_pcb;
if (td == curthread) {
critical_enter();
vfp_store(&pcb->pcb_vfpstate, false);
critical_exit();
} else
MPASS(TD_IS_SUSPENDED(td));
memcpy(vfp->mcv_reg, pcb->pcb_vfpstate.reg,
sizeof(vfp->mcv_reg));
vfp->mcv_fpscr = curpcb->pcb_vfpstate.fpscr;
critical_exit();
vfp->mcv_fpscr = pcb->pcb_vfpstate.fpscr;
}
/*
@ -427,17 +428,18 @@ get_vfpcontext(struct thread *td, mcontext_vfp_t *vfp)
static void
set_vfpcontext(struct thread *td, mcontext_vfp_t *vfp)
{
struct pcb *curpcb;
struct pcb *pcb;
curpcb = curthread->td_pcb;
critical_enter();
vfp_discard(td);
memcpy(curpcb->pcb_vfpstate.reg, vfp->mcv_reg,
sizeof(curpcb->pcb_vfpstate.reg));
curpcb->pcb_vfpstate.fpscr = vfp->mcv_fpscr;
critical_exit();
pcb = td->td_pcb;
if (td == curthread) {
critical_enter();
vfp_discard(td);
critical_exit();
} else
MPASS(TD_IS_SUSPENDED(td));
memcpy(pcb->pcb_vfpstate.reg, vfp->mcv_reg,
sizeof(pcb->pcb_vfpstate.reg));
pcb->pcb_vfpstate.fpscr = vfp->mcv_fpscr;
}
#endif