root/src/system/libroot/posix/arch/x86_64/siglongjmp.S
/*
 * Copyright 2012, Alex Smith, alex@alex-smith.me.uk.
 * Distributed under the terms of the MIT License.
 */

#include "setjmp_internal.h"


/* int __siglongjmp(jmp_buf buffer, int value) */
FUNCTION(siglongjmp):
FUNCTION(longjmp):
FUNCTION(_longjmp):
        // Restore new callee-save registers.
        movq    JMP_REGS_R15(%rdi), %r15
        movq    JMP_REGS_R14(%rdi), %r14
        movq    JMP_REGS_R13(%rdi), %r13
        movq    JMP_REGS_R12(%rdi), %r12
        movq    JMP_REGS_BX(%rdi), %rbx
        movq    JMP_REGS_BP(%rdi), %rbp

        // Restore new stack pointer and push return address.
        movq    JMP_REGS_SP(%rdi), %rsp
        movq    JMP_REGS_IP(%rdi), %rax
        push    %rax

        // __longjmp_return restores the signal mask and sets the return value.
        call    __longjmp_return@PLT
        ret
FUNCTION_END(siglongjmp)


#pragma weak longjmp=siglongjmp