summaryrefslogtreecommitdiff
path: root/src/pal/src/arch/arm/callsignalhandlerwrapper.S
diff options
context:
space:
mode:
Diffstat (limited to 'src/pal/src/arch/arm/callsignalhandlerwrapper.S')
-rw-r--r--src/pal/src/arch/arm/callsignalhandlerwrapper.S21
1 files changed, 18 insertions, 3 deletions
diff --git a/src/pal/src/arch/arm/callsignalhandlerwrapper.S b/src/pal/src/arch/arm/callsignalhandlerwrapper.S
index 266e4fdfe9..b9398d6d63 100644
--- a/src/pal/src/arch/arm/callsignalhandlerwrapper.S
+++ b/src/pal/src/arch/arm/callsignalhandlerwrapper.S
@@ -18,12 +18,27 @@ C_FUNC(SignalHandlerWorkerReturnOffset\Alignment):
// address set to SignalHandlerWorkerReturn during SIGSEGV handling.
// It enables the unwinder to unwind stack from the handling code to the actual failure site.
NESTED_ENTRY CallSignalHandlerWrapper\Alignment, _TEXT, NoHandler
- sub sp, sp, #(8 + \Alignment) // red zone + alignment
- stmfd sp!, {r7, lr}
+#ifndef __linux__
+__StackAllocationSize = (8 + 4 + \Alignment) // red zone + alignment
+ alloc_stack __StackAllocationSize
+ PROLOG_PUSH "{r7, r11, lr}"
bl EXTERNAL_C_FUNC(signal_handler_worker)
LOCAL_LABEL(SignalHandlerWorkerReturn\Alignment):
- ldmfd sp!, {r7, lr}
+ EPILOG_POP "{r7, r11, lr}"
+ free_stack __StackAllocationSize
bx lr
+#else
+ // This unwind information is needed for lldb gdb doesn't use it and tries
+ // to read all registers from $sp + 12
+ .save {r0-r15}
+ .pad #12
+ bl EXTERNAL_C_FUNC(signal_handler_worker)
+LOCAL_LABEL(SignalHandlerWorkerReturn\Alignment):
+ // Following instruction are needed to say gdb that this frame is SIGTRAMP_FRAME
+ // and it can restore all registers from stack
+ mov.w r7, #119
+ svc 0
+#endif
NESTED_END CallSignalHandlerWrapper\Alignment, _TEXT
.endm