]> git.saurik.com Git - apple/libplatform.git/blobdiff - src/setjmp/arm64/setjmp.s
libplatform-220.tar.gz
[apple/libplatform.git] / src / setjmp / arm64 / setjmp.s
index 890179df013c507e25ddc9209d27a09cc801bb93..430b7a98ff6557eda01c2f000012f48623f2492f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011 Apple Inc. All rights reserved.
+ * Copyright (c) 2011-2018 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -26,9 +26,8 @@
 #define        JMP_r23_24      #0x20
 #define        JMP_r25_26      #0x30
 #define        JMP_r27_28      #0x40
-#define        JMP_r29_lr      #0x50
-#define        JMP_fp_sp       #0x60
-
+#define        JMP_fp_lr       #0x50
+#define        JMP_sp_rsvd     #0x60 /* second field is reserved/unused */
 #define        JMP_d8_d9       #0x70
 #define        JMP_d10_d11     #0x80
 #define        JMP_d12_d13     #0x90
 #define        JMP_sigflag     #0xB8
 
 #include <architecture/arm/asm_help.h>
+#include <os/tsd.h>
+
 
 /* int _setjmp(jmp_buf env); */
 ENTRY_POINT(__setjmp)
-       add             x1, sp, #0      /* can't STP from sp */
+       mov             x12, sp
+       _OS_PTR_MUNGE_TOKEN(x16, x16)
+       _OS_PTR_MUNGE(x10, fp, x16)
+       _OS_PTR_MUNGE(x11, lr, x16)
+       _OS_PTR_MUNGE(x12, x12, x16)
        stp             x19, x20,       [x0, JMP_r19_20]
        stp             x21, x22,       [x0, JMP_r21_22]
        stp             x23, x24,       [x0, JMP_r23_24]
        stp             x25, x26,       [x0, JMP_r25_26]
        stp             x27, x28,       [x0, JMP_r27_28]
-       stp             x29, lr,        [x0, JMP_r29_lr]
-       stp             fp, x1,         [x0, JMP_fp_sp]
+       stp             x10, x11,       [x0, JMP_fp_lr]
+       str             x12,            [x0, JMP_sp_rsvd]
        stp             d8, d9,         [x0, JMP_d8_d9]
        stp             d10, d11,       [x0, JMP_d10_d11]
        stp             d12, d13,       [x0, JMP_d12_d13]
        stp             d14, d15,       [x0, JMP_d14_d15]
-       mov             x0, #0
+       mov             w0, #0
        ret
 
 /* void _longjmp(jmp_buf env, int val); */
@@ -62,24 +67,25 @@ ENTRY_POINT(__longjmp)
        ldp             x23, x24,       [x0, JMP_r23_24]
        ldp             x25, x26,       [x0, JMP_r25_26]
        ldp             x27, x28,       [x0, JMP_r27_28]
-       ldp             x29, lr,        [x0, JMP_r29_lr]
-       ldp             fp, x2,         [x0, JMP_fp_sp]
+       ldp             x10, x11,       [x0, JMP_fp_lr]
+       ldr             x12,            [x0, JMP_sp_rsvd]
        ldp             d8, d9,         [x0, JMP_d8_d9]
        ldp             d10, d11,       [x0, JMP_d10_d11]
        ldp             d12, d13,       [x0, JMP_d12_d13]
        ldp             d14, d15,       [x0, JMP_d14_d15]
-       add             sp, x2, #0
-       mov             x0, x1
-       cmp             x0, #0          /* longjmp returns 1 if val is 0 */
-       b.ne    1f
-       add             x0, x0, #1
-1:     ret
+       _OS_PTR_MUNGE_TOKEN(x16, x16)
+       _OS_PTR_UNMUNGE(fp, x10, x16)
+       _OS_PTR_UNMUNGE(lr, x11, x16)
+       _OS_PTR_UNMUNGE(x12, x12, x16)
+       mov             sp, x12
+       cmp             w1, #0
+       csinc   w0, w1, wzr, ne
+       ret
 
 /* int sigsetjmp(sigjmp_buf env, int savemask); */
 ENTRY_POINT(_sigsetjmp)
-       str             x1, [x0, JMP_sigflag]
-       cmp             x1, #0
-       b.ne    1f
+       str             w1, [x0, JMP_sigflag]
+       cbnz    w1, 1f
        b               __setjmp
 1:
        /* else, fall through */
@@ -88,8 +94,8 @@ ENTRY_POINT(_sigsetjmp)
 ENTRY_POINT(_setjmp)
        stp             x21, lr, [x0]
        mov             x21, x0
-       
-       mov             x0, #1
+
+       orr             w0, wzr, #0x1
        mov             x1, #0
        add             x2, x21, JMP_sig
        CALL_EXTERNAL(_sigprocmask)
@@ -98,11 +104,11 @@ ENTRY_POINT(_setjmp)
        ldp             x21, lr, [x0]
        b               __setjmp
 
+
 /* void siglongjmp(sigjmp_buf env, int val); */
 ENTRY_POINT(_siglongjmp)
-       ldr             x2, [x0, JMP_sigflag]
-       cmp             x2, #0
-       b.ne    1f
+       ldr             w8, [x0, JMP_sigflag]
+       cbnz    w8, 1f
        b               __longjmp
 1:
        /* else, fall through */
@@ -112,11 +118,11 @@ ENTRY_POINT(_longjmp)
        sub     sp, sp, #16
        mov             x21, x0                                 // x21/x22 will be restored by __longjmp
        mov             x22, x1
-       ldr             x0, [x21, JMP_sig]              // restore the signal mask
-       str     x0, [sp, #8]
-       add     x1, sp, #8                              // set
+       ldr             x8, [x21, JMP_sig]              // restore the signal mask
+       str     x8, [sp, #8]
        orr     w0, wzr, #0x3                   // SIG_SETMASK
-       movz    x2, #0                                  // oset
+       add     x1, sp, #8                              // set
+       mov             x2, #0                                  // oset
        CALL_EXTERNAL(_sigprocmask)
        mov             x0, x21
        mov             x1, x22