summaryrefslogtreecommitdiff
path: root/src/setjmp/x32/longjmp.s
diff options
context:
space:
mode:
Diffstat (limited to 'src/setjmp/x32/longjmp.s')
-rw-r--r--src/setjmp/x32/longjmp.s22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/setjmp/x32/longjmp.s b/src/setjmp/x32/longjmp.s
new file mode 100644
index 00000000..e175a4b9
--- /dev/null
+++ b/src/setjmp/x32/longjmp.s
@@ -0,0 +1,22 @@
+/* Copyright 2011-2012 Nicholas J. Kain, licensed under standard MIT license */
+.global _longjmp
+.global longjmp
+.type _longjmp,@function
+.type longjmp,@function
+_longjmp:
+longjmp:
+ mov %rsi,%rax /* val will be longjmp return */
+ test %rax,%rax
+ jnz 1f
+ inc %rax /* if val==0, val=1 per longjmp semantics */
+1:
+ mov (%rdi),%rbx /* rdi is the jmp_buf, restore regs from it */
+ mov 8(%rdi),%rbp
+ mov 16(%rdi),%r12
+ mov 24(%rdi),%r13
+ mov 32(%rdi),%r14
+ mov 40(%rdi),%r15
+ mov 48(%rdi),%rdx /* this ends up being the stack pointer */
+ mov %rdx,%rsp
+ mov 56(%rdi),%rdx /* this is the instruction pointer */
+ jmp *%rdx /* goto saved address without altering rsp */