summaryrefslogtreecommitdiff
path: root/packaging/0016-callsignalhandlerwrapper-patch.patch
blob: cb223da971a73be61a2bae2878f10427b124a1cc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
From 8e38cfbaf45147c4361123a306d5b50c667a899e Mon Sep 17 00:00:00 2001
From: CHUNSEOK LEE <chunseok.lee@samsung.com>
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