summaryrefslogtreecommitdiff
path: root/src/setjmp/x86_64/longjmp.s
diff options
context:
space:
mode:
authorNicholas J. Kain <njkain@gmail.com>2011-02-15 07:32:09 -0500
committerNicholas J. Kain <njkain@gmail.com>2011-02-15 07:32:09 -0500
commit1e12632591ab98a6ea3af8680716c28282552981 (patch)
tree5b79bd9a0b950d6ab414fef8cbb5dfcd1a6d2e83 /src/setjmp/x86_64/longjmp.s
parentc2afb747b0296f23cd1903e82ccbdee3fc2978fd (diff)
downloadmusl-1e12632591ab98a6ea3af8680716c28282552981.tar.gz
Port musl to x86-64. One giant commit!
Diffstat (limited to 'src/setjmp/x86_64/longjmp.s')
-rw-r--r--src/setjmp/x86_64/longjmp.s24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/setjmp/x86_64/longjmp.s b/src/setjmp/x86_64/longjmp.s
new file mode 100644
index 00000000..c63b0c95
--- /dev/null
+++ b/src/setjmp/x86_64/longjmp.s
@@ -0,0 +1,24 @@
+/* Copyright 2011 Nicholas J. Kain, licensed GNU LGPL 2.1 or later */
+.global _longjmp
+.global longjmp
+.type _longjmp,%function
+.type longjmp,%function
+_longjmp:
+longjmp:
+ mov %rsi,%rax /* val will be longjmp return */
+ test %rax,%rax
+ jnz .L0
+ inc %rax /* if val==0, val=1 per longjmp semantics */
+.L0:
+ movq (%rdi),%rbx /* rdi is the jmp_buf, restore regs from it */
+ movq 8(%rdi),%rbp
+ movq 16(%rdi),%r12
+ movq 24(%rdi),%r13
+ movq 32(%rdi),%r14
+ movq 40(%rdi),%r15
+ movq 48(%rdi),%rdx /* this ends up being the stack pointer */
+ mov %rdx,%rsp
+ movq 56(%rdi),%rdx /* this is the instruction pointer */
+ jmp *%rdx /* goto saved address without altering rsp */
+.size _longjmp,.-_longjmp
+.size longjmp,.-longjmp