s390/entry: Fix last breaking event handling in case of stack corruption
authorHeiko Carstens <hca@linux.ibm.com>
Thu, 24 Apr 2025 15:07:01 +0000 (17:07 +0200)
committerHeiko Carstens <hca@linux.ibm.com>
Mon, 5 May 2025 13:46:34 +0000 (15:46 +0200)
In case of stack corruption stack_invalid() is called and the expectation
is that register r10 contains the last breaking event address. This
dependency is quite subtle and broke a couple of years ago without that
anybody noticed.

Fix this by getting rid of the dependency and read the last breaking event
address from lowcore.

Fixes: 56e62a737028 ("s390: convert to generic entry")
Acked-by: Ilya Leoshkevich <iii@linux.ibm.com>
Reviewed-by: Alexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
arch/s390/kernel/entry.S

index dd291c9ad6a61bb05dc88c4da0001e842454bed8..9980c17ba22d956cb2d3b8f0f8e5e3564884eb34 100644 (file)
@@ -602,7 +602,8 @@ SYM_CODE_START(stack_invalid)
        stmg    %r0,%r7,__PT_R0(%r11)
        stmg    %r8,%r9,__PT_PSW(%r11)
        mvc     __PT_R8(64,%r11),0(%r14)
-       stg     %r10,__PT_ORIG_GPR2(%r11) # store last break to orig_gpr2
+       GET_LC  %r2
+       mvc     __PT_ORIG_GPR2(8,%r11),__LC_PGM_LAST_BREAK(%r2)
        xc      __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
        lgr     %r2,%r11                # pass pointer to pt_regs
        jg      kernel_stack_invalid