Index: include/fpu.h =================================================================== RCS file: /cvsroot/src/sys/arch/powerpc/include/fpu.h,v retrieving revision 1.19 diff -p -u -r1.19 fpu.h --- include/fpu.h 19 May 2011 08:22:38 -0000 1.19 +++ include/fpu.h 13 Jun 2011 00:05:39 -0000 @@ -77,6 +77,7 @@ #include struct lwp; +bool fpu_dirty_p(struct lwp *); bool fpu_used_p(struct lwp *); void fpu_mark_used(struct lwp *); Index: include/proc.h =================================================================== RCS file: /cvsroot/src/sys/arch/powerpc/include/proc.h,v retrieving revision 1.12 diff -p -u -r1.12 proc.h --- include/proc.h 5 Jun 2011 16:52:25 -0000 1.12 +++ include/proc.h 13 Jun 2011 00:05:39 -0000 @@ -44,6 +44,7 @@ struct mdlwp { }; #define MDLWP_USEDFPU __BIT(PCU_FPU) /* this thread has used the FPU */ #define MDLWP_USEDVEC __BIT(PCU_VEC) /* this thread has used the VEC */ +#define MDLWP_DIRTYFPU __BIT(4) /* XXX thread is dirty on fpu */ struct trapframe; Index: powerpc/fpu.c =================================================================== RCS file: /cvsroot/src/sys/arch/powerpc/powerpc/fpu.c,v retrieving revision 1.31 diff -p -u -r1.31 fpu.c --- powerpc/fpu.c 7 Jun 2011 01:01:43 -0000 1.31 +++ powerpc/fpu.c 13 Jun 2011 00:05:39 -0000 @@ -63,6 +63,12 @@ const pcu_ops_t fpu_ops = { }; bool +fpu_dirty_p(lwp_t *l) +{ + return (l->l_md.md_flags & MDLWP_DIRTYFPU) != 0; +} + +bool fpu_used_p(lwp_t *l) { return (l->l_md.md_flags & MDLWP_USEDFPU) != 0; @@ -97,7 +103,7 @@ fpu_state_load(lwp_t *l, bool used) curcpu()->ci_ev_fpusw.ev_count++; l->l_md.md_utf->tf_srr1 |= PSL_FP|(pcb->pcb_flags & (PCB_FE0|PCB_FE1)); - l->l_md.md_flags |= MDLWP_USEDFPU; + l->l_md.md_flags |= MDLWP_USEDFPU | MDLWP_DIRTYFPU; } /* @@ -117,12 +123,15 @@ fpu_state_save(lwp_t *l) mtmsr(msr); __asm volatile ("isync"); + + l->l_md.md_flags &= ~MDLWP_DIRTYFPU; } void fpu_state_release(lwp_t *l) { l->l_md.md_utf->tf_srr1 &= ~PSL_FP; + l->l_md.md_flags &= ~MDLWP_DIRTYFPU; } #define STICKYBITS (FPSCR_VX|FPSCR_OX|FPSCR_UX|FPSCR_ZX|FPSCR_XX) Index: powerpc/process_machdep.c =================================================================== RCS file: /cvsroot/src/sys/arch/powerpc/powerpc/process_machdep.c,v retrieving revision 1.32 diff -p -u -r1.32 process_machdep.c --- powerpc/process_machdep.c 12 Jun 2011 20:38:10 -0000 1.32 +++ powerpc/process_machdep.c 13 Jun 2011 00:05:39 -0000 @@ -89,9 +89,11 @@ process_read_fpregs(struct lwp *l, struc memset(fpregs, 0, sizeof (*fpregs)); #ifdef PPC_HAVE_FPU } else { - KASSERTMSG(l == curlwp, - ("%s: l (%p) != curlwp (%p)", __func__, l, curlwp)); - fpu_save(); + if (fpu_dirty_p(l)) { + KASSERTMSG(l == curlwp, + ("%s: l (%p) != curlwp (%p)", __func__, l, curlwp)); + fpu_save(); + } #endif } *fpregs = pcb->pcb_fpu;