OSDN Git Service

* dcrt0.cc (getstack): Try harder to modify memory.
authorcgf <cgf>
Fri, 2 Dec 2005 03:12:06 +0000 (03:12 +0000)
committercgf <cgf>
Fri, 2 Dec 2005 03:12:06 +0000 (03:12 +0000)
(alloc_stack): Alloc page prior to stack top, too.

winsup/cygwin/ChangeLog
winsup/cygwin/dcrt0.cc

index 152dbcd..f7c6b96 100644 (file)
@@ -1,5 +1,10 @@
 2005-12-01  Christopher Faylor  <cgf@timesys.com>
 
+       * dcrt0.cc (getstack): Try harder to modify memory.
+       (alloc_stack): Alloc page prior to stack top, too.
+
+2005-12-01  Christopher Faylor  <cgf@timesys.com>
+
        * devices.h (_major): Revert previous ill-advised change.
        (_minor): Ditto.
 
index c88d43d..dd5731a 100644 (file)
@@ -504,9 +504,10 @@ alloc_stack_hard_way (child_info_fork *ci, volatile char *b)
 
 void *getstack (void *) __attribute__ ((noinline));
 volatile char *
-getstack (volatile char *p)
+getstack (volatile char * volatile p)
 {
-  *p |= 0;
+  *p ^= 1;
+  *p ^= 1;
   return p - 4096;
 }
 
@@ -515,13 +516,14 @@ getstack (volatile char *p)
 static void
 alloc_stack (child_info_fork *ci)
 {
-  volatile char *esp;
+  volatile char * volatile esp;
   __asm__ volatile ("movl %%esp,%0": "=r" (esp));
   if (_tlsbase != ci->stackbottom)
     alloc_stack_hard_way (ci, esp);
   else
     {
-      while (_tlstop > ci->stacktop)
+      char *stacktop = (char *) ci->stacktop - 4096;
+      while (_tlstop >= stacktop)
        esp = getstack (esp);
       ci->stacksize = 0;
     }