ladybird/Userland/Libraries/LibELF/Arch/i386/entry.S
Gunnar Beutner 06883ed8a3 Kernel+Userland: Make the stack alignment comply with the System V ABI
The System V ABI for both x86 and x86_64 requires that the stack pointer
is 16-byte aligned on entry. Previously we did not align the stack
pointer properly.

As far as "main" was concerned the stack alignment was correct even
without this patch due to how the C++ _start function and the kernel
interacted, i.e. the kernel misaligned the stack as far as the ABI
was concerned but that misalignment (read: it was properly aligned for
a regular function call - but misaligned in terms of what the ABI
dictates) was actually expected by our _start function.
2021-07-10 01:41:57 +02:00

28 lines
765 B
ArmAsm

/*
* Copyright (c) 2021, Gunnar Beutner <gbeutner@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
.align 4
.globl _invoke_entry
.hidden _invoke_entry
.type _invoke_entry,@function
_invoke_entry: # (argc, argv, envp, entry)
addl $4, %esp # return address
popl %edi # argc
popl %esi # argv
popl %edx # envp
popl %ecx # entry
// The System V ABI for x86 and x86_64 prescribes that the stack pointer is 16-byte aligned
andl $~15, %esp
// We're going to push three arguments so we need to align the stack for that
subl $4, %esp
// FIXME: The way we're setting up the stack and passing arguments to the entry point isn't ABI-compliant
pushl %edx
pushl %esi
pushl %edi
jmp *%ecx