Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 18 Oct 2016 13:39:56 +0000 (UTC)
From:      Andrew Turner <andrew@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r307565 - in head/sys/arm64: arm64 include
Message-ID:  <201610181339.u9IDduRp001897@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: andrew
Date: Tue Oct 18 13:39:55 2016
New Revision: 307565
URL: https://svnweb.freebsd.org/changeset/base/307565

Log:
  Add PCB_FP_USERMASK so we can mask off floating point flags that should
  not be sent to userspace, for example the future flag to tell when we are
  using floating point in the kernel.
  
  Obtained from:	ABT Systems Ltd
  Sponsored by:	The FreeBSD Foundation

Modified:
  head/sys/arm64/arm64/machdep.c
  head/sys/arm64/arm64/trap.c
  head/sys/arm64/include/pcb.h

Modified: head/sys/arm64/arm64/machdep.c
==============================================================================
--- head/sys/arm64/arm64/machdep.c	Tue Oct 18 13:37:59 2016	(r307564)
+++ head/sys/arm64/arm64/machdep.c	Tue Oct 18 13:39:55 2016	(r307565)
@@ -341,6 +341,8 @@ get_fpcontext(struct thread *td, mcontex
 
 		KASSERT(curpcb->pcb_fpusaved == &curpcb->pcb_fpustate,
 		    ("Called get_fpcontext while the kernel is using the VFP"));
+		KASSERT((curpcb->pcb_fpflags & ~PCB_FP_USERMASK) == 0,
+		    ("Non-userspace FPU flags set in get_fpcontext"));
 		memcpy(mcp->mc_fpregs.fp_q, curpcb->pcb_fpustate.vfp_regs,
 		    sizeof(mcp->mc_fpregs));
 		mcp->mc_fpregs.fp_cr = curpcb->pcb_fpustate.vfp_fpcr;
@@ -376,7 +378,7 @@ set_fpcontext(struct thread *td, mcontex
 		    sizeof(mcp->mc_fpregs));
 		curpcb->pcb_fpustate.vfp_fpcr = mcp->mc_fpregs.fp_cr;
 		curpcb->pcb_fpustate.vfp_fpsr = mcp->mc_fpregs.fp_sr;
-		curpcb->pcb_fpflags = mcp->mc_fpregs.fp_flags;
+		curpcb->pcb_fpflags = mcp->mc_fpregs.fp_flags & PCB_FP_USERMASK;
 	}
 
 	critical_exit();

Modified: head/sys/arm64/arm64/trap.c
==============================================================================
--- head/sys/arm64/arm64/trap.c	Tue Oct 18 13:37:59 2016	(r307564)
+++ head/sys/arm64/arm64/trap.c	Tue Oct 18 13:39:55 2016	(r307565)
@@ -409,6 +409,9 @@ do_el0_sync(struct trapframe *frame)
 		userret(td, frame);
 		break;
 	}
+
+	KASSERT((curthread->td_pcb->pcb_fpflags & ~PCB_FP_USERMASK) == 0,
+	    ("Kernel VFP flags set while entering userspace"));
 }
 
 void

Modified: head/sys/arm64/include/pcb.h
==============================================================================
--- head/sys/arm64/include/pcb.h	Tue Oct 18 13:37:59 2016	(r307564)
+++ head/sys/arm64/include/pcb.h	Tue Oct 18 13:39:55 2016	(r307565)
@@ -54,6 +54,8 @@ struct pcb {
 	struct vfpstate	*pcb_fpusaved;
 	int		pcb_fpflags;
 #define	PCB_FP_STARTED	0x01
+/* The bits passed to userspace in get_fpcontext */
+#define	PCB_FP_USERMASK	(PCB_FP_STARTED)
 	u_int		pcb_vfpcpu;	/* Last cpu this thread ran VFP code */
 
 	/*



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201610181339.u9IDduRp001897>