1#include <arm64/proc_reg.h> 2#include <mach/arm64/asm.h> 3 4#define JMP_r19_20 #0x00 5#define JMP_r21_22 #0x10 6#define JMP_r23_24 #0x20 7#define JMP_r25_26 #0x30 8#define JMP_r27_28 #0x40 9#define JMP_r29_lr #0x50 10#define JMP_fp_sp #0x60 11 12#define JMP_d8_d9 #0x70 13#define JMP_d10_d11 #0x80 14#define JMP_d12_d13 #0x90 15#define JMP_d14_d15 #0xA0 16 17.text 18 19.align 5 20.globl EXT(_setjmp) 21LEXT(_setjmp) 22 add x1, sp, #0 /* can't STP from sp */ 23 stp x19, x20, [x0, JMP_r19_20] 24 stp x21, x22, [x0, JMP_r21_22] 25 stp x23, x24, [x0, JMP_r23_24] 26 stp x25, x26, [x0, JMP_r25_26] 27 stp x27, x28, [x0, JMP_r27_28] 28 stp x29, lr, [x0, JMP_r29_lr] 29 stp fp, x1, [x0, JMP_fp_sp] 30 stp d8, d9, [x0, JMP_d8_d9] 31 stp d10, d11, [x0, JMP_d10_d11] 32 stp d12, d13, [x0, JMP_d12_d13] 33 stp d14, d15, [x0, JMP_d14_d15] 34 mov x0, #0 35 ret 36 37.align 5 38.globl EXT(_longjmp) 39LEXT(_longjmp) 40 ldp x19, x20, [x0, JMP_r19_20] 41 ldp x21, x22, [x0, JMP_r21_22] 42 ldp x23, x24, [x0, JMP_r23_24] 43 ldp x25, x26, [x0, JMP_r25_26] 44 ldp x27, x28, [x0, JMP_r27_28] 45 ldp x29, lr, [x0, JMP_r29_lr] 46 ldp fp, x2, [x0, JMP_fp_sp] 47 ldp d8, d9, [x0, JMP_d8_d9] 48 ldp d10, d11, [x0, JMP_d10_d11] 49 ldp d12, d13, [x0, JMP_d12_d13] 50 ldp d14, d15, [x0, JMP_d14_d15] 51 add sp, x2, #0 52 mov x0, x1 53 cmp x0, #0 /* longjmp returns 1 if val is 0 */ 54 b.ne 1f 55 add x0, x0, #1 561: ret 57 58