Commit 24321ac6 authored by Raoni Fassina Firmino's avatar Raoni Fassina Firmino Committed by Michael Ellerman
Browse files

powerpc/64/signal: Fix regression in __kernel_sigtramp_rt64() semantics

Commit 0138ba57 ("powerpc/64/signal: Balance return predictor
stack in signal trampoline") changed __kernel_sigtramp_rt64() VDSO and
trampoline code, and introduced a regression in the way glibc's
backtrace()[1] detects the signal-handler stack frame. Apart from the
practical implications, __kernel_sigtramp_rt64() was a VDSO function
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 behaviour of 0138ba57 by adding a new symbol
to serve as the jump target from the kernel to the trampoline. Now the
trampoline has two parts, a new entry point and the old return point.

[1] https://lists.ozlabs.org/pipermail/linuxppc-dev/2021-January/223194.html



Fixes: 0138ba57 ("powerpc/64/signal: Balance return predictor stack in signal trampoline")
Cc: stable@vger.kernel.org # v5.9+
Signed-off-by: default avatarRaoni Fassina Firmino <raoni@linux.ibm.com>
Acked-by: default avatarNicholas Piggin <npiggin@gmail.com>
[mpe: Minor tweaks to change log formatting, add stable tag]
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20210201200505.iz46ubcizipnkcxe@work-tp
parent 66f0a9e0
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -15,11 +15,20 @@

	.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
+1 −1
Original line number Diff line number Diff line
@@ -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;