Skip to content

Commit 24321ac

Browse files
Raoni Fassina Firminompe
authored andcommitted
powerpc/64/signal: Fix regression in __kernel_sigtramp_rt64() semantics
Commit 0138ba5 ("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 0138ba5 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: 0138ba5 ("powerpc/64/signal: Balance return predictor stack in signal trampoline") Cc: [email protected] # v5.9+ Signed-off-by: Raoni Fassina Firmino <[email protected]> Acked-by: Nicholas Piggin <[email protected]> [mpe: Minor tweaks to change log formatting, add stable tag] Signed-off-by: Michael Ellerman <[email protected]> Link: https://lore.kernel.org/r/20210201200505.iz46ubcizipnkcxe@work-tp
1 parent 66f0a9e commit 24321ac

File tree

2 files changed

+11
-2
lines changed

2 files changed

+11
-2
lines changed

arch/powerpc/kernel/vdso64/sigtramp.S

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,20 @@
1515

1616
.text
1717

18+
/*
19+
* __kernel_start_sigtramp_rt64 and __kernel_sigtramp_rt64 together
20+
* are one function split in two parts. The kernel jumps to the former
21+
* and the signal handler indirectly (by blr) returns to the latter.
22+
* __kernel_sigtramp_rt64 needs to point to the return address so
23+
* glibc can correctly identify the trampoline stack frame.
24+
*/
1825
.balign 8
1926
.balign IFETCH_ALIGN_BYTES
20-
V_FUNCTION_BEGIN(__kernel_sigtramp_rt64)
27+
V_FUNCTION_BEGIN(__kernel_start_sigtramp_rt64)
2128
.Lsigrt_start:
2229
bctrl /* call the handler */
30+
V_FUNCTION_END(__kernel_start_sigtramp_rt64)
31+
V_FUNCTION_BEGIN(__kernel_sigtramp_rt64)
2332
addi r1, r1, __SIGNAL_FRAMESIZE
2433
li r0,__NR_rt_sigreturn
2534
sc

arch/powerpc/kernel/vdso64/vdso64.lds.S

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,4 +131,4 @@ VERSION
131131
/*
132132
* Make the sigreturn code visible to the kernel.
133133
*/
134-
VDSO_sigtramp_rt64 = __kernel_sigtramp_rt64;
134+
VDSO_sigtramp_rt64 = __kernel_start_sigtramp_rt64;

0 commit comments

Comments
 (0)