
.type __setjmp, "function"
__setjmp:
    mov 4(%esp), %eax       # Save argument (buffer) in edi
    mov %ebx, 0x00(%eax)
    mov %ebp, 0x04(%eax)
    mov %esi, 0x08(%eax)
    mov %edi, 0x0c(%eax)

	lea 4(%esp), %ecx       # esp before return eip is pushed
	mov %ecx, 0x10(%eax)
	mov (%esp), %ecx        # Return eip
	mov %ecx, 0x14(%eax)

	test %edx, %edx
	jnz 1f
	xor %eax, %eax
	ret

  1:
	jmp __sigsetjmp

.global setjmp
.type setjmp, "function"
setjmp:
	xor %edx, %edx
	jmp __setjmp

.global sigsetjmp
.type sigsetjmp, "function"
sigsetjmp:
	mov $1, %edx
	jmp __setjmp

.global longjmp
.type longjmp, "function"
longjmp:
    mov 4(%esp), %ecx
	mov 0x00(%ecx), %ebx
	mov 0x04(%ecx), %ebp
	mov 0x08(%ecx), %esi
	mov 0x0c(%ecx), %edi

	mov 8(%esp), %eax
    test %eax, %eax
    setz %al

	mov 0x10(%ecx), %esp
	jmp *0x14(%ecx)

.section .note.GNU-stack,"",%progbits

