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 */
 
        /*
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to