diff options
author | kib <kib@FreeBSD.org> | 2010-06-23 12:17:13 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2010-06-23 12:17:13 +0000 |
commit | 8177c022b541dfd7ea50a10fd33d22a04a4ce48d (patch) | |
tree | 6bc3fddcdeece5835325f8c43230cbe8de496e0f | |
parent | ddd061d954434ea8b04da914c0e1b724d6e8b8c1 (diff) | |
download | FreeBSD-src-8177c022b541dfd7ea50a10fd33d22a04a4ce48d.zip FreeBSD-src-8177c022b541dfd7ea50a10fd33d22a04a4ce48d.tar.gz |
Fix bugs on pc98, use npxgetuserregs() instead of npxgetregs() for
get_fpcontext(), and npxsetuserregs() for set_fpcontext). Also,
note that usercontext is not initialized anymore in fpstate_drop().
Systematically replace references to npxgetregs() and npxsetregs()
by npxgetuserregs() and npxsetuserregs() in comments.
Noted by: bde
-rw-r--r-- | sys/amd64/amd64/machdep.c | 4 | ||||
-rw-r--r-- | sys/i386/i386/machdep.c | 12 | ||||
-rw-r--r-- | sys/pc98/pc98/machdep.c | 19 |
3 files changed, 14 insertions, 21 deletions
diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c index 0cfdfc8..c25b827 100644 --- a/sys/amd64/amd64/machdep.c +++ b/sys/amd64/amd64/machdep.c @@ -2123,10 +2123,10 @@ fpstate_drop(struct thread *td) * XXX force a full drop of the fpu. The above only drops it if we * owned it. * - * XXX I don't much like fpugetregs()'s semantics of doing a full + * XXX I don't much like fpugetuserregs()'s semantics of doing a full * drop. Dropping only to the pcb matches fnsave's behaviour. * We only need to drop to !PCB_INITDONE in sendsig(). But - * sendsig() is the only caller of fpugetregs()... perhaps we just + * sendsig() is the only caller of fpugetuserregs()... perhaps we just * have too many layers. */ curthread->td_pcb->pcb_flags &= ~(PCB_FPUINITDONE | diff --git a/sys/i386/i386/machdep.c b/sys/i386/i386/machdep.c index 67d9c47..d2c75fb 100644 --- a/sys/i386/i386/machdep.c +++ b/sys/i386/i386/machdep.c @@ -3319,7 +3319,7 @@ get_fpcontext(struct thread *td, mcontext_t *mcp) * * XXX unpessimize most cases by only aligning when fxsave might be * called, although this requires knowing too much about - * npxgetregs()'s internals. + * npxgetuserregs()'s internals. */ addr = (union savefpu *)&mcp->mc_fpstate; if (td == PCPU_GET(fpcurthread) && @@ -3372,10 +3372,6 @@ set_fpcontext(struct thread *td, const mcontext_t *mcp) if (cpu_fxsr) addr->sv_xmm.sv_env.en_mxcsr &= cpu_mxcsr_mask; #endif - /* - * XXX we violate the dubious requirement that npxsetregs() - * be called with interrupts disabled. - */ npxsetuserregs(td, addr); #endif /* @@ -3400,12 +3396,12 @@ fpstate_drop(struct thread *td) #endif /* * XXX force a full drop of the npx. The above only drops it if we - * owned it. npxgetregs() has the same bug in the !cpu_fxsr case. + * owned it. npxgetuserregs() has the same bug in the !cpu_fxsr case. * - * XXX I don't much like npxgetregs()'s semantics of doing a full + * XXX I don't much like npxgetuserregs()'s semantics of doing a full * drop. Dropping only to the pcb matches fnsave's behaviour. * We only need to drop to !PCB_INITDONE in sendsig(). But - * sendsig() is the only caller of npxgetregs()... perhaps we just + * sendsig() is the only caller of npxgetuserregs()... perhaps we just * have too many layers. */ curthread->td_pcb->pcb_flags &= ~(PCB_NPXINITDONE | diff --git a/sys/pc98/pc98/machdep.c b/sys/pc98/pc98/machdep.c index 28f3be4..5d27e7a 100644 --- a/sys/pc98/pc98/machdep.c +++ b/sys/pc98/pc98/machdep.c @@ -2647,7 +2647,7 @@ get_fpcontext(struct thread *td, mcontext_t *mcp) * * XXX unpessimize most cases by only aligning when fxsave might be * called, although this requires knowing too much about - * npxgetregs()'s internals. + * npxgetuserregs()'s internals. */ addr = (union savefpu *)&mcp->mc_fpstate; if (td == PCPU_GET(fpcurthread) && @@ -2659,7 +2659,7 @@ get_fpcontext(struct thread *td, mcontext_t *mcp) addr = (void *)((char *)addr + 4); while ((uintptr_t)(void *)addr & 0xF); } - mcp->mc_ownedfp = npxgetregs(td, addr); + mcp->mc_ownedfp = npxgetuserregs(td, addr); if (addr != (union savefpu *)&mcp->mc_fpstate) { bcopy(addr, &mcp->mc_fpstate, sizeof(mcp->mc_fpstate)); bzero(&mcp->mc_spare2, sizeof(mcp->mc_spare2)); @@ -2700,11 +2700,7 @@ set_fpcontext(struct thread *td, const mcontext_t *mcp) if (cpu_fxsr) addr->sv_xmm.sv_env.en_mxcsr &= cpu_mxcsr_mask; #endif - /* - * XXX we violate the dubious requirement that npxsetregs() - * be called with interrupts disabled. - */ - npxsetregs(td, addr); + npxsetuserregs(td, addr); #endif /* * Don't bother putting things back where they were in the @@ -2727,15 +2723,16 @@ fpstate_drop(struct thread *td) #endif /* * XXX force a full drop of the npx. The above only drops it if we - * owned it. npxgetregs() has the same bug in the !cpu_fxsr case. + * owned it. npxusergetregs() has the same bug in the !cpu_fxsr case. * - * XXX I don't much like npxgetregs()'s semantics of doing a full + * XXX I don't much like npxgetuserregs()'s semantics of doing a full * drop. Dropping only to the pcb matches fnsave's behaviour. * We only need to drop to !PCB_INITDONE in sendsig(). But - * sendsig() is the only caller of npxgetregs()... perhaps we just + * sendsig() is the only caller of npxgetuserregs()... perhaps we just * have too many layers. */ - curthread->td_pcb->pcb_flags &= ~PCB_NPXINITDONE; + curthread->td_pcb->pcb_flags &= ~(PCB_NPXINITDONE | + PCB_NPXUSERINITDONE); critical_exit(); } |