[I did not get any reply after 6 weeks, so I'm cc'ing the ML] Markus F.X.J. Oberhumer wrote:
Tony,I've just realized that this patch probably should also be applied for the ia64 arch - but I cannot test it due to lack of hardware.Please seehttp://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=d347f372273c2b3d86a66e2e1c94c790c208e166for more info. Thanks, Markus ------------------------------------------------------------------------ [PATCH] i386: fix stack alignment for signal handlers (ia64) This fixes the setup of the alignment of the signal frame, so that all signal handlers are run with a properly aligned stack frame. The current code "over-aligns" the stack pointer so that the stack frame is effectively always mis-aligned by 4 bytes. But what we really want is that on function entry ((sp + 4) & 15) == 0, which matches what would happen if the stack were aligned before a "call" instruction. [ This patch fixes ia64. i386 and x86_64 are already fixed by git commit d347f372273c2b3d86a66e2e1c94c790c208e166 ] Signed-off-by: Markus F.X.J. Oberhumer <markus@xxxxxxxxxxxxx> Index: b/arch/ia64/ia32/ia32_signal.c =================================================================== --- a/arch/ia64/ia32/ia32_signal.c +++ b/arch/ia64/ia32/ia32_signal.c @@ -811,7 +811,11 @@ } /* Legacy stack switching not supported */- return (void __user *)((esp - frame_size) & -8ul);+ esp -= frame_size; + /* Align the stack pointer according to the i386 ABI, + * i.e. so that on function entry ((sp + 4) & 15) == 0. */ + esp = ((esp + 4) & -16ul) - 4; + return (void __user *) esp; }static int
-- Markus Oberhumer, <markus@xxxxxxxxxxxxx>, http://www.oberhumer.com/
[PATCH] i386: fix stack alignment for signal handlers (ia64) This fixes the setup of the alignment of the signal frame, so that all signal handlers are run with a properly aligned stack frame. The current code "over-aligns" the stack pointer so that the stack frame is effectively always mis-aligned by 4 bytes. But what we really want is that on function entry ((sp + 4) & 15) == 0, which matches what would happen if the stack were aligned before a "call" instruction. [ This patch fixes ia64. i386 and x86_64 are already fixed by git commit d347f372273c2b3d86a66e2e1c94c790c208e166 ] Signed-off-by: Markus F.X.J. Oberhumer <markus@xxxxxxxxxxxxx> Index: b/arch/ia64/ia32/ia32_signal.c =================================================================== --- a/arch/ia64/ia32/ia32_signal.c +++ b/arch/ia64/ia32/ia32_signal.c @@ -811,7 +811,11 @@ } /* Legacy stack switching not supported */ - return (void __user *)((esp - frame_size) & -8ul); + esp -= frame_size; + /* Align the stack pointer according to the i386 ABI, + * i.e. so that on function entry ((sp + 4) & 15) == 0. */ + esp = ((esp + 4) & -16ul) - 4; + return (void __user *) esp; } static int
![]() |