summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2007-12-03 04:57:30 +0000
committerUlrich Drepper <drepper@redhat.com>2007-12-03 04:57:30 +0000
commit51bd20d93a1d61f52bb29e19256e2401a633134b (patch)
tree71204e38910cf3413d6c1d508f261fc7a73b286a
parentd90d025691b584812ecaf216be6fbf17c7f0a0a3 (diff)
[BZ #5435]
* sysdeps/unix/sysv/linux/i386/makecontext.S: Align stack.
-rw-r--r--ChangeLog3
-rw-r--r--sysdeps/unix/sysv/linux/i386/makecontext.S16
2 files changed, 14 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 49f0179327..4f1b198a60 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
2007-12-03 Ulrich Drepper <drepper@redhat.com>
+ [BZ #5435]
+ * sysdeps/unix/sysv/linux/i386/makecontext.S: Align stack.
+
* stdlib/tst-setcontext.c: Catch the case where the links gets
messed up and we do not reach main again.
diff --git a/sysdeps/unix/sysv/linux/i386/makecontext.S b/sysdeps/unix/sysv/linux/i386/makecontext.S
index 12ba4e2d67..89be1176f7 100644
--- a/sysdeps/unix/sysv/linux/i386/makecontext.S
+++ b/sysdeps/unix/sysv/linux/i386/makecontext.S
@@ -35,11 +35,6 @@ ENTRY(__makecontext)
movl %ecx, oEIP(%eax)
addl oSS_SIZE(%eax), %edx
- /* Put the next context on the new stack (from the uc_link
- element). */
- movl oLINK(%eax), %ecx
- movl %ecx, -4(%edx)
-
/* Remember the number of parameters for the exit handler since
it has to remove them. We store the number in the EBX register
which the function we will call must preserve. */
@@ -50,9 +45,20 @@ ENTRY(__makecontext)
negl %ecx
leal -8(%edx,%ecx,4), %edx
negl %ecx
+
+ /* Align the stack. */
+ addl $16, %edx
+ andl $0xfffffff0, %edx
+ subl $4, %edx
+
/* Store the future stack pointer. */
movl %edx, oESP(%eax)
+ /* Put the next context on the new stack (from the uc_link
+ element). */
+ movl oLINK(%eax), %eax
+ movl %eax, 4(%edx,%ecx,4)
+
/* Copy all the parameters. */
jecxz 2f
1: movl 12(%esp,%ecx,4), %eax