aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ia64/ia32
diff options
context:
space:
mode:
authorMarkus F.X.J. Oberhumer <markus@oberhumer.com>2007-04-23 06:00:05 -0400
committerTony Luck <tony.luck@intel.com>2007-05-08 14:22:59 -0400
commit66761522a7bca951c1214498b80260533957e3ad (patch)
tree7813ff92c8e661b9990fb2049426f76d522e6bf5 /arch/ia64/ia32
parent0e17b560985afb5190e859d5d4609237a91bb732 (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.c6
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
817static int 821static int