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