summaryrefslogtreecommitdiff
path: root/gnu-efi/lib/x86_64/setjmp.S
diff options
context:
space:
mode:
Diffstat (limited to 'gnu-efi/lib/x86_64/setjmp.S')
-rw-r--r--gnu-efi/lib/x86_64/setjmp.S48
1 files changed, 48 insertions, 0 deletions
diff --git a/gnu-efi/lib/x86_64/setjmp.S b/gnu-efi/lib/x86_64/setjmp.S
new file mode 100644
index 00000000..e3e51959
--- /dev/null
+++ b/gnu-efi/lib/x86_64/setjmp.S
@@ -0,0 +1,48 @@
+ .text
+ .globl setjmp
+
+#ifndef __APPLE__
+# ifndef __MINGW32__
+ .type setjmp, @function
+# else
+ .def setjmp; .scl 2; .type 32; .endef
+# endif
+#endif
+
+setjmp:
+ pop %rsi
+ movq %rbx,0x00(%rdi)
+ movq %rsp,0x08(%rdi)
+ push %rsi
+ movq %rbp,0x10(%rdi)
+ movq %r12,0x18(%rdi)
+ movq %r13,0x20(%rdi)
+ movq %r14,0x28(%rdi)
+ movq %r15,0x30(%rdi)
+ movq %rsi,0x38(%rdi)
+ xor %rax,%rax
+ ret
+
+ .globl longjmp
+#ifndef __APPLE__
+# ifndef __MINGW32__
+ .type longjmp, @function
+# else
+ .def longjmp; .scl 2; .type 32; .endef
+# endif
+#endif
+
+longjmp:
+ movl %esi, %eax
+ movq 0x00(%rdi), %rbx
+ movq 0x08(%rdi), %rsp
+ movq 0x10(%rdi), %rbp
+ movq 0x18(%rdi), %r12
+ movq 0x20(%rdi), %r13
+ movq 0x28(%rdi), %r14
+ movq 0x30(%rdi), %r15
+ xor %rdx,%rdx
+ mov $1,%rcx
+ cmp %rax,%rdx
+ cmove %rcx,%rax
+ jmp *0x38(%rdi)