Messages in this thread Patch in this message | | | From | Ammar Faizi <> | Subject | [PATCH v1 1/1] tools/nolibc: i386: Fix a stack misalign bug on _start | Date | Sat, 26 Aug 2023 21:16:32 +0700 |
| |
The ABI mandates that the %esp register must be a multiple of 16 when executing a call instruction.
Commit 2ab446336b17 simplified the _start function, but it didn't take care of the %esp alignment, causing SIGSEGV on SSE and AVX programs that use aligned move instruction (e.g., movdqa, movaps, and vmovdqa).
Ensure the %esp is a multiple of 16 when executing the call instruction.
Cc: Zhangjin Wu <falcon@tinylab.org> Fixes: 2ab446336b17aad362c6decee29b4efd83a01979 ("tools/nolibc: i386: shrink _start with _start_c") Reported-by: Nicholas Rosenberg <inori@vnlx.org> Signed-off-by: Ammar Faizi <ammarfaizi2@gnuweeb.org> --- tools/include/nolibc/arch-i386.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/tools/include/nolibc/arch-i386.h b/tools/include/nolibc/arch-i386.h index 64415b9fac77f996..4edf238eeac67aa2 100644 --- a/tools/include/nolibc/arch-i386.h +++ b/tools/include/nolibc/arch-i386.h @@ -167,7 +167,8 @@ void __attribute__((weak, noreturn, optimize("Os", "omit-frame-pointer"))) __no_ __asm__ volatile ( "xor %ebp, %ebp\n" /* zero the stack frame */ "mov %esp, %eax\n" /* save stack pointer to %eax, as arg1 of _start_c */ - "and $-16, %esp\n" /* last pushed argument must be 16-byte aligned */ + "and $-16, %esp\n" /* align stack to 16 bytes */ + "sub $12, %esp\n" /* last pushed argument must be 16-byte aligned */ "push %eax\n" /* push arg1 on stack to support plain stack modes too */ "call _start_c\n" /* transfer to c runtime */ "hlt\n" /* ensure it does not return */ -- Ammar Faizi
| |