Skip to content

Commit e3c1102

Browse files
Vasily GorbikAlexander Gordeev
authored andcommitted
s390: avoid using global register for current_stack_pointer
Commit 30de14b ("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: 30de14b ("s390: current_stack_pointer shouldn't be a function") Reviewed-by: Heiko Carstens <[email protected]> Signed-off-by: Vasily Gorbik <[email protected]> Signed-off-by: Alexander Gordeev <[email protected]>
1 parent a41a11b commit e3c1102

File tree

1 file changed

+10
-1
lines changed

1 file changed

+10
-1
lines changed

arch/s390/include/asm/processor.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,16 @@ unsigned long __get_wchan(struct task_struct *p);
199199
/* Has task runtime instrumentation enabled ? */
200200
#define is_ri_task(tsk) (!!(tsk)->thread.ri_cb)
201201

202-
register unsigned long current_stack_pointer asm("r15");
202+
/* avoid using global register due to gcc bug in versions < 8.4 */
203+
#define current_stack_pointer (__current_stack_pointer())
204+
205+
static __always_inline unsigned long __current_stack_pointer(void)
206+
{
207+
unsigned long sp;
208+
209+
asm volatile("lgr %0,15" : "=d" (sp));
210+
return sp;
211+
}
203212

204213
static __always_inline unsigned short stap(void)
205214
{

0 commit comments

Comments
 (0)