about summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux/i386/makecontext.S
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 /sysdeps/unix/sysv/linux/i386/makecontext.S
parentd90d025691b584812ecaf216be6fbf17c7f0a0a3 (diff)
downloadglibc-51bd20d93a1d61f52bb29e19256e2401a633134b.tar.gz
glibc-51bd20d93a1d61f52bb29e19256e2401a633134b.tar.xz
glibc-51bd20d93a1d61f52bb29e19256e2401a633134b.zip
[BZ #5435]
	* sysdeps/unix/sysv/linux/i386/makecontext.S: Align stack.
Diffstat (limited to 'sysdeps/unix/sysv/linux/i386/makecontext.S')
-rw-r--r--sysdeps/unix/sysv/linux/i386/makecontext.S16
1 files changed, 11 insertions, 5 deletions
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