Fix 16-byte stack alignment requirement for x86_64 ABI

Change-Id: I43304803ac54c8688c61688bd96c7160614172d4
Signed-off-by: Pavel Chupin <pavel.v.chupin@intel.com>
This commit is contained in:
Pavel Chupin 2013-10-21 20:20:53 +04:00 committed by Elliott Hughes
parent f4ac8ba566
commit 33a209e575
2 changed files with 9 additions and 4 deletions

View File

@ -50,6 +50,10 @@ void _start() {
array.fini_array = &__FINI_ARRAY__;
void* raw_args = (void*) ((uintptr_t) __builtin_frame_address(0) + sizeof(void*));
#ifdef __x86_64__
// 16-byte stack alignment is required by x86_64 ABI
asm("andq $~15, %rsp");
#endif
__libc_init(raw_args, NULL, &main, &array);
}

View File

@ -59,10 +59,11 @@ ENTRY(__pthread_clone)
# We're in the child now, so call __thread_entry
# with the arguments from the child stack moved into
# the appropriate registers.
popq %rdi # fn
popq %rsi # arg
popq %rdx # tls
# the appropriate registers. We avoid pop here to keep
# the required 16-byte stack alignment.
movq (%rsp), %rdi # fn
movq 8(%rsp), %rsi # arg
movq 16(%rsp), %rdx # tls
call __thread_entry
hlt
2: