summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/i386/setjmp.S
blob: 09b266c61859cb2b803527e86f23ff88fdcbaed6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <setjmp.h>

.text
.weak setjmp
.type setjmp,@function
setjmp:
.globl __setjmp
.type __setjmp,@function
__setjmp:
	popl %eax
	popl %ecx
	pushl $0
	pushl %ecx
	pushl %eax

.globl __sigsetjmp
.type __sigsetjmp,@function
__sigsetjmp:
	movl 4(%esp), %eax

	/* Save registers.  */
	movl %ebx, (JB_BX*4)(%eax)
	movl %esi, (JB_SI*4)(%eax)
	movl %edi, (JB_DI*4)(%eax)
	movl %ebp, (JB_BP*4)(%eax)
	leal 4(%esp), %edx	/* Save SP as it will be after we return.  */
	movl 0(%esp), %ecx	/* Save PC we are returning to now.  */
	movl %edx, (JB_SP*4)(%eax)
	movl %ecx, (JB_PC*4)(%eax)

	/* Make a tail call to __sigjmp_save; it takes the same args.  */
#ifdef	PIC
	call	1f
	addl	$_GLOBAL_OFFSET_TABLE_, %ecx
	jmp	*__sigjmp_save@GOT(%ecx)
1:	movl	(%esp), %ecx
	ret
#else
	jmp __sigjmp_save
#endif
.size __sigsetjmp,.-__sigsetjmp;