Switch x86 begin.c to asm; align ESP correctly

Every other architecture already uses an assembly file here.

The previous code aligned ESP incorrectly, but it doesn't really matter
because everything is built with Clang's -mstackrealign, which realigns
ESP in every function prologue.

Bug: http://b/73140672#comment4
Test: lunch aosp_x86-eng; m; emulator; device boots
Test: manual
Change-Id: I921fd7848cdc611b4f8f13d1176d1983ffea952d
This commit is contained in:
Ryan Prichard 2018-02-12 19:59:46 -08:00
parent 919dd9dcb4
commit f857d59635
2 changed files with 12 additions and 24 deletions

View File

@ -104,9 +104,7 @@ cc_binary {
version_script: "linker.generic.map",
},
x86: {
srcs: ["arch/x86/begin.c"],
cflags: ["-D__work_around_b_24465209__"],
srcs: ["arch/x86/begin.S"],
version_script: "linker.generic.map",
},
x86_64: {

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2012 The Android Open Source Project
* Copyright (C) 2018 The Android Open Source Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -26,28 +26,18 @@
* SUCH DAMAGE.
*/
#include <stdint.h>
#include <sys/cdefs.h>
#include <private/bionic_asm.h>
extern unsigned __linker_init(void* raw_args);
__LIBC_HIDDEN__ void _start() {
ENTRY(_start)
// Force unwinds to end in this function.
asm volatile(".cfi_undefined \%eip");
.cfi_undefined %eip
void (*start)(void);
void* raw_args = (void*) ((uintptr_t) __builtin_frame_address(0) + sizeof(void*));
start = (void(*)(void))__linker_init(raw_args);
movl %esp, %eax // %esp is aligned to 16 here.
subl $12, %esp
pushl %eax
call __linker_init // %esp is aligned to 16 before the call.
addl $16, %esp
/* linker init returns (%eax) the _entry address in the main image */
/* entry point expects sp to point to raw_args */
__asm__ (
"mov %0, %%esp\n\t"
"jmp *%1\n\t"
: : "r"(raw_args), "r"(start) :
);
/* Unreachable */
}
jmp *%eax
END(_start)