summaryrefslogtreecommitdiff
path: root/lib/libc/arch/x86_64/sigsetjmp.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/arch/x86_64/sigsetjmp.c')
-rw-r--r--lib/libc/arch/x86_64/sigsetjmp.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/lib/libc/arch/x86_64/sigsetjmp.c b/lib/libc/arch/x86_64/sigsetjmp.c
new file mode 100644
index 00000000..d4c0a4db
--- /dev/null
+++ b/lib/libc/arch/x86_64/sigsetjmp.c
@@ -0,0 +1,33 @@
+#include <setjmp.h>
+
+int sigsetjmp(sigjmp_buf env, int savemask)
+{
+ __asm__ __volatile__("movq %%rbx, 0(%0)\n"
+ "movq %%rbp, 8(%0)\n"
+ "movq %%r12, 16(%0)\n"
+ "movq %%r13, 24(%0)\n"
+ "movq %%r14, 32(%0)\n"
+ "movq %%r15, 40(%0)\n"
+
+ "leaq 8(%%rsp), %%rax\n"
+ "movq %%rax, 48(%0)\n"
+ "movq (%%rsp), %%rax\n"
+ "movq %%rax, 56(%0)\n"
+
+ "testl %%esi, %%esi\n"
+ "jz 1f\n"
+ "movq $2, %%rdi\n"
+ "movq $0, %%rsi\n"
+ "leaq 64(%0), %%rdx\n"
+ "movq $128, %%r10\n"
+ "movq $14, %%rax\n"
+ "syscall\n"
+
+ "1:\n"
+ "xor %%eax, %%eax\n"
+ :
+ : "r"(env), "S"(savemask)
+ : "rax", "rdi", "rdx", "r10", "memory");
+
+ return 0;
+}