|
From: <sv...@va...> - 2011-11-20 09:40:39
|
Author: sewardj
Date: 2011-11-20 09:35:51 +0000 (Sun, 20 Nov 2011)
New Revision: 12273
Log:
arm-linux: fix signal returning so that if SA_RESTORER is not
specified, the handler returns to the previous context rather than to
whatever value happens to be parked in the link register (duh).
Previous behaviour made complete nonsense of signal returning on
Android.
Modified:
trunk/coregrind/m_sigframe/sigframe-arm-linux.c
trunk/coregrind/m_trampoline.S
trunk/coregrind/pub_core_trampoline.h
Modified: trunk/coregrind/m_sigframe/sigframe-arm-linux.c
===================================================================
--- trunk/coregrind/m_sigframe/sigframe-arm-linux.c 2011-11-17 21:57:21 UTC (rev 12272)
+++ trunk/coregrind/m_sigframe/sigframe-arm-linux.c 2011-11-20 09:35:51 UTC (rev 12273)
@@ -259,7 +259,12 @@
tst->arch.vex.guest_R0 = sigNo;
if (flags & VKI_SA_RESTORER)
- tst->arch.vex.guest_R14 = (Addr) restorer;
+ tst->arch.vex.guest_R14 = (Addr)restorer;
+ else
+ tst->arch.vex.guest_R14
+ = (flags & VKI_SA_SIGINFO)
+ ? (Addr)&VG_(arm_linux_SUBST_FOR_rt_sigreturn)
+ : (Addr)&VG_(arm_linux_SUBST_FOR_sigreturn);
tst->arch.vex.guest_R15T = (Addr) handler; /* R15 == PC */
}
Modified: trunk/coregrind/m_trampoline.S
===================================================================
--- trunk/coregrind/m_trampoline.S 2011-11-17 21:57:21 UTC (rev 12272)
+++ trunk/coregrind/m_trampoline.S 2011-11-20 09:35:51 UTC (rev 12273)
@@ -517,6 +517,22 @@
.global VG_(trampoline_stuff_start)
VG_(trampoline_stuff_start):
+.global VG_(arm_linux_SUBST_FOR_sigreturn)
+.type VG_(arm_linux_SUBST_FOR_sigreturn),#function
+VG_(arm_linux_SUBST_FOR_sigreturn):
+ mov r7, # __NR_sigreturn
+ svc #0
+ .long 0xFFFFFFFF /*illegal insn*/
+.size VG_(arm_linux_SUBST_FOR_sigreturn), .-VG_(arm_linux_SUBST_FOR_sigreturn)
+
+.global VG_(arm_linux_SUBST_FOR_rt_sigreturn)
+.type VG_(arm_linux_SUBST_FOR_rt_sigreturn),#function
+VG_(arm_linux_SUBST_FOR_rt_sigreturn):
+ mov r7, # __NR_rt_sigreturn
+ svc #0
+ .long 0xFFFFFFFF /*illegal insn*/
+.size VG_(arm_linux_SUBST_FOR_rt_sigreturn), .-VG_(arm_linux_SUBST_FOR_rt_sigreturn)
+
.global VG_(arm_linux_REDIR_FOR_strlen)
VG_(arm_linux_REDIR_FOR_strlen):
mov r2, r0
Modified: trunk/coregrind/pub_core_trampoline.h
===================================================================
--- trunk/coregrind/pub_core_trampoline.h 2011-11-17 21:57:21 UTC (rev 12272)
+++ trunk/coregrind/pub_core_trampoline.h 2011-11-20 09:35:51 UTC (rev 12273)
@@ -93,6 +93,8 @@
#endif
#if defined(VGP_arm_linux)
+extern Addr VG_(arm_linux_SUBST_FOR_sigreturn);
+extern Addr VG_(arm_linux_SUBST_FOR_rt_sigreturn);
extern UInt VG_(arm_linux_REDIR_FOR_strlen)( void* );
//extern void* VG_(arm_linux_REDIR_FOR_index) ( void*, Int );
extern void* VG_(arm_linux_REDIR_FOR_memcpy)( void*, void*, Int );
|