Module Name: src Committed By: matt Date: Fri Aug 23 05:22:01 UTC 2013
Modified Files: src/sys/arch/arm/arm: arm_machdep.c process_machdep.c src/sys/arch/arm/arm32: sys_machdep.c vm_machdep.c src/sys/arch/arm/include: locore.h proc.h src/sys/arch/arm/vfp: vfp_init.c Log Message: Reap LWP_VFPUSED and use PCU internal tracking. Add bool vfp_used_p(void); To generate a diff of this commit: cvs rdiff -u -r1.37 -r1.38 src/sys/arch/arm/arm/arm_machdep.c cvs rdiff -u -r1.26 -r1.27 src/sys/arch/arm/arm/process_machdep.c cvs rdiff -u -r1.17 -r1.18 src/sys/arch/arm/arm32/sys_machdep.c cvs rdiff -u -r1.66 -r1.67 src/sys/arch/arm/arm32/vm_machdep.c cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/include/locore.h cvs rdiff -u -r1.13 -r1.14 src/sys/arch/arm/include/proc.h cvs rdiff -u -r1.24 -r1.25 src/sys/arch/arm/vfp/vfp_init.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/arm/arm_machdep.c diff -u src/sys/arch/arm/arm/arm_machdep.c:1.37 src/sys/arch/arm/arm/arm_machdep.c:1.38 --- src/sys/arch/arm/arm/arm_machdep.c:1.37 Sun Aug 18 06:28:18 2013 +++ src/sys/arch/arm/arm/arm_machdep.c Fri Aug 23 05:22:01 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: arm_machdep.c,v 1.37 2013/08/18 06:28:18 matt Exp $ */ +/* $NetBSD: arm_machdep.c,v 1.38 2013/08/23 05:22:01 matt Exp $ */ /* * Copyright (c) 2001 Wasabi Systems, Inc. @@ -78,7 +78,7 @@ #include <sys/param.h> -__KERNEL_RCSID(0, "$NetBSD: arm_machdep.c,v 1.37 2013/08/18 06:28:18 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: arm_machdep.c,v 1.38 2013/08/23 05:22:01 matt Exp $"); #include <sys/exec.h> #include <sys/proc.h> @@ -187,7 +187,7 @@ setregs(struct lwp *l, struct exec_packa l->l_md.md_flags |= MDLWP_NOALIGNFLT; #endif #ifdef FPU_VFP - vfp_discardcontext(); + vfp_discardcontext(false); #endif } Index: src/sys/arch/arm/arm/process_machdep.c diff -u src/sys/arch/arm/arm/process_machdep.c:1.26 src/sys/arch/arm/arm/process_machdep.c:1.27 --- src/sys/arch/arm/arm/process_machdep.c:1.26 Sun Aug 18 06:28:18 2013 +++ src/sys/arch/arm/arm/process_machdep.c Fri Aug 23 05:22:01 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: process_machdep.c,v 1.26 2013/08/18 06:28:18 matt Exp $ */ +/* $NetBSD: process_machdep.c,v 1.27 2013/08/23 05:22:01 matt Exp $ */ /* * Copyright (c) 1993 The Regents of the University of California. @@ -133,7 +133,7 @@ #include <sys/param.h> -__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.26 2013/08/18 06:28:18 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.27 2013/08/23 05:22:01 matt Exp $"); #include <sys/proc.h> #include <sys/ptrace.h> @@ -227,8 +227,7 @@ process_write_fpregs(struct lwp *l, cons return EINVAL; } struct pcb * const pcb = lwp_getpcb(l); - vfp_discardcontext(); - l->l_md.md_flags |= MDLWP_VFPUSED; + vfp_discardcontext(true); pcb->pcb_vfp = regs->fpr_vfp; pcb->pcb_vfp.vfp_fpexc &= ~VFP_FPEXC_EN; #endif Index: src/sys/arch/arm/arm32/sys_machdep.c diff -u src/sys/arch/arm/arm32/sys_machdep.c:1.17 src/sys/arch/arm/arm32/sys_machdep.c:1.18 --- src/sys/arch/arm/arm32/sys_machdep.c:1.17 Sun Aug 18 06:28:18 2013 +++ src/sys/arch/arm/arm32/sys_machdep.c Fri Aug 23 05:22:01 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_machdep.c,v 1.17 2013/08/18 06:28:18 matt Exp $ */ +/* $NetBSD: sys_machdep.c,v 1.18 2013/08/23 05:22:01 matt Exp $ */ /* * Copyright (c) 1995-1997 Mark Brinicombe. @@ -41,7 +41,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sys_machdep.c,v 1.17 2013/08/18 06:28:18 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_machdep.c,v 1.18 2013/08/23 05:22:01 matt Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -123,7 +123,7 @@ static int arm32_fpu_used(struct lwp *l, const void *uap, register_t *retval) { /* No args */ - retval[0] = (curlwp->l_md.md_flags & MDLWP_VFPUSED) != 0; + retval[0] = vfp_used_p(); return 0; } Index: src/sys/arch/arm/arm32/vm_machdep.c diff -u src/sys/arch/arm/arm32/vm_machdep.c:1.66 src/sys/arch/arm/arm32/vm_machdep.c:1.67 --- src/sys/arch/arm/arm32/vm_machdep.c:1.66 Sat May 11 07:35:58 2013 +++ src/sys/arch/arm/arm32/vm_machdep.c Fri Aug 23 05:22:01 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: vm_machdep.c,v 1.66 2013/05/11 07:35:58 skrll Exp $ */ +/* $NetBSD: vm_machdep.c,v 1.67 2013/08/23 05:22:01 matt Exp $ */ /* * Copyright (c) 1994-1998 Mark Brinicombe. @@ -44,7 +44,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.66 2013/05/11 07:35:58 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.67 2013/08/23 05:22:01 matt Exp $"); #include "opt_armfpe.h" #include "opt_pmap_debug.h" @@ -131,7 +131,6 @@ cpu_lwp_fork(struct lwp *l1, struct lwp * VFP state is valid. */ pcb2->pcb_vfp.vfp_fpexc &= ~VFP_FPEXC_EN; - l2->l_md.md_flags = l1->l_md.md_flags & MDLWP_VFPUSED; #endif /* Index: src/sys/arch/arm/include/locore.h diff -u src/sys/arch/arm/include/locore.h:1.3 src/sys/arch/arm/include/locore.h:1.4 --- src/sys/arch/arm/include/locore.h:1.3 Sun Aug 18 16:08:24 2013 +++ src/sys/arch/arm/include/locore.h Fri Aug 23 05:22:01 2013 @@ -191,10 +191,11 @@ void ucas_ras_check(trapframe_t *); /* vfp_init.c */ void vfp_attach(void); -void vfp_discardcontext(void); +void vfp_discardcontext(bool); void vfp_savecontext(void); void vfp_kernel_acquire(void); void vfp_kernel_release(void); +bool vfp_used_p(void); extern const pcu_ops_t arm_vfp_ops; #endif /* !_LOCORE */ Index: src/sys/arch/arm/include/proc.h diff -u src/sys/arch/arm/include/proc.h:1.13 src/sys/arch/arm/include/proc.h:1.14 --- src/sys/arch/arm/include/proc.h:1.13 Tue Dec 25 22:34:36 2012 +++ src/sys/arch/arm/include/proc.h Fri Aug 23 05:22:01 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: proc.h,v 1.13 2012/12/25 22:34:36 matt Exp $ */ +/* $NetBSD: proc.h,v 1.14 2013/08/23 05:22:01 matt Exp $ */ /* * Copyright (c) 1994 Mark Brinicombe. @@ -48,7 +48,6 @@ struct mdlwp { }; /* Flags setttings for md_flags */ -#define MDLWP_VFPUSED 0x00000001 /* LWP used the VFP */ #define MDLWP_NOALIGNFLT 0x00000002 /* For EXEC_AOUT */ #define MDLWP_VFPINTR 0x00000004 /* VFP used in intr */ Index: src/sys/arch/arm/vfp/vfp_init.c diff -u src/sys/arch/arm/vfp/vfp_init.c:1.24 src/sys/arch/arm/vfp/vfp_init.c:1.25 --- src/sys/arch/arm/vfp/vfp_init.c:1.24 Thu Aug 22 19:50:54 2013 +++ src/sys/arch/arm/vfp/vfp_init.c Fri Aug 23 05:22:01 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: vfp_init.c,v 1.24 2013/08/22 19:50:54 drochner Exp $ */ +/* $NetBSD: vfp_init.c,v 1.25 2013/08/23 05:22:01 matt Exp $ */ /* * Copyright (c) 2008 ARM Ltd @@ -191,8 +191,7 @@ vfp_fpscr_handler(u_int address, u_int i return 1; #endif - if (__predict_false((l->l_md.md_flags & MDLWP_VFPUSED) == 0)) { - l->l_md.md_flags |= MDLWP_VFPUSED; + if (__predict_false(!vfp_used_p())) { pcb->pcb_vfp.vfp_fpscr = (VFP_FPSCR_DN | VFP_FPSCR_FZ); /* Runfast */ } @@ -485,9 +484,8 @@ vfp_state_load(lwp_t *l, u_int flags) * If a process has used the VFP, count a "used VFP, and took * a trap to use it again" event. */ - if (__predict_false((l->l_md.md_flags & MDLWP_VFPUSED) == 0)) { + if (__predict_false((flags & PCU_LOADED) == 0)) { vfpevent_use.ev_count++; - l->l_md.md_flags |= MDLWP_VFPUSED; pcb->pcb_vfp.vfp_fpscr = /* Runfast */ (VFP_FPSCR_DN | VFP_FPSCR_FZ | VFP_FPSCR_RN); } else { @@ -599,9 +597,15 @@ vfp_savecontext(void) } void -vfp_discardcontext(void) +vfp_discardcontext(bool used_p) { - pcu_discard(&arm_vfp_ops, false); + pcu_discard(&arm_vfp_ops, used_p); +} + +bool +vfp_used_p(void) +{ + return pcu_used_p(&arm_vfp_ops); } void @@ -643,7 +647,7 @@ vfp_kernel_release(void) void vfp_getcontext(struct lwp *l, mcontext_t *mcp, int *flagsp) { - if (l->l_md.md_flags & MDLWP_VFPUSED) { + if (vfp_used_p()) { const struct pcb * const pcb = lwp_getpcb(l); pcu_save(&arm_vfp_ops); mcp->__fpu.__vfpregs.__vfp_fpscr = pcb->pcb_vfp.vfp_fpscr; @@ -658,7 +662,6 @@ vfp_setcontext(struct lwp *l, const mcon { pcu_discard(&arm_vfp_ops, true); struct pcb * const pcb = lwp_getpcb(l); - l->l_md.md_flags |= MDLWP_VFPUSED; pcb->pcb_vfp.vfp_fpscr = mcp->__fpu.__vfpregs.__vfp_fpscr; memcpy(pcb->pcb_vfp.vfp_regs, mcp->__fpu.__vfpregs.__vfp_fstmx, sizeof(mcp->__fpu.__vfpregs.__vfp_fstmx));