aboutsummaryrefslogtreecommitdiff
path: root/arch/i386/kernel/signal.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@starflyer.(none)>2005-10-20 18:21:33 +1000
committerDave Airlie <airlied@linux.ie>2005-10-20 18:21:33 +1000
commit312f5726055534be1dc9dd369be13aabd2943fcb (patch)
tree29394a3f83b4952a73b36a4aa962dfeda839e9db /arch/i386/kernel/signal.c
parent3d5efad953c6d5ba11d5bcb584ef8e906f953a73 (diff)
parent93918e9afc76717176e9e114e79cdbb602a45ae8 (diff)
merge Linus head tree into my drm tree and fix up conflicts
Diffstat (limited to 'arch/i386/kernel/signal.c')
-rw-r--r--arch/i386/kernel/signal.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/arch/i386/kernel/signal.c b/arch/i386/kernel/signal.c
index 61eb0c8a6e4..adcd069db91 100644
--- a/arch/i386/kernel/signal.c
+++ b/arch/i386/kernel/signal.c
@@ -338,7 +338,11 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
esp = (unsigned long) ka->sa.sa_restorer;
}
- 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;
}
/* These symbols are defined with the addresses in the vsyscall page.