diff options
author | Ulrich Drepper <drepper@redhat.com> | 2005-12-28 19:13:20 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2005-12-28 19:13:20 +0000 |
commit | 272b289859eff42d77fac6cf3125b38b0ff01791 (patch) | |
tree | 0af9bdc2118abfc0f8a30e799944fa74d1383ad1 /sysdeps/i386/__longjmp.S | |
parent | 4973f319536a5dc555fe3980615677b12e5359e4 (diff) | |
download | glibc-272b289859eff42d77fac6cf3125b38b0ff01791.tar glibc-272b289859eff42d77fac6cf3125b38b0ff01791.tar.gz glibc-272b289859eff42d77fac6cf3125b38b0ff01791.tar.bz2 glibc-272b289859eff42d77fac6cf3125b38b0ff01791.zip |
* sysdeps/i386/__longjmp.S [PTR_DEMANGLE]: Also demangle stack
pointer. Add CFI.
* sysdeps/i386/bsd-_setjmp.S [PTR_MANGLE]: Also mangle stack pointer.
* sysdeps/i386/bsd-setjmp.S: Likewise.
* sysdeps/i386/setjmp.S: Likewise.
Diffstat (limited to 'sysdeps/i386/__longjmp.S')
-rw-r--r-- | sysdeps/i386/__longjmp.S | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/sysdeps/i386/__longjmp.S b/sysdeps/i386/__longjmp.S index aced5f42c9..10a4650fb0 100644 --- a/sysdeps/i386/__longjmp.S +++ b/sysdeps/i386/__longjmp.S @@ -32,6 +32,36 @@ ENTRY (BP_SYM (__longjmp)) ENTER +#ifdef PTR_DEMANGLE + movl JBUF(%esp), %eax /* User's jmp_buf in %eax. */ + CHECK_BOUNDS_BOTH_WIDE (%eax, JBUF(%esp), $JB_SIZE) + + /* Save the return address now. */ + movl (JB_PC*4)(%eax), %edx + /* Get the stack pointer. */ + movl (JB_SP*4)(%eax), %ecx + PTR_DEMANGLE (%edx) + PTR_DEMANGLE (%ecx) + cfi_def_cfa(%eax, 0) + cfi_register(%eip, %edx) + cfi_register(%esp, %ecx) + cfi_offset(%ebx, JB_BX*4) + cfi_offset(%esi, JB_SI*4) + cfi_offset(%edi, JB_DI*4) + cfi_offset(%ebp, JB_BP*4) + /* Restore registers. */ + movl (JB_BX*4)(%eax), %ebx + movl (JB_SI*4)(%eax), %esi + movl (JB_DI*4)(%eax), %edi + movl (JB_BP*4)(%eax), %ebp + cfi_restore(%ebx) + cfi_restore(%esi) + cfi_restore(%edi) + cfi_restore(%ebp) + + movl VAL(%esp), %eax /* Second argument is return value. */ + movl %ecx, %esp +#else movl JBUF(%esp), %ecx /* User's jmp_buf in %ecx. */ CHECK_BOUNDS_BOTH_WIDE (%ecx, JBUF(%esp), $JB_SIZE) @@ -44,8 +74,6 @@ ENTRY (BP_SYM (__longjmp)) movl (JB_DI*4)(%ecx), %edi movl (JB_BP*4)(%ecx), %ebp movl (JB_SP*4)(%ecx), %esp -#ifdef PTR_DEMANGLE - PTR_DEMANGLE (%edx) #endif /* Jump to saved PC. */ jmp *%edx |