Reimplemented setjmp(). It no longer offsets the caller's esp.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25428 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold
2008-05-10 17:16:09 +00:00
parent c306892e40
commit ad7ff929dd
3 changed files with 28 additions and 26 deletions
@@ -7,7 +7,6 @@ local genericSources =
;
MergeObject posix_arch_$(TARGET_ARCH).o :
setjmp.S
sigsetjmp.S
siglongjmp.S
@@ -1,20 +0,0 @@
/*
* Copyright 2004-2005, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#include "setjmp_internal.h"
/* int setjmp(jmp_buf buffer) */
FUNCTION(setjmp):
pop %eax // pop argument and return pointer from stack
pop %ecx
pushl $0 // push new argument (for saveMask) and old stuff
push %ecx // back onto the stack
push %eax
jmp __sigsetjmp // let sigsetjmp() do the actual work
#pragma weak _setjmp=setjmp
+28 -5
View File
@@ -1,4 +1,5 @@
/*
* Copyright 2008, Ingo Weinhold, ingo_weinhold@gmx.de.
* Copyright 2004-2005, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
* Distributed under the terms of the MIT License.
*/
@@ -15,23 +16,45 @@
* if it was asked to do this.
*/
/* int sigsetjmp(jmp_buf buffer, int saveMask) */
FUNCTION(__sigsetjmp):
FUNCTION(sigsetjmp):
// return address to %edx, stack pointer for return to %ecx (both are
// scratch registers)
mov 0(%esp), %edx
lea 4(%esp), %ecx
// buffer to %eax
mov 4(%esp), %eax
// fill __jmp_buf structure with current registers (%ecx can be clobbered)
sigsetjmp_setjmp_entry:
// fill __jmp_buf structure with current registers
mov %ebx, JMP_REGS_EBX(%eax)
mov %esi, JMP_REGS_ESI(%eax)
mov %edi, JMP_REGS_EDI(%eax)
mov %ebp, JMP_REGS_EBP(%eax)
// save stack and return address (because that's where we intend to jump to)
lea 4(%esp,1), %ecx
mov %ecx, JMP_REGS_ESP(%eax)
mov 0(%esp), %ecx
mov %ecx, JMP_REGS_PC(%eax)
mov %edx, JMP_REGS_PC(%eax)
jmp __setjmp_save_sigs
/* int setjmp(jmp_buf buffer) */
FUNCTION(setjmp):
// prepare %edx, %ecx, and %eax for sigsetjmp
mov 0(%esp), %edx
lea 4(%esp), %ecx
mov (%ecx), %eax
// let sigsetjmp do the real work
pushl $0 // saveMask
push %eax // buffer
call sigsetjmp_setjmp_entry
add $8, %esp
ret
#pragma weak _setjmp=setjmp