Changeset 25428

Show
Ignore:
Timestamp:
05/10/08 12:16:09 (6 days ago)
Author:
bonefish
Message:
Reimplemented setjmp(). It no longer offsets the caller's esp.
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • haiku/trunk/src/system/libroot/posix/arch/x86/Jamfile

    r15479 r25428  
    88 
    99MergeObject posix_arch_$(TARGET_ARCH).o : 
    10         setjmp.S 
    1110        sigsetjmp.S 
    1211        siglongjmp.S 
  • haiku/trunk/src/system/libroot/posix/arch/x86/sigsetjmp.S

    r14901 r25428  
    11/* 
     2 * Copyright 2008, Ingo Weinhold, ingo_weinhold@gmx.de. 
    23 * Copyright 2004-2005, Axel Dörfler, axeld@pinc-software.de. All rights reserved. 
    34 * Distributed under the terms of the MIT License. 
     
    1617 */ 
    1718 
    18  
    1919/* int sigsetjmp(jmp_buf buffer, int saveMask) */ 
    2020FUNCTION(__sigsetjmp): 
    2121FUNCTION(sigsetjmp): 
     22        // return address to %edx, stack pointer for return to %ecx (both are 
     23        // scratch registers) 
     24        mov             0(%esp), %edx 
     25        lea             4(%esp), %ecx 
     26 
     27        // buffer to %eax 
    2228        mov             4(%esp), %eax 
    2329 
    24         // fill __jmp_buf structure with current registers (%ecx can be clobbered) 
     30sigsetjmp_setjmp_entry: 
     31        // fill __jmp_buf structure with current registers 
    2532        mov             %ebx, JMP_REGS_EBX(%eax) 
    2633        mov             %esi, JMP_REGS_ESI(%eax) 
     
    2936 
    3037        // save stack and return address (because that's where we intend to jump to) 
    31         lea             4(%esp,1), %ecx 
    3238        mov             %ecx, JMP_REGS_ESP(%eax) 
    33         mov             0(%esp), %ecx 
    34         mov             %ecx, JMP_REGS_PC(%eax) 
     39        mov             %edx, JMP_REGS_PC(%eax) 
    3540 
    3641        jmp             __setjmp_save_sigs 
    3742 
     43 
     44/* int setjmp(jmp_buf buffer) */ 
     45FUNCTION(setjmp): 
     46        // prepare %edx, %ecx, and %eax for sigsetjmp 
     47        mov             0(%esp), %edx 
     48        lea             4(%esp), %ecx 
     49        mov             (%ecx), %eax 
     50 
     51        // let sigsetjmp do the real work 
     52        pushl   $0                                                      // saveMask 
     53        push    %eax                                            // buffer 
     54        call    sigsetjmp_setjmp_entry 
     55        add             $8, %esp 
     56 
     57        ret 
     58 
     59 
     60#pragma weak _setjmp=setjmp