From 8e38cfbaf45147c4361123a306d5b50c667a899e Mon Sep 17 00:00:00 2001 From: CHUNSEOK LEE Date: Wed, 2 Aug 2017 09:02:14 +0900 Subject: [PATCH 16/29] callsignalhandlerwrapper patch Change-Id: I38630f9d02733aab5890b46afda39fd6e45461db --- src/pal/src/arch/arm/callsignalhandlerwrapper.S | 10 ++++++---- src/pal/src/arch/arm/signalhandlerhelper.cpp | 2 ++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/pal/src/arch/arm/callsignalhandlerwrapper.S b/src/pal/src/arch/arm/callsignalhandlerwrapper.S index 266e4fd..b6288c4 100644 --- a/src/pal/src/arch/arm/callsignalhandlerwrapper.S +++ b/src/pal/src/arch/arm/callsignalhandlerwrapper.S @@ -18,12 +18,14 @@ 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} + alloc_stack (8 + \Alignment) +// PROLOG_PUSH "{r7, lr}" + .save {r7, r11, lr, pc} bl EXTERNAL_C_FUNC(signal_handler_worker) LOCAL_LABEL(SignalHandlerWorkerReturn\Alignment): - ldmfd sp!, {r7, lr} - bx lr +// EPILOG_POP "{r7, lr}" +// free_stack (8 + \Alignment) +// bx lr NESTED_END CallSignalHandlerWrapper\Alignment, _TEXT .endm diff --git a/src/pal/src/arch/arm/signalhandlerhelper.cpp b/src/pal/src/arch/arm/signalhandlerhelper.cpp index e1ad460..3936204 100644 --- a/src/pal/src/arch/arm/signalhandlerhelper.cpp +++ b/src/pal/src/arch/arm/signalhandlerhelper.cpp @@ -48,7 +48,9 @@ void ExecuteHandlerOnOriginalStack(int code, siginfo_t *siginfo, void *context, // Build fake stack frame to enable the stack unwinder to unwind from signal_handler_worker to the faulting instruction // pushed LR *--sp = (size_t)MCREG_Pc(ucontext->uc_mcontext); + *--sp = (size_t)MCREG_Lr(ucontext->uc_mcontext); // pushed frame pointer + *--sp = (size_t)MCREG_R11(ucontext->uc_mcontext); *--sp = (size_t)MCREG_R7(ucontext->uc_mcontext); // Switch the current context to the signal_handler_worker and the original stack -- 2.7.4