From 444980deb1873833aeb75965eb758a3e7d50862b Mon Sep 17 00:00:00 2001 From: milek7 Date: Mon, 28 Mar 2022 21:35:04 +0200 Subject: [PATCH] arm64: Implement setjmp/longjmp. Change-Id: I9cd2d5de27a3b110b185c658e980428fe49392b0 Reviewed-on: https://review.haiku-os.org/c/haiku/+/5267 Tested-by: Commit checker robot Reviewed-by: David Karoly Reviewed-by: waddlesplash --- src/system/libroot/posix/arch/arm64/siglongjmp.S | 14 +++++++++++--- src/system/libroot/posix/arch/arm64/sigsetjmp.S | 16 ++++++++++++++-- 2 files changed, 25 insertions(+), 5 deletions(-) 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