1/* 2 * Copyright 2012, Alex Smith, alex@alex-smith.me.uk. 3 * Distributed under the terms of the MIT License. 4 */ 5 6#include "setjmp_internal.h" 7 8 9/* int sigsetjmp(jmp_buf buffer, int saveMask) */ 10FUNCTION(__sigsetjmp): 11FUNCTION(sigsetjmp): 12 // Save instruction/stack pointers. 13 movq (%rsp), %rax 14 movq %rax, JMP_REGS_IP(%rdi) 15 leaq 8(%rsp), %rax 16 movq %rax, JMP_REGS_SP(%rdi) 17 18 // Save callee-save registers. 19 movq %rbp, JMP_REGS_BP(%rdi) 20 movq %rbx, JMP_REGS_BX(%rdi) 21 movq %r12, JMP_REGS_R12(%rdi) 22 movq %r13, JMP_REGS_R13(%rdi) 23 movq %r14, JMP_REGS_R14(%rdi) 24 movq %r15, JMP_REGS_R15(%rdi) 25 26 // __setjmp_save_sigs handles signal mask and return value. 27 jmp __setjmp_save_sigs@PLT 28FUNCTION_END(setjmp) 29 30 31/* int setjmp(jmp_buf buffer) */ 32FUNCTION(setjmp): 33FUNCTION(_setjmp): 34 // Jump to sigsetjmp with a zero saveMask. 35 xorl %esi, %esi 36 jmp sigsetjmp@PLT 37FUNCTION_END(setjmp) 38 39 40#pragma weak _setjmp=setjmp 41