diff options
author | Ulrich Drepper <drepper@redhat.com> | 2003-04-05 22:03:35 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2003-04-05 22:03:35 +0000 |
commit | a5392bed0982a8e61ca5578149683572adaaf279 (patch) | |
tree | 5a3d2a39e99e03b723c612f99d104d752c2a537c /sysdeps/unix/sysv/linux | |
parent | ee6bf14d9e6fd8204ccda32ca942082ce31662d8 (diff) | |
download | glibc-a5392bed0982a8e61ca5578149683572adaaf279.tar glibc-a5392bed0982a8e61ca5578149683572adaaf279.tar.gz glibc-a5392bed0982a8e61ca5578149683572adaaf279.tar.bz2 glibc-a5392bed0982a8e61ca5578149683572adaaf279.zip |
Update.
2003-04-05 Roland McGrath <roland@redhat.com>
* sysdeps/unix/sysv/linux/i386/setcontext.S: Rewrite to avoid writing
below the stack pointer even if switching to the same context we are
running right now.
* catgets/gencat.c (read_input_file): Make sure that \n is not
alone on the line before testing for continuation.
* math/test-tgmath.c (compile_test): Initialize c.
Diffstat (limited to 'sysdeps/unix/sysv/linux')
-rw-r--r-- | sysdeps/unix/sysv/linux/i386/setcontext.S | 53 |
1 files changed, 20 insertions, 33 deletions
diff --git a/sysdeps/unix/sysv/linux/i386/setcontext.S b/sysdeps/unix/sysv/linux/i386/setcontext.S index cbe9f08ce5..ebed2ce572 100644 --- a/sysdeps/unix/sysv/linux/i386/setcontext.S +++ b/sysdeps/unix/sysv/linux/i386/setcontext.S @@ -1,5 +1,5 @@ /* Install given context. - Copyright (C) 2001, 2002 Free Software Foundation, Inc. + Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2001. @@ -53,39 +53,26 @@ ENTRY(__setcontext) movl oFS(%eax), %ecx movw %cx, %fs + /* Fetch the address to return to. */ + movl oEIP(%eax), %ecx + /* Load the new stack pointer. */ - movl oESP(%eax), %ecx - /* Make room for 8 registers and the return address. We will load - the values from the stack. */ - subl $36, %ecx - - /* Move the values of all the 32-bit registers (except ESP) on - the stack. This happens in the form the 'popa' instruction - expects it. Before this block put the address of the code - to execute. */ - movl oEDI(%eax), %ebx - movl oESI(%eax), %edx - movl oEBP(%eax), %esi - movl oEBX(%eax), %edi - movl %ebx, (%ecx) - movl %edx, 4(%ecx) - movl %esi, 8(%ecx) - movl %edi, 16(%ecx) - movl oEDX(%eax), %ebx - movl oECX(%eax), %edx - movl oEAX(%eax), %esi - movl oEIP(%eax), %edi - movl %ebx, 20(%ecx) - movl %edx, 24(%ecx) - movl %esi, 28(%ecx) - movl %edi, 32(%ecx) - - /* Set the new stack address. The stack points now to the block - we put the register content in. */ - movl %ecx, %esp - /* Restore the register content. */ - popa - /* The following 'ret' will pop the addres of the code and jump + movl oESP(%eax), %esp + + /* Push the return address on the new stack so we can return there. */ + pushl %ecx + + /* Load the values of all the 32-bit registers (except ESP). + Since we are loading from EAX, it must be last. */ + movl oEDI(%eax), %edi + movl oESI(%eax), %esi + movl oEBP(%eax), %ebp + movl oEBX(%eax), %ebx + movl oEDX(%eax), %edx + movl oECX(%eax), %ecx + movl oEAX(%eax), %eax + + /* The following 'ret' will pop the address of the code and jump to it. */ L(pseudo_end): |