Tested on powerpc64 and powerpc64le, with a glibc build and running the affected glibc's testcase[2], inspected that glibc's backtrace() now gives the correct result and gdb backtrace also keeps working as before.
I believe this should be backported to releases 5.9 and 5.10 as userspace is affected in this releases. ---- 8< ---- A Change[1] in __kernel_sigtramp_rt64 VDSO and trampoline code introduced a regression in the way glibc's backtrace()[2] detects the signal-handler stack frame. Apart from the practical implications, __kernel_sigtram_rt64 was a VDSO with the semantics that it is a function you can call from userspace to end a signal handling. Now this semantics are no longer valid. I believe the aforementioned change affects all releases since 5.9. This patch tries to fix both the semantics and practical aspect of __kernel_sigtramp_rt64 returning it to the previous code, whilst keeping the intended behavior from[1] by adding a new symbol to serve as the jump target from the kernel to the trampoline. Now the trampoline has two parts, an new entry point and the old return point. [1] commit 0138ba5783ae0dcc799ad401a1e8ac8333790df9 ("powerpc/64/signal: Balance return predictor stack in signal trampoline") [2] https://lists.ozlabs.org/pipermail/linuxppc-dev/2021-January/223194.html Fixes: 0138ba5783ae ("powerpc/64/signal: Balance return predictor stack in signal trampoline") Signed-off-by: Raoni Fassina Firmino <ra...@linux.ibm.com> --- arch/powerpc/kernel/vdso64/sigtramp.S | 9 ++++++++- arch/powerpc/kernel/vdso64/vdso64.lds.S | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/arch/powerpc/kernel/vdso64/sigtramp.S b/arch/powerpc/kernel/vdso64/sigtramp.S index bbf68cd01088..f0fd8d2a9fc4 100644 --- a/arch/powerpc/kernel/vdso64/sigtramp.S +++ b/arch/powerpc/kernel/vdso64/sigtramp.S @@ -15,11 +15,18 @@ .text +/* __kernel_start_sigtramp_rt64 and __kernel_sigtramp_rt64 together + are one function split in two parts. The kernel jumps to the former + and the signal handler indirectly (by blr) returns to the latter. + __kernel_sigtramp_rt64 needs to point to the return address so + glibc can correctly identify the trampoline stack frame. */ .balign 8 .balign IFETCH_ALIGN_BYTES -V_FUNCTION_BEGIN(__kernel_sigtramp_rt64) +V_FUNCTION_BEGIN(__kernel_start_sigtramp_rt64) .Lsigrt_start: bctrl /* call the handler */ +V_FUNCTION_END(__kernel_start_sigtramp_rt64) +V_FUNCTION_BEGIN(__kernel_sigtramp_rt64) addi r1, r1, __SIGNAL_FRAMESIZE li r0,__NR_rt_sigreturn sc diff --git a/arch/powerpc/kernel/vdso64/vdso64.lds.S b/arch/powerpc/kernel/vdso64/vdso64.lds.S index 6164d1a1ba11..2f3c359cacd3 100644 --- a/arch/powerpc/kernel/vdso64/vdso64.lds.S +++ b/arch/powerpc/kernel/vdso64/vdso64.lds.S @@ -131,4 +131,4 @@ VERSION /* * Make the sigreturn code visible to the kernel. */ -VDSO_sigtramp_rt64 = __kernel_sigtramp_rt64; +VDSO_sigtramp_rt64 = __kernel_start_sigtramp_rt64; base-commit: 76c057c84d286140c6c416c3b4ba832cd1d8984e -- 2.26.2