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>