Patch "s390: avoid using global register for current_stack_pointer" has been added to the 6.0-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    s390: avoid using global register for current_stack_pointer

to the 6.0-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     s390-avoid-using-global-register-for-current_stack_p.patch
and it can be found in the queue-6.0 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 5cf034818461de9907d4771b3c827d2f1f728004
Author: Vasily Gorbik <gor@xxxxxxxxxxxxx>
Date:   Fri Nov 4 12:06:47 2022 +0100

    s390: avoid using global register for current_stack_pointer
    
    [ Upstream commit e3c11025bcd2142a61abe5806b2f86a0e78118df ]
    
    Commit 30de14b1884b ("s390: current_stack_pointer shouldn't be a
    function") made current_stack_pointer a global register variable like
    on many other architectures. Unfortunately on s390 it uncovers old
    gcc bug which is fixed only since gcc-9.1 [gcc commit 3ad7fed1cc87
    ("S/390: Fix PR89775. Stackpointer save/restore instructions removed")]
    and backported to gcc-8.4 and later. Due to this bug gcc versions prior
    to 8.4 generate broken code which leads to stack corruptions.
    
    Current minimal gcc version required to build the kernel is declared
    as 5.1. It is not possible to fix all old gcc versions, so work
    around this problem by avoiding using global register variable for
    current_stack_pointer.
    
    Fixes: 30de14b1884b ("s390: current_stack_pointer shouldn't be a function")
    Reviewed-by: Heiko Carstens <hca@xxxxxxxxxxxxx>
    Signed-off-by: Vasily Gorbik <gor@xxxxxxxxxxxxx>
    Signed-off-by: Alexander Gordeev <agordeev@xxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/arch/s390/include/asm/processor.h b/arch/s390/include/asm/processor.h
index bd66f8e34949..00f45d8f1efa 100644
--- a/arch/s390/include/asm/processor.h
+++ b/arch/s390/include/asm/processor.h
@@ -202,7 +202,16 @@ unsigned long __get_wchan(struct task_struct *p);
 /* Has task runtime instrumentation enabled ? */
 #define is_ri_task(tsk) (!!(tsk)->thread.ri_cb)
 
-register unsigned long current_stack_pointer asm("r15");
+/* avoid using global register due to gcc bug in versions < 8.4 */
+#define current_stack_pointer (__current_stack_pointer())
+
+static __always_inline unsigned long __current_stack_pointer(void)
+{
+	unsigned long sp;
+
+	asm volatile("lgr %0,15" : "=d" (sp));
+	return sp;
+}
 
 static __always_inline unsigned short stap(void)
 {



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux