From: Matt Turner <[email protected]>
With the vdso, default_sigreturn and default_rt_sigreturn point at
__kernel_sigreturn and __kernel_rt_sigreturn and setup_sigtramp() is no
longer used. The vdso trampolines load the syscall number with mov.l
instead of the kernel's mov.w/trapa/or r0,r0 sequence, which undoes
commit 9ac5aa7227 ("linux-user/sh4: Fix setup_sigtramp to match Linux
kernel trampoline pattern"): libunwind's unw_is_signal_frame() no longer
recognizes the signal frame, so unwinding through a signal handler stops
there.
Use the sequence from the kernel's own vdso,
arch/sh/kernel/vsyscall/vsyscall-sigreturn.S.
Fixes: 975bd51a88 ("linux-user/sh4: add VDSO support for sh4 and sh4eb")
Cc: [email protected]
Signed-off-by: Matt Turner <[email protected]>
Reviewed-by: Helge Deller <[email protected]>
Signed-off-by: Helge Deller <[email protected]>
---
linux-user/sh4/vdso-be.so | Bin 2704 -> 2720 bytes
linux-user/sh4/vdso-le.so | Bin 2704 -> 2720 bytes
linux-user/sh4/vdso.S | 26 ++++++++++++++++++--------
3 files changed, 18 insertions(+), 8 deletions(-)
diff --git a/linux-user/sh4/vdso-be.so b/linux-user/sh4/vdso-be.so
index
4f50143f8284ab63693c1117e68f3efa886155e3..bc1fb37e1089b7aa5612da0039e24193b156b3d8
100755
GIT binary patch
delta 194
zcmbOrx<GV-GNZyo6=&8T3=AwkCgxO#v^^7IdSMZuBqF1%9rYmk#g%V{*C+nCEhr$w
zz`(=6z>vYf!19cNfk9yN6UOaK%t{QNljpHmC{1QPETF&*gAC<p{Iv|6lM@-mC;w-8
z!1!(Q1J-<2uo;s>*zEZrCMPE+g;si2C2d~Fmd4B&GMR%*neoSD9WHgo6_Z1_)J119
NFfg<*AOItX2>?A$F(&{3
delta 178
zcmZ1=Ize=TGNZsm6=&8L3=AwUCgxO#6if>*aPh9(e`{gllH+YV4J~=!giQQ#TaZhL
zfq{pCfgyu|f#m@M0|UqACyd*fm_-=eCeLHB5W38GSb%|(fq|j?GQ(j31_p+;lM@-m
zC-bvDV0<z818Y7jSkL4XHhVsZNy*7YQI?S@>6<sQr7<(QOqSqMW_&T(hD)7s#^e+(
Qb<s`+28I>}1YiU)0VjPgU;qFB
diff --git a/linux-user/sh4/vdso-le.so b/linux-user/sh4/vdso-le.so
index
c41cb5831b9e5883a64564da8b2149a33e199f4f..c1ff560cc165413d7b07aa873225bd92afb8569e
100755
GIT binary patch
delta 202
zcmbOrx<GV-0;9r2MQ7F@EDQ`kCT3QP?EQGW?V6EbjpN0Ka-A|h8NXg^nl$mp4M710
z1_mJp9)=7C28L%W3=9IBA2M!dVpC#ZU|{f^Jdedfk#(}bVQvK&EN4LFuVvtzoX99T
z`47tj#&47FvgWgbO_?0XW)C-;AvxK|)6&>Db@M{DWM;;Y$*f$;j6Wu8a;Y<}m>kHZ
RE-{mxfuRLtBNQ+~834g&GJ*gA
delta 184
zcmZ1=Ize=T0;9l0MQ7F*EDQ`UCT3QPl&)2g-L`IF)#Kt%zJj4I-B(^c;xzHc4M8pj
z1_mJp9)=7C28IVL3=ABbA2M!dViRFtU|?{YJdeeKpYgK5VNQl}kicbu!)qreGKx>;
zVST{(V)9$od{(fY$%$<CaFZC4lPkSUBf_#aZ)8hmW^|b>%B9TsVzMQdI^&GViCpRu
Qo$L$@Eg<8dfDy_70CGt$_W%F@
diff --git a/linux-user/sh4/vdso.S b/linux-user/sh4/vdso.S
index 4fb5ee9d31..1faa665774 100644
--- a/linux-user/sh4/vdso.S
+++ b/linux-user/sh4/vdso.S
@@ -43,6 +43,22 @@ vdso_syscall __vdso_clock_gettime64, __NR_clock_gettime64
vdso_syscall __vdso_clock_getres, __NR_clock_getres
vdso_syscall __vdso_gettimeofday, __NR_gettimeofday
+/*
+ * Same instruction sequence as the kernel's
+ * arch/sh/kernel/vsyscall/vsyscall-sigreturn.S. libunwind matches these
+ * bytes to recognize a signal frame.
+ */
+.macro sigreturn_tramp nr
+ mov.w 1f, r3
+ trapa #0x10
+ or r0, r0
+ or r0, r0
+ or r0, r0
+ or r0, r0
+ or r0, r0
+1: .word \nr
+.endm
+
/*
* Signal return trampolines.
*
@@ -122,20 +138,14 @@ vdso_syscall __vdso_gettimeofday, __NR_gettimeofday
sigreturn_region_start:
__kernel_sigreturn:
- mov.l 1f, r3
- trapa #0x10
- .align 2
-1: .long __NR_sigreturn
+ sigreturn_tramp __NR_sigreturn
endf __kernel_sigreturn
/* Update CFA base for the rt_sigreturn frame layout. */
.cfi_def_cfa_offset RT_SIGFRAME_SC_OFFSET
__kernel_rt_sigreturn:
- mov.l 2f, r3
- trapa #0x10
- .align 2
-2: .long __NR_rt_sigreturn
+ sigreturn_tramp __NR_rt_sigreturn
endf __kernel_rt_sigreturn
sigreturn_region_end:
--
2.54.0