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));

Reply via email to