1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-29 20:45:08 +00:00

Kernel: Add SysV stack alignment to signal trampoline

In both dispatch signal and asm_signal_trampoline we
now ensure that the stack is 16 byte aligned, as per
the System V ABI.
This commit is contained in:
Drew Stratford 2019-09-05 23:35:57 +12:00 committed by Andreas Kling
parent 81d0f96f20
commit 95fe775d81
2 changed files with 9 additions and 2 deletions

View file

@ -386,6 +386,12 @@ ShouldUnblockThread Thread::dispatch_signal(u8 signal)
u32 ret_eip = regs.eip;
u32 ret_eflags = regs.eflags;
// Align the stack to 16 bytes.
// Note that we push 56 bytes (4 * 14) on to the stack,
// so we need to account for this here.
u32 stack_alignment = (regs.esp_if_crossRing - 56) % 16;
regs.esp_if_crossRing -= stack_alignment;
push_value_on_user_stack(regs, ret_eflags);
push_value_on_user_stack(regs, ret_eip);
@ -407,7 +413,7 @@ ShouldUnblockThread Thread::dispatch_signal(u8 signal)
regs.eip = g_return_to_ring3_from_signal_trampoline.get();
// FIXME: Should we worry about the stack being 16 byte aligned when entering a signal handler?
ASSERT((regs.esp_if_crossRing % 16) == 0);
// If we're not blocking we need to update the tss so
// that the far jump in Scheduler goes to the proper location.