diff options
Diffstat (limited to 'src/pal/src/arch/arm/callsignalhandlerwrapper.S')
-rw-r--r-- | src/pal/src/arch/arm/callsignalhandlerwrapper.S | 21 |
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 |