From bd563f0b3c00fd09a3f8234e7cc55fa3fc4485e0 Mon Sep 17 00:00:00 2001 From: Sahan Fernando Date: Sun, 2 May 2021 03:22:00 +1000 Subject: Kernel: Make processes start with a 16-byte-aligned stack --- Kernel/Syscalls/execve.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'Kernel/Syscalls/execve.cpp') diff --git a/Kernel/Syscalls/execve.cpp b/Kernel/Syscalls/execve.cpp index a3658e52b0..4aba395cf7 100644 --- a/Kernel/Syscalls/execve.cpp +++ b/Kernel/Syscalls/execve.cpp @@ -131,12 +131,18 @@ static KResultOr make_userspace_stack_for_main_thread(Region& region, V // NOTE: The stack needs to be 16-byte aligned. new_esp -= new_esp % 16; + // GCC assumes that the return address has been pushed to the stack when it enters the function, + // so we need to reserve an extra pointer's worth of bytes below this to make GCC's stack alignment + // calculations work + new_esp -= sizeof(void*); push_on_new_stack((FlatPtr)envp); push_on_new_stack((FlatPtr)argv); push_on_new_stack((FlatPtr)argv_entries.size()); push_on_new_stack(0); + VERIFY((new_esp + sizeof(void*)) % 16 == 0); + return new_esp; } -- cgit v1.2.3