From: Jens Remus <jremus@linux.ibm.com>
To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org,
linux-s390@vger.kernel.org, bpf@vger.kernel.org, x86@kernel.org,
Steven Rostedt <rostedt@kernel.org>
Cc: Jens Remus <jremus@linux.ibm.com>,
Heiko Carstens <hca@linux.ibm.com>,
Vasily Gorbik <gor@linux.ibm.com>,
Ilya Leoshkevich <iii@linux.ibm.com>,
Josh Poimboeuf <jpoimboe@kernel.org>,
Masami Hiramatsu <mhiramat@kernel.org>,
Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@kernel.org>, Jiri Olsa <jolsa@kernel.org>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Namhyung Kim <namhyung@kernel.org>,
Thomas Gleixner <tglx@linutronix.de>,
Andrii Nakryiko <andrii@kernel.org>,
Indu Bhagat <indu.bhagat@oracle.com>,
"Jose E. Marchesi" <jemarch@gnu.org>,
Beau Belgrave <beaub@linux.microsoft.com>,
Linus Torvalds <torvalds@linux-foundation.org>,
Andrew Morton <akpm@linux-foundation.org>,
Florian Weimer <fweimer@redhat.com>, Kees Cook <kees@kernel.org>,
"Carlos O'Donell" <codonell@redhat.com>,
Sam James <sam@gentoo.org>, Dylan Hatch <dylanbhatch@google.com>
Subject: [RFC PATCH v2 14/15] unwind_user/backchain: Introduce back chain user space unwinding
Date: Fri, 5 Dec 2025 18:14:45 +0100 [thread overview]
Message-ID: <20251205171446.2814872-15-jremus@linux.ibm.com> (raw)
In-Reply-To: <20251205171446.2814872-1-jremus@linux.ibm.com>
Add support for unwinding of user space using back chain to the
unwind user interface. Use it as secondary fallback for unwinding
using SFrame, if that fails and the primary fallback using frame
pointer is not available.
Signed-off-by: Jens Remus <jremus@linux.ibm.com>
---
Notes (jremus):
Changes in RFC v2:
- Adjusted to latest unwind user enhancements. Does hopefully no longer
appear grafted on.
arch/Kconfig | 6 ++++++
include/linux/unwind_user_backchain.h | 20 ++++++++++++++++++++
include/linux/unwind_user_types.h | 2 ++
kernel/unwind/user.c | 12 ++++++++++++
4 files changed, 40 insertions(+)
create mode 100644 include/linux/unwind_user_backchain.h
diff --git a/arch/Kconfig b/arch/Kconfig
index 7fa89d70b244..37fb78a5e876 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -488,6 +488,12 @@ config AS_SFRAME
config UNWIND_USER
bool
+config HAVE_UNWIND_USER_BACKCHAIN
+ bool
+ select UNWIND_USER
+ help
+ The arch supports unwinding of user space using back chain.
+
config HAVE_UNWIND_USER_FP
bool
select UNWIND_USER
diff --git a/include/linux/unwind_user_backchain.h b/include/linux/unwind_user_backchain.h
new file mode 100644
index 000000000000..e7a8e584b13f
--- /dev/null
+++ b/include/linux/unwind_user_backchain.h
@@ -0,0 +1,20 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _LINUX_UNWIND_USER_BACKCHAIN_H
+#define _LINUX_UNWIND_USER_BACKCHAIN_H
+
+struct unwind_user_state;
+
+#ifdef CONFIG_HAVE_UNWIND_USER_BACKCHAIN
+
+extern int arch_unwind_user_next_backchain(struct unwind_user_state *state);
+
+#else /* !CONFIG_HAVE_UNWIND_USER_BACKCHAIN */
+
+static inline int arch_unwind_user_next_backchain(struct unwind_user_state *state)
+{
+ return -EINVAL;
+}
+
+#endif /* !CONFIG_HAVE_UNWIND_USER_BACKCHAIN */
+
+#endif /* _LINUX_UNWIND_USER_BACKCHAIN_H */
diff --git a/include/linux/unwind_user_types.h b/include/linux/unwind_user_types.h
index 6efc12b6e831..b44502e90b7f 100644
--- a/include/linux/unwind_user_types.h
+++ b/include/linux/unwind_user_types.h
@@ -11,6 +11,7 @@
enum unwind_user_type_bits {
UNWIND_USER_TYPE_SFRAME_BIT = 0,
UNWIND_USER_TYPE_FP_BIT = 1,
+ UNWIND_USER_TYPE_BACKCHAIN_BIT = 2,
NR_UNWIND_USER_TYPE_BITS,
};
@@ -20,6 +21,7 @@ enum unwind_user_type {
UNWIND_USER_TYPE_NONE = 0,
UNWIND_USER_TYPE_SFRAME = BIT(UNWIND_USER_TYPE_SFRAME_BIT),
UNWIND_USER_TYPE_FP = BIT(UNWIND_USER_TYPE_FP_BIT),
+ UNWIND_USER_TYPE_BACKCHAIN = BIT(UNWIND_USER_TYPE_BACKCHAIN_BIT),
};
struct unwind_stacktrace {
diff --git a/kernel/unwind/user.c b/kernel/unwind/user.c
index 122045cb411f..5b4649bc91ba 100644
--- a/kernel/unwind/user.c
+++ b/kernel/unwind/user.c
@@ -6,6 +6,7 @@
#include <linux/sched.h>
#include <linux/sched/task_stack.h>
#include <linux/unwind_user.h>
+#include <linux/unwind_user_backchain.h>
#include <linux/uaccess.h>
#include <linux/sframe.h>
@@ -105,6 +106,11 @@ static int unwind_user_next_common(struct unwind_user_state *state,
return 0;
}
+static int unwind_user_next_backchain(struct unwind_user_state *state)
+{
+ return arch_unwind_user_next_backchain(state);
+}
+
static int unwind_user_next_fp(struct unwind_user_state *state)
{
struct pt_regs *regs = task_pt_regs(current);
@@ -159,6 +165,10 @@ static int unwind_user_next(struct unwind_user_state *state)
if (!unwind_user_next_fp(state))
return 0;
continue;
+ case UNWIND_USER_TYPE_BACKCHAIN:
+ if (!unwind_user_next_backchain(state))
+ return 0;
+ continue; /* Try next method. */
default:
WARN_ONCE(1, "Undefined unwind bit %d", bit);
break;
@@ -187,6 +197,8 @@ static int unwind_user_start(struct unwind_user_state *state)
state->available_types |= UNWIND_USER_TYPE_SFRAME;
if (IS_ENABLED(CONFIG_HAVE_UNWIND_USER_FP))
state->available_types |= UNWIND_USER_TYPE_FP;
+ if (IS_ENABLED(CONFIG_HAVE_UNWIND_USER_BACKCHAIN))
+ state->available_types |= UNWIND_USER_TYPE_BACKCHAIN;
state->ip = instruction_pointer(regs);
state->sp = user_stack_pointer(regs);
--
2.51.0
next prev parent reply other threads:[~2025-12-05 17:15 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-05 17:14 [RFC PATCH v2 00/15] s390: SFrame user space unwinding Jens Remus
2025-12-05 17:14 ` [RFC PATCH v2 01/15] unwind_user: Enhance comments on get CFA, FP, and RA Jens Remus
2025-12-05 17:14 ` [RFC PATCH v2 02/15] unwind_user/fp: Use dummies instead of ifdef Jens Remus
2025-12-05 17:14 ` [RFC PATCH v2 03/15] x86/unwind_user: Guard unwind_user_word_size() by UNWIND_USER Jens Remus
2025-12-05 17:23 ` Linus Torvalds
2025-12-05 17:14 ` [RFC PATCH v2 04/15] s390: asm/dwarf.h should only be included in assembly files Jens Remus
2025-12-05 17:14 ` [RFC PATCH v2 05/15] s390/vdso: Avoid emitting DWARF CFI for non-vDSO Jens Remus
2025-12-05 17:14 ` [RFC PATCH v2 06/15] s390/vdso: Keep function symbols in vDSO Jens Remus
2025-12-05 17:14 ` [RFC PATCH v2 07/15] s390/vdso: Enable SFrame generation " Jens Remus
2025-12-05 17:14 ` [RFC PATCH v2 08/15] unwind_user: Enable archs that define CFA = SP_callsite + offset Jens Remus
2025-12-05 17:14 ` [RFC PATCH v2 09/15] unwind_user: Enable archs that pass RA in a register Jens Remus
2025-12-05 17:14 ` [RFC PATCH v2 10/15] unwind_user: Enable archs that save RA/FP in other registers Jens Remus
2025-12-05 17:14 ` [RFC PATCH v2 11/15] unwind_user/sframe: Enable archs with encoded SFrame CFA offsets Jens Remus
2025-12-05 17:14 ` [RFC PATCH v2 12/15] s390/ptrace: Provide frame_pointer() Jens Remus
2025-12-05 17:14 ` [RFC PATCH v2 13/15] s390/unwind_user/sframe: Enable HAVE_UNWIND_USER_SFRAME Jens Remus
2025-12-05 17:14 ` Jens Remus [this message]
2025-12-07 15:10 ` [RFC PATCH v2 14/15] unwind_user/backchain: Introduce back chain user space unwinding Josh Poimboeuf
2025-12-08 15:38 ` Jens Remus
2025-12-05 17:14 ` [RFC PATCH v2 15/15] s390/unwind_user/backchain: Enable HAVE_UNWIND_USER_BACKCHAIN Jens Remus
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=20251205171446.2814872-15-jremus@linux.ibm.com \
--to=jremus@linux.ibm.com \
--cc=acme@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=andrii@kernel.org \
--cc=beaub@linux.microsoft.com \
--cc=bpf@vger.kernel.org \
--cc=codonell@redhat.com \
--cc=dylanbhatch@google.com \
--cc=fweimer@redhat.com \
--cc=gor@linux.ibm.com \
--cc=hca@linux.ibm.com \
--cc=iii@linux.ibm.com \
--cc=indu.bhagat@oracle.com \
--cc=jemarch@gnu.org \
--cc=jolsa@kernel.org \
--cc=jpoimboe@kernel.org \
--cc=kees@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=mhiramat@kernel.org \
--cc=mingo@kernel.org \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
--cc=rostedt@kernel.org \
--cc=sam@gentoo.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
--cc=x86@kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox