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