libroot_debug: Merge guarded heap into libroot_debug.
[haiku.git] / src / system / libroot / posix / arch / x86 / sigsetjmp.S
blob9498135ea37e4a8ea77a5ca61700c4c7a5636bdd
1 /*
2  * Copyright 2008, Ingo Weinhold, ingo_weinhold@gmx.de.
3  * Copyright 2004-2005, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
4  * Distributed under the terms of the MIT License.
5  */
7 #include "setjmp_internal.h"
10 /**     This is a BeOS compatible __sigsetjmp() implementation; there,
11  *      setjmp() and sigsetjmp() are both macros to this function.
12  *
13  *      It first saves the register/stack environment of the running thread,
14  *      and then calls __setjmp_save_sigs() which will save the signal state
15  *      if it was asked to do this.
16  */
18 /* int sigsetjmp(jmp_buf buffer, int saveMask) */
19 FUNCTION(__sigsetjmp):
20 FUNCTION(sigsetjmp):
21         // return address to %edx, stack pointer for return to %ecx (both are
22         // scratch registers)
23         mov             0(%esp), %edx
24         lea             4(%esp), %ecx
26         // buffer to %eax
27         mov             4(%esp), %eax
29 sigsetjmp_setjmp_entry:
30         // fill __jmp_buf structure with current registers
31         mov             %ebx, JMP_REGS_EBX(%eax)
32         mov             %esi, JMP_REGS_ESI(%eax)
33         mov             %edi, JMP_REGS_EDI(%eax)
34         mov             %ebp, JMP_REGS_EBP(%eax)
36         // save stack and return address (because that's where we intend to jump to)
37         mov             %ecx, JMP_REGS_ESP(%eax)
38         mov             %edx, JMP_REGS_PC(%eax)
40         jmp             __setjmp_save_sigs
41 FUNCTION_END(sigsetjmp)
44 /* int setjmp(jmp_buf buffer) */
45 FUNCTION(setjmp):
46         // prepare %edx, %ecx, and %eax for sigsetjmp
47         mov             0(%esp), %edx
48         lea             4(%esp), %ecx
49         mov             (%ecx), %eax
51         // let sigsetjmp do the real work
52         pushl   $0                                                      // saveMask
53         push    %eax                                            // buffer
54         call    sigsetjmp_setjmp_entry
55         add             $8, %esp
57         ret
58 FUNCTION_END(setjmp)
61 #pragma weak _setjmp=setjmp