mirror of
https://github.com/fergalmoran/ladybird.git
synced 2025-12-28 20:29:42 +00:00
The System V ABI requires that the stack is 16-byte aligned on function call. Confusingly, however, they mean that the stack must be aligned this way **before** the `CALL` instruction is executed. That instruction pushes the return value onto the stack, so the callee will actually see the stack pointer as a value `sizeof(FlatPtr)` smaller. The signal trampoline was written with this in mind, but `setup_stack` aligned the entire stack, *including the return address* to a 16-byte boundary. Because of this, the trampoline subtracted too much from the stack pointer, thus misaligning it. This was not a problem on i686 because we didn't execute any instructions from signal handlers that would require memory operands to be aligned to more than 4 bytes. This is not the case, however, on x86_64, where SSE instructions are enabled by default and they require 16-byte aligned operands. Running such instructions raised a GP fault, immediately killing the offending program with a SIGSEGV signal. This issue caused TestKernelAlarm to fail in LibC when ran locally, and at one point, the zsh port was affected too. Fixes #9291
44 KiB
44 KiB