From: Jens Remus <jremus@linux.ibm.com>
To: linux-kernel@vger.kernel.org, linux-trace-kernel@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>,
Masami Hiramatsu <mhiramat@kernel.org>,
Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
Josh Poimboeuf <jpoimboe@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@kernel.org>, Jiri Olsa <jolsa@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>,
Jens Axboe <axboe@kernel.dk>, Florian Weimer <fweimer@redhat.com>,
Sam James <sam@gentoo.org>
Subject: [RFC PATCH v1 13/16] s390/unwind_user/backchain: Enable HAVE_UNWIND_USER_BACKCHAIN
Date: Thu, 10 Jul 2025 18:35:19 +0200 [thread overview]
Message-ID: <20250710163522.3195293-14-jremus@linux.ibm.com> (raw)
In-Reply-To: <20250710163522.3195293-1-jremus@linux.ibm.com>
Enable unwinding of user space using back chain on s390. Based on
arch_stack_walk_user_common() in arch/s390/kernel/stacktrace.c.
Signed-off-by: Jens Remus <jremus@linux.ibm.com>
---
arch/s390/Kconfig | 1 +
arch/s390/include/asm/unwind_user_backchain.h | 127 ++++++++++++++++++
2 files changed, 128 insertions(+)
create mode 100644 arch/s390/include/asm/unwind_user_backchain.h
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig
index 8b29a8f0f9c3..49f231123040 100644
--- a/arch/s390/Kconfig
+++ b/arch/s390/Kconfig
@@ -239,6 +239,7 @@ config S390
select HAVE_SETUP_PER_CPU_AREA
select HAVE_SOFTIRQ_ON_OWN_STACK
select HAVE_SYSCALL_TRACEPOINTS
+ select HAVE_UNWIND_USER_BACKCHAIN
select HAVE_UNWIND_USER_LOC_REG
select HAVE_UNWIND_USER_SFRAME
select HAVE_USER_RA_REG
diff --git a/arch/s390/include/asm/unwind_user_backchain.h b/arch/s390/include/asm/unwind_user_backchain.h
new file mode 100644
index 000000000000..ceb56b9d8411
--- /dev/null
+++ b/arch/s390/include/asm/unwind_user_backchain.h
@@ -0,0 +1,127 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _ASM_S390_UNWIND_USER_BACKCHAIN_H
+#define _ASM_S390_UNWIND_USER_BACKCHAIN_H
+
+#include <linux/security.h>
+#ifndef ASM_OFFSETS_C
+#include <asm/asm-offsets.h>
+#endif
+
+struct stack_frame_user {
+ unsigned long backchain;
+ unsigned long unused;
+ /* Argument register save area. */
+ unsigned long r2;
+ unsigned long r3;
+ unsigned long r4;
+ unsigned long r5;
+ unsigned long r6;
+ /* Other register save area. */
+ unsigned long r7;
+ unsigned long r8;
+ unsigned long r9;
+ unsigned long r10;
+ unsigned long r11;
+ unsigned long r12;
+ unsigned long r13;
+ unsigned long r14;
+ unsigned long r15;
+ /* FP argument register save area. */
+ unsigned long f0;
+ unsigned long f2;
+ unsigned long f4;
+ unsigned long f6;
+};
+
+struct stack_frame_vdso_wrapper {
+ struct stack_frame_user sf;
+ unsigned long return_address;
+};
+
+/**
+ * ip_invalid - Perform some basic checks whether an instruction pointer (IP)
+ * taken from an unreliable source is invalid
+ * @ip: The instruction pointer to be validated
+ *
+ * returns whether the instruction pointer is invalid
+ */
+static inline bool ip_invalid(unsigned long ip)
+{
+ if (ip & 1)
+ return true;
+ if (ip < mmap_min_addr)
+ return true;
+ if (ip >= current->mm->context.asce_limit)
+ return true;
+ return false;
+}
+
+/**
+ * ip_within_vdso - Check whether an instruction pointer (IP) is within vDSO
+ * @ip: The instruction pointer
+ *
+ * returns whether the instruction pointer is within vDSO
+ */
+static inline bool ip_within_vdso(unsigned long ip)
+{
+ return in_range(ip, current->mm->context.vdso_base, vdso_text_size());
+}
+
+/**
+ * arch_unwind_user_backchain_next - Unwind one frame using backchain
+ * @state: The unwind user state
+ *
+ * returns zero when successful, otherwise -EINVAL.
+ */
+static inline int arch_unwind_user_backchain_next(struct unwind_user_state *state)
+{
+ struct stack_frame_user __user *sf;
+ unsigned long sp, ra;
+
+ sf = (void __user *)state->sp;
+ if (__get_user(sp, (unsigned long __user *)&sf->backchain))
+ return -EINVAL;
+
+ /*
+ * vDSO entry code on s390 has a non-standard stack frame layout.
+ * See vDSO user wrapper code for details.
+ */
+ if (!sp && ip_within_vdso(state->ip)) {
+ struct stack_frame_vdso_wrapper *sf_vdso = (void __user *)sf;
+
+ if (__get_user(ra, (unsigned long __user *)&sf_vdso->return_address))
+ return -EINVAL;
+ sf = (void __user *)((unsigned long)sf + STACK_FRAME_VDSO_OVERHEAD);
+ if (__get_user(sp, (unsigned long __user *)&sf->backchain))
+ return -EINVAL;
+ } else {
+ sf = (void __user *)sp;
+ if (__get_user(ra, (unsigned long __user *)&sf->r14))
+ return -EINVAL;
+ }
+
+ /* ABI requires SP to be 8-byte aligned. */
+ if (sp & 0x7)
+ return -EINVAL;
+
+ /*
+ * If the IP is invalid and this is the topmost frame,
+ * assume the RA register has not been saved yet.
+ */
+ if (ip_invalid(ra)) {
+ if (!state->topmost || !IS_ENABLED(CONFIG_HAVE_USER_RA_REG))
+ return -EINVAL;
+
+ ra = user_return_address(task_pt_regs(current));
+ if (ip_invalid(ra))
+ return -EINVAL;
+ }
+
+ state->sp = sp;
+ state->ip = ra;
+ state->fp = 0;
+
+ return 0;
+}
+
+#endif /* _ASM_S390_UNWIND_USER_BACKCHAIN_H */
--
2.48.1
next prev parent reply other threads:[~2025-07-10 16:35 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-10 16:35 [RFC PATCH v1 00/16] s390: SFrame user space unwinding Jens Remus
2025-07-10 16:35 ` [RFC PATCH v1 01/16] fixup! unwind_user: Add frame pointer support Jens Remus
2025-07-10 16:35 ` [RFC PATCH v1 02/16] s390: asm/dwarf.h should only be included in assembly files Jens Remus
2025-07-10 16:35 ` [RFC PATCH v1 03/16] s390/vdso: Avoid emitting DWARF CFI for non-vDSO Jens Remus
2025-07-10 16:35 ` [RFC PATCH v1 04/16] s390/vdso: Enable SFrame generation in vDSO Jens Remus
2025-07-10 16:35 ` [RFC PATCH v1 05/16] s390/vdso: Keep function symbols " Jens Remus
2025-07-10 16:35 ` [RFC PATCH v1 06/16] unwind_user: Enable archs that define CFA = SP_callsite + offset Jens Remus
2025-07-16 21:32 ` Josh Poimboeuf
2025-07-17 9:27 ` Jens Remus
2025-07-18 4:51 ` Josh Poimboeuf
2025-07-10 16:35 ` [RFC PATCH v1 07/16] unwind_user: Enable archs that do not necessarily save RA Jens Remus
2025-07-16 23:01 ` Josh Poimboeuf
2025-07-17 11:09 ` Jens Remus
2025-07-18 8:28 ` Jens Remus
2025-07-18 16:59 ` Josh Poimboeuf
2025-07-21 14:25 ` Jens Remus
2025-07-10 16:35 ` [RFC PATCH v1 08/16] unwind_user: Enable archs that save RA/FP in other registers Jens Remus
2025-07-17 2:01 ` Josh Poimboeuf
2025-07-17 2:50 ` Josh Poimboeuf
2025-07-17 12:07 ` Jens Remus
2025-07-18 4:52 ` Josh Poimboeuf
2025-07-17 3:57 ` Steven Rostedt
2025-07-17 7:24 ` Josh Poimboeuf
2025-07-17 12:05 ` Steven Rostedt
2025-07-17 11:28 ` Jens Remus
2025-07-17 12:10 ` Steven Rostedt
2025-07-18 4:51 ` Josh Poimboeuf
2025-07-10 16:35 ` [RFC PATCH v1 09/16] unwind_user/sframe: Enable archs with encoded SFrame CFA offsets Jens Remus
2025-07-10 16:35 ` [RFC PATCH v1 10/16] s390/ptrace: Enable HAVE_USER_RA_REG Jens Remus
2025-07-10 16:35 ` [RFC PATCH v1 11/16] s390/unwind_user/sframe: Enable HAVE_UNWIND_USER_SFRAME Jens Remus
2025-08-01 12:53 ` Heiko Carstens
2025-08-01 15:46 ` Jens Remus
2025-07-10 16:35 ` [RFC PATCH v1 12/16] unwind_user/backchain: Introduce back chain user space unwinding Jens Remus
2025-07-17 2:06 ` Josh Poimboeuf
2025-07-17 12:20 ` Jens Remus
2025-07-18 5:19 ` Josh Poimboeuf
2025-08-01 12:36 ` Heiko Carstens
2025-08-01 15:49 ` Jens Remus
2025-07-10 16:35 ` Jens Remus [this message]
2025-07-10 16:35 ` [RFC PATCH v1 14/16] PREREQ: x86/asm: Avoid emitting DWARF CFI for non-VDSO Jens Remus
2025-07-10 16:35 ` [RFC PATCH v1 15/16] PREREQ: x86/vdso: Enable sframe generation in VDSO Jens Remus
2025-07-10 16:35 ` [RFC PATCH v1 16/16] WIP: fixup! s390/unwind_user/sframe: Enable HAVE_UNWIND_USER_SFRAME 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=20250710163522.3195293-14-jremus@linux.ibm.com \
--to=jremus@linux.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=andrii@kernel.org \
--cc=axboe@kernel.dk \
--cc=beaub@linux.microsoft.com \
--cc=bpf@vger.kernel.org \
--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=linux-kernel@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 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.