summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/dcrt0.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/dcrt0.cc')
-rw-r--r--winsup/cygwin/dcrt0.cc10
1 files changed, 6 insertions, 4 deletions
diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc
index c88d43d23..dd5731a3e 100644
--- a/winsup/cygwin/dcrt0.cc
+++ b/winsup/cygwin/dcrt0.cc
@@ -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;
}