===================================================================
@@ -298,6 +298,10 @@ __generic_morestack (size_t *pframe_size
size_t frame_size = *pframe_size;
struct stack_segment *current;
struct stack_segment **pp;
+ char *from;
+ char *to;
+ void *ret;
+ size_t i;
current = __morestack_current_segment;
@@ -318,13 +322,21 @@ __generic_morestack (size_t *pframe_size
#ifdef STACK_GROWS_DOWNWARD
{
char *bottom = (char *) (current + 1) + current->size;
- __builtin_memcpy (bottom - param_size, old_stack, param_size);
- return bottom - param_size;
+ to = bottom - param_size;
+ ret = bottom - param_size;
}
#else
- __builtin_memcpy (current + 1, old_stack, param_size);
- return (char *) (current + 1) + param_size;
+ to = current + 1;
+ ret = (char *) (current + 1) + param_size;
#endif
+
+ /* We don't call memcpy to avoid worrying about the dynamic linker
+ trying to resolve it. */
+ from = (char *) old_stack;
+ for (i = 0; i < param_size; i++)
+ *to++ = *from++;
+
+ return ret;
}
/* This function is called by a processor specific function when it is
@@ -394,9 +406,9 @@ __generic_findstack (void *stack)
}
/* This function is called at program startup time to make sure that
- mmap and munmap are resolved if linking dynamically. We want to
- resolve them while we have enough stack for them, rather than
- calling into the dynamic linker while low on stack space. */
+ mmap, munmap, and getpagesize are resolved if linking dynamically.
+ We want to resolve them while we have enough stack for them, rather
+ than calling into the dynamic linker while low on stack space. */
void
__morestack_load_mmap (void)
@@ -405,7 +417,7 @@ __morestack_load_mmap (void)
fails. Pass __MORESTACK_CURRENT_SEGMENT to make sure that any
TLS accessor function is resolved. */
mmap (__morestack_current_segment, 0, PROT_READ, MAP_ANONYMOUS, -1, 0);
- munmap (0, 0);
+ munmap (0, getpagesize ());
}
#endif /* !defined (inhibit_libc) */
===================================================================
@@ -76,6 +76,15 @@
# __morestack to call __morestack_non_split instead. We just bump the
# requested stack space by 16K.
+# The amount of extra space we ask for. In general this has to be
+# enough for the dynamic loader to find a symbol.
+
+#ifndef __x86_64__
+#define BACKOFF (512)
+#else
+#define BACKOFF (1024)
+#endif
+
.global __morestack_non_split
#ifdef __ELF__
@@ -147,7 +156,7 @@ __morestack:
pushl 12(%ebp) # The size of the parameters.
leal 20(%ebp),%eax # Address of caller's parameters.
pushl %eax
- addl $512,8(%ebp) # Ask for backoff bytes.
+ addl $BACKOFF,8(%ebp) # Ask for backoff bytes.
leal 8(%ebp),%eax # The address of the new frame size.
pushl %eax
@@ -158,7 +167,7 @@ __morestack:
movl %eax,%esp # Switch to the new stack.
subl 8(%ebp),%eax # The end of the stack space.
- addl $512,%eax # Back off 512 bytes.
+ addl $BACKOFF,%eax # Back off 512 bytes.
# FIXME: The offset must match
# TARGET_THREAD_SPLIT_STACK_OFFSET in
@@ -197,7 +206,7 @@ __morestack:
call __generic_releasestack
subl 4(%esp),%eax # Subtract available space.
- addl $512,%eax # Back off 512 bytes.
+ addl $BACKOFF,%eax # Back off 512 bytes.
.LEHE0:
movl %eax,%gs:0x30 # Save the new stack boundary.
@@ -226,7 +235,7 @@ __morestack:
call __generic_findstack
movl %ebp,%ecx # Get the stack pointer.
subl %eax,%ecx # Subtract available space.
- addl $512,%ecx # Back off 512 bytes.
+ addl $BACKOFF,%ecx # Back off 512 bytes.
movl %ecx,%gs:0x30 # Save new stack boundary.
movl 4(%esp),%eax # Function argument.
movl %eax,(%esp)
@@ -258,7 +267,7 @@ __morestack:
# In 64-bit mode the new stack frame size is passed in r10
# and the argument size is passed in r11.
- addq $512,%r10 # Ask for backoff bytes.
+ addq $BACKOFF,%r10 # Ask for backoff bytes.
pushq %r10 # Save new frame size.
# In 64-bit mode the registers %rdi, %rsi, %rdx, %rcx, %r8,
@@ -291,7 +300,7 @@ __morestack:
popq %r10 # Reload modified frame size
movq %rax,%rsp # Switch to the new stack.
subq %r10,%rax # The end of the stack space.
- addq $512,%rax # Back off 512 bytes.
+ addq $BACKOFF,%rax # Back off 1024 bytes.
# FIXME: The offset must match
# TARGET_THREAD_SPLIT_STACK_OFFSET in
@@ -321,7 +330,7 @@ __morestack:
call __generic_releasestack
subq 0(%rsp),%rax # Subtract available space.
- addq $512,%rax # Back off 512 bytes.
+ addq $BACKOFF,%rax # Back off 1024 bytes.
.LEHE0:
movq %rax,%fs:0x70 # Save the new stack boundary.
@@ -349,7 +358,7 @@ __morestack:
call __generic_findstack
movq %rbp,%rcx # Get the stack pointer.
subq %rax,%rcx # Subtract available space.
- addq $512,%rcx # Back off 512 bytes.
+ addq $BACKOFF,%rcx # Back off 1024 bytes.
movq %rcx,%fs:0x70 # Save new stack boundary.
movq (%rsp),%rdi # Restore exception data for call.
#ifdef __PIC__