aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Xu <davidxu@FreeBSD.org>2006-05-29 02:58:37 +0000
committerDavid Xu <davidxu@FreeBSD.org>2006-05-29 02:58:37 +0000
commit5d84379dd634020c88d082abef1acadd42b8fcb0 (patch)
tree148fc7d55c6f53e985453277d59ea634b8595fde
parent46f1e0d36c058141cc4d12aa569f1b48d4836dc9 (diff)
downloadsrc-5d84379dd634020c88d082abef1acadd42b8fcb0.tar.gz
src-5d84379dd634020c88d082abef1acadd42b8fcb0.zip
Backout changes trying to inherit floating-point environment, although
POSIX (susv3) requires this, but it is unclear what should be inherited, duplicating whole 387 stack for new thread seems to be unnecessary and dangerous. Revert to previous code, force a new thread to be started with clean FP state.
Notes
Notes: svn path=/head/; revision=159027
-rw-r--r--sys/i386/i386/vm_machdep.c3
-rw-r--r--sys/i386/include/npx.h3
-rw-r--r--sys/i386/isa/npx.c35
3 files changed, 1 insertions, 40 deletions
diff --git a/sys/i386/i386/vm_machdep.c b/sys/i386/i386/vm_machdep.c
index f9b954b20e43..26ed735145b8 100644
--- a/sys/i386/i386/vm_machdep.c
+++ b/sys/i386/i386/vm_machdep.c
@@ -393,8 +393,7 @@ cpu_set_upcall(struct thread *td, struct thread *td0)
* more analysis) (need a good safe default).
*/
bcopy(td0->td_pcb, pcb2, sizeof(*pcb2));
- pcb2->pcb_flags &= ~PCB_NPXTRAP;
- npx_fork_thread(td0, td);
+ pcb2->pcb_flags &= ~(PCB_NPXTRAP|PCB_NPXINITDONE);
/*
* Create a new fresh stack for the new thread.
diff --git a/sys/i386/include/npx.h b/sys/i386/include/npx.h
index 792f75a40f3e..86b9af8e7151 100644
--- a/sys/i386/include/npx.h
+++ b/sys/i386/include/npx.h
@@ -138,8 +138,6 @@ union savefpu {
#ifdef _KERNEL
-struct thread;
-
#define IO_NPX 0x0F0 /* Numeric Coprocessor */
#define IO_NPXSIZE 16 /* 80387/80487 NPX registers */
@@ -157,7 +155,6 @@ void npxinit(u_short control);
void npxsave(union savefpu *addr);
void npxsetregs(struct thread *td, union savefpu *addr);
int npxtrap(void);
-void npx_fork_thread(struct thread *td, struct thread *newtd);
#endif
diff --git a/sys/i386/isa/npx.c b/sys/i386/isa/npx.c
index 129a853f20ed..bc396294c57d 100644
--- a/sys/i386/isa/npx.c
+++ b/sys/i386/isa/npx.c
@@ -942,41 +942,6 @@ npxsetregs(td, addr)
curthread->td_pcb->pcb_flags |= PCB_NPXINITDONE;
}
-/*
- * POSIX requires new thread to inherit floating-point environment.
- */
-void
-npx_fork_thread(struct thread *td, struct thread *newtd)
-{
- union savefpu *state;
- u_int32_t mxcsr;
- u_int32_t cw;
-
- if (!(td->td_pcb->pcb_flags & PCB_NPXINITDONE)) {
- newtd->td_pcb->pcb_flags &= ~PCB_NPXINITDONE;
- return;
- }
-
- state = &newtd->td_pcb->pcb_save;
- /* get control word */
- if (npxgetregs(td, state))
- return;
- if (cpu_fxsr) {
- mxcsr = state->sv_xmm.sv_env.en_mxcsr;
- cw = state->sv_xmm.sv_env.en_cw;
- } else {
- cw = state->sv_87.sv_env.en_cw;
- mxcsr = 0;
- }
- bcopy(&npx_cleanstate, state, sizeof(*state));
- if (cpu_fxsr) {
- state->sv_xmm.sv_env.en_cw = cw;
- state->sv_xmm.sv_env.en_mxcsr = mxcsr;
- } else
- state->sv_87.sv_env.en_cw = cw;
- newtd->td_pcb->pcb_flags |= PCB_NPXINITDONE;
-}
-
static void
fpusave(addr)
union savefpu *addr;