diff options
author | David Schultz <das@FreeBSD.org> | 2005-02-06 17:29:20 +0000 |
---|---|---|
committer | David Schultz <das@FreeBSD.org> | 2005-02-06 17:29:20 +0000 |
commit | 2a51b9b0aa5e759bd93651f5b7d18171e04b3500 (patch) | |
tree | 6a53d6aaa2c5e606210b667b4254eb0b6ca38db2 /sys | |
parent | 1c7178ce25235ce5dbabfc76d8921c972f3e8695 (diff) | |
download | src-2a51b9b0aa5e759bd93651f5b7d18171e04b3500.tar.gz src-2a51b9b0aa5e759bd93651f5b7d18171e04b3500.zip |
When running Linux binaries, set up the initial FPU state as Linux
would.
PR: 28966
Notes
Notes:
svn path=/head/; revision=141407
Diffstat (limited to 'sys')
-rw-r--r-- | sys/i386/linux/linux_sysvec.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/sys/i386/linux/linux_sysvec.c b/sys/i386/linux/linux_sysvec.c index 859270148d90..34b4c49bc185 100644 --- a/sys/i386/linux/linux_sysvec.c +++ b/sys/i386/linux/linux_sysvec.c @@ -94,6 +94,9 @@ MALLOC_DEFINE(M_LINUX, "linux", "Linux mode structures"); #define LINUX_SYS_linux_rt_sendsig 0 #define LINUX_SYS_linux_sendsig 0 +#define fldcw(addr) __asm("fldcw %0" : : "m" (*(addr))) +#define __LINUX_NPXCW__ 0x37f + extern char linux_sigcode[]; extern int linux_szsigcode; @@ -775,12 +778,16 @@ static void exec_linux_setregs(struct thread *td, u_long entry, u_long stack, u_long ps_strings) { + static const u_short control = __LINUX_NPXCW__; struct pcb *pcb = td->td_pcb; exec_setregs(td, entry, stack, ps_strings); /* Linux sets %gs to 0, we default to _udatasel */ pcb->pcb_gs = 0; load_gs(0); + + /* Linux sets the i387 to extended precision. */ + fldcw(&control); } struct sysentvec linux_sysvec = { |