Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2005-03-03 03:49:53 +0300
committerChristopher Faylor <me@cgf.cx>2005-03-03 03:49:53 +0300
commit608b0ce960f564ab86ebe56b6ea24d063169ee8c (patch)
tree7595cd7d0b042a77db955d137af7aeff7eba862d
parent55b670024ce220b4be27a6f62849aba3204b09f0 (diff)
* autoload.cc (std_dll_init): Save and restore fpu control register around
LoadAddress to prevent loaded dlls (like msvcrt.dll) from setting unwanted stuff.
-rw-r--r--winsup/cygwin/ChangeLog6
-rw-r--r--winsup/cygwin/autoload.cc8
2 files changed, 12 insertions, 2 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 3e8218771..302fb5ef0 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,5 +1,11 @@
2005-03-02 Christopher Faylor <cgf@timesys.com>
+ * autoload.cc (std_dll_init): Save and restore fpu control register
+ around LoadAddress to prevent loaded dlls (like msvcrt.dll) from
+ setting unwanted stuff.
+
+2005-03-02 Christopher Faylor <cgf@timesys.com>
+
* cygtls.cc (_cygtls::init_thread): Move exitsock setting later. It
2005-03-02 Christopher Faylor <cgf@timesys.com>
diff --git a/winsup/cygwin/autoload.cc b/winsup/cygwin/autoload.cc
index 805b765c1..aef122a2f 100644
--- a/winsup/cygwin/autoload.cc
+++ b/winsup/cygwin/autoload.cc
@@ -208,8 +208,13 @@ std_dll_init ()
while (InterlockedIncrement (&dll->here));
else if (!dll->handle)
{
+ unsigned fpu_control = 0;
+ __asm__ __volatile__ ("fnstcw %0": "=m" (fpu_control));
if ((h = LoadLibrary (dll->name)) != NULL)
- dll->handle = h;
+ {
+ __asm__ __volatile__ ("fldcw %0": : "m" (fpu_control));
+ dll->handle = h;
+ }
else if (!(func->decoration & 1))
api_fatal ("could not load %s, %E", dll->name);
else
@@ -256,7 +261,6 @@ wsock_init ()
if (!wsock_started)
{
- /* Don't use autoload to load WSAStartup to eliminate recursion. */
int (*wsastartup) (int, WSADATA *);
wsastartup = (int (*)(int, WSADATA *))