From b2a3d1367fff1ba60825edbccdc5cd429104b5c6 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 10 Feb 2021 15:28:26 +0100 Subject: [PATCH] 5.10-stable patches added patches: powerpc-64-signal-fix-regression-in-__kernel_sigtramp_rt64-semantics.patch --- ...-in-__kernel_sigtramp_rt64-semantics.patch | 87 +++++++++++++++++++ queue-5.10/series | 1 + 2 files changed, 88 insertions(+) create mode 100644 queue-5.10/powerpc-64-signal-fix-regression-in-__kernel_sigtramp_rt64-semantics.patch diff --git a/queue-5.10/powerpc-64-signal-fix-regression-in-__kernel_sigtramp_rt64-semantics.patch b/queue-5.10/powerpc-64-signal-fix-regression-in-__kernel_sigtramp_rt64-semantics.patch new file mode 100644 index 00000000000..a18c7f1f202 --- /dev/null +++ b/queue-5.10/powerpc-64-signal-fix-regression-in-__kernel_sigtramp_rt64-semantics.patch @@ -0,0 +1,87 @@ +From 24321ac668e452a4942598533d267805f291fdc9 Mon Sep 17 00:00:00 2001 +From: Raoni Fassina Firmino +Date: Mon, 1 Feb 2021 17:05:05 -0300 +Subject: powerpc/64/signal: Fix regression in __kernel_sigtramp_rt64() semantics + +From: Raoni Fassina Firmino + +commit 24321ac668e452a4942598533d267805f291fdc9 upstream. + +Commit 0138ba5783ae ("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 0138ba5783ae 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: 0138ba5783ae ("powerpc/64/signal: Balance return predictor stack in signal trampoline") +Cc: stable@vger.kernel.org # v5.9+ +Signed-off-by: Raoni Fassina Firmino +Acked-by: Nicholas Piggin +[mpe: Minor tweaks to change log formatting, add stable tag] +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20210201200505.iz46ubcizipnkcxe@work-tp +Signed-off-by: Greg Kroah-Hartman + +--- + arch/powerpc/kernel/vdso.c | 2 +- + arch/powerpc/kernel/vdso64/sigtramp.S | 11 ++++++++++- + arch/powerpc/kernel/vdso64/vdso64.lds.S | 1 + + 3 files changed, 12 insertions(+), 2 deletions(-) + +--- a/arch/powerpc/kernel/vdso.c ++++ b/arch/powerpc/kernel/vdso.c +@@ -475,7 +475,7 @@ static __init void vdso_setup_trampoline + */ + + #ifdef CONFIG_PPC64 +- vdso64_rt_sigtramp = find_function64(v64, "__kernel_sigtramp_rt64"); ++ vdso64_rt_sigtramp = find_function64(v64, "__kernel_start_sigtramp_rt64"); + #endif + vdso32_sigtramp = find_function32(v32, "__kernel_sigtramp32"); + vdso32_rt_sigtramp = find_function32(v32, "__kernel_sigtramp_rt32"); +--- a/arch/powerpc/kernel/vdso64/sigtramp.S ++++ b/arch/powerpc/kernel/vdso64/sigtramp.S +@@ -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 +--- a/arch/powerpc/kernel/vdso64/vdso64.lds.S ++++ b/arch/powerpc/kernel/vdso64/vdso64.lds.S +@@ -150,6 +150,7 @@ VERSION + __kernel_get_tbfreq; + __kernel_sync_dicache; + __kernel_sync_dicache_p5; ++ __kernel_start_sigtramp_rt64; + __kernel_sigtramp_rt64; + __kernel_getcpu; + __kernel_time; diff --git a/queue-5.10/series b/queue-5.10/series index 613ee3e80fc..6ec97340386 100644 --- a/queue-5.10/series +++ b/queue-5.10/series @@ -15,3 +15,4 @@ io_uring-fix-sqo-ownership-false-positive-warning.patch io_uring-reinforce-cancel-on-flush-during-exit.patch io_uring-drop-mm-files-between-task_work_submit.patch gpiolib-cdev-clear-debounce-period-if-line-set-to-output.patch +powerpc-64-signal-fix-regression-in-__kernel_sigtramp_rt64-semantics.patch -- 2.47.2