All of lore.kernel.org
 help / color / mirror / Atom feed
From: Heiko Carstens <hca@linux.ibm.com>
To: Alexander Gordeev <agordeev@linux.ibm.com>,
	Sven Schnelle <svens@linux.ibm.com>,
	Vasily Gorbik <gor@linux.ibm.com>,
	Christian Borntraeger <borntraeger@linux.ibm.com>
Cc: linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org
Subject: [PATCH 2/2] s390/entry: Save lowcore on invalid kernel stack
Date: Fri,  2 Oct 2026 17:20:55 +0200	[thread overview]
Message-ID: <20261002152055.3305184-3-hca@linux.ibm.com> (raw)
In-Reply-To: <20261002152055.3305184-1-hca@linux.ibm.com>

In case of an invalid kernel stack copy the current CPU's lowcore to
stack_invalid_lowcore, so it is available to debug tools after a crash.

The copy is helpful since the lowcore is modified e.g., when printing
messages before a dump is taken. Keep it as unmodified as possible and
as close to the event that caused register corruption.

Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
---
 arch/s390/kernel/entry.S | 15 +++++++++++++++
 arch/s390/kernel/entry.h |  4 ++++
 arch/s390/kernel/traps.c |  6 ++++++
 3 files changed, 25 insertions(+)

diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S
index 4e99ed559dbd..7346f8ad7f91 100644
--- a/arch/s390/kernel/entry.S
+++ b/arch/s390/kernel/entry.S
@@ -21,6 +21,7 @@
 #include <asm/thread_info.h>
 #include <asm/asm-offsets.h>
 #include <asm/unistd.h>
+#include <asm/lowcore.h>
 #include <asm/page.h>
 #include <asm/sigp.h>
 #include <asm/bug.h>
@@ -613,6 +614,8 @@ SYM_CODE_END(early_pgm_check_handler)
  * The synchronous or the asynchronous stack pointer is invalid. We are dead.
  * No need to properly save the registers, we are going to panic anyway.
  * Setup a pt_regs so that show_trace can provide a good call trace.
+ * Copy lowcore of the current CPU to stack_invalid_lowcore before it
+ * is modified by printing debug messages and crash handling.
  */
 SYM_CODE_START(stack_invalid)
 	GET_LC	%r15
@@ -623,6 +626,18 @@ SYM_CODE_START(stack_invalid)
 	mvc	__PT_R8(64,%r11),0(%r14)
 	GET_LC	%r2
 	mvc	__PT_LAST_BREAK(8,%r11),__LC_PGM_LAST_BREAK(%r2)
+	/* copy lowcore; skip if used by another CPU */
+	larl	%r4,stack_invalid_lowcore_used
+	lhi	%r1,0
+	lhi	%r3,1
+	cs	%r1,%r3,0(%r4)
+	jne	.Lskip
+	larl	%r0,stack_invalid_lowcore
+	lghi	%r1,LC_PAGES * PAGE_SIZE
+	lgr	%r4,%r2
+	lgr	%r5,%r1
+	mvcl	%r0,%r4
+.Lskip:
 	xc	__SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
 	lgr	%r2,%r11		# pass pointer to pt_regs
 	jg	kernel_stack_invalid
diff --git a/arch/s390/kernel/entry.h b/arch/s390/kernel/entry.h
index dc84ab497251..5d6685e5bf5f 100644
--- a/arch/s390/kernel/entry.h
+++ b/arch/s390/kernel/entry.h
@@ -11,6 +11,7 @@
 #include <linux/types.h>
 #include <linux/signal.h>
 #include <asm/extable.h>
+#include <asm/lowcore.h>
 #include <asm/ptrace.h>
 #include <asm/idle.h>
 
@@ -64,6 +65,9 @@ long sys_s390_sthyi(unsigned long function_code, void __user *buffer, u64 __user
 unsigned long stack_alloc(void);
 void stack_free(unsigned long stack);
 
+extern int stack_invalid_lowcore_used;
+extern struct lowcore stack_invalid_lowcore;
+
 extern char kprobes_insn_page[];
 
 extern char _samode31[], _eamode31[];
diff --git a/arch/s390/kernel/traps.c b/arch/s390/kernel/traps.c
index b6ba4465f59d..cd55729e5f8a 100644
--- a/arch/s390/kernel/traps.c
+++ b/arch/s390/kernel/traps.c
@@ -283,6 +283,12 @@ static void monitor_event_exception(struct pt_regs *regs)
 	}
 }
 
+/*
+ * Content of the faulting CPU's lowcore, copied by stack_invalid().
+ */
+struct lowcore stack_invalid_lowcore;
+int stack_invalid_lowcore_used;
+
 void kernel_stack_invalid(struct pt_regs *regs)
 {
 	/*
-- 
2.53.0


  parent reply	other threads:[~2026-10-02 15:21 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-02 15:20 [PATCH 0/2] s390: Improve handling for stack register corruption Heiko Carstens
2026-10-02 15:20 ` [PATCH 1/2] s390/entry: Last breaking event vs invalid kernel stack Heiko Carstens
2026-10-03  1:33   ` sashiko-bot
2026-10-13  7:56   ` Alexander Gordeev
2026-10-02 15:20 ` Heiko Carstens [this message]
2026-10-03  1:33   ` [PATCH 2/2] s390/entry: Save lowcore on " sashiko-bot
2026-10-13 11:55   ` Alexander Gordeev

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20261002152055.3305184-3-hca@linux.ibm.com \
    --to=hca@linux.ibm.com \
    --cc=agordeev@linux.ibm.com \
    --cc=borntraeger@linux.ibm.com \
    --cc=gor@linux.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=svens@linux.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.