diff --git a/src/system/libroot/posix/arch/arm64/siglongjmp.S b/src/system/libroot/posix/arch/arm64/siglongjmp.S index 59e28fc333..3e1081cf93 100644 --- a/src/system/libroot/posix/arch/arm64/siglongjmp.S +++ b/src/system/libroot/posix/arch/arm64/siglongjmp.S @@ -11,9 +11,17 @@ FUNCTION(siglongjmp): FUNCTION(longjmp): FUNCTION(_longjmp): - /* Loop infinitely here, for now. - TODO implement this for real */ - b . + ldp x19, x20, [x0], #16 + ldp x21, x22, [x0], #16 + ldp x23, x24, [x0], #16 + ldp x25, x26, [x0], #16 + ldp x27, x28, [x0], #16 + ldp x29, x30, [x0], #16 + + ldr x2, [x0] + mov sp, x2 + + b __longjmp_return FUNCTION_END(siglongjmp) FUNCTION_END(longjmp) FUNCTION_END(_longjmp) diff --git a/src/system/libroot/posix/arch/arm64/sigsetjmp.S b/src/system/libroot/posix/arch/arm64/sigsetjmp.S index edde2aa135..00a83d7a7f 100644 --- a/src/system/libroot/posix/arch/arm64/sigsetjmp.S +++ b/src/system/libroot/posix/arch/arm64/sigsetjmp.S @@ -8,7 +8,17 @@ /* int sigsetjmp(jmp_buf buffer, int saveMask) */ FUNCTION(__sigsetjmp): FUNCTION(sigsetjmp): - b . + stp x19, x20, [x0], #16 + stp x21, x22, [x0], #16 + stp x23, x24, [x0], #16 + stp x25, x26, [x0], #16 + stp x27, x28, [x0], #16 + stp x29, x30, [x0], #16 + + mov x2, sp + str x2, [x0] + + b __setjmp_save_sigs FUNCTION_END(sigsetjmp) FUNCTION_END(__sigsetjmp) @@ -16,7 +26,9 @@ FUNCTION_END(__sigsetjmp) /* int setjmp(jmp_buf buffer) */ FUNCTION(setjmp): FUNCTION(_setjmp): - b . + mov x1, #0 + b __sigsetjmp +FUNCTION_END(_setjmp) FUNCTION_END(setjmp) #pragma weak _setjmp=setjmp