summaryrefslogtreecommitdiff
path: root/lib/mlibc/options/internal/aarch64/setjmp.S
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mlibc/options/internal/aarch64/setjmp.S')
-rw-r--r--lib/mlibc/options/internal/aarch64/setjmp.S63
1 files changed, 63 insertions, 0 deletions
diff --git a/lib/mlibc/options/internal/aarch64/setjmp.S b/lib/mlibc/options/internal/aarch64/setjmp.S
new file mode 100644
index 0000000..9dddaa8
--- /dev/null
+++ b/lib/mlibc/options/internal/aarch64/setjmp.S
@@ -0,0 +1,63 @@
+// vim: ft=arm64asm
+
+.extern __sigsetjmp
+
+.type __setjmp, "function"
+__setjmp:
+ stp x19, x20, [x0, #0]
+ stp x21, x22, [x0, #16]
+ stp x23, x24, [x0, #24]
+ stp x25, x26, [x0, #32]
+ stp x27, x28, [x0, #48]
+ stp x29, x30, [x0, #64]
+ stp x29, x30, [x0, #80]
+ mov x4, sp
+ str x4, [x0, #96]
+
+ stp d8, d9, [x0, #112]
+ stp d10, d11, [x0, #128]
+ stp d12, d13, [x0, #144]
+ stp d14, d15, [x0, #160]
+
+ cbnz x2, 1f
+
+ mov x0, xzr
+ ret
+1:
+ b __sigsetjmp
+
+.global setjmp
+.type setjmp, "function"
+setjmp:
+ mov x2, xzr
+ b __setjmp
+
+.global sigsetjmp
+.type sigsetjmp, "function"
+sigsetjmp:
+ mov x2, #1
+ b __setjmp
+
+.global longjmp
+.type longjmp, "function"
+longjmp:
+ ldp x19, x20, [x0, #0]
+ ldp x21, x22, [x0, #16]
+ ldp x23, x24, [x0, #24]
+ ldp x25, x26, [x0, #32]
+ ldp x27, x28, [x0, #48]
+ ldp x29, x30, [x0, #64]
+ ldp x29, x30, [x0, #80]
+ ldr x4, [x0, #96]
+ mov sp, x4
+
+ ldp d8, d9, [x0, #112]
+ ldp d10, d11, [x0, #128]
+ ldp d12, d13, [x0, #144]
+ ldp d14, d15, [x0, #160]
+
+ cmp w1, 0
+ csinc w0, w1, wzr, ne
+ br x30
+.section .note.GNU-stack,"",%progbits
+