diff options
author | Markus F.X.J. Oberhumer <markus@oberhumer.com> | 2007-04-23 06:00:05 -0400 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2007-05-08 14:22:59 -0400 |
commit | 66761522a7bca951c1214498b80260533957e3ad (patch) | |
tree | 7813ff92c8e661b9990fb2049426f76d522e6bf5 /arch/ia64/ia32 | |
parent | 0e17b560985afb5190e859d5d4609237a91bb732 (diff) |
[IA64] fix stack alignment for ia32 signal handlers
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.
i386 and x86_64 are already fixed by d347f372273c2b3d86a66e2e1c94c790c208e166
Signed-off-by: Markus F.X.J. Oberhumer <markus@oberhumer.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'arch/ia64/ia32')
-rw-r--r-- | arch/ia64/ia32/ia32_signal.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/arch/ia64/ia32/ia32_signal.c b/arch/ia64/ia32/ia32_signal.c index b3355a9ca2c3..7b38b73e7827 100644 --- a/arch/ia64/ia32/ia32_signal.c +++ b/arch/ia64/ia32/ia32_signal.c | |||
@@ -811,7 +811,11 @@ get_sigframe (struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size) | |||
811 | } | 811 | } |
812 | /* Legacy stack switching not supported */ | 812 | /* Legacy stack switching not supported */ |
813 | 813 | ||
814 | return (void __user *)((esp - frame_size) & -8ul); | 814 | esp -= frame_size; |
815 | /* Align the stack pointer according to the i386 ABI, | ||
816 | * i.e. so that on function entry ((sp + 4) & 15) == 0. */ | ||
817 | esp = ((esp + 4) & -16ul) - 4; | ||
818 | return (void __user *) esp; | ||
815 | } | 819 | } |
816 | 820 | ||
817 | static int | 821 | static int |