From 51bd20d93a1d61f52bb29e19256e2401a633134b Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Mon, 3 Dec 2007 04:57:30 +0000 Subject: [PATCH] [BZ #5435] * sysdeps/unix/sysv/linux/i386/makecontext.S: Align stack. --- ChangeLog | 3 +++ sysdeps/unix/sysv/linux/i386/makecontext.S | 16 +++++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 49f0179..4f1b198 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2007-12-03 Ulrich Drepper + [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 12ba4e2..89be117 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 -- 2.7.4