From nobody Sat Feb 7 05:01:40 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C71D335EDCC; Tue, 27 Jan 2026 15:06:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526422; cv=none; b=TO907YDKEiIX5Xkikk9Tl+1DwA7JGjs4xqDC8MlytqknRlrIFg7B1Ms9LeThz75DSEL6zDa44IPjcs/PxyIbntXxDsvgfVjGCSewqj939O3OtE4UFDXCEEBelyuqu7Mq49jiqiy8VW2XDjJw5MQXUJ4o2OLGAWj8WiDENV498cA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526422; c=relaxed/simple; bh=Yp/q6S4FQghc3PZA/xbnvDPuYwgSc5y3GWTyaNDo0Zs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CXQPps0c5R65PC8lhQGOrUmOwt+h0T7/i8BlCZhSWLrUqR/9laKbAK9uuanOa5eq4AEoAvrOdVGOt+sQq1QhXcQw2JEVKFucfDG0FSZznfXwT00AHltQfXWYxMeIRPdA4QIWucQ8mG7dC+JsFv9Pmqwg7BinMAp3y4EiNEEp+oQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=b2dhKUAg; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="b2dhKUAg" Received: from pps.filterd (m0360072.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 60R731Qb021146; Tue, 27 Jan 2026 15:06:03 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=7Yoqs7fR6uybY6XM2 9/Ri0f5H39nTiUmzWKwan6lvgs=; b=b2dhKUAgwKAoIdraPmJhsQcUUbf+CxMuY SW11FsdHArPhhKJ/F/2zaKoqBN9voPIfPEs0YGkVOsk44BRBFd/qL2WTgxbmO16+ zwXoyrpPM0osol2YwF4VIK70kWkK5Uw5Mkzbaa03nx7Ehob3wkDWDlQKjGAnopsc m/q4cDoguRGT432cgGNT5OvuhyaiBIVVsNCWhKXK62ZzXvbUW0dSDzl/veTtSr3t eXGMYJ8R2SchnOBKByGPQMWPNV+EIhbafg3KbH/6nxddGLZn2BVENn+VBqPrhpha uxT0xIM+iko6XT5hESVSx4YoFT0Vk3fT/+TeCS3rfLV5H2tayoYzA== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvnr646qe-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:03 +0000 (GMT) Received: from m0360072.ppops.net (m0360072.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 60REbkt2008750; Tue, 27 Jan 2026 15:06:02 GMT Received: from ppma23.wdc07v.mail.ibm.com (5d.69.3da9.ip4.static.sl-reverse.com [169.61.105.93]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvnr646q7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:02 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 60RE0G2W026319; Tue, 27 Jan 2026 15:06:01 GMT Received: from smtprelay04.fra02v.mail.ibm.com ([9.218.2.228]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4bw9wk91jm-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:01 +0000 Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay04.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 60RF5vhP15597876 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 Jan 2026 15:05:57 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4865A20040; Tue, 27 Jan 2026 15:05:57 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id D7B3F2004E; Tue, 27 Jan 2026 15:05:56 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 27 Jan 2026 15:05:56 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org, x86@kernel.org, linux-mm@kvack.org, Steven Rostedt Cc: Jens Remus , Josh Poimboeuf , Masami Hiramatsu , Mathieu Desnoyers , Peter Zijlstra , Ingo Molnar , Jiri Olsa , Arnaldo Carvalho de Melo , Namhyung Kim , Thomas Gleixner , Andrii Nakryiko , Indu Bhagat , "Jose E. Marchesi" , Beau Belgrave , Linus Torvalds , Andrew Morton , Florian Weimer , Kees Cook , "Carlos O'Donell" , Sam James , Dylan Hatch , Borislav Petkov , Dave Hansen , David Hildenbrand , "H. Peter Anvin" , "Liam R. Howlett" , Lorenzo Stoakes , Michal Hocko , Mike Rapoport , Suren Baghdasaryan , Vlastimil Babka , Heiko Carstens , Vasily Gorbik , "Steven Rostedt (Google)" Subject: [PATCH v13 01/18] unwind_user/sframe: Add support for reading .sframe headers Date: Tue, 27 Jan 2026 16:05:36 +0100 Message-ID: <20260127150554.2760964-2-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260127150554.2760964-1-jremus@linux.ibm.com> References: <20260127150554.2760964-1-jremus@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTI3MDEyMSBTYWx0ZWRfXySYEBGmWu/Su 3txPG92HqFUlDLN1xIkf+EK61hW9mi0SB+ApZ+ibVrNzHxR9RyDKLLFCm39BZwaIWRR0y4wH3J/ pXYaOmpxbd56ZBu95Erw99pJHPzJdKrm6mTPU1l4tq/R+avCUFldYzkvqkSqjK+yGXJ8FU4Wo+C YrtvpmSbyfaSbSbr9YDqlU/DibbgVAORBod2aA76pwsjMm5SwyyeY0EJnoe0r+WOT9TiNmugJm2 aYcLPKcBlRLXnCgW2vCmV9FbJIKEe8QpjraTiShmSiblub1FEzPhMJzCkthRNp+e/lL0bv4Lncs w8hWMudQX83/qMRhev1nlNFYl+UCFPxil4pt4QlNfnav6l1WB82747fZzl9Jr/bey+3eNcnvSRz KQtK46YnvNNG5pTrgLpjXTBpsW8g3zvc/3A2i4EsI5gwa+wnsfV0P8Ne7lLZ7zxxf4kOT95+Jqw /1j3tRbx39/AcS1zGzA== X-Proofpoint-GUID: DsM9M45YuOzFQyLA6np9lhFgO2lae4Ty X-Proofpoint-ORIG-GUID: zQ5awoGs6fGROUQ-xhWsKwUtmUR4dewc X-Authority-Analysis: v=2.4 cv=X+Vf6WTe c=1 sm=1 tr=0 ts=6978d45b cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=vUbySO9Y5rIA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=CCpqsmhAAAAA:8 a=7d_E57ReAAAA:8 a=JfrnYn6hAAAA:8 a=yPCof4ZbAAAA:8 a=mDV3o1hIAAAA:8 a=yMhMjlubAAAA:8 a=VnNF1IyMAAAA:8 a=Z4Rwk6OoAAAA:8 a=20KFwNOVAAAA:8 a=7mOBRU54AAAA:8 a=meVymXHHAAAA:8 a=FcC2FuIPsPklFa1YY6kA:9 a=gWTG3a1JFnwA:10 a=0rJyKvmL6cEA:10 a=ul9cdbp4aOFLsgKbc677:22 a=jhqOcbufqs7Y1TYCrUUU:22 a=1CNFftbPRP8L7MoqJWF3:22 a=HkZW87K1Qel5hWWM3VKY:22 a=wa9RWnbW_A1YIeRBVszw:22 a=2JgSa4NbpEOStq-L5dxp:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-01-27_03,2026-01-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 suspectscore=0 impostorscore=0 lowpriorityscore=0 clxscore=1011 spamscore=0 adultscore=0 malwarescore=0 bulkscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2601150000 definitions=main-2601270121 Content-Type: text/plain; charset="utf-8" From: Josh Poimboeuf In preparation for unwinding user space stacks with sframe, add basic sframe compile infrastructure and support for reading the .sframe section header. sframe_add_section() reads the header and unconditionally returns an error, so it's not very useful yet. A subsequent patch will improve that. Link: https://lore.kernel.org/all/f27e8463783febfa0dabb0432a3dd6be8ad98412.= 1737511963.git.jpoimboe@kernel.org/ [ Jens Remus: Add support for SFrame V3. Add support for PC-relative FDE function start offset. Cleanup includes and indentation. ] Cc: Masami Hiramatsu Cc: Mathieu Desnoyers Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Jiri Olsa Cc: Arnaldo Carvalho de Melo Cc: Namhyung Kim Cc: Thomas Gleixner Cc: Andrii Nakryiko Cc: Indu Bhagat Cc: "Jose E. Marchesi" Cc: Beau Belgrave Cc: Jens Remus Cc: Linus Torvalds Cc: Andrew Morton Cc: Florian Weimer Cc: Sam James Cc: Kees Cook Cc: "Carlos O'Donell" Signed-off-by: Josh Poimboeuf Signed-off-by: Steven Rostedt (Google) Signed-off-by: Jens Remus --- Notes (jremus): Changes in v13: - Update to SFrame V3: - Add and use SFRAME_VERSION_3 definition. - Add helper macros to access SFrame V3 FDE type. - Rename SFRAME_FUNC_*() macros to SFRAME_FDE_*(). - Rename SFRAME_FDE_TYPE_PC* defines to SFRAME_FDE_PCTYPE_* and SFRAME_FUNC_FDE_TYPE() macro to SFRAME_V3_FDE_PCTYPE(). - Reword OFFSET to DATAWORD in SFRAME_FRE_OFFSET_{COUNT|SIZE}() macros. - Rename version-specific SFRAME_*() macros to SFRAME_V3_*(). - Update struct sframe_fde and rename to sframe_fde_v3: - Change field start_addr from s32 to s64 and rename to func_start_off. - Change field fres_num from u32 to u16. - New field u8 info2. - Remove u16 padding field. - Split FDE into function descriptor entry (struct sframe_fde_v3) and attributes (struct sframe_fde_v3). - Rename macro parameter "data" to "info" to hint at fde/fre info word and wrap it in parenthesis. - Group SFRAME_* definitions so that related ones are together. - Reword commit message (my changes). MAINTAINERS | 1 + arch/Kconfig | 3 + include/linux/sframe.h | 37 +++++++++++ kernel/unwind/Makefile | 3 +- kernel/unwind/sframe.c | 136 +++++++++++++++++++++++++++++++++++++++++ kernel/unwind/sframe.h | 81 ++++++++++++++++++++++++ 6 files changed, 260 insertions(+), 1 deletion(-) create mode 100644 include/linux/sframe.h create mode 100644 kernel/unwind/sframe.c create mode 100644 kernel/unwind/sframe.h diff --git a/MAINTAINERS b/MAINTAINERS index 5b11839cba9d..79cff4f4df56 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -27226,6 +27226,7 @@ USERSPACE STACK UNWINDING M: Josh Poimboeuf M: Steven Rostedt S: Maintained +F: include/linux/sframe.h F: include/linux/unwind*.h F: kernel/unwind/ =20 diff --git a/arch/Kconfig b/arch/Kconfig index 31220f512b16..7d5517364d8b 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -486,6 +486,9 @@ config HAVE_UNWIND_USER_FP bool select UNWIND_USER =20 +config HAVE_UNWIND_USER_SFRAME + bool + config HAVE_PERF_REGS bool help diff --git a/include/linux/sframe.h b/include/linux/sframe.h new file mode 100644 index 000000000000..0642595534f9 --- /dev/null +++ b/include/linux/sframe.h @@ -0,0 +1,37 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _LINUX_SFRAME_H +#define _LINUX_SFRAME_H + +#ifdef CONFIG_HAVE_UNWIND_USER_SFRAME + +struct sframe_section { + unsigned long sframe_start; + unsigned long sframe_end; + unsigned long text_start; + unsigned long text_end; + + unsigned long fdes_start; + unsigned long fres_start; + unsigned long fres_end; + unsigned int num_fdes; + + signed char ra_off; + signed char fp_off; +}; + +extern int sframe_add_section(unsigned long sframe_start, unsigned long sf= rame_end, + unsigned long text_start, unsigned long text_end); +extern int sframe_remove_section(unsigned long sframe_addr); + +#else /* !CONFIG_HAVE_UNWIND_USER_SFRAME */ + +static inline int sframe_add_section(unsigned long sframe_start, unsigned = long sframe_end, + unsigned long text_start, unsigned long text_end) +{ + return -ENOSYS; +} +static inline int sframe_remove_section(unsigned long sframe_addr) { retur= n -ENOSYS; } + +#endif /* CONFIG_HAVE_UNWIND_USER_SFRAME */ + +#endif /* _LINUX_SFRAME_H */ diff --git a/kernel/unwind/Makefile b/kernel/unwind/Makefile index eae37bea54fd..146038165865 100644 --- a/kernel/unwind/Makefile +++ b/kernel/unwind/Makefile @@ -1 +1,2 @@ - obj-$(CONFIG_UNWIND_USER) +=3D user.o deferred.o + obj-$(CONFIG_UNWIND_USER) +=3D user.o deferred.o + obj-$(CONFIG_HAVE_UNWIND_USER_SFRAME) +=3D sframe.o diff --git a/kernel/unwind/sframe.c b/kernel/unwind/sframe.c new file mode 100644 index 000000000000..c128c1eeaca2 --- /dev/null +++ b/kernel/unwind/sframe.c @@ -0,0 +1,136 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Userspace sframe access functions + */ + +#define pr_fmt(fmt) "sframe: " fmt + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sframe.h" + +#define dbg(fmt, ...) \ + pr_debug("%s (%d): " fmt, current->comm, current->pid, ##__VA_ARGS__) + +static void free_section(struct sframe_section *sec) +{ + kfree(sec); +} + +static int sframe_read_header(struct sframe_section *sec) +{ + unsigned long header_end, fdes_start, fdes_end, fres_start, fres_end; + struct sframe_header shdr; + unsigned int num_fdes; + + if (copy_from_user(&shdr, (void __user *)sec->sframe_start, sizeof(shdr))= ) { + dbg("header usercopy failed\n"); + return -EFAULT; + } + + if (shdr.preamble.magic !=3D SFRAME_MAGIC || + shdr.preamble.version !=3D SFRAME_VERSION_3 || + !(shdr.preamble.flags & SFRAME_F_FDE_SORTED) || + !(shdr.preamble.flags & SFRAME_F_FDE_FUNC_START_PCREL) || + shdr.auxhdr_len) { + dbg("bad/unsupported sframe header\n"); + return -EINVAL; + } + + if (!shdr.num_fdes || !shdr.num_fres) { + dbg("no fde/fre entries\n"); + return -EINVAL; + } + + header_end =3D sec->sframe_start + SFRAME_HEADER_SIZE(shdr); + if (header_end >=3D sec->sframe_end) { + dbg("header doesn't fit in section\n"); + return -EINVAL; + } + + num_fdes =3D shdr.num_fdes; + fdes_start =3D header_end + shdr.fdes_off; + fdes_end =3D fdes_start + (num_fdes * sizeof(struct sframe_fde_v3)); + + fres_start =3D header_end + shdr.fres_off; + fres_end =3D fres_start + shdr.fre_len; + + if (fres_start < fdes_end || fres_end > sec->sframe_end) { + dbg("inconsistent fde/fre offsets\n"); + return -EINVAL; + } + + sec->num_fdes =3D num_fdes; + sec->fdes_start =3D fdes_start; + sec->fres_start =3D fres_start; + sec->fres_end =3D fres_end; + + sec->ra_off =3D shdr.cfa_fixed_ra_offset; + sec->fp_off =3D shdr.cfa_fixed_fp_offset; + + return 0; +} + +int sframe_add_section(unsigned long sframe_start, unsigned long sframe_en= d, + unsigned long text_start, unsigned long text_end) +{ + struct vm_area_struct *sframe_vma, *text_vma; + struct mm_struct *mm =3D current->mm; + struct sframe_section *sec; + int ret; + + if (!sframe_start || !sframe_end || !text_start || !text_end) { + dbg("zero-length sframe/text address\n"); + return -EINVAL; + } + + scoped_guard(mmap_read_lock, mm) { + sframe_vma =3D vma_lookup(mm, sframe_start); + if (!sframe_vma || sframe_end > sframe_vma->vm_end) { + dbg("bad sframe address (0x%lx - 0x%lx)\n", + sframe_start, sframe_end); + return -EINVAL; + } + + text_vma =3D vma_lookup(mm, text_start); + if (!text_vma || + !(text_vma->vm_flags & VM_EXEC) || + text_end > text_vma->vm_end) { + dbg("bad text address (0x%lx - 0x%lx)\n", + text_start, text_end); + return -EINVAL; + } + } + + sec =3D kzalloc(sizeof(*sec), GFP_KERNEL); + if (!sec) + return -ENOMEM; + + sec->sframe_start =3D sframe_start; + sec->sframe_end =3D sframe_end; + sec->text_start =3D text_start; + sec->text_end =3D text_end; + + ret =3D sframe_read_header(sec); + if (ret) + goto err_free; + + /* TODO nowhere to store it yet - just free it and return an error */ + ret =3D -ENOSYS; + +err_free: + free_section(sec); + return ret; +} + +int sframe_remove_section(unsigned long sframe_start) +{ + return -ENOSYS; +} diff --git a/kernel/unwind/sframe.h b/kernel/unwind/sframe.h new file mode 100644 index 000000000000..07a2e99855f9 --- /dev/null +++ b/kernel/unwind/sframe.h @@ -0,0 +1,81 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * From https://www.sourceware.org/binutils/docs/sframe-spec.html + */ +#ifndef _SFRAME_H +#define _SFRAME_H + +#include + +#define SFRAME_VERSION_1 1 +#define SFRAME_VERSION_2 2 +#define SFRAME_VERSION_3 3 +#define SFRAME_MAGIC 0xdee2 + +#define SFRAME_F_FDE_SORTED 0x1 +#define SFRAME_F_FRAME_POINTER 0x2 +#define SFRAME_F_FDE_FUNC_START_PCREL 0x4 + +#define SFRAME_ABI_AARCH64_ENDIAN_BIG 1 +#define SFRAME_ABI_AARCH64_ENDIAN_LITTLE 2 +#define SFRAME_ABI_AMD64_ENDIAN_LITTLE 3 + +struct sframe_preamble { + u16 magic; + u8 version; + u8 flags; +} __packed; + +struct sframe_header { + struct sframe_preamble preamble; + u8 abi_arch; + s8 cfa_fixed_fp_offset; + s8 cfa_fixed_ra_offset; + u8 auxhdr_len; + u32 num_fdes; + u32 num_fres; + u32 fre_len; + u32 fdes_off; + u32 fres_off; +} __packed; + +#define SFRAME_HEADER_SIZE(header) \ + ((sizeof(struct sframe_header) + (header).auxhdr_len)) + +struct sframe_fde_v3 { + s64 func_start_off; + u32 func_size; + u32 fres_off; +} __packed; + +struct sframe_fda_v3 { + u16 fres_num; + u8 info; + u8 info2; + u8 rep_size; +} __packed; + +#define SFRAME_FDE_PCTYPE_INC 0 +#define SFRAME_FDE_PCTYPE_MASK 1 + +#define SFRAME_AARCH64_PAUTH_KEY_A 0 +#define SFRAME_AARCH64_PAUTH_KEY_B 1 + +#define SFRAME_V3_FDE_FRE_TYPE(info) ((info) & 0xf) +#define SFRAME_V3_FDE_PCTYPE(info) (((info) >> 4) & 0x1) +#define SFRAME_V3_AARCH64_FDE_PAUTH_KEY(info) (((info) >> 5) & 0x1) + +#define SFRAME_FDE_TYPE_REGULAR 0 + +#define SFRAME_V3_FDE_TYPE_MASK 0x0f +#define SFRAME_V3_FDE_TYPE(info2) ((info2) & SFRAME_V3_FDE_TYPE_MASK) + +#define SFRAME_BASE_REG_FP 0 +#define SFRAME_BASE_REG_SP 1 + +#define SFRAME_V3_FRE_CFA_BASE_REG_ID(info) ((info) & 0x1) +#define SFRAME_V3_FRE_DATAWORD_COUNT(info) (((info) >> 1) & 0xf) +#define SFRAME_V3_FRE_DATAWORD_SIZE(info) (((info) >> 5) & 0x3) +#define SFRAME_V3_AARCH64_FRE_MANGLED_RA_P(info) (((info) >> 7) & 0x1) + +#endif /* _SFRAME_H */ --=20 2.51.0 From nobody Sat Feb 7 05:01:40 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EFD6C35E547; Tue, 27 Jan 2026 15:06:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526420; cv=none; b=GgIkHv87yGOxgL+pKxKcZgosT36Se9OaeZgr+nhmOOAeW/8C5r+P5sw2VrmSnp36CTb+HDWEcOv9ACw5h5HNk81jilGgptlTU0CAAdRH7dLKROO+64rgGVBJtNe74Yefd8hWuS/uTZEtbgLJ6C4eKO421QMWEmePfESyTETOOSY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526420; c=relaxed/simple; bh=sFnfyaMs+RPYLaqlcEnp3upevu+2OsOnCldrdAifD4M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=eFIB+7vaE61BZbt9u5aAjpkP5qDbL49R8eapHs6ZEzGr9tjQizFjygqZ/RNExtG2Z8a366AH3n+/7/nO+7gyWcAw+aVLqM0cQ0CexhuyKAyCfQ2YlckR93Oh1Nbe2kN2z9cP775GFIGYy+iNfOdY3aDgVsUj7SfH6oPjwXbh3wg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=q9USiT6A; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="q9USiT6A" Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 60R1shiS000830; Tue, 27 Jan 2026 15:06:04 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=hfsP7eDwLI1bgJYLs yU2XjwkAw7+pqh3tU+FZJn6YBE=; b=q9USiT6AhsV9WfM83XsrNvA9tBQ/TMKcL xYUGNCbSvupqYIUvjPOHkRWgu2845oyHyqzX/zUEaDA3uu8b3sQjPYlH4Y3JaK3a bSpni5dvGagrtgBvyeo5UbluJeRfxVG5c3cWmlS2HR3QGGrPsTED6z6Vdb+W5FgL hiQpsljup60RNuGx9bhpKkL+Fdac8/w24gfR4f4ZqOxhZ2zxnPjgFDbHVPFWOlNb opYalfhwc1lqeuZk25M7X+H5pPfJGkD6zFqQeJZocz5o5o4gDFNCpmGar19kfYPG yBckk484xhVogOsxIhnMsHeMsf/4ZOEQ/lcSJFzo9/pvBy425IEjg== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvmgfvde5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:03 +0000 (GMT) Received: from m0353725.ppops.net (m0353725.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 60REww8J009059; Tue, 27 Jan 2026 15:06:02 GMT Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvmgfvddw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:02 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 60RDWomZ019844; Tue, 27 Jan 2026 15:06:02 GMT Received: from smtprelay04.fra02v.mail.ibm.com ([9.218.2.228]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4bw9dn13qc-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:02 +0000 Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay04.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 60RF5vHX15597878 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 Jan 2026 15:05:58 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B5C5520040; Tue, 27 Jan 2026 15:05:57 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 500F920049; Tue, 27 Jan 2026 15:05:57 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 27 Jan 2026 15:05:57 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org, x86@kernel.org, linux-mm@kvack.org, Steven Rostedt Cc: Jens Remus , Josh Poimboeuf , Masami Hiramatsu , Mathieu Desnoyers , Peter Zijlstra , Ingo Molnar , Jiri Olsa , Arnaldo Carvalho de Melo , Namhyung Kim , Thomas Gleixner , Andrii Nakryiko , Indu Bhagat , "Jose E. Marchesi" , Beau Belgrave , Linus Torvalds , Andrew Morton , Florian Weimer , Kees Cook , "Carlos O'Donell" , Sam James , Dylan Hatch , Borislav Petkov , Dave Hansen , David Hildenbrand , "H. Peter Anvin" , "Liam R. Howlett" , Lorenzo Stoakes , Michal Hocko , Mike Rapoport , Suren Baghdasaryan , Vlastimil Babka , Heiko Carstens , Vasily Gorbik , "Steven Rostedt (Google)" Subject: [PATCH v13 02/18] unwind_user/sframe: Store .sframe section data in per-mm maple tree Date: Tue, 27 Jan 2026 16:05:37 +0100 Message-ID: <20260127150554.2760964-3-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260127150554.2760964-1-jremus@linux.ibm.com> References: <20260127150554.2760964-1-jremus@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=Z4vh3XRA c=1 sm=1 tr=0 ts=6978d45b cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=vUbySO9Y5rIA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=7d_E57ReAAAA:8 a=JfrnYn6hAAAA:8 a=yPCof4ZbAAAA:8 a=mDV3o1hIAAAA:8 a=yMhMjlubAAAA:8 a=VnNF1IyMAAAA:8 a=Z4Rwk6OoAAAA:8 a=20KFwNOVAAAA:8 a=7mOBRU54AAAA:8 a=QyXUC8HyAAAA:8 a=oGMlB6cnAAAA:8 a=1XWaLZrsAAAA:8 a=iox4zFpeAAAA:8 a=37rDS-QxAAAA:8 a=meVymXHHAAAA:8 a=WXPXSJi59xPm3fQCPWUA:9 a=jhqOcbufqs7Y1TYCrUUU:22 a=1CNFftbPRP8L7MoqJWF3:22 a=HkZW87K1Qel5hWWM3VKY:22 a=wa9RWnbW_A1YIeRBVszw:22 a=NdAtdrkLVvyUPsUoGJp4:22 a=WzC6qhA0u3u7Ye7llzcV:22 a=k1Nq6YrhK2t884LQW06G:22 a=2JgSa4NbpEOStq-L5dxp:22 X-Proofpoint-GUID: Bib1A93bPA3qtU-1N4Liwkq5g9MzjKPC X-Proofpoint-ORIG-GUID: 1BXUtyl1a6o4dLxcV1g-OuBe4aIut9rl X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTI3MDEyMSBTYWx0ZWRfX+UZmCDOpdjui m2eW5mhjZ2WF2ziWdvdAp732U6dNV6M2cSSMobNMMkswDJKSPjJqcBh5sbPdAbnX/MX35WN48Ms bMQ6mIVo9mEplqR7+al+QgDqVVkbH8xzxY4WDX7Q0aaeFcuGOUZnujQFwCfm8AeLjkbJUFofm86 xNmwvVb7XEFniT6Q9syRg+KYxZoNvz+i1A0YeQxU9/UCYUJHknDrN1DyiDsaCFD3SduvSo31Y74 x/6sVRjSF8TN7cKodcTKiHl5s7FnGyym7V7c9LEKLHj4XTOs20nvNli0wR7vaVefl9lvm03G0uG ssaVKIRsKIsMEJmRFZ4fOSAS+k6BSbss1Izcf09yzkDpJQToueAHeYqVGQ9UZSn8KsvAszF4fom eL9d6pdbP8opxvPGB4v5codweC7cfoT69q3JlhOjD0PQeQpVE0xfWSpLgMWH0GCGciuHVlDzFS1 4DmsfjHgBH1MadZ8pgg== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-01-27_03,2026-01-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 malwarescore=0 phishscore=0 priorityscore=1501 bulkscore=0 adultscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2601150000 definitions=main-2601270121 Content-Type: text/plain; charset="utf-8" From: Josh Poimboeuf Associate an .sframe section with its mm by adding it to a per-mm maple tree which is indexed by the corresponding text address range. A single .sframe section can be associated with multiple text ranges. [ Jens Remus: Minor cleanups. Reword commit subject/message. ] Cc: Thomas Gleixner Cc: Masami Hiramatsu Cc: Mathieu Desnoyers Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Jiri Olsa Cc: Arnaldo Carvalho de Melo Cc: Namhyung Kim Cc: Andrii Nakryiko Cc: Indu Bhagat Cc: "Jose E. Marchesi" Cc: Beau Belgrave Cc: Jens Remus Cc: Linus Torvalds Cc: Florian Weimer Cc: Sam James Cc: Kees Cook Cc: "Carlos O'Donell" Cc: Borislav Petkov Cc: Dave Hansen Cc: "H. Peter Anvin" Cc: Andrew Morton Cc: David Hildenbrand Cc: Lorenzo Stoakes Cc: "Liam R. Howlett" Cc: Vlastimil Babka Cc: Mike Rapoport Cc: Suren Baghdasaryan Cc: Michal Hocko Cc: x86@kernel.org Cc: linux-mm@kvack.org Signed-off-by: Josh Poimboeuf Signed-off-by: Steven Rostedt (Google) Signed-off-by: Jens Remus --- arch/x86/include/asm/mmu.h | 2 +- include/linux/mm_types.h | 3 ++ include/linux/sframe.h | 15 ++++++++++ kernel/fork.c | 10 +++++++ kernel/unwind/sframe.c | 56 ++++++++++++++++++++++++++++++++++++-- mm/init-mm.c | 2 ++ 6 files changed, 84 insertions(+), 4 deletions(-) diff --git a/arch/x86/include/asm/mmu.h b/arch/x86/include/asm/mmu.h index 0fe9c569d171..227a32899a59 100644 --- a/arch/x86/include/asm/mmu.h +++ b/arch/x86/include/asm/mmu.h @@ -87,7 +87,7 @@ typedef struct { .context =3D { \ .ctx_id =3D 1, \ .lock =3D __MUTEX_INITIALIZER(mm.context.lock), \ - } + }, =20 void leave_mm(void); #define leave_mm leave_mm diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index 9f6de068295d..c764d00fa522 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -1323,6 +1323,9 @@ struct mm_struct { #ifdef CONFIG_MM_ID mm_id_t mm_id; #endif /* CONFIG_MM_ID */ +#ifdef CONFIG_HAVE_UNWIND_USER_SFRAME + struct maple_tree sframe_mt; +#endif } __randomize_layout; =20 /* diff --git a/include/linux/sframe.h b/include/linux/sframe.h index 0642595534f9..7ea6a97ed8af 100644 --- a/include/linux/sframe.h +++ b/include/linux/sframe.h @@ -2,6 +2,8 @@ #ifndef _LINUX_SFRAME_H #define _LINUX_SFRAME_H =20 +#include + #ifdef CONFIG_HAVE_UNWIND_USER_SFRAME =20 struct sframe_section { @@ -19,18 +21,31 @@ struct sframe_section { signed char fp_off; }; =20 +#define INIT_MM_SFRAME .sframe_mt =3D MTREE_INIT(sframe_mt, 0), +extern void sframe_free_mm(struct mm_struct *mm); + extern int sframe_add_section(unsigned long sframe_start, unsigned long sf= rame_end, unsigned long text_start, unsigned long text_end); extern int sframe_remove_section(unsigned long sframe_addr); =20 +static inline bool current_has_sframe(void) +{ + struct mm_struct *mm =3D current->mm; + + return mm && !mtree_empty(&mm->sframe_mt); +} + #else /* !CONFIG_HAVE_UNWIND_USER_SFRAME */ =20 +#define INIT_MM_SFRAME +static inline void sframe_free_mm(struct mm_struct *mm) {} static inline int sframe_add_section(unsigned long sframe_start, unsigned = long sframe_end, unsigned long text_start, unsigned long text_end) { return -ENOSYS; } static inline int sframe_remove_section(unsigned long sframe_addr) { retur= n -ENOSYS; } +static inline bool current_has_sframe(void) { return false; } =20 #endif /* CONFIG_HAVE_UNWIND_USER_SFRAME */ =20 diff --git a/kernel/fork.c b/kernel/fork.c index b1f3915d5f8e..d8a7a32f8b81 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -107,6 +107,7 @@ #include #include #include +#include #include =20 #include @@ -732,6 +733,7 @@ void __mmdrop(struct mm_struct *mm) mm_pasid_drop(mm); mm_destroy_cid(mm); percpu_counter_destroy_many(mm->rss_stat, NR_MM_COUNTERS); + sframe_free_mm(mm); =20 free_mm(mm); } @@ -1067,6 +1069,13 @@ static void mmap_init_lock(struct mm_struct *mm) #endif } =20 +static void mm_init_sframe(struct mm_struct *mm) +{ +#ifdef CONFIG_HAVE_UNWIND_USER_SFRAME + mt_init(&mm->sframe_mt); +#endif +} + static struct mm_struct *mm_init(struct mm_struct *mm, struct task_struct = *p, struct user_namespace *user_ns) { @@ -1095,6 +1104,7 @@ static struct mm_struct *mm_init(struct mm_struct *mm= , struct task_struct *p, mm->pmd_huge_pte =3D NULL; #endif mm_init_uprobes_state(mm); + mm_init_sframe(mm); hugetlb_count_init(mm); =20 mm_flags_clear_all(mm); diff --git a/kernel/unwind/sframe.c b/kernel/unwind/sframe.c index c128c1eeaca2..fdb2a4908563 100644 --- a/kernel/unwind/sframe.c +++ b/kernel/unwind/sframe.c @@ -81,6 +81,7 @@ static int sframe_read_header(struct sframe_section *sec) int sframe_add_section(unsigned long sframe_start, unsigned long sframe_en= d, unsigned long text_start, unsigned long text_end) { + struct maple_tree *sframe_mt =3D ¤t->mm->sframe_mt; struct vm_area_struct *sframe_vma, *text_vma; struct mm_struct *mm =3D current->mm; struct sframe_section *sec; @@ -122,15 +123,64 @@ int sframe_add_section(unsigned long sframe_start, un= signed long sframe_end, if (ret) goto err_free; =20 - /* TODO nowhere to store it yet - just free it and return an error */ - ret =3D -ENOSYS; + ret =3D mtree_insert_range(sframe_mt, sec->text_start, sec->text_end, sec= , GFP_KERNEL); + if (ret) { + dbg("mtree_insert_range failed: text=3D%lx-%lx\n", + sec->text_start, sec->text_end); + goto err_free; + } + + return 0; =20 err_free: free_section(sec); return ret; } =20 +static int __sframe_remove_section(struct mm_struct *mm, + struct sframe_section *sec) +{ + if (!mtree_erase(&mm->sframe_mt, sec->text_start)) { + dbg("mtree_erase failed: text=3D%lx\n", sec->text_start); + return -EINVAL; + } + + free_section(sec); + + return 0; +} + int sframe_remove_section(unsigned long sframe_start) { - return -ENOSYS; + struct mm_struct *mm =3D current->mm; + struct sframe_section *sec; + unsigned long index =3D 0; + bool found =3D false; + int ret =3D 0; + + mt_for_each(&mm->sframe_mt, sec, index, ULONG_MAX) { + if (sec->sframe_start =3D=3D sframe_start) { + found =3D true; + ret |=3D __sframe_remove_section(mm, sec); + } + } + + if (!found || ret) + return -EINVAL; + + return 0; +} + +void sframe_free_mm(struct mm_struct *mm) +{ + struct sframe_section *sec; + unsigned long index =3D 0; + + if (!mm) + return; + + mt_for_each(&mm->sframe_mt, sec, index, ULONG_MAX) + free_section(sec); + + mtree_destroy(&mm->sframe_mt); } diff --git a/mm/init-mm.c b/mm/init-mm.c index 4600e7605cab..b32fcf167cc2 100644 --- a/mm/init-mm.c +++ b/mm/init-mm.c @@ -11,6 +11,7 @@ #include #include #include +#include #include =20 #ifndef INIT_MM_CONTEXT @@ -46,6 +47,7 @@ struct mm_struct init_mm =3D { .user_ns =3D &init_user_ns, .cpu_bitmap =3D CPU_BITS_NONE, INIT_MM_CONTEXT(init_mm) + INIT_MM_SFRAME }; =20 void setup_initial_init_mm(void *start_code, void *end_code, --=20 2.51.0 From nobody Sat Feb 7 05:01:40 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DCDFB366046; Tue, 27 Jan 2026 15:07:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526423; cv=none; b=BNDIETzm428DKCyN+7kLvYxrMu+cJzOg/+PshjBtkN6nqd4mfQCk89+xEJS2ao9qan83nZL73lEnnCQBniYI7k3xv+HgThRwb82iV19Ay5XL7r40UcIuFZGuU2BcdZW6t2cnv83JrdM/c7OAzIwRu8JhraLOvDdlOxGapOTnh9c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526423; c=relaxed/simple; bh=BuSEtfdW37CYHXk4kRFlCk48bOdRffJ20FCnjnOvIe8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fqhYJm09OPMg24F0+6iwUklVYg9w1tfGiDCRvyxzVlNcEVCmz2VOhl97uoGdzDaaQLpkcnbUovEfy3VDOW0BGnzq+o7KdyYNQWq/mBlB/jpDlTXKDJkxllHu71KkNU8MK84qx/mWQogK/9WAQnHygzwqbFfdQbXwTfRxC6FWYl0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=pFZvMSDU; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="pFZvMSDU" Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 60R7XYbd028672; Tue, 27 Jan 2026 15:06:04 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=4adnvlRASqyynXmCG JAHcQWpHowlKMkoygtl7xi1WSs=; b=pFZvMSDUEUAfP1DmE3zEnX5ZY5VxwCjCN 3axQRjpXjPru3P/nmqXez27G9kh6xMNRvpp9MKVYSrH6aZ+EECXaWmX6xGIWhQ9f VCNzaBhj7VNOtVrBIYUyKb3aPpx29m0TPwuz1pJqx5OBvPfEwfDlzs/HX2h7/FBp CKB2a7LSBfgc/CbMuYv846uJvVoVvEK1xhEui2NbwBoM3cpB+F5Zt1lrLgRvIWxE s1YWeFvuwkxtdzHer6fQVOYVwZTf1C/6xOioxzNQrJbW09GzHdKHDBiPEFvOQ5h4 1w+vW6c4JYD98deQXJU6cOoxjzit53NXvH/hQAYdgRcm+FtdHFzsQ== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvmgfvde9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:04 +0000 (GMT) Received: from m0353725.ppops.net (m0353725.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 60REvWsW005540; Tue, 27 Jan 2026 15:06:03 GMT Received: from ppma13.dal12v.mail.ibm.com (dd.9e.1632.ip4.static.sl-reverse.com [50.22.158.221]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvmgfvddy-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:03 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 60REWmD0023635; Tue, 27 Jan 2026 15:06:02 GMT Received: from smtprelay01.fra02v.mail.ibm.com ([9.218.2.227]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4bwamjrwhs-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:02 +0000 Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay01.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 60RF5w4H62259704 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 Jan 2026 15:05:58 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1EE2920040; Tue, 27 Jan 2026 15:05:58 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id BB6DB2004D; Tue, 27 Jan 2026 15:05:57 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 27 Jan 2026 15:05:57 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org, x86@kernel.org, linux-mm@kvack.org, Steven Rostedt Cc: Jens Remus , Josh Poimboeuf , Masami Hiramatsu , Mathieu Desnoyers , Peter Zijlstra , Ingo Molnar , Jiri Olsa , Arnaldo Carvalho de Melo , Namhyung Kim , Thomas Gleixner , Andrii Nakryiko , Indu Bhagat , "Jose E. Marchesi" , Beau Belgrave , Linus Torvalds , Andrew Morton , Florian Weimer , Kees Cook , "Carlos O'Donell" , Sam James , Dylan Hatch , Borislav Petkov , Dave Hansen , David Hildenbrand , "H. Peter Anvin" , "Liam R. Howlett" , Lorenzo Stoakes , Michal Hocko , Mike Rapoport , Suren Baghdasaryan , Vlastimil Babka , Heiko Carstens , Vasily Gorbik , "Steven Rostedt (Google)" Subject: [PATCH v13 03/18] x86/uaccess: Add unsafe_copy_from_user() implementation Date: Tue, 27 Jan 2026 16:05:38 +0100 Message-ID: <20260127150554.2760964-4-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260127150554.2760964-1-jremus@linux.ibm.com> References: <20260127150554.2760964-1-jremus@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=Z4vh3XRA c=1 sm=1 tr=0 ts=6978d45c cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=vUbySO9Y5rIA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=7d_E57ReAAAA:8 a=JfrnYn6hAAAA:8 a=yPCof4ZbAAAA:8 a=mDV3o1hIAAAA:8 a=yMhMjlubAAAA:8 a=VnNF1IyMAAAA:8 a=Z4Rwk6OoAAAA:8 a=20KFwNOVAAAA:8 a=7mOBRU54AAAA:8 a=meVymXHHAAAA:8 a=gpC398cPzQKiNBT45cIA:9 a=jhqOcbufqs7Y1TYCrUUU:22 a=1CNFftbPRP8L7MoqJWF3:22 a=HkZW87K1Qel5hWWM3VKY:22 a=wa9RWnbW_A1YIeRBVszw:22 a=2JgSa4NbpEOStq-L5dxp:22 X-Proofpoint-GUID: wWLAwxKLDR56egnD3ibSJEftoBpl7R4C X-Proofpoint-ORIG-GUID: fPKE0b2Hahn9KHpZXBsmmNBym3BITZQD X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTI3MDEyMSBTYWx0ZWRfXxpJQvjvhXrz6 JHEkZjiGQa+4O4Ml6OB4AchVLY0fRaNlYlXGP0hjW9qQyGnt1LONySFIm3bPWtYw+Y11aeHTESB /VNubUEMF/CHJc/bRg0uJFR4GUuv2VHZqRZosr/wnLPNR8sdw4E86uEcMAGpTPuxRzxCxvtD921 6dNDvBmBLpbg8caFX2ujHJgmY38AoPSJbbyDBgeL5X79Rjjp/h2e7Gzw99700SYNeDNMyLvuiEK nBMhE6qY8cLqI0A6q6io44czFB73cnxG74IzFJt7fg9tAh2hXDL24NtjIRa/FVSXwve3riwFEd6 Cdu+gYKQzWgJrVXt8MC3qZboqfRltGdVyb0sHu4lwPvmykEF3aiXI+buYhTbnJNlDfRLlNQwWJi Z/6Rh05mx2QnFfRaVPiAZVekS7nSH/dJcqBUOj+UZkZr2rsxtzxSeCwiCkCrXoX3tGg+9/qHrXP n62TpMipDO6bKmUNDIA== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-01-27_03,2026-01-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 malwarescore=0 phishscore=0 priorityscore=1501 bulkscore=0 adultscore=0 clxscore=1011 lowpriorityscore=0 impostorscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2601150000 definitions=main-2601270121 Content-Type: text/plain; charset="utf-8" From: Josh Poimboeuf Add an x86 implementation of unsafe_copy_from_user() similar to the existing unsafe_copy_to_user(). Cc: Masami Hiramatsu Cc: Mathieu Desnoyers Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Jiri Olsa Cc: Arnaldo Carvalho de Melo Cc: Namhyung Kim Cc: Thomas Gleixner Cc: Andrii Nakryiko Cc: Indu Bhagat Cc: "Jose E. Marchesi" Cc: Beau Belgrave Cc: Jens Remus Cc: Linus Torvalds Cc: Andrew Morton Cc: Florian Weimer Cc: Sam James Cc: Kees Cook Cc: "Carlos O'Donell" Signed-off-by: Josh Poimboeuf Signed-off-by: Steven Rostedt (Google) Signed-off-by: Jens Remus --- arch/x86/include/asm/uaccess.h | 39 +++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/arch/x86/include/asm/uaccess.h b/arch/x86/include/asm/uaccess.h index 367297b188c3..dfe143235967 100644 --- a/arch/x86/include/asm/uaccess.h +++ b/arch/x86/include/asm/uaccess.h @@ -598,7 +598,7 @@ _label: \ * We want the unsafe accessors to always be inlined and use * the error labels - thus the macro games. */ -#define unsafe_copy_loop(dst, src, len, type, label) \ +#define unsafe_copy_to_user_loop(dst, src, len, type, label) \ while (len >=3D sizeof(type)) { \ unsafe_put_user(*(type *)(src),(type __user *)(dst),label); \ dst +=3D sizeof(type); \ @@ -606,15 +606,34 @@ _label: \ len -=3D sizeof(type); \ } =20 -#define unsafe_copy_to_user(_dst,_src,_len,label) \ -do { \ - char __user *__ucu_dst =3D (_dst); \ - const char *__ucu_src =3D (_src); \ - size_t __ucu_len =3D (_len); \ - unsafe_copy_loop(__ucu_dst, __ucu_src, __ucu_len, u64, label); \ - unsafe_copy_loop(__ucu_dst, __ucu_src, __ucu_len, u32, label); \ - unsafe_copy_loop(__ucu_dst, __ucu_src, __ucu_len, u16, label); \ - unsafe_copy_loop(__ucu_dst, __ucu_src, __ucu_len, u8, label); \ +#define unsafe_copy_to_user(_dst, _src, _len, label) \ +do { \ + void __user *__dst =3D (_dst); \ + const void *__src =3D (_src); \ + size_t __len =3D (_len); \ + unsafe_copy_to_user_loop(__dst, __src, __len, u64, label); \ + unsafe_copy_to_user_loop(__dst, __src, __len, u32, label); \ + unsafe_copy_to_user_loop(__dst, __src, __len, u16, label); \ + unsafe_copy_to_user_loop(__dst, __src, __len, u8, label); \ +} while (0) + +#define unsafe_copy_from_user_loop(dst, src, len, type, label) \ + while (len >=3D sizeof(type)) { \ + unsafe_get_user(*(type *)(dst), (type __user *)(src), label); \ + dst +=3D sizeof(type); \ + src +=3D sizeof(type); \ + len -=3D sizeof(type); \ + } + +#define unsafe_copy_from_user(_dst, _src, _len, label) \ +do { \ + void *__dst =3D (_dst); \ + void __user *__src =3D (_src); \ + size_t __len =3D (_len); \ + unsafe_copy_from_user_loop(__dst, __src, __len, u64, label); \ + unsafe_copy_from_user_loop(__dst, __src, __len, u32, label); \ + unsafe_copy_from_user_loop(__dst, __src, __len, u16, label); \ + unsafe_copy_from_user_loop(__dst, __src, __len, u8, label); \ } while (0) =20 #ifdef CONFIG_CC_HAS_ASM_GOTO_OUTPUT --=20 2.51.0 From nobody Sat Feb 7 05:01:40 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5792F366DAD; Tue, 27 Jan 2026 15:07:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526428; cv=none; b=gXGGykHMVX9Cc0M5jd7recSykNPvO0v4jekGhbjipMpVZGF8uE7HmgKl8KG1iDceDwvUQMF/tbvyRRooVnpMhnBtDLciduY2vNz5IHtD3WAnO0P1rgJ6O0Jw+LOImFITdprbbfGs3KzEsiEe0R+OPZtyrr7r8dN7LVjAhU0iqGo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526428; c=relaxed/simple; bh=/jaT8DYcz6/t5qEtz84JolEYNmHSd+p3IQAPKf8c6gE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=drxmUtZMNWODQCzRLaqiVXlPRijwWoFEZcGbpNegnxD0pYXcJJpI6IGcqpE3HRUqwdVJQboem9wd3AL2xC8oFeRnLgK4oxjYFPAr3NXg8GBtzM0NW9H49y780/WD8HhpK1rpo+Arvzvq7RXmZGLO3Ln6iAFRHlkMzlpzvlQfE2M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=GsStQhwG; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="GsStQhwG" Received: from pps.filterd (m0356516.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 60R7589N000453; Tue, 27 Jan 2026 15:06:05 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=DbpoU7V6wjGl7C19u Q9e9DVJpWOU0+bGfyvDPjd+U9U=; b=GsStQhwGs70N2hzjvI9EcXMrhXrTg4xFz qZnDzNVtWyeDCFi7hQyAkGpuCapI0g7Z0zeuhFVinXJpkC6EZLqB18Qih5JUUXsx PqC0zKswa+Aq8rNBkdH4rGqmC3wJgKzsyO4coLyicESpxocRM5reJYMut19aXDjc ceaI9Lt60Ga1cAdwC5ij44YT/pkzerOqRMtD4cRXoqMqpCLIG2kxVLdC3wX5Ew/9 pZRUYVI0kaXf+W/MQw6V5R5Dymdh2D8IwaJgENqskOLXvMIGlWJsxqXUP5yNVo9P H2ggT/yVLS08Wvzuo2iiIFgsLbxZi4mjPD3ABBenDAG8i0Rt02pYw== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvkgmmhhq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:04 +0000 (GMT) Received: from m0356516.ppops.net (m0356516.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 60REv2n7016679; Tue, 27 Jan 2026 15:06:03 GMT Received: from ppma11.dal12v.mail.ibm.com (db.9e.1632.ip4.static.sl-reverse.com [50.22.158.219]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvkgmmhhj-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:03 +0000 (GMT) Received: from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1]) by ppma11.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 60RF43I4018045; Tue, 27 Jan 2026 15:06:02 GMT Received: from smtprelay01.fra02v.mail.ibm.com ([9.218.2.227]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4bwb41ru3u-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:02 +0000 Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay01.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 60RF5whg34013604 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 Jan 2026 15:05:58 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 8EB1F20040; Tue, 27 Jan 2026 15:05:58 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 2508820049; Tue, 27 Jan 2026 15:05:58 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 27 Jan 2026 15:05:58 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org, x86@kernel.org, linux-mm@kvack.org, Steven Rostedt Cc: Jens Remus , Josh Poimboeuf , Masami Hiramatsu , Mathieu Desnoyers , Peter Zijlstra , Ingo Molnar , Jiri Olsa , Arnaldo Carvalho de Melo , Namhyung Kim , Thomas Gleixner , Andrii Nakryiko , Indu Bhagat , "Jose E. Marchesi" , Beau Belgrave , Linus Torvalds , Andrew Morton , Florian Weimer , Kees Cook , "Carlos O'Donell" , Sam James , Dylan Hatch , Borislav Petkov , Dave Hansen , David Hildenbrand , "H. Peter Anvin" , "Liam R. Howlett" , Lorenzo Stoakes , Michal Hocko , Mike Rapoport , Suren Baghdasaryan , Vlastimil Babka , Heiko Carstens , Vasily Gorbik , "Steven Rostedt (Google)" Subject: [PATCH v13 04/18] unwind_user/sframe: Add support for reading .sframe contents Date: Tue, 27 Jan 2026 16:05:39 +0100 Message-ID: <20260127150554.2760964-5-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260127150554.2760964-1-jremus@linux.ibm.com> References: <20260127150554.2760964-1-jremus@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=Gr1PO01C c=1 sm=1 tr=0 ts=6978d45c cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=vUbySO9Y5rIA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=7d_E57ReAAAA:8 a=JfrnYn6hAAAA:8 a=yPCof4ZbAAAA:8 a=mDV3o1hIAAAA:8 a=yMhMjlubAAAA:8 a=Z4Rwk6OoAAAA:8 a=20KFwNOVAAAA:8 a=7mOBRU54AAAA:8 a=meVymXHHAAAA:8 a=YuDcBBqGAAAA:8 a=W06K4fExuwiiLY1qHd8A:9 a=jhqOcbufqs7Y1TYCrUUU:22 a=1CNFftbPRP8L7MoqJWF3:22 a=HkZW87K1Qel5hWWM3VKY:22 a=wa9RWnbW_A1YIeRBVszw:22 a=2JgSa4NbpEOStq-L5dxp:22 a=V9_jqlfyBUA7Gw2gN5zN:22 X-Proofpoint-GUID: bxllR8V2cfKsLY4uc8NmlESMOL4FGHqT X-Proofpoint-ORIG-GUID: gvUXawCUsZyo0XByjQUvWCrzApMOkwsV X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTI3MDEyMSBTYWx0ZWRfX6r4Qq0mN6reT hCqK4ruC0Kcg4mwPHv94OdEXmw7sdbKDtv3DlS/Xcrxwgh+nhuHWO+RZwflYa7et9LxYDh6aqzc Onba562M5N24b57by3HX+gqnc18WV8vGfMHv6AMPLpT8TC6Mwc3ensAgLgmMHDni5FmFlTXTUmy LXsuZA/6CEU4wG96J20bAdDNbufh+xCb8jcOEvGTIMmtesHm0J7Zk7fHjiaUkMwPAJAssK5lTGR Zhfe01EuQOYdwW8UVrCHNgu1v9QQZwcC+MlkwhL7x6zT6Dq0CMmAgkDGrLXnuIe7AUsOrxULuzk hfZFLnRaPixf1x8n2L4ExA5sEDbkWIrl1rnqsYmfgj/VjBX2dNXZYN+FUvo8GCBFmWHa4vChrSI 8149JQeria7C3c4BJh0VA/WwTuAuyqHRlqZSLxdv/u+81Uy3xsO4qTfPv36TAI6SGa6T4Tgc/qa 01oLkX4XUtm/AtNiBsw== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-01-27_03,2026-01-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 clxscore=1011 lowpriorityscore=0 suspectscore=0 impostorscore=0 phishscore=0 malwarescore=0 adultscore=0 spamscore=0 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2601150000 definitions=main-2601270121 Content-Type: text/plain; charset="utf-8" From: Josh Poimboeuf In preparation for using sframe to unwind user space stacks, add an sframe_find() interface for finding the sframe information associated with a given text address. For performance, use user_read_access_begin() and the corresponding unsafe_*() accessors. Note that use of pr_debug() in uaccess-enabled regions would break noinstr validation, so there aren't any debug messages yet. That will be added in a subsequent commit. Link: https://lore.kernel.org/all/77c0d1ec143bf2a53d66c4ecb190e7e0a576fbfd.= 1737511963.git.jpoimboe@kernel.org/ Link: https://lore.kernel.org/all/b35ca3a3-8de5-4d32-8d30-d4e562f6b0de@linu= x.ibm.com/ [ Jens Remus: Add initial support for SFrame V3 (limited to regular FDEs). Add support for PC-relative FDE function start offset. Simplify logic by using an internal FDE representation. Rename struct sframe_fre to sframe_fre_internal to align with struct sframe_fde_internal. Cleanup includes. Fix checkpatch errors "spaces required around that ':'". ] Cc: Masami Hiramatsu Cc: Mathieu Desnoyers Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Jiri Olsa Cc: Arnaldo Carvalho de Melo Cc: Namhyung Kim Cc: Thomas Gleixner Cc: Andrii Nakryiko Cc: Indu Bhagat Cc: "Jose E. Marchesi" Cc: Beau Belgrave Cc: Jens Remus Cc: Linus Torvalds Cc: Andrew Morton Cc: Florian Weimer Cc: Sam James Cc: Kees Cook Cc: "Carlos O'Donell" Signed-off-by: Josh Poimboeuf Signed-off-by: Steven Rostedt (Google) Signed-off-by: Jens Remus --- Notes (jremus): Changes in v13: - Update to SFrame V3: - Adjust to SFRAME_V3_*() macros and macro/define renames. - Adjust to struct sframe_fde_v3 rename. - Adjust to s64 FDE function start offset. - Rename local variables fde_type to fde_pctype. - Add and maintain struct sframe_fde_internal field u8 info2. - Adjust to FDE split into function descriptor entry (struct sframe_fde_v3) and attributes (struct sframe_fde_v3). - Rename offset_count/offset_size to dataword_count/dataword_count. - Limit __read_fre() to SFrame V3 regular FDEs (FDE_TYPE_REGULAR). A subsequent patch will add support for flexible FDEs (FDE_TYPE_FLEX). - Rename struct sframe_fde_internal field func_start_addr to func_addr. - Add support u64/s64 in UNSAFE_GET_USER_INC() for s64 FDE function start offset. - Reduce indentation of assignments to fre. - Reword commit message (my changes). include/linux/sframe.h | 6 + kernel/unwind/sframe.c | 346 ++++++++++++++++++++++++++++++++++- kernel/unwind/sframe_debug.h | 35 ++++ 3 files changed, 383 insertions(+), 4 deletions(-) create mode 100644 kernel/unwind/sframe_debug.h diff --git a/include/linux/sframe.h b/include/linux/sframe.h index 7ea6a97ed8af..9a72209696f9 100644 --- a/include/linux/sframe.h +++ b/include/linux/sframe.h @@ -3,10 +3,14 @@ #define _LINUX_SFRAME_H =20 #include +#include +#include =20 #ifdef CONFIG_HAVE_UNWIND_USER_SFRAME =20 struct sframe_section { + struct rcu_head rcu; + unsigned long sframe_start; unsigned long sframe_end; unsigned long text_start; @@ -27,6 +31,7 @@ extern void sframe_free_mm(struct mm_struct *mm); extern int sframe_add_section(unsigned long sframe_start, unsigned long sf= rame_end, unsigned long text_start, unsigned long text_end); extern int sframe_remove_section(unsigned long sframe_addr); +extern int sframe_find(unsigned long ip, struct unwind_user_frame *frame); =20 static inline bool current_has_sframe(void) { @@ -45,6 +50,7 @@ static inline int sframe_add_section(unsigned long sframe= _start, unsigned long s return -ENOSYS; } static inline int sframe_remove_section(unsigned long sframe_addr) { retur= n -ENOSYS; } +static inline int sframe_find(unsigned long ip, struct unwind_user_frame *= frame) { return -ENOSYS; } static inline bool current_has_sframe(void) { return false; } =20 #endif /* CONFIG_HAVE_UNWIND_USER_SFRAME */ diff --git a/kernel/unwind/sframe.c b/kernel/unwind/sframe.c index fdb2a4908563..9b3779924395 100644 --- a/kernel/unwind/sframe.c +++ b/kernel/unwind/sframe.c @@ -15,9 +15,338 @@ #include =20 #include "sframe.h" +#include "sframe_debug.h" + +struct sframe_fde_internal { + unsigned long func_addr; + u32 func_size; + u32 fda_off; + u32 fres_off; + u32 fres_num; + u8 info; + u8 info2; + u8 rep_size; +}; + +struct sframe_fre_internal { + unsigned int size; + u32 ip_off; + s32 cfa_off; + s32 ra_off; + s32 fp_off; + u8 info; +}; + +DEFINE_STATIC_SRCU(sframe_srcu); + +static __always_inline unsigned char fre_type_to_size(unsigned char fre_ty= pe) +{ + if (fre_type > 2) + return 0; + return 1 << fre_type; +} + +static __always_inline unsigned char dataword_size_enum_to_size(unsigned c= har dataword_size) +{ + if (dataword_size > 2) + return 0; + return 1 << dataword_size; +} + +static __always_inline int __read_fde(struct sframe_section *sec, + unsigned int fde_num, + struct sframe_fde_internal *fde) +{ + unsigned long fde_addr, fda_addr, func_addr; + struct sframe_fde_v3 _fde; + struct sframe_fda_v3 _fda; + + fde_addr =3D sec->fdes_start + (fde_num * sizeof(struct sframe_fde_v3)); + unsafe_copy_from_user(&_fde, (void __user *)fde_addr, + sizeof(struct sframe_fde_v3), Efault); + + func_addr =3D fde_addr + _fde.func_start_off; + if (func_addr < sec->text_start || func_addr > sec->text_end) + return -EINVAL; + + fda_addr =3D sec->fres_start + _fde.fres_off; + if (fda_addr + sizeof(struct sframe_fda_v3) > sec->fres_end) + return -EINVAL; + unsafe_copy_from_user(&_fda, (void __user *)fda_addr, + sizeof(struct sframe_fda_v3), Efault); + + fde->func_addr =3D func_addr; + fde->func_size =3D _fde.func_size; + fde->fda_off =3D _fde.fres_off; + fde->fres_off =3D _fde.fres_off + sizeof(struct sframe_fda_v3); + fde->fres_num =3D _fda.fres_num; + fde->info =3D _fda.info; + fde->info2 =3D _fda.info2; + fde->rep_size =3D _fda.rep_size; + + return 0; + +Efault: + return -EFAULT; +} + +static __always_inline int __find_fde(struct sframe_section *sec, + unsigned long ip, + struct sframe_fde_internal *fde) +{ + unsigned long func_addr_low =3D 0, func_addr_high =3D ULONG_MAX; + struct sframe_fde_v3 __user *first, *low, *high, *found =3D NULL; + int ret; + + first =3D (void __user *)sec->fdes_start; + low =3D first; + high =3D first + sec->num_fdes - 1; + + while (low <=3D high) { + struct sframe_fde_v3 __user *mid; + s64 func_off; + unsigned long func_addr; + + mid =3D low + ((high - low) / 2); + + unsafe_get_user(func_off, (s64 __user *)mid, Efault); + func_addr =3D (unsigned long)mid + func_off; + + if (ip >=3D func_addr) { + if (func_addr < func_addr_low) + return -EFAULT; + + func_addr_low =3D func_addr; + + found =3D mid; + low =3D mid + 1; + } else { + if (func_addr > func_addr_high) + return -EFAULT; + + func_addr_high =3D func_addr; + + high =3D mid - 1; + } + } + + if (!found) + return -EINVAL; + + ret =3D __read_fde(sec, found - first, fde); + if (ret) + return ret; + + /* make sure it's not in a gap */ + if (ip < fde->func_addr || ip >=3D fde->func_addr + fde->func_size) + return -EINVAL; + + return 0; + +Efault: + return -EFAULT; +} + +#define ____UNSAFE_GET_USER_INC(to, from, type, label) \ +({ \ + type __to; \ + unsafe_get_user(__to, (type __user *)from, label); \ + from +=3D sizeof(__to); \ + to =3D __to; \ +}) + +#define __UNSAFE_GET_USER_INC(to, from, size, label, u_or_s) \ +({ \ + switch (size) { \ + case 1: \ + ____UNSAFE_GET_USER_INC(to, from, u_or_s##8, label); \ + break; \ + case 2: \ + ____UNSAFE_GET_USER_INC(to, from, u_or_s##16, label); \ + break; \ + case 4: \ + ____UNSAFE_GET_USER_INC(to, from, u_or_s##32, label); \ + break; \ + default: \ + return -EFAULT; \ + } \ +}) + +#define UNSAFE_GET_USER_UNSIGNED_INC(to, from, size, label) \ + __UNSAFE_GET_USER_INC(to, from, size, label, u) + +#define UNSAFE_GET_USER_SIGNED_INC(to, from, size, label) \ + __UNSAFE_GET_USER_INC(to, from, size, label, s) + +#define UNSAFE_GET_USER_INC(to, from, size, label) \ + _Generic(to, \ + u8 : UNSAFE_GET_USER_UNSIGNED_INC(to, from, size, label), \ + u16 : UNSAFE_GET_USER_UNSIGNED_INC(to, from, size, label), \ + u32 : UNSAFE_GET_USER_UNSIGNED_INC(to, from, size, label), \ + u64 : UNSAFE_GET_USER_UNSIGNED_INC(to, from, size, label), \ + s8 : UNSAFE_GET_USER_SIGNED_INC(to, from, size, label), \ + s16 : UNSAFE_GET_USER_SIGNED_INC(to, from, size, label), \ + s32 : UNSAFE_GET_USER_SIGNED_INC(to, from, size, label), \ + s64 : UNSAFE_GET_USER_SIGNED_INC(to, from, size, label)) + +static __always_inline int __read_fre(struct sframe_section *sec, + struct sframe_fde_internal *fde, + unsigned long fre_addr, + struct sframe_fre_internal *fre) +{ + unsigned char fde_type =3D SFRAME_V3_FDE_TYPE(fde->info2); + unsigned char fde_pctype =3D SFRAME_V3_FDE_PCTYPE(fde->info); + unsigned char fre_type =3D SFRAME_V3_FDE_FRE_TYPE(fde->info); + unsigned char dataword_count, dataword_size; + s32 cfa_off, ra_off, fp_off; + unsigned long cur =3D fre_addr; + unsigned char addr_size; + u32 ip_off; + u8 info; + + addr_size =3D fre_type_to_size(fre_type); + if (!addr_size) + return -EFAULT; + + if (fre_addr + addr_size + 1 > sec->fres_end) + return -EFAULT; + + UNSAFE_GET_USER_INC(ip_off, cur, addr_size, Efault); + if (fde_pctype =3D=3D SFRAME_FDE_PCTYPE_INC && ip_off > fde->func_size) + return -EFAULT; + + UNSAFE_GET_USER_INC(info, cur, 1, Efault); + dataword_count =3D SFRAME_V3_FRE_DATAWORD_COUNT(info); + dataword_size =3D dataword_size_enum_to_size(SFRAME_V3_FRE_DATAWORD_SIZE= (info)); + if (!dataword_count || !dataword_size) + return -EFAULT; + + if (cur + (dataword_count * dataword_size) > sec->fres_end) + return -EFAULT; + + /* TODO: Support for flexible FDEs not implemented yet. */ + if (fde_type !=3D SFRAME_FDE_TYPE_REGULAR) + return -EFAULT; + + UNSAFE_GET_USER_INC(cfa_off, cur, dataword_size, Efault); + dataword_count--; + + ra_off =3D sec->ra_off; + if (!ra_off) { + if (!dataword_count--) + return -EFAULT; + + UNSAFE_GET_USER_INC(ra_off, cur, dataword_size, Efault); + } + + fp_off =3D sec->fp_off; + if (!fp_off && dataword_count) { + dataword_count--; + UNSAFE_GET_USER_INC(fp_off, cur, dataword_size, Efault); + } + + if (dataword_count) + return -EFAULT; + + fre->size =3D addr_size + 1 + (dataword_count * dataword_size); + fre->ip_off =3D ip_off; + fre->cfa_off =3D cfa_off; + fre->ra_off =3D ra_off; + fre->fp_off =3D fp_off; + fre->info =3D info; + + return 0; + +Efault: + return -EFAULT; +} + +static __always_inline int __find_fre(struct sframe_section *sec, + struct sframe_fde_internal *fde, + unsigned long ip, + struct unwind_user_frame *frame) +{ + unsigned char fde_pctype =3D SFRAME_V3_FDE_PCTYPE(fde->info); + struct sframe_fre_internal *fre, *prev_fre =3D NULL; + struct sframe_fre_internal fres[2]; + unsigned long fre_addr; + bool which =3D false; + unsigned int i; + u32 ip_off; + + ip_off =3D ip - fde->func_addr; + + if (fde_pctype =3D=3D SFRAME_FDE_PCTYPE_MASK) + ip_off %=3D fde->rep_size; + + fre_addr =3D sec->fres_start + fde->fres_off; + + for (i =3D 0; i < fde->fres_num; i++) { + int ret; + + /* + * Alternate between the two fre_addr[] entries for 'fre' and + * 'prev_fre'. + */ + fre =3D which ? fres : fres + 1; + which =3D !which; + + ret =3D __read_fre(sec, fde, fre_addr, fre); + if (ret) + return ret; + + fre_addr +=3D fre->size; + + if (prev_fre && fre->ip_off <=3D prev_fre->ip_off) + return -EFAULT; + + if (fre->ip_off > ip_off) + break; + + prev_fre =3D fre; + } + + if (!prev_fre) + return -EINVAL; + fre =3D prev_fre; + + frame->cfa_off =3D fre->cfa_off; + frame->ra_off =3D fre->ra_off; + frame->fp_off =3D fre->fp_off; + frame->use_fp =3D SFRAME_V3_FRE_CFA_BASE_REG_ID(fre->info) =3D=3D SFRAME= _BASE_REG_FP; + + return 0; +} + +int sframe_find(unsigned long ip, struct unwind_user_frame *frame) +{ + struct mm_struct *mm =3D current->mm; + struct sframe_section *sec; + struct sframe_fde_internal fde; + int ret; + + if (!mm) + return -EINVAL; + + guard(srcu)(&sframe_srcu); + + sec =3D mtree_load(&mm->sframe_mt, ip); + if (!sec) + return -EINVAL; + + if (!user_read_access_begin((void __user *)sec->sframe_start, + sec->sframe_end - sec->sframe_start)) + return -EFAULT; =20 -#define dbg(fmt, ...) \ - pr_debug("%s (%d): " fmt, current->comm, current->pid, ##__VA_ARGS__) + ret =3D __find_fde(sec, ip, &fde); + if (ret) + goto end; + + ret =3D __find_fre(sec, &fde, ip, frame); +end: + user_read_access_end(); + return ret; +} =20 static void free_section(struct sframe_section *sec) { @@ -120,8 +449,10 @@ int sframe_add_section(unsigned long sframe_start, uns= igned long sframe_end, sec->text_end =3D text_end; =20 ret =3D sframe_read_header(sec); - if (ret) + if (ret) { + dbg_print_header(sec); goto err_free; + } =20 ret =3D mtree_insert_range(sframe_mt, sec->text_start, sec->text_end, sec= , GFP_KERNEL); if (ret) { @@ -137,6 +468,13 @@ int sframe_add_section(unsigned long sframe_start, uns= igned long sframe_end, return ret; } =20 +static void sframe_free_srcu(struct rcu_head *rcu) +{ + struct sframe_section *sec =3D container_of(rcu, struct sframe_section, r= cu); + + free_section(sec); +} + static int __sframe_remove_section(struct mm_struct *mm, struct sframe_section *sec) { @@ -145,7 +483,7 @@ static int __sframe_remove_section(struct mm_struct *mm, return -EINVAL; } =20 - free_section(sec); + call_srcu(&sframe_srcu, &sec->rcu, sframe_free_srcu); =20 return 0; } diff --git a/kernel/unwind/sframe_debug.h b/kernel/unwind/sframe_debug.h new file mode 100644 index 000000000000..36352124cde8 --- /dev/null +++ b/kernel/unwind/sframe_debug.h @@ -0,0 +1,35 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _SFRAME_DEBUG_H +#define _SFRAME_DEBUG_H + +#include +#include "sframe.h" + +#ifdef CONFIG_DYNAMIC_DEBUG + +#define dbg(fmt, ...) \ + pr_debug("%s (%d): " fmt, current->comm, current->pid, ##__VA_ARGS__) + +static __always_inline void dbg_print_header(struct sframe_section *sec) +{ + unsigned long fdes_end; + + fdes_end =3D sec->fdes_start + (sec->num_fdes * sizeof(struct sframe_fde_= v3)); + + dbg("SEC: sframe:0x%lx-0x%lx text:0x%lx-0x%lx " + "fdes:0x%lx-0x%lx fres:0x%lx-0x%lx " + "ra_off:%d fp_off:%d\n", + sec->sframe_start, sec->sframe_end, sec->text_start, sec->text_end, + sec->fdes_start, fdes_end, sec->fres_start, sec->fres_end, + sec->ra_off, sec->fp_off); +} + +#else /* !CONFIG_DYNAMIC_DEBUG */ + +#define dbg(args...) no_printk(args) + +static inline void dbg_print_header(struct sframe_section *sec) {} + +#endif /* !CONFIG_DYNAMIC_DEBUG */ + +#endif /* _SFRAME_DEBUG_H */ --=20 2.51.0 From nobody Sat Feb 7 05:01:40 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4B57F35F8D9; Tue, 27 Jan 2026 15:07:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526442; cv=none; b=qeD+Oq3uDBtC4400Eh8Xm+l75It9xhAGB3+yA3ZrGB9xMD6gRd7bUPgSQgH0Ua1Cx/9r+MQ7OC4/iBUOiUELCEytsgu7WXzW7xhW39RGxsNDnOiOD3jj9k8h19kC5qGSolJmg6QwF9JTQtf5UUavAgdodt3BqlBOQKuVIMPvq68= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526442; c=relaxed/simple; bh=XpCEuwTqijDt1RI03u6nXaFg8DOmFLBBMUIhU3r9CoU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Ma3GazvBp2lyxEh3Ymeq9m6On+2UMBLvdnm/odObveSBQIHLMicAv4vQjTLX+XUC1RwELXzmynMBsCLFlMXhiAaYkaMZJVqIjFUxZXfDLBxJEhcbHqo8J09lVtanBJ/5WDSTiVgQX4hk018UzDlJtPH3ZImn2QhbSpoUozGvjXI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=mkPMWj8O; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="mkPMWj8O" Received: from pps.filterd (m0360072.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 60R8OYQK016222; Tue, 27 Jan 2026 15:06:05 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=j7PUs00n+iGXFRNku NqX2x1J88rk3p3akBKjU23hZu4=; b=mkPMWj8OFLLgSDNnS9OdTu/8KFhOUO0uU wQyWLa+f/i2FVk6p9PRzSOIof+TIBieeKLrkGObebgR84+d/Uj276IGB476jjH0d 3735w+OwM2teAbkNuLPdL0xnJLHZlVErRLYdqTfnCAnAmu0NKo+98vXYul7b2u1B U1yalOAPBaIkEz2UDQgBNTM5Zvzf0r9Dz2j5RwcJZAz9QEmZvjfs4J4atO/SOcyp lD+94v2Hn4xts6Vt2B0jzBv/2d1DegpoIJqZD/6icBV6Is11YjrpchN+SmqFPICL 44RWlajJfCmsTsiDwNnD8TQQBs7P+gebyI89SqI/1GvhssX04Gg1A== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvnr646qn-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:04 +0000 (GMT) Received: from m0360072.ppops.net (m0360072.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 60RF1ZwM025842; Tue, 27 Jan 2026 15:06:04 GMT Received: from ppma12.dal12v.mail.ibm.com (dc.9e.1632.ip4.static.sl-reverse.com [50.22.158.220]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvnr646qg-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:04 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 60RD5sZJ031040; Tue, 27 Jan 2026 15:06:03 GMT Received: from smtprelay02.fra02v.mail.ibm.com ([9.218.2.226]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4bw8dsh6cg-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:02 +0000 Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay02.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 60RF5xBo37880180 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 Jan 2026 15:05:59 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id EBF8420040; Tue, 27 Jan 2026 15:05:58 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 94D872004B; Tue, 27 Jan 2026 15:05:58 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 27 Jan 2026 15:05:58 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org, x86@kernel.org, linux-mm@kvack.org, Steven Rostedt Cc: Jens Remus , Josh Poimboeuf , Masami Hiramatsu , Mathieu Desnoyers , Peter Zijlstra , Ingo Molnar , Jiri Olsa , Arnaldo Carvalho de Melo , Namhyung Kim , Thomas Gleixner , Andrii Nakryiko , Indu Bhagat , "Jose E. Marchesi" , Beau Belgrave , Linus Torvalds , Andrew Morton , Florian Weimer , Kees Cook , "Carlos O'Donell" , Sam James , Dylan Hatch , Borislav Petkov , Dave Hansen , David Hildenbrand , "H. Peter Anvin" , "Liam R. Howlett" , Lorenzo Stoakes , Michal Hocko , Mike Rapoport , Suren Baghdasaryan , Vlastimil Babka , Heiko Carstens , Vasily Gorbik , "Steven Rostedt (Google)" Subject: [PATCH v13 05/18] unwind_user/sframe: Detect .sframe sections in executables Date: Tue, 27 Jan 2026 16:05:40 +0100 Message-ID: <20260127150554.2760964-6-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260127150554.2760964-1-jremus@linux.ibm.com> References: <20260127150554.2760964-1-jremus@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTI3MDEyMSBTYWx0ZWRfXxyX8eQDOJo7p Gv3tzaBiHVI8HxE1hmXjviiHlheagc1N6M7LH73B1548/7VVMeobn8G7uNDsHQSqGY5zaJMANfn 0VIkTcVmYdEDgzqvCuBo7PD52dLzzdj6280ccbzsM4rolRC9Q5/OgbNxuFMXyuAeg/n1XzKK212 B5MZLdE+0TLt4E58brgt4dmjfEd/HhvLaYzoqIkCEqwfwXSarJId9Ply3+azb/ktPKtUruLZoaQ D30uvGn++tqZ2dYCVvPfqsLJIee3byLLcPD2skEmPuTvCphkvYlC5GHft6ZLKf00LKfcHZC7N5h 9bXl0sl7rckSPMLhnxE0coCGPcl/hZGS/r7kyvdfFZszdrQw/auSYtn6Z8AoG/9A3FAWpNeeu69 Lz5V8CZS8BWUI542SPAGECtN+lHIJnzx0js41dViwqdwZZCceCAwjOLqrLhzX5UsjW7VetUfNbB /xRXBPsUJ/AMZKb3OPA== X-Proofpoint-GUID: -aKMD8f0xVdm5za7MVxww0k3EWdzg2cu X-Proofpoint-ORIG-GUID: d_lNCTprw3XggzNds1LbFi8sLbGXEVGt X-Authority-Analysis: v=2.4 cv=X+Vf6WTe c=1 sm=1 tr=0 ts=6978d45c cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=vUbySO9Y5rIA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=37rDS-QxAAAA:8 a=7d_E57ReAAAA:8 a=JfrnYn6hAAAA:8 a=yPCof4ZbAAAA:8 a=mDV3o1hIAAAA:8 a=yMhMjlubAAAA:8 a=VnNF1IyMAAAA:8 a=Z4Rwk6OoAAAA:8 a=20KFwNOVAAAA:8 a=7mOBRU54AAAA:8 a=meVymXHHAAAA:8 a=7QiolxpzR31IVsMsWeYA:9 a=k1Nq6YrhK2t884LQW06G:22 a=jhqOcbufqs7Y1TYCrUUU:22 a=1CNFftbPRP8L7MoqJWF3:22 a=HkZW87K1Qel5hWWM3VKY:22 a=wa9RWnbW_A1YIeRBVszw:22 a=2JgSa4NbpEOStq-L5dxp:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-01-27_03,2026-01-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 suspectscore=0 impostorscore=0 lowpriorityscore=0 clxscore=1011 spamscore=0 adultscore=0 malwarescore=0 bulkscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2601150000 definitions=main-2601270121 Content-Type: text/plain; charset="utf-8" From: Josh Poimboeuf When loading an ELF executable, automatically detect an .sframe section and associate it with the mm_struct. [ Jens Remus: Fix checkpatch warning "braces {} are not necessary for single statement blocks". ] Cc: linux-mm@kvack.org Cc: Masami Hiramatsu Cc: Mathieu Desnoyers Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Jiri Olsa Cc: Arnaldo Carvalho de Melo Cc: Namhyung Kim Cc: Thomas Gleixner Cc: Andrii Nakryiko Cc: Indu Bhagat Cc: "Jose E. Marchesi" Cc: Beau Belgrave Cc: Jens Remus Cc: Linus Torvalds Cc: Andrew Morton Cc: Florian Weimer Cc: Sam James Cc: Kees Cook Cc: "Carlos O'Donell" Signed-off-by: Josh Poimboeuf Signed-off-by: Steven Rostedt (Google) Signed-off-by: Jens Remus --- fs/binfmt_elf.c | 48 +++++++++++++++++++++++++++++++++++++--- include/uapi/linux/elf.h | 1 + 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index 3eb734c192e9..fc6ecb4d239e 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c @@ -47,6 +47,7 @@ #include #include #include +#include #include #include =20 @@ -637,6 +638,21 @@ static inline int make_prot(u32 p_flags, struct arch_e= lf_state *arch_state, return arch_elf_adjust_prot(prot, arch_state, has_interp, is_interp); } =20 +static void elf_add_sframe(struct elf_phdr *text, struct elf_phdr *sframe, + unsigned long base_addr) +{ + unsigned long sframe_start, sframe_end, text_start, text_end; + + sframe_start =3D base_addr + sframe->p_vaddr; + sframe_end =3D sframe_start + sframe->p_memsz; + + text_start =3D base_addr + text->p_vaddr; + text_end =3D text_start + text->p_memsz; + + /* Ignore return value, sframe section isn't critical */ + sframe_add_section(sframe_start, sframe_end, text_start, text_end); +} + /* This is much more generalized than the library routine read function, so we keep this separate. Technically the library read function is only provided so that we can read a.out libraries that have @@ -647,7 +663,7 @@ static unsigned long load_elf_interp(struct elfhdr *int= erp_elf_ex, unsigned long no_base, struct elf_phdr *interp_elf_phdata, struct arch_elf_state *arch_state) { - struct elf_phdr *eppnt; + struct elf_phdr *eppnt, *sframe_phdr =3D NULL; unsigned long load_addr =3D 0; int load_addr_set =3D 0; unsigned long error =3D ~0UL; @@ -673,7 +689,8 @@ static unsigned long load_elf_interp(struct elfhdr *int= erp_elf_ex, =20 eppnt =3D interp_elf_phdata; for (i =3D 0; i < interp_elf_ex->e_phnum; i++, eppnt++) { - if (eppnt->p_type =3D=3D PT_LOAD) { + switch (eppnt->p_type) { + case PT_LOAD: { int elf_type =3D MAP_PRIVATE; int elf_prot =3D make_prot(eppnt->p_flags, arch_state, true, true); @@ -712,6 +729,19 @@ static unsigned long load_elf_interp(struct elfhdr *in= terp_elf_ex, error =3D -ENOMEM; goto out; } + break; + } + case PT_GNU_SFRAME: + sframe_phdr =3D eppnt; + break; + } + } + + if (sframe_phdr) { + eppnt =3D interp_elf_phdata; + for (i =3D 0; i < interp_elf_ex->e_phnum; i++, eppnt++) { + if (eppnt->p_flags & PF_X) + elf_add_sframe(eppnt, sframe_phdr, load_addr); } } =20 @@ -836,7 +866,7 @@ static int load_elf_binary(struct linux_binprm *bprm) int first_pt_load =3D 1; unsigned long error; struct elf_phdr *elf_ppnt, *elf_phdata, *interp_elf_phdata =3D NULL; - struct elf_phdr *elf_property_phdata =3D NULL; + struct elf_phdr *elf_property_phdata =3D NULL, *sframe_phdr =3D NULL; unsigned long elf_brk; bool brk_moved =3D false; int retval, i; @@ -945,6 +975,10 @@ static int load_elf_binary(struct linux_binprm *bprm) executable_stack =3D EXSTACK_DISABLE_X; break; =20 + case PT_GNU_SFRAME: + sframe_phdr =3D elf_ppnt; + break; + case PT_LOPROC ... PT_HIPROC: retval =3D arch_elf_pt_proc(elf_ex, elf_ppnt, bprm->file, false, @@ -1242,6 +1276,14 @@ static int load_elf_binary(struct linux_binprm *bprm) elf_brk =3D k; } =20 + if (sframe_phdr) { + for (i =3D 0, elf_ppnt =3D elf_phdata; + i < elf_ex->e_phnum; i++, elf_ppnt++) { + if ((elf_ppnt->p_flags & PF_X)) + elf_add_sframe(elf_ppnt, sframe_phdr, load_bias); + } + } + e_entry =3D elf_ex->e_entry + load_bias; phdr_addr +=3D load_bias; elf_brk +=3D load_bias; diff --git a/include/uapi/linux/elf.h b/include/uapi/linux/elf.h index 819ded2d39de..92c16c94fca8 100644 --- a/include/uapi/linux/elf.h +++ b/include/uapi/linux/elf.h @@ -41,6 +41,7 @@ typedef __u16 Elf64_Versym; #define PT_GNU_STACK (PT_LOOS + 0x474e551) #define PT_GNU_RELRO (PT_LOOS + 0x474e552) #define PT_GNU_PROPERTY (PT_LOOS + 0x474e553) +#define PT_GNU_SFRAME (PT_LOOS + 0x474e554) =20 =20 /* ARM MTE memory tag segment type */ --=20 2.51.0 From nobody Sat Feb 7 05:01:40 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2B32A368264; Tue, 27 Jan 2026 15:07:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526429; cv=none; b=HftN3CjGDBI0SIEf8zzLFkBSzCcUNPhN5fFVX14ol1oNPL1kmRE38e3dOKxaQd5ReWnzMAFfpdC08FjEJz14kCYUzNpQY6GrXkTRNAh3knicfRm+c4gQ9apweUWnFL6vDn+6xMwXADhRtCT7ryH25KaUB24lVZr5ihBUeDKfaic= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526429; c=relaxed/simple; bh=Sb47u02mayfW00aTxVSv6OlfLsyPv+lkkhMWD9lRMG8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AjFj9CEr3TMDnT4vYUH4DH46YLSXTZ87x4qI70OXV7jC4BVOxV5a0xDcMWPprTtYYRiqlMan8jYM6OdzsO0UKN8866jS2ntk58/uFNwFccf9gvaZ1361Jw7j0BT2/L67njKJN7VF0KT1uhzfAMEkDTCZd/GQJFu08/OMk1mhd7g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=ZrLz45tC; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="ZrLz45tC" Received: from pps.filterd (m0356517.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 60R8n3Ej004217; Tue, 27 Jan 2026 15:06:06 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=OpFpBWS/xAQ6vWdqa ep5WPali3+wOicQDYDVioZk2LY=; b=ZrLz45tCR7SH0jkkcoDPIuu2kDowMxQI1 lzqvbX2tWzPG0CBus3MuI0fzbsuHotR9EdNJ/Puvt3UWrW1Lw7jJf9q0PCZcduvF yDObuk3umDgDJx1RsKNJyqz02j42yrqwjZJ9BH27zzgG81LV+6SiW5MDyFf4iVwR 4Am2rF+r37mhDxDDQnpga9nK7tannx9Jo/Cidfqs51acOzMwLju19xveKPrZ/yLS njFNrZBrFuw9nwypd78BNfg8ifgKJZJluCb2nygvcNZHqpnvSHHq9FBDQaVv1uUf 5wiZPJxmPxkNne6IbzXsqizBeI2mQUjdE3+9/a8swEh2dxdmN8I+w== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvnt7p1kh-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:05 +0000 (GMT) Received: from m0356517.ppops.net (m0356517.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 60RF64YS031490; Tue, 27 Jan 2026 15:06:04 GMT Received: from ppma13.dal12v.mail.ibm.com (dd.9e.1632.ip4.static.sl-reverse.com [50.22.158.221]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvnt7p1kd-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:04 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 60REAE0g023722; Tue, 27 Jan 2026 15:06:03 GMT Received: from smtprelay02.fra02v.mail.ibm.com ([9.218.2.226]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4bwamjrwhx-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:03 +0000 Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay02.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 60RF5xDC37880188 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 Jan 2026 15:05:59 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 568EC20040; Tue, 27 Jan 2026 15:05:59 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id F216B2004D; Tue, 27 Jan 2026 15:05:58 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 27 Jan 2026 15:05:58 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org, x86@kernel.org, linux-mm@kvack.org, Steven Rostedt Cc: Jens Remus , Josh Poimboeuf , Masami Hiramatsu , Mathieu Desnoyers , Peter Zijlstra , Ingo Molnar , Jiri Olsa , Arnaldo Carvalho de Melo , Namhyung Kim , Thomas Gleixner , Andrii Nakryiko , Indu Bhagat , "Jose E. Marchesi" , Beau Belgrave , Linus Torvalds , Andrew Morton , Florian Weimer , Kees Cook , "Carlos O'Donell" , Sam James , Dylan Hatch , Borislav Petkov , Dave Hansen , David Hildenbrand , "H. Peter Anvin" , "Liam R. Howlett" , Lorenzo Stoakes , Michal Hocko , Mike Rapoport , Suren Baghdasaryan , Vlastimil Babka , Heiko Carstens , Vasily Gorbik , "Steven Rostedt (Google)" Subject: [PATCH v13 06/18] unwind_user/sframe: Wire up unwind_user to sframe Date: Tue, 27 Jan 2026 16:05:41 +0100 Message-ID: <20260127150554.2760964-7-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260127150554.2760964-1-jremus@linux.ibm.com> References: <20260127150554.2760964-1-jremus@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-GUID: _vLn3dmPI5jstfJPr09Re077zRhGt_j9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTI3MDEyMSBTYWx0ZWRfX+tZzNgx3Girk Q34EgBlH4RYHuj+XZucDOKvQxGt4E0LCZryiltuHy6cdxj3HbbjhLtaM+MLF6hiiSrC53ON2nzu 0LALSK+Sb2K3hhHMluJZWm7NJGlcYK3ZZ+zGGTy60ARHu8sjrds8wPq5S8GDayOGjTfYVPo5YYI UBdgqOkMj+3ySFviF9UqmzIeJWA6C3hrZwvtvhxNWW9dMjIbW/BAcemAzGSfJnVpXP2hl71IQ55 Fju4zEWnuyVyCehGPSStd8sEHlZguyyrN5mMR4P3qAYyCqf5Dk0n/R2GaI4EGlS8kZ3z019FBNk +p2ShdClPrTtBIIf2gEn7cGpI+A+m6NBGQmDJregnenEEQSfZrCM6e5TpwJeZxFVvQBHdUUl7/K eJuMKh9W5YzhsJSEgqh+rS5Ug1Zgq40cAJ+ILSihLjdwRlm5JLcil46mM6cAC9Ixe9knCvWqOiK 2y1cTo0isDWxo4h6OMQ== X-Authority-Analysis: v=2.4 cv=Zs3g6t7G c=1 sm=1 tr=0 ts=6978d45d cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=vUbySO9Y5rIA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=7d_E57ReAAAA:8 a=JfrnYn6hAAAA:8 a=yPCof4ZbAAAA:8 a=mDV3o1hIAAAA:8 a=yMhMjlubAAAA:8 a=VnNF1IyMAAAA:8 a=Z4Rwk6OoAAAA:8 a=20KFwNOVAAAA:8 a=7mOBRU54AAAA:8 a=meVymXHHAAAA:8 a=ZumjT3II3fW-INSmAFwA:9 a=jhqOcbufqs7Y1TYCrUUU:22 a=1CNFftbPRP8L7MoqJWF3:22 a=HkZW87K1Qel5hWWM3VKY:22 a=wa9RWnbW_A1YIeRBVszw:22 a=2JgSa4NbpEOStq-L5dxp:22 X-Proofpoint-ORIG-GUID: 93xmvXR5SG-tXz1DxtBs637NzhJoO2U1 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-01-27_03,2026-01-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 lowpriorityscore=0 adultscore=0 phishscore=0 suspectscore=0 bulkscore=0 impostorscore=0 priorityscore=1501 malwarescore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2601150000 definitions=main-2601270121 Content-Type: text/plain; charset="utf-8" From: Josh Poimboeuf Now that the sframe infrastructure is fully in place, make it work by hooking it up to the unwind_user interface. [ Jens Remus: Remove unused pt_regs from unwind_user_next_common() and its callers. Simplify unwind_user_next_sframe(). ] Cc: Masami Hiramatsu Cc: Mathieu Desnoyers Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Jiri Olsa Cc: Arnaldo Carvalho de Melo Cc: Namhyung Kim Cc: Thomas Gleixner Cc: Andrii Nakryiko Cc: Indu Bhagat Cc: "Jose E. Marchesi" Cc: Beau Belgrave Cc: Jens Remus Cc: Linus Torvalds Cc: Andrew Morton Cc: Florian Weimer Cc: Sam James Cc: Kees Cook Cc: "Carlos O'Donell" Signed-off-by: Josh Poimboeuf Signed-off-by: Steven Rostedt (Google) Signed-off-by: Jens Remus --- arch/Kconfig | 1 + include/linux/unwind_user_types.h | 4 +++- kernel/unwind/user.c | 23 +++++++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/arch/Kconfig b/arch/Kconfig index 7d5517364d8b..2ece3df821b5 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -488,6 +488,7 @@ config HAVE_UNWIND_USER_FP =20 config HAVE_UNWIND_USER_SFRAME bool + select UNWIND_USER =20 config HAVE_PERF_REGS bool diff --git a/include/linux/unwind_user_types.h b/include/linux/unwind_user_= types.h index 412729a269bc..43e4b160883f 100644 --- a/include/linux/unwind_user_types.h +++ b/include/linux/unwind_user_types.h @@ -9,7 +9,8 @@ * available. */ enum unwind_user_type_bits { - UNWIND_USER_TYPE_FP_BIT =3D 0, + UNWIND_USER_TYPE_SFRAME_BIT =3D 0, + UNWIND_USER_TYPE_FP_BIT =3D 1, =20 NR_UNWIND_USER_TYPE_BITS, }; @@ -17,6 +18,7 @@ enum unwind_user_type_bits { enum unwind_user_type { /* Type "none" for the start of stack walk iteration. */ UNWIND_USER_TYPE_NONE =3D 0, + UNWIND_USER_TYPE_SFRAME =3D BIT(UNWIND_USER_TYPE_SFRAME_BIT), UNWIND_USER_TYPE_FP =3D BIT(UNWIND_USER_TYPE_FP_BIT), }; =20 diff --git a/kernel/unwind/user.c b/kernel/unwind/user.c index 90ab3c1a205e..1fb272419733 100644 --- a/kernel/unwind/user.c +++ b/kernel/unwind/user.c @@ -7,6 +7,7 @@ #include #include #include +#include =20 #define for_each_user_frame(state) \ for (unwind_user_start(state); !(state)->done; unwind_user_next(state)) @@ -82,6 +83,16 @@ static int unwind_user_next_fp(struct unwind_user_state = *state) return unwind_user_next_common(state, &fp_frame); } =20 +static int unwind_user_next_sframe(struct unwind_user_state *state) +{ + struct unwind_user_frame frame; + + /* sframe expects the frame to be local storage */ + if (sframe_find(state->ip, &frame)) + return -ENOENT; + return unwind_user_next_common(state, &frame); +} + static int unwind_user_next(struct unwind_user_state *state) { unsigned long iter_mask =3D state->available_types; @@ -95,6 +106,16 @@ static int unwind_user_next(struct unwind_user_state *s= tate) =20 state->current_type =3D type; switch (type) { + case UNWIND_USER_TYPE_SFRAME: + switch (unwind_user_next_sframe(state)) { + case 0: + return 0; + case -ENOENT: + continue; /* Try next method. */ + default: + state->done =3D true; + } + break; case UNWIND_USER_TYPE_FP: if (!unwind_user_next_fp(state)) return 0; @@ -123,6 +144,8 @@ static int unwind_user_start(struct unwind_user_state *= state) return -EINVAL; } =20 + if (current_has_sframe()) + state->available_types |=3D UNWIND_USER_TYPE_SFRAME; if (IS_ENABLED(CONFIG_HAVE_UNWIND_USER_FP)) state->available_types |=3D UNWIND_USER_TYPE_FP; =20 --=20 2.51.0 From nobody Sat Feb 7 05:01:40 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 811E135EDAD; Tue, 27 Jan 2026 15:07:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526429; cv=none; b=Ewe4ng8eCKBA7ROjAKmsSQbwz0zJKMIO0GSAUrdcjChepK/3K3tjW/PCTcnGI6SuwvF2i0v9ehSvyjwrZCGFMVeIgYL6XkkvheeQ2DJ3EGzEtcPh+qYBoUWPx4C2Kz5QeR4EgJmef4k9KPT8AqjS8gJDswY5jVS/YONPe0t6FCo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526429; c=relaxed/simple; bh=9X2/xoSWm0kTAN+EQEhyKe/HxHnBxpCeX4ZwQ8F7j5Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HO+Y74e8GDghVgZuGJkhVFBtgPVLvjlVAk7h+CUoQ2zX87Gk2Mx1zIQBknT2FIz7lPlqDH5wmaEvWkReg2vBrQncS21uNDZocjlFy1najbj4ROoOdplPVecNX3H8z9eu43gCky8jBlfbSsUf+1AGr9le096UuD2w/SgJ4kJBZx4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=JRPfsCvi; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="JRPfsCvi" Received: from pps.filterd (m0356516.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 60R6bs2q011850; Tue, 27 Jan 2026 15:06:05 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=s8yD6zQnCi2VjhbmM KBe6rWarjh0LI+Iy4NKcZSO5P0=; b=JRPfsCviGf2wItF2wOmIZ3Q5v2KPBdTl4 IaaZAzW3SbUM0PpNfFdLOpGBraHkRd5WJw8TGj/Bi8RdrLaTi6fzKTzIafSy07JX tsK4Nps1fMvX5NTRf+PY2jpTUsJDh7fiLoUhrg4FgXTsNydBf4ZBiu6dSTZK2bqW IiA9JkkJOYH6EdYEQ0h3qebYDP2fwcZA+xr80yu1bJEVZ7iLMhUt9U82XNDCj8Bf QicwsZ2hgqrlxJCnBYjD61uUZOX3W5gil5z3kPcEaUekthP/lRPLwdmAQTBo4sMy eFCNG9dmMc8A7aRZg33ZBPe9GVIfoitt9UZu6LEzyBymKq3zCgAoA== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvkgmmhhv-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:05 +0000 (GMT) Received: from m0356516.ppops.net (m0356516.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 60RF15BX026039; Tue, 27 Jan 2026 15:06:04 GMT Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvkgmmhhr-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:04 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 60RDxiae019733; Tue, 27 Jan 2026 15:06:03 GMT Received: from smtprelay02.fra02v.mail.ibm.com ([9.218.2.226]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4bw9dn13qg-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:03 +0000 Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay02.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 60RF5xEY50397512 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 Jan 2026 15:05:59 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id BBCDD2004F; Tue, 27 Jan 2026 15:05:59 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5C7952004B; Tue, 27 Jan 2026 15:05:59 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 27 Jan 2026 15:05:59 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org, x86@kernel.org, linux-mm@kvack.org, Steven Rostedt Cc: Jens Remus , Josh Poimboeuf , Masami Hiramatsu , Mathieu Desnoyers , Peter Zijlstra , Ingo Molnar , Jiri Olsa , Arnaldo Carvalho de Melo , Namhyung Kim , Thomas Gleixner , Andrii Nakryiko , Indu Bhagat , "Jose E. Marchesi" , Beau Belgrave , Linus Torvalds , Andrew Morton , Florian Weimer , Kees Cook , "Carlos O'Donell" , Sam James , Dylan Hatch , Borislav Petkov , Dave Hansen , David Hildenbrand , "H. Peter Anvin" , "Liam R. Howlett" , Lorenzo Stoakes , Michal Hocko , Mike Rapoport , Suren Baghdasaryan , Vlastimil Babka , Heiko Carstens , Vasily Gorbik Subject: [PATCH v13 07/18] unwind_user: Stop when reaching an outermost frame Date: Tue, 27 Jan 2026 16:05:42 +0100 Message-ID: <20260127150554.2760964-8-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260127150554.2760964-1-jremus@linux.ibm.com> References: <20260127150554.2760964-1-jremus@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=Gr1PO01C c=1 sm=1 tr=0 ts=6978d45d cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=vUbySO9Y5rIA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=7d_E57ReAAAA:8 a=JfrnYn6hAAAA:8 a=yPCof4ZbAAAA:8 a=mDV3o1hIAAAA:8 a=yMhMjlubAAAA:8 a=VnNF1IyMAAAA:8 a=Z4Rwk6OoAAAA:8 a=20KFwNOVAAAA:8 a=7mOBRU54AAAA:8 a=_1qlYuAciRtwIPuEvDgA:9 a=jhqOcbufqs7Y1TYCrUUU:22 a=1CNFftbPRP8L7MoqJWF3:22 a=HkZW87K1Qel5hWWM3VKY:22 a=wa9RWnbW_A1YIeRBVszw:22 X-Proofpoint-GUID: Yw30ofjYvy8yVTEj7Cr__KxhMse0QOAk X-Proofpoint-ORIG-GUID: YvUxJJmHnkqwmkKr8zAyE1qA-LQB89ro X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTI3MDEyMSBTYWx0ZWRfX/7FotBWprXgZ biwo8FtHSXqaJzBJFIv8UYyr2c4GphiWUFtNtvN39wBUDBcDU2rR92g08b7Bbp0hvkKW9ru77mS e55eqDl1WOqARysSdOPyPD8TvPyoX7HLZaDbSAvLAU2Esqw3qbHp/aUipF9GgTrVQoR4bsyRiZl KOKa7Mgvz/TCDTynGAt/O9BO9evBB8kOmpBzZog/6u99c9xlP/Hf77QZp7k0fb1we+isuNLXMKN SVXew722i2Fdfn0Yew6eKD/4oPmOSMHxNjVL2DDpJNqCZsL68n+vlcPXKKuqbSaiezEH/XI0FH3 7VFB4/9/kd4l/4wtuVxGkPMNHQSgF1aHJn86h/mRTP/7p3c8ihNd2aTlxXlknOwB3zrOnn7IBOK 8EVpzCGoi1E5TvPzq6Q1GFoG/bLmCdxKrZr1qdFC7CXZSymYoN8uTK7WN7VeIgG23mphn4LZsak kXRzLa9qghCRBH/QVVA== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-01-27_03,2026-01-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 clxscore=1011 lowpriorityscore=0 suspectscore=0 impostorscore=0 phishscore=0 malwarescore=0 adultscore=0 spamscore=0 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2601150000 definitions=main-2601270121 Content-Type: text/plain; charset="utf-8" Add an indication for an outermost frame to the unwind user frame structure and stop unwinding when reaching an outermost frame. This will be used by unwind user sframe, as SFrame may represent an undefined return address as indication for an outermost frame. Cc: Steven Rostedt Cc: Josh Poimboeuf Cc: Masami Hiramatsu Cc: Mathieu Desnoyers Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Jiri Olsa Cc: Arnaldo Carvalho de Melo Cc: Namhyung Kim Cc: Thomas Gleixner Cc: Andrii Nakryiko Cc: Indu Bhagat Cc: "Jose E. Marchesi" Cc: Beau Belgrave Cc: Jens Remus Cc: Linus Torvalds Cc: Andrew Morton Cc: Florian Weimer Cc: Sam James Cc: Kees Cook Cc: "Carlos O'Donell" Signed-off-by: Jens Remus --- arch/x86/include/asm/unwind_user.h | 6 ++++-- include/linux/unwind_user_types.h | 1 + kernel/unwind/user.c | 6 ++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/arch/x86/include/asm/unwind_user.h b/arch/x86/include/asm/unwi= nd_user.h index 6e469044e4de..2dfb5ef11e36 100644 --- a/arch/x86/include/asm/unwind_user.h +++ b/arch/x86/include/asm/unwind_user.h @@ -23,13 +23,15 @@ static inline int unwind_user_word_size(struct pt_regs = *regs) .cfa_off =3D 2*(ws), \ .ra_off =3D -1*(ws), \ .fp_off =3D -2*(ws), \ - .use_fp =3D true, + .use_fp =3D true, \ + .outermost =3D false, =20 #define ARCH_INIT_USER_FP_ENTRY_FRAME(ws) \ .cfa_off =3D 1*(ws), \ .ra_off =3D -1*(ws), \ .fp_off =3D 0, \ - .use_fp =3D false, + .use_fp =3D false, \ + .outermost =3D false, =20 static inline bool unwind_user_at_function_start(struct pt_regs *regs) { diff --git a/include/linux/unwind_user_types.h b/include/linux/unwind_user_= types.h index 43e4b160883f..616cc5ee4586 100644 --- a/include/linux/unwind_user_types.h +++ b/include/linux/unwind_user_types.h @@ -32,6 +32,7 @@ struct unwind_user_frame { s32 ra_off; s32 fp_off; bool use_fp; + bool outermost; }; =20 struct unwind_user_state { diff --git a/kernel/unwind/user.c b/kernel/unwind/user.c index 1fb272419733..fdb1001e3750 100644 --- a/kernel/unwind/user.c +++ b/kernel/unwind/user.c @@ -32,6 +32,12 @@ static int unwind_user_next_common(struct unwind_user_st= ate *state, { unsigned long cfa, fp, ra; =20 + /* Stop unwinding when reaching an outermost frame. */ + if (frame->outermost) { + state->done =3D true; + return 0; + } + /* Get the Canonical Frame Address (CFA) */ if (frame->use_fp) { if (state->fp < state->sp) --=20 2.51.0 From nobody Sat Feb 7 05:01:40 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9B35736606E; Tue, 27 Jan 2026 15:07:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526424; cv=none; b=PgfJDgTwU6OqZYBgThOWW5f2CbkpNco0A4qFbABNGOeoG/LCssT/YYA9IgKIDQDApbWWmVuAw40tSPrW3oPyIVbnQs154abkZcA+OKk7WG2Lo6LqEgj+ATiCjEmT3jkGcWz8d1ugwZf0YXv75rZpOBfMwzg0zEcS57SIWqfdomg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526424; c=relaxed/simple; bh=EKnaZnxlp6Oybboq9koYMKXIKAQZUc05LSP0nqSpChA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Qj3TwntN7fbrnbanE4Q8ptzNdzx16dTo9OhosWExVGIGB5+zdY0yVuHHNealM45aKzAQ/qUrAwdF1lcvTr3/3cGXwdC8h1AnBxwZssQnPacvp6XIxYwduf3y5gs8wWmvXOq7vIHcuvEYxxqg+3Mo5/0hbmdSxXpYwKZLyX8AbMo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=clH5/tXV; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="clH5/tXV" Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 60RBIvNL020431; Tue, 27 Jan 2026 15:06:06 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=zVm5fftPMxN9/Z5b/ HvpY+qb7Z5C4VZqWHD0URHipvg=; b=clH5/tXVntD26pkJpDYOLDvDuioG+XOmh BOfZtPKdC71XL4MQrv/zdfOlXxHGMJwJansyAozOatpMVQ/oy3F5v0t/Wcvv3lc4 izaQJbACzdnH9t/3NPaNWn0Y/nbQesLp6N8kvr//LrTTjQ/QSzsWBmYscxMZ63Nu desnJuZE0F5suI+mZgayD7oKQL6FU3v5iQcCYyR5CZwaRO7AzQvp2uuRwj7G4dLk Jt9VAnNPaUrsgsful7RUWq8JpjXu7ty/FWYgp14h7EAsF6uUi7yJ8netsA8zuvzb eEwn2yaANGyzv+elIux++G3jbTKngI0HBL9PkkaqPU0Cw7JMs/nkw== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvmgfvdej-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:05 +0000 (GMT) Received: from m0353725.ppops.net (m0353725.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 60RF0auZ013973; Tue, 27 Jan 2026 15:06:05 GMT Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvmgfvdee-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:05 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 60RD69uk019647; Tue, 27 Jan 2026 15:06:04 GMT Received: from smtprelay05.fra02v.mail.ibm.com ([9.218.2.225]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4bw9dn13qh-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:04 +0000 Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay05.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 60RF60JZ39191032 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 Jan 2026 15:06:00 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 2533020040; Tue, 27 Jan 2026 15:06:00 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C23922004E; Tue, 27 Jan 2026 15:05:59 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 27 Jan 2026 15:05:59 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org, x86@kernel.org, linux-mm@kvack.org, Steven Rostedt Cc: Jens Remus , Josh Poimboeuf , Masami Hiramatsu , Mathieu Desnoyers , Peter Zijlstra , Ingo Molnar , Jiri Olsa , Arnaldo Carvalho de Melo , Namhyung Kim , Thomas Gleixner , Andrii Nakryiko , Indu Bhagat , "Jose E. Marchesi" , Beau Belgrave , Linus Torvalds , Andrew Morton , Florian Weimer , Kees Cook , "Carlos O'Donell" , Sam James , Dylan Hatch , Borislav Petkov , Dave Hansen , David Hildenbrand , "H. Peter Anvin" , "Liam R. Howlett" , Lorenzo Stoakes , Michal Hocko , Mike Rapoport , Suren Baghdasaryan , Vlastimil Babka , Heiko Carstens , Vasily Gorbik Subject: [PATCH v13 08/18] unwind_user/sframe: Add support for outermost frame indication Date: Tue, 27 Jan 2026 16:05:43 +0100 Message-ID: <20260127150554.2760964-9-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260127150554.2760964-1-jremus@linux.ibm.com> References: <20260127150554.2760964-1-jremus@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=Z4vh3XRA c=1 sm=1 tr=0 ts=6978d45d cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=vUbySO9Y5rIA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=7d_E57ReAAAA:8 a=JfrnYn6hAAAA:8 a=yPCof4ZbAAAA:8 a=mDV3o1hIAAAA:8 a=yMhMjlubAAAA:8 a=VnNF1IyMAAAA:8 a=Z4Rwk6OoAAAA:8 a=20KFwNOVAAAA:8 a=7mOBRU54AAAA:8 a=mFg4y33aAicYmUfzDuoA:9 a=jhqOcbufqs7Y1TYCrUUU:22 a=1CNFftbPRP8L7MoqJWF3:22 a=HkZW87K1Qel5hWWM3VKY:22 a=wa9RWnbW_A1YIeRBVszw:22 X-Proofpoint-GUID: KlXhgSsl-7XYGr8sEfIy1wcmIpHJAtvp X-Proofpoint-ORIG-GUID: 1nm0Z9teSyeP7GTrC8S6VI-9JvDkzbHB X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTI3MDEyMSBTYWx0ZWRfX8ehchMl53yaJ fhvCTCx2yZ+p/TGN5+RQxrq9+j9wt8NoOUFDFh4LaSJ8mHgL4MfxPbe1jiMBkO2WgFVHakS/7r4 M/vG8tmc6/ZZtysxHnzyfD2QBCzYPHmtaDf8z6PoOSaGsRPGux9TIHoDib4brteX4Kl7RxoOko3 R/BboGphlfMIzq4TYydGBoXM6RQzK9f4qNX3l9SXTf11tarMJYJMd1F3Gzz8JjuoHTmxKCsAKSj Bhqx3M2ObqttbbAkyce1w/34RocYLgP/kLgpIm0eWsYQGgQJppOZ7G3QXRJtMQsmKPeOGpPLt09 5p1uRo/I2tKfrbhz4qa+cwhw2kOhG3IkbrcIJxw3zl7zZ8E9bo90ijYt9EA1yBlHYYHRmBkfO/R MpszybXEApyTC3gxchB+ndVRNUZs8XNDhDXZA57uFhC0OD/V/IT7GHTkPTs0mIAvqbZDzp7ItNT b/PaEexVcRASurcbwHg== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-01-27_03,2026-01-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 malwarescore=0 phishscore=0 priorityscore=1501 bulkscore=0 adultscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2601150000 definitions=main-2601270121 Content-Type: text/plain; charset="utf-8" SFrame may represent an undefined return address (RA) as SFrame FRE without any offsets as indication for an outermost frame. Cc: Steven Rostedt Cc: Josh Poimboeuf Cc: Masami Hiramatsu Cc: Mathieu Desnoyers Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Jiri Olsa Cc: Arnaldo Carvalho de Melo Cc: Namhyung Kim Cc: Thomas Gleixner Cc: Andrii Nakryiko Cc: Indu Bhagat Cc: "Jose E. Marchesi" Cc: Beau Belgrave Cc: Jens Remus Cc: Linus Torvalds Cc: Andrew Morton Cc: Florian Weimer Cc: Sam James Cc: Kees Cook Cc: "Carlos O'Donell" Signed-off-by: Jens Remus --- Notes (jremus): Changes in v13: - Use SFRAME_V3_FRE_RA_UNDEFINED_P() instead of struct sframe_fre_internal.ra_undefined field. - Reduce indentation of assignments. kernel/unwind/sframe.c | 15 ++++++++++++++- kernel/unwind/sframe.h | 1 + 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/kernel/unwind/sframe.c b/kernel/unwind/sframe.c index 9b3779924395..6004b43aac34 100644 --- a/kernel/unwind/sframe.c +++ b/kernel/unwind/sframe.c @@ -218,7 +218,7 @@ static __always_inline int __read_fre(struct sframe_sec= tion *sec, UNSAFE_GET_USER_INC(info, cur, 1, Efault); dataword_count =3D SFRAME_V3_FRE_DATAWORD_COUNT(info); dataword_size =3D dataword_size_enum_to_size(SFRAME_V3_FRE_DATAWORD_SIZE= (info)); - if (!dataword_count || !dataword_size) + if (!dataword_size) return -EFAULT; =20 if (cur + (dataword_count * dataword_size) > sec->fres_end) @@ -228,6 +228,17 @@ static __always_inline int __read_fre(struct sframe_se= ction *sec, if (fde_type !=3D SFRAME_FDE_TYPE_REGULAR) return -EFAULT; =20 + if (!dataword_count) { + /* + * A FRE without data words indicates RA undefined / + * outermost frame. + */ + cfa_off =3D 0; + ra_off =3D 0; + fp_off =3D 0; + goto done; + } + UNSAFE_GET_USER_INC(cfa_off, cur, dataword_size, Efault); dataword_count--; =20 @@ -248,6 +259,7 @@ static __always_inline int __read_fre(struct sframe_sec= tion *sec, if (dataword_count) return -EFAULT; =20 +done: fre->size =3D addr_size + 1 + (dataword_count * dataword_size); fre->ip_off =3D ip_off; fre->cfa_off =3D cfa_off; @@ -314,6 +326,7 @@ static __always_inline int __find_fre(struct sframe_sec= tion *sec, frame->ra_off =3D fre->ra_off; frame->fp_off =3D fre->fp_off; frame->use_fp =3D SFRAME_V3_FRE_CFA_BASE_REG_ID(fre->info) =3D=3D SFRAME= _BASE_REG_FP; + frame->outermost =3D SFRAME_V3_FRE_RA_UNDEFINED_P(fre->info); =20 return 0; } diff --git a/kernel/unwind/sframe.h b/kernel/unwind/sframe.h index 07a2e99855f9..3fcc15534e5a 100644 --- a/kernel/unwind/sframe.h +++ b/kernel/unwind/sframe.h @@ -77,5 +77,6 @@ struct sframe_fda_v3 { #define SFRAME_V3_FRE_DATAWORD_COUNT(info) (((info) >> 1) & 0xf) #define SFRAME_V3_FRE_DATAWORD_SIZE(info) (((info) >> 5) & 0x3) #define SFRAME_V3_AARCH64_FRE_MANGLED_RA_P(info) (((info) >> 7) & 0x1) +#define SFRAME_V3_FRE_RA_UNDEFINED_P(info) (SFRAME_V3_FRE_DATAWORD_COUNT(= info) =3D=3D 0) =20 #endif /* _SFRAME_H */ --=20 2.51.0 From nobody Sat Feb 7 05:01:40 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 739AC35E544; Tue, 27 Jan 2026 15:06:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526419; cv=none; b=jk4rcBoE0lBlFeuVsYX8/T9Ta19u5qON7NwnnbwAhZSmkNCBABkm4XWkWGeHCamqWRIMKcvKNdvf4JERp6+zHzKwF2BcLsN0isrTbKupnasGe6kvKZJOlhx2Mpu+vMLllUtnAJM3zNMborg+9PIt7nn6eZ26hSwzhgn9KR1Xre0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526419; c=relaxed/simple; bh=XeDt4m5b8cu5z7Myjsfk3QbaxYYFSHz8bGNIxDo/FSY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DTI9ppIqR6wZbqt9aZ6mg4I9O/rAhOE3byJGFITf2e5OXEidHepTsvKL7TMpOG94uGIk9s3nHq2Ai7SbSlPNtz42EwZlitZn38VEBhmMfGEHL9abCS/ttfsu/4Ts8pbg+q39syhir6EmISmEtJPiAMs1fQgsvNF3aZGcyF4CAeU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=fQGUKr3P; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="fQGUKr3P" Received: from pps.filterd (m0360072.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 60R7SZHb002736; Tue, 27 Jan 2026 15:06:06 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=BqoUo0wq/xUVQ08wQ S3GDigATks54kCDHtiMA4j3FTs=; b=fQGUKr3PKkcBFYy4Zp7gCNwieS5UthKrB oYXEYeDPH+6+qHswUVowhRZWM/NM7kKVBh45j6cCHcM0dtyYMdGkjz4Yr059yk9r EACsLP0BKQLO/Qm9hxc0QPvjfChyB0I+BcISVT2ZkNy9viKjSpHKm2iyBSImC9Cl 6jv20HMuc454KUkVqdEhpRgUTQ2dEcunfSZI7XkhiTz/zmYTsq4SmqHKUMDb3t6r dhAQJIzOERq9+Xgb11lAjcZbUrNU0+tGpgXH4cqTUtOgbmRi1Z/463c2xvy+JFno DpR06T3u4AtlFXib9EFPpL1y6q7ta8xzWueSIUNR4C+2PRgKHjqWQ== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvnr646qw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:06 +0000 (GMT) Received: from m0360072.ppops.net (m0360072.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 60REhpsY020393; Tue, 27 Jan 2026 15:06:05 GMT Received: from ppma12.dal12v.mail.ibm.com (dc.9e.1632.ip4.static.sl-reverse.com [50.22.158.220]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvnr646qs-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:05 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 60RDEoLv031044; Tue, 27 Jan 2026 15:06:04 GMT Received: from smtprelay05.fra02v.mail.ibm.com ([9.218.2.225]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4bw8dsh6cj-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:04 +0000 Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay05.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 60RF60Iu39191036 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 Jan 2026 15:06:00 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 83F4520040; Tue, 27 Jan 2026 15:06:00 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 2B0DB20049; Tue, 27 Jan 2026 15:06:00 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 27 Jan 2026 15:06:00 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org, x86@kernel.org, linux-mm@kvack.org, Steven Rostedt Cc: Jens Remus , Josh Poimboeuf , Masami Hiramatsu , Mathieu Desnoyers , Peter Zijlstra , Ingo Molnar , Jiri Olsa , Arnaldo Carvalho de Melo , Namhyung Kim , Thomas Gleixner , Andrii Nakryiko , Indu Bhagat , "Jose E. Marchesi" , Beau Belgrave , Linus Torvalds , Andrew Morton , Florian Weimer , Kees Cook , "Carlos O'Donell" , Sam James , Dylan Hatch , Borislav Petkov , Dave Hansen , David Hildenbrand , "H. Peter Anvin" , "Liam R. Howlett" , Lorenzo Stoakes , Michal Hocko , Mike Rapoport , Suren Baghdasaryan , Vlastimil Babka , Heiko Carstens , Vasily Gorbik , "Steven Rostedt (Google)" Subject: [PATCH v13 09/18] unwind_user/sframe: Remove .sframe section on detected corruption Date: Tue, 27 Jan 2026 16:05:44 +0100 Message-ID: <20260127150554.2760964-10-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260127150554.2760964-1-jremus@linux.ibm.com> References: <20260127150554.2760964-1-jremus@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTI3MDEyMSBTYWx0ZWRfX9dtk6uVtCdRH tId1yvkI/H1UbXz8xpStDEIEFjEeDs3gX4Cjmp1gwSeJXDevIO7Q5AvsjrI0jrVqaNT5MxBciba kG7KAPlvsNLuDOqiNAymSs6nn6sk3PsRsBPh2sM2FOGSP6h+JatzEodqXGtSiJk/7Sgdr0Xn4np xr6DcR75zPNll8nF9sG0qL7zyfxKmq1kb37+3/bbyMTHJmfDhPEnmlI4qe0o1x8ERGNK9YYJDuN uNwfS0y4tWbDRv97l5Uti//o/gXaLQ4OcDSmyt77bqCP/ppfNVHlcPHF40JV1uMkK7btskDJi6C yHWrRetluRtVzj1Rgv+xC2SUigjUuckoGQP8weTOtY8RxkDjyqJFEUIC+Xh3oNJAJuhRfkK4F+I ccVrRHGErH2WtobWDmGe1YoJJoM70hWn9WR+Bgv7V6n6qSgvzWng4q5w0mTA+Sbo82gAvqAcS2e NY5o8zkeQGH2vIbR7Rw== X-Proofpoint-GUID: 5XHuKtAdbWHV3NOc049IMGl0YAFe-Nfy X-Proofpoint-ORIG-GUID: OjNNiXWl2C9A79lDqi2h7zSLQYwtqHvm X-Authority-Analysis: v=2.4 cv=X+Vf6WTe c=1 sm=1 tr=0 ts=6978d45e cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=vUbySO9Y5rIA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=7d_E57ReAAAA:8 a=JfrnYn6hAAAA:8 a=yPCof4ZbAAAA:8 a=mDV3o1hIAAAA:8 a=yMhMjlubAAAA:8 a=VnNF1IyMAAAA:8 a=Z4Rwk6OoAAAA:8 a=20KFwNOVAAAA:8 a=7mOBRU54AAAA:8 a=meVymXHHAAAA:8 a=UW-gzNxWWvgdzlWFvSoA:9 a=jhqOcbufqs7Y1TYCrUUU:22 a=1CNFftbPRP8L7MoqJWF3:22 a=HkZW87K1Qel5hWWM3VKY:22 a=wa9RWnbW_A1YIeRBVszw:22 a=2JgSa4NbpEOStq-L5dxp:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-01-27_03,2026-01-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 suspectscore=0 impostorscore=0 lowpriorityscore=0 clxscore=1015 spamscore=0 adultscore=0 malwarescore=0 bulkscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2601150000 definitions=main-2601270121 Content-Type: text/plain; charset="utf-8" From: Josh Poimboeuf To avoid continued attempted use of a bad .sframe section, remove it on demand when the first sign of corruption is detected. Cc: Masami Hiramatsu Cc: Mathieu Desnoyers Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Jiri Olsa Cc: Arnaldo Carvalho de Melo Cc: Namhyung Kim Cc: Thomas Gleixner Cc: Andrii Nakryiko Cc: Indu Bhagat Cc: "Jose E. Marchesi" Cc: Beau Belgrave Cc: Jens Remus Cc: Linus Torvalds Cc: Andrew Morton Cc: Florian Weimer Cc: Sam James Cc: Kees Cook Cc: "Carlos O'Donell" Signed-off-by: Josh Poimboeuf Signed-off-by: Steven Rostedt (Google) Signed-off-by: Jens Remus --- kernel/unwind/sframe.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/kernel/unwind/sframe.c b/kernel/unwind/sframe.c index 6004b43aac34..9a63f8828593 100644 --- a/kernel/unwind/sframe.c +++ b/kernel/unwind/sframe.c @@ -358,6 +358,10 @@ int sframe_find(unsigned long ip, struct unwind_user_f= rame *frame) ret =3D __find_fre(sec, &fde, ip, frame); end: user_read_access_end(); + + if (ret =3D=3D -EFAULT) + WARN_ON_ONCE(sframe_remove_section(sec->sframe_start)); + return ret; } =20 --=20 2.51.0 From nobody Sat Feb 7 05:01:40 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2B3D135EDD1; Tue, 27 Jan 2026 15:07:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526425; cv=none; b=eZ3mBMXwsIcqEFLHT3GxzVAWQYUq+YsbqKMn2/n6itdHMcfUEVbEXV4hzgHMq/3iAj3J5Mn4xABYI3g51iNo2ilR+UM7ixUfS1LHabwScBxEzGAvGTpSGwj4g6uISQG7EIgdI+t4XOH16kBMQRhrkWmyGdlwpPkl0Cgk9Vn+Deg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526425; c=relaxed/simple; bh=yZNi9mYyBlYTwrKKwtxqcwtcIeTCTG8eGE29VxaB+Us=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BDWAWi5UE+l18RiKyZSNVRSGLdQ1c35XRal2UZ8eUrRNNIZ9mru5vrx3jRJu/HMeZxbFiSMRo7gU9dmNT2BmzUxKWS8d9xr1oCyLy41Ae++kne1DUyhUxsql5D6I9Zm8ufPXdZR1EJrpFJjhoYVBk/rL8bqv3jGgEvZkjnhOyaw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=EzRaYn+o; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="EzRaYn+o" Received: from pps.filterd (m0356517.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 60R68LP2000552; Tue, 27 Jan 2026 15:06:07 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=zLEDyXOe30s4hlEbb EGFNk2z8jN9dL4jNH2veMqtxjI=; b=EzRaYn+o/O0L+2+rwDYA2duNpe7UM4Pme ZRycAkS1LHN/l4bwce8rFVZRIx5l73asgmwww0fIiyX3jD8WW5lpGDLBdE/Cl1LC F0Gtkfmx8H0mwFkn0JrDaHB1GYCZL6BBleEQZy1FfmiHDuByMx3NXGNYrQ3wqrDw OQEDdwIJ24zJpBRuluvgYlvL7i1RN/8DyxL1nQVt0Wk40HKOTdfKBGUPVyS+Snvd iQ0JKNuCsV+p9pFBTfBLcfjo3IvobXCJFV8HEb59OBzhDuo+NzgU40RfXwPWSR0R tJLbqbtnDYzP2LumiEmGzJWlyrknV/6N9AhsY+jzS8Sab+FRVTZmA== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvnt7p1ks-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:07 +0000 (GMT) Received: from m0356517.ppops.net (m0356517.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 60RF668d031505; Tue, 27 Jan 2026 15:06:06 GMT Received: from ppma23.wdc07v.mail.ibm.com (5d.69.3da9.ip4.static.sl-reverse.com [169.61.105.93]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvnt7p1kk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:06 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 60RDXls6026805; Tue, 27 Jan 2026 15:06:05 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4bw9wk91jv-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:05 +0000 Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay06.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 60RF617T31588668 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 Jan 2026 15:06:01 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id EA3DB20040; Tue, 27 Jan 2026 15:06:00 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 89DB12004B; Tue, 27 Jan 2026 15:06:00 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 27 Jan 2026 15:06:00 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org, x86@kernel.org, linux-mm@kvack.org, Steven Rostedt Cc: Jens Remus , Josh Poimboeuf , Masami Hiramatsu , Mathieu Desnoyers , Peter Zijlstra , Ingo Molnar , Jiri Olsa , Arnaldo Carvalho de Melo , Namhyung Kim , Thomas Gleixner , Andrii Nakryiko , Indu Bhagat , "Jose E. Marchesi" , Beau Belgrave , Linus Torvalds , Andrew Morton , Florian Weimer , Kees Cook , "Carlos O'Donell" , Sam James , Dylan Hatch , Borislav Petkov , Dave Hansen , David Hildenbrand , "H. Peter Anvin" , "Liam R. Howlett" , Lorenzo Stoakes , Michal Hocko , Mike Rapoport , Suren Baghdasaryan , Vlastimil Babka , Heiko Carstens , Vasily Gorbik , "Steven Rostedt (Google)" Subject: [PATCH v13 10/18] unwind_user/sframe: Show file name in debug output Date: Tue, 27 Jan 2026 16:05:45 +0100 Message-ID: <20260127150554.2760964-11-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260127150554.2760964-1-jremus@linux.ibm.com> References: <20260127150554.2760964-1-jremus@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-GUID: dBUVxsPrSrXueAWmjbm3XmSUwIoxjqrh X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTI3MDEyMSBTYWx0ZWRfX7J/CIeKR0xQM eDdXtX2AtADStkTCmIluuGgHGHUr3daqFe9Fu65xsOaL5bM+fT7MwsBiwzzJc5HWcJzKFH93095 7b7Tel7WNE61vqeVh0U6vVYdO+qtvBnxB268zQ34btIHM7eoFVoIYSoSIHR+cyTWFIWBYniRP+G wqX4a9Z/vtNsifmS9AjJ62R2ctfS/9qPY+CD1GQLiQ/rYMOlngoxY5XFTRGrXZxF9MeCWo2ZEKb iAcmwslkMLQrwfXkf+1qnLGSeF3zqqI+MRkpz+QW0heQsKjnAGJjKX5Aj0wwHS2+mMm2iV2zc86 +PlhzB5iMxkfgvKu1SLDkneEvuC/dTrjqvaIVycAiPxUm6/L2Ry/3anSwFIvfcSdXCF1kWp3YcO S4mTUumeomGAX0LpSphsI1jS/FzSd3evJdWFHViNx4hY+w1eWlqQVqXoRra8WgEKwIzbHOqII9F mi4/TD43OJHkzPURgng== X-Authority-Analysis: v=2.4 cv=Zs3g6t7G c=1 sm=1 tr=0 ts=6978d45f cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=vUbySO9Y5rIA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=7d_E57ReAAAA:8 a=JfrnYn6hAAAA:8 a=yPCof4ZbAAAA:8 a=mDV3o1hIAAAA:8 a=yMhMjlubAAAA:8 a=VnNF1IyMAAAA:8 a=Z4Rwk6OoAAAA:8 a=20KFwNOVAAAA:8 a=7mOBRU54AAAA:8 a=meVymXHHAAAA:8 a=uJBe1DRFJ8tuXqE5OugA:9 a=jhqOcbufqs7Y1TYCrUUU:22 a=1CNFftbPRP8L7MoqJWF3:22 a=HkZW87K1Qel5hWWM3VKY:22 a=wa9RWnbW_A1YIeRBVszw:22 a=2JgSa4NbpEOStq-L5dxp:22 X-Proofpoint-ORIG-GUID: qLV6FVK9ZH-JszMPD-k-3R6SjRlcW3eu X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-01-27_03,2026-01-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 lowpriorityscore=0 adultscore=0 phishscore=0 suspectscore=0 bulkscore=0 impostorscore=0 priorityscore=1501 malwarescore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2601150000 definitions=main-2601270121 Content-Type: text/plain; charset="utf-8" From: Josh Poimboeuf When debugging sframe issues, the error messages aren't all that helpful without knowing what file a corresponding .sframe section belongs to. Prefix debug output strings with the file name. [ Jens Remus: Fix checkpatch error "space prohibited before that close parenthesis ')'". ] Cc: Masami Hiramatsu Cc: Mathieu Desnoyers Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Jiri Olsa Cc: Arnaldo Carvalho de Melo Cc: Namhyung Kim Cc: Thomas Gleixner Cc: Andrii Nakryiko Cc: Indu Bhagat Cc: "Jose E. Marchesi" Cc: Beau Belgrave Cc: Jens Remus Cc: Linus Torvalds Cc: Andrew Morton Cc: Florian Weimer Cc: Sam James Cc: Kees Cook Cc: "Carlos O'Donell" Signed-off-by: Josh Poimboeuf Signed-off-by: Steven Rostedt (Google) Signed-off-by: Jens Remus --- include/linux/sframe.h | 4 +++- kernel/unwind/sframe.c | 23 ++++++++++-------- kernel/unwind/sframe_debug.h | 45 +++++++++++++++++++++++++++++++----- 3 files changed, 56 insertions(+), 16 deletions(-) diff --git a/include/linux/sframe.h b/include/linux/sframe.h index 9a72209696f9..b79c5ec09229 100644 --- a/include/linux/sframe.h +++ b/include/linux/sframe.h @@ -10,7 +10,9 @@ =20 struct sframe_section { struct rcu_head rcu; - +#ifdef CONFIG_DYNAMIC_DEBUG + const char *filename; +#endif unsigned long sframe_start; unsigned long sframe_end; unsigned long text_start; diff --git a/kernel/unwind/sframe.c b/kernel/unwind/sframe.c index 9a63f8828593..3276aa6d0c77 100644 --- a/kernel/unwind/sframe.c +++ b/kernel/unwind/sframe.c @@ -359,14 +359,17 @@ int sframe_find(unsigned long ip, struct unwind_user_= frame *frame) end: user_read_access_end(); =20 - if (ret =3D=3D -EFAULT) + if (ret =3D=3D -EFAULT) { + dbg_sec("removing bad .sframe section\n"); WARN_ON_ONCE(sframe_remove_section(sec->sframe_start)); + } =20 return ret; } =20 static void free_section(struct sframe_section *sec) { + dbg_free(sec); kfree(sec); } =20 @@ -377,7 +380,7 @@ static int sframe_read_header(struct sframe_section *se= c) unsigned int num_fdes; =20 if (copy_from_user(&shdr, (void __user *)sec->sframe_start, sizeof(shdr))= ) { - dbg("header usercopy failed\n"); + dbg_sec("header usercopy failed\n"); return -EFAULT; } =20 @@ -386,18 +389,18 @@ static int sframe_read_header(struct sframe_section *= sec) !(shdr.preamble.flags & SFRAME_F_FDE_SORTED) || !(shdr.preamble.flags & SFRAME_F_FDE_FUNC_START_PCREL) || shdr.auxhdr_len) { - dbg("bad/unsupported sframe header\n"); + dbg_sec("bad/unsupported sframe header\n"); return -EINVAL; } =20 if (!shdr.num_fdes || !shdr.num_fres) { - dbg("no fde/fre entries\n"); + dbg_sec("no fde/fre entries\n"); return -EINVAL; } =20 header_end =3D sec->sframe_start + SFRAME_HEADER_SIZE(shdr); if (header_end >=3D sec->sframe_end) { - dbg("header doesn't fit in section\n"); + dbg_sec("header doesn't fit in section\n"); return -EINVAL; } =20 @@ -409,7 +412,7 @@ static int sframe_read_header(struct sframe_section *se= c) fres_end =3D fres_start + shdr.fre_len; =20 if (fres_start < fdes_end || fres_end > sec->sframe_end) { - dbg("inconsistent fde/fre offsets\n"); + dbg_sec("inconsistent fde/fre offsets\n"); return -EINVAL; } =20 @@ -465,6 +468,8 @@ int sframe_add_section(unsigned long sframe_start, unsi= gned long sframe_end, sec->text_start =3D text_start; sec->text_end =3D text_end; =20 + dbg_init(sec); + ret =3D sframe_read_header(sec); if (ret) { dbg_print_header(sec); @@ -473,8 +478,8 @@ int sframe_add_section(unsigned long sframe_start, unsi= gned long sframe_end, =20 ret =3D mtree_insert_range(sframe_mt, sec->text_start, sec->text_end, sec= , GFP_KERNEL); if (ret) { - dbg("mtree_insert_range failed: text=3D%lx-%lx\n", - sec->text_start, sec->text_end); + dbg_sec("mtree_insert_range failed: text=3D%lx-%lx\n", + sec->text_start, sec->text_end); goto err_free; } =20 @@ -496,7 +501,7 @@ static int __sframe_remove_section(struct mm_struct *mm, struct sframe_section *sec) { if (!mtree_erase(&mm->sframe_mt, sec->text_start)) { - dbg("mtree_erase failed: text=3D%lx\n", sec->text_start); + dbg_sec("mtree_erase failed: text=3D%lx\n", sec->text_start); return -EINVAL; } =20 diff --git a/kernel/unwind/sframe_debug.h b/kernel/unwind/sframe_debug.h index 36352124cde8..e568be4172b1 100644 --- a/kernel/unwind/sframe_debug.h +++ b/kernel/unwind/sframe_debug.h @@ -10,26 +10,59 @@ #define dbg(fmt, ...) \ pr_debug("%s (%d): " fmt, current->comm, current->pid, ##__VA_ARGS__) =20 +#define dbg_sec(fmt, ...) \ + dbg("%s: " fmt, sec->filename, ##__VA_ARGS__) + static __always_inline void dbg_print_header(struct sframe_section *sec) { unsigned long fdes_end; =20 fdes_end =3D sec->fdes_start + (sec->num_fdes * sizeof(struct sframe_fde_= v3)); =20 - dbg("SEC: sframe:0x%lx-0x%lx text:0x%lx-0x%lx " - "fdes:0x%lx-0x%lx fres:0x%lx-0x%lx " - "ra_off:%d fp_off:%d\n", - sec->sframe_start, sec->sframe_end, sec->text_start, sec->text_end, - sec->fdes_start, fdes_end, sec->fres_start, sec->fres_end, - sec->ra_off, sec->fp_off); + dbg_sec("SEC: sframe:0x%lx-0x%lx text:0x%lx-0x%lx " + "fdes:0x%lx-0x%lx fres:0x%lx-0x%lx " + "ra_off:%d fp_off:%d\n", + sec->sframe_start, sec->sframe_end, sec->text_start, sec->text_end, + sec->fdes_start, fdes_end, sec->fres_start, sec->fres_end, + sec->ra_off, sec->fp_off); +} + +static inline void dbg_init(struct sframe_section *sec) +{ + struct mm_struct *mm =3D current->mm; + struct vm_area_struct *vma; + + guard(mmap_read_lock)(mm); + vma =3D vma_lookup(mm, sec->sframe_start); + if (!vma) + sec->filename =3D kstrdup("(vma gone???)", GFP_KERNEL); + else if (vma->vm_file) + sec->filename =3D kstrdup_quotable_file(vma->vm_file, GFP_KERNEL); + else if (vma->vm_ops && vma->vm_ops->name) + sec->filename =3D kstrdup(vma->vm_ops->name(vma), GFP_KERNEL); + else if (arch_vma_name(vma)) + sec->filename =3D kstrdup(arch_vma_name(vma), GFP_KERNEL); + else if (!vma->vm_mm) + sec->filename =3D kstrdup("(vdso)", GFP_KERNEL); + else + sec->filename =3D kstrdup("(anonymous)", GFP_KERNEL); +} + +static inline void dbg_free(struct sframe_section *sec) +{ + kfree(sec->filename); } =20 #else /* !CONFIG_DYNAMIC_DEBUG */ =20 #define dbg(args...) no_printk(args) +#define dbg_sec(args...) no_printk(args) =20 static inline void dbg_print_header(struct sframe_section *sec) {} =20 +static inline void dbg_init(struct sframe_section *sec) {} +static inline void dbg_free(struct sframe_section *sec) {} + #endif /* !CONFIG_DYNAMIC_DEBUG */ =20 #endif /* _SFRAME_DEBUG_H */ --=20 2.51.0 From nobody Sat Feb 7 05:01:40 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BACD835E529; Tue, 27 Jan 2026 15:06:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526418; cv=none; b=YeGX6kbULkTdVWKinPa6gIyWe6y1JY3N+FrtNVP6CxcO3Uk/1bpQyBoqcNE+TuWXotDdsA+5vNZA7sKiXOMTTHTDk9U3LpG0y/dbLB3kMulG8xrWUGJ+hfjBRg6WXV9bmClWytbPO1CDkTS6MezAPdMlYXHCMxFwJiECekOdo7g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526418; c=relaxed/simple; bh=5XKH4rKG2rmPjvD+My7SIO/4CsLggleyZNwULbG90Cw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=uj/KP6azRSwlrHiij3bQ1sPI+IJNbj1HBgfG86GaiyRIq7fzf7/33Grt3G9NyYlAdwMSx1qx1ipt3Tl7flolxeFXceRJQJ1hQNsL7N9dHOhho3+RZryppNCHLgP490PqwKK1k5Di0I/K4OvmpJH4RZtoi2lp1+DLlU3vUYgiZsQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=ACezbWl6; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="ACezbWl6" Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 60R8BwoI028591; Tue, 27 Jan 2026 15:06:07 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=YbpErXg7HY93PUk7+ FUjxM4tE3Cz5WHz6tumO7wQIpY=; b=ACezbWl6w+Bx12TtXBkF1fItFqrnbAwwE a9Jifv07Lw4mtNSN8crIgnafY/RLyfTAgdQb4tu+nFI0lVsTelYs5/YKYUIrB1FF dJJ1Zo1eZzxq0MtBbbghwRr76fQq8D+xHFTlZAwC9DdGoIwPUTXYVQPuYIAJ6HCG D4NYvnYvbOF7Kb3qHgV7aJVsFtk6uE1e7pVBIAuvw9pw3q0XMAgdYjMPOnP2YsAp C1k4DY4T0r7CwytniHUyPvhOrUiuE1gvkXfkDMLAA+EAE6nPy6S24eHT1B3s/yP7 s4wPyYKmX4TIxngp7IPzEe/wTV921Nka88HjEuQi8pC6MP0fD15jA== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvmgfvder-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:07 +0000 (GMT) Received: from m0353725.ppops.net (m0353725.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 60RF4FPo021920; Tue, 27 Jan 2026 15:06:06 GMT Received: from ppma11.dal12v.mail.ibm.com (db.9e.1632.ip4.static.sl-reverse.com [50.22.158.219]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvmgfvdek-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:06 +0000 (GMT) Received: from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1]) by ppma11.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 60REptcW017960; Tue, 27 Jan 2026 15:06:05 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4bwb41ru41-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:05 +0000 Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay06.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 60RF614k31588670 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 Jan 2026 15:06:01 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5550520040; Tue, 27 Jan 2026 15:06:01 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id F153B20049; Tue, 27 Jan 2026 15:06:00 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 27 Jan 2026 15:06:00 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org, x86@kernel.org, linux-mm@kvack.org, Steven Rostedt Cc: Jens Remus , Josh Poimboeuf , Masami Hiramatsu , Mathieu Desnoyers , Peter Zijlstra , Ingo Molnar , Jiri Olsa , Arnaldo Carvalho de Melo , Namhyung Kim , Thomas Gleixner , Andrii Nakryiko , Indu Bhagat , "Jose E. Marchesi" , Beau Belgrave , Linus Torvalds , Andrew Morton , Florian Weimer , Kees Cook , "Carlos O'Donell" , Sam James , Dylan Hatch , Borislav Petkov , Dave Hansen , David Hildenbrand , "H. Peter Anvin" , "Liam R. Howlett" , Lorenzo Stoakes , Michal Hocko , Mike Rapoport , Suren Baghdasaryan , Vlastimil Babka , Heiko Carstens , Vasily Gorbik , "Steven Rostedt (Google)" Subject: [PATCH v13 11/18] unwind_user/sframe: Add .sframe validation option Date: Tue, 27 Jan 2026 16:05:46 +0100 Message-ID: <20260127150554.2760964-12-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260127150554.2760964-1-jremus@linux.ibm.com> References: <20260127150554.2760964-1-jremus@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=Z4vh3XRA c=1 sm=1 tr=0 ts=6978d45f cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=vUbySO9Y5rIA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=7d_E57ReAAAA:8 a=JfrnYn6hAAAA:8 a=yPCof4ZbAAAA:8 a=mDV3o1hIAAAA:8 a=yMhMjlubAAAA:8 a=VnNF1IyMAAAA:8 a=Z4Rwk6OoAAAA:8 a=20KFwNOVAAAA:8 a=7mOBRU54AAAA:8 a=meVymXHHAAAA:8 a=RXKZOtKmAAAA:8 a=X__uKv6Ezr3YNgStCWAA:9 a=jhqOcbufqs7Y1TYCrUUU:22 a=1CNFftbPRP8L7MoqJWF3:22 a=HkZW87K1Qel5hWWM3VKY:22 a=wa9RWnbW_A1YIeRBVszw:22 a=2JgSa4NbpEOStq-L5dxp:22 a=UFF3uGjEBZWolfm0k6KQ:22 X-Proofpoint-GUID: 8CIGiFRntDNEIVuUfDBRFak6N5_snaXU X-Proofpoint-ORIG-GUID: HXV_CBhSVc9DXg5rigLHd-wDWkUlYZuK X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTI3MDEyMSBTYWx0ZWRfX79+Ow3UZoRu4 Il2uCK9/SM3NUUG4G4ddQ6vPPpHwahJ0sBNDL29v7uGb1pPtnaLrrt60NZNj2FHtfkfDtBcYepR GMzDSglFjkT3jRCDGTGEO0p6QDX75oROSY53MG4pBD0QCFy6pSOikW4NCwFTWF4d7rOalIBTxwj 8Sahc4tv9NyO2ocdLoJDR1tZpL930JS5PVXpwoonqDJUuhNlgt7eHH4dIeUNEX+25xTXTzW0Tc3 2ugQSGJBigxVSrLd8gpvLVvmIc8Hmv4WuZ4a4YjVznWRzZG1eXB9uyVD6NV1ej3yIs4/RmY1M2j zZaRxWx3MVeb0j08bhEef6Y6aM9p8RM86B3l40S5aE99ZPA1pNbUfh6/CXB2qx1djRp8H5qZ+Cb chpKZuxa7Tp+56sJYwxgB1RgL9ZdhPdjCABH+vK70TVFG6GgvsbOtI7EZqW4Lql/XEwntlx2dJX AdwFDuAy8QN9qfp2i7g== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-01-27_03,2026-01-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 malwarescore=0 phishscore=0 priorityscore=1501 bulkscore=0 adultscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2601150000 definitions=main-2601270121 Content-Type: text/plain; charset="utf-8" From: Josh Poimboeuf Add a debug feature to validate all .sframe sections when first loading the file rather than on demand. [ Jens Remus: Add support for SFrame V3. Add support for PC-relative FDE function start offset. Adjust to rename of struct sframe_fre to sframe_fre_internal. Use %#x/%#lx format specifiers. ] Cc: Masami Hiramatsu Cc: Mathieu Desnoyers Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Jiri Olsa Cc: Arnaldo Carvalho de Melo Cc: Namhyung Kim Cc: Thomas Gleixner Cc: Andrii Nakryiko Cc: Indu Bhagat Cc: "Jose E. Marchesi" Cc: Beau Belgrave Cc: Jens Remus Cc: Linus Torvalds Cc: Andrew Morton Cc: Florian Weimer Cc: Sam James Cc: Kees Cook Cc: "Carlos O'Donell" Signed-off-by: Josh Poimboeuf Signed-off-by: Steven Rostedt (Google) Signed-off-by: Jens Remus --- Notes (jremus): Changes in v13: - Update to SFrame V3: - Print struct sframe_fde_internal fields fda_off and info2 in debug message. - Adjust to rename of struct sframe_fde_internal field func_start_addr to func_addr. - Use format strings "%#x" and "%#lx" instead of "0x%x" and "0x%lx". - Reword commit message (my changes). arch/Kconfig | 19 ++++++++ kernel/unwind/sframe.c | 99 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) diff --git a/arch/Kconfig b/arch/Kconfig index 2ece3df821b5..dcb553136e0c 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -490,6 +490,25 @@ config HAVE_UNWIND_USER_SFRAME bool select UNWIND_USER =20 +config SFRAME_VALIDATION + bool "Enable .sframe section debugging" + depends on HAVE_UNWIND_USER_SFRAME + depends on DYNAMIC_DEBUG + help + When adding an .sframe section for a task, validate the entire + section immediately rather than on demand. + + This is a debug feature which is helpful for rooting out .sframe + section issues. If the .sframe section is corrupt, it will fail to + load immediately, with more information provided in dynamic printks. + + This has a significant page cache footprint due to its reading of the + entire .sframe section for every loaded executable and shared + library. Also, it's done for all processes, even those which don't + get stack traced by the kernel. Not recommended for general use. + + If unsure, say N. + config HAVE_PERF_REGS bool help diff --git a/kernel/unwind/sframe.c b/kernel/unwind/sframe.c index 3276aa6d0c77..cf353bdbc907 100644 --- a/kernel/unwind/sframe.c +++ b/kernel/unwind/sframe.c @@ -367,6 +367,101 @@ int sframe_find(unsigned long ip, struct unwind_user_= frame *frame) return ret; } =20 +#ifdef CONFIG_SFRAME_VALIDATION + +static int safe_read_fde(struct sframe_section *sec, + unsigned int fde_num, struct sframe_fde_internal *fde) +{ + int ret; + + if (!user_read_access_begin((void __user *)sec->sframe_start, + sec->sframe_end - sec->sframe_start)) + return -EFAULT; + ret =3D __read_fde(sec, fde_num, fde); + user_read_access_end(); + return ret; +} + +static int safe_read_fre(struct sframe_section *sec, + struct sframe_fde_internal *fde, + unsigned long fre_addr, + struct sframe_fre_internal *fre) +{ + int ret; + + if (!user_read_access_begin((void __user *)sec->sframe_start, + sec->sframe_end - sec->sframe_start)) + return -EFAULT; + ret =3D __read_fre(sec, fde, fre_addr, fre); + user_read_access_end(); + return ret; +} + +static int sframe_validate_section(struct sframe_section *sec) +{ + unsigned long prev_ip =3D 0; + unsigned int i; + + for (i =3D 0; i < sec->num_fdes; i++) { + struct sframe_fre_internal *fre, *prev_fre =3D NULL; + unsigned long ip, fre_addr; + struct sframe_fde_internal fde; + struct sframe_fre_internal fres[2]; + bool which =3D false; + unsigned int j; + int ret; + + ret =3D safe_read_fde(sec, i, &fde); + if (ret) + return ret; + + ip =3D fde.func_addr; + if (ip <=3D prev_ip) { + dbg_sec("fde %u not sorted\n", i); + return -EFAULT; + } + prev_ip =3D ip; + + fre_addr =3D sec->fres_start + fde.fres_off; + for (j =3D 0; j < fde.fres_num; j++) { + int ret; + + fre =3D which ? fres : fres + 1; + which =3D !which; + + ret =3D safe_read_fre(sec, &fde, fre_addr, fre); + if (ret) { + dbg_sec("fde %u: __read_fre(%u) failed\n", i, j); + dbg_sec("FDE: func_addr:%#lx func_size:%#x fda_off:%#x fres_off:%#x fr= es_num:%d info:%u info2:%u rep_size:%u\n", + fde.func_addr, fde.func_size, + fde.fda_off, + fde.fres_off, fde.fres_num, + fde.info, fde.info2, + fde.rep_size); + return ret; + } + + fre_addr +=3D fre->size; + + if (prev_fre && fre->ip_off <=3D prev_fre->ip_off) { + dbg_sec("fde %u: fre %u not sorted\n", i, j); + return -EFAULT; + } + + prev_fre =3D fre; + } + } + + return 0; +} + +#else /* !CONFIG_SFRAME_VALIDATION */ + +static int sframe_validate_section(struct sframe_section *sec) { return 0;= } + +#endif /* !CONFIG_SFRAME_VALIDATION */ + + static void free_section(struct sframe_section *sec) { dbg_free(sec); @@ -476,6 +571,10 @@ int sframe_add_section(unsigned long sframe_start, uns= igned long sframe_end, goto err_free; } =20 + ret =3D sframe_validate_section(sec); + if (ret) + goto err_free; + ret =3D mtree_insert_range(sframe_mt, sec->text_start, sec->text_end, sec= , GFP_KERNEL); if (ret) { dbg_sec("mtree_insert_range failed: text=3D%lx-%lx\n", --=20 2.51.0 From nobody Sat Feb 7 05:01:40 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8BE4B35E556; Tue, 27 Jan 2026 15:06:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526420; cv=none; b=uyBxIqC5Abq4htMqwNJM0pSVeKaiW71y7QkhWBf3RaQw59KM9yYuqy44Whbw6dIb7VPUVw7btzLU7+wPt64DxntFrDiJ4AcVGChuUf0bXDuQ6DkwzdyhQdEG+kyC30xMH9ts7U8vjoodkOIB8rchS+kkpWjpsTcJUGJEI2Gky4M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526420; c=relaxed/simple; bh=E3AoU/0zb/U2ONsLGDm0BbnsBUvwFFhH5i9sfX1y5Dg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sNk5i9UeqVinUpRS8p8NvReCKAOEUvH5KH17YnVzILfQfnhz9dkSdeZy/rTXNQe0b/rKPOTpUhkGSom90wwyWdpReUczNbiRb93bm3d2WrpOQCaXPQl51Ouf3xnYjHqs3KOSIlIqEgKsP+swjR8XZTZogN5iTPWPsBNHmfx//S8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=gJFysdCM; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="gJFysdCM" Received: from pps.filterd (m0356517.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 60R6lnHn007318; Tue, 27 Jan 2026 15:06:08 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=Iv/QDF4F57jd/avnh h5oZwrTLD1Pr75CntdhW6Ulg6c=; b=gJFysdCMw1sIwtMoLFA4bXWkEuYTlzU+C CLFGgETXrSVVVOgf3oY7SOJLj2LWi06ciKfTNe1X5NqXVMdAdOlpX+geX5Sda+Ck yXyAWtw6viiiN+uJFfsbD9By3horReF8G1QCdCb9BBbAwNnPIdUOVVcB2u6xx3IQ paE2qYQaTohQr5Lj1Qrzy1BiPHcfJ21ynwDvXSZEUaHwlkBEkCXCu9BUQ3ght7HW jc5t1hQ4spxvJNzgsIxIlOozhm9XeJEtltnqRDiVmO77xRfWnN3Yi/BOIVApN2cX VkyYXtvZuJjIcW7f8yVc21ZUZtdc2QAD0eospn857roxBTG+whn2Q== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvnt7p1ky-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:08 +0000 (GMT) Received: from m0356517.ppops.net (m0356517.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 60REpwUh002598; Tue, 27 Jan 2026 15:06:07 GMT Received: from ppma23.wdc07v.mail.ibm.com (5d.69.3da9.ip4.static.sl-reverse.com [169.61.105.93]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvnt7p1kq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:07 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 60RDK24o026513; Tue, 27 Jan 2026 15:06:06 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4bw9wk91jx-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:05 +0000 Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay06.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 60RF61g019071292 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 Jan 2026 15:06:01 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B292E20040; Tue, 27 Jan 2026 15:06:01 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5C7142004B; Tue, 27 Jan 2026 15:06:01 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 27 Jan 2026 15:06:01 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org, x86@kernel.org, linux-mm@kvack.org, Steven Rostedt Cc: Jens Remus , Josh Poimboeuf , Masami Hiramatsu , Mathieu Desnoyers , Peter Zijlstra , Ingo Molnar , Jiri Olsa , Arnaldo Carvalho de Melo , Namhyung Kim , Thomas Gleixner , Andrii Nakryiko , Indu Bhagat , "Jose E. Marchesi" , Beau Belgrave , Linus Torvalds , Andrew Morton , Florian Weimer , Kees Cook , "Carlos O'Donell" , Sam James , Dylan Hatch , Borislav Petkov , Dave Hansen , David Hildenbrand , "H. Peter Anvin" , "Liam R. Howlett" , Lorenzo Stoakes , Michal Hocko , Mike Rapoport , Suren Baghdasaryan , Vlastimil Babka , Heiko Carstens , Vasily Gorbik Subject: [PATCH v13 12/18] unwind_user: Enable archs that pass RA in a register Date: Tue, 27 Jan 2026 16:05:47 +0100 Message-ID: <20260127150554.2760964-13-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260127150554.2760964-1-jremus@linux.ibm.com> References: <20260127150554.2760964-1-jremus@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-GUID: gN9Ie2oXE6XmK2pw2kxSTY9196utoeeB X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTI3MDEyMSBTYWx0ZWRfX8+H9rMU1UBVG CK5vKwe6dghhRv0aEhpPl32RezsG5njc2bVoPZxqxHDt/ZTiHjd3xjC1fwJ9/wrZ1bI6PIFQHEp VuA/xlyfKuRsWxznKqabE8Mp4Z8+QhkMLOpfo83t+2j2NSCzqWm7ScLSNVEd9hg6spJE65OjJc8 KdeCu9e1zobAxHqE3ytt1nAs5zMPRu1iWOPTMgyXDPl/xVBYF0gCQX4DM3sKBgPiC0uSjzQp6u/ x7q3M7rzlR5U2Xhkn4tDioKSl4DBbPWatJfrKH2Hz3FVAyxpjuHrhtAdfGQ4jopp3PY9dmScZht uO+pKk8VhY5B1ohbiyFTlz7UdkRLy+0rNLcO6no5iKQintm/yedr77cBr0W3GTDcR2wF/Z/BSLI H3udbZyodkg4IUpQu/Q9S3lnyc+rmMv1Nmsb63etHcoAtJB5Crdyi5AflgOtPHpwRS/iRn2DQjj eJcVwkofOMw+X2eTJwA== X-Authority-Analysis: v=2.4 cv=Zs3g6t7G c=1 sm=1 tr=0 ts=6978d460 cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=vUbySO9Y5rIA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=7d_E57ReAAAA:8 a=JfrnYn6hAAAA:8 a=yPCof4ZbAAAA:8 a=mDV3o1hIAAAA:8 a=yMhMjlubAAAA:8 a=Z4Rwk6OoAAAA:8 a=20KFwNOVAAAA:8 a=7mOBRU54AAAA:8 a=BZmVhOMqpLk0IJKryeUA:9 a=jhqOcbufqs7Y1TYCrUUU:22 a=1CNFftbPRP8L7MoqJWF3:22 a=HkZW87K1Qel5hWWM3VKY:22 a=wa9RWnbW_A1YIeRBVszw:22 X-Proofpoint-ORIG-GUID: tbgXXc5An2wsk3YCAZR6rR_lesBL9Ea- X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-01-27_03,2026-01-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 lowpriorityscore=0 adultscore=0 phishscore=0 suspectscore=0 bulkscore=0 impostorscore=0 priorityscore=1501 malwarescore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2601150000 definitions=main-2601270121 Content-Type: text/plain; charset="utf-8" Not all architectures have the return address (RA) in user space saved on the stack on function entry, such as x86-64 does due to its CALL instruction pushing the RA onto the stack. Architectures/ABIs, such as s390, also do not necessarily enforce to save the RA in user space on the stack in the function prologue or even at all, for instance in leaf functions. Treat a RA offset from CFA of zero as indication that the RA is not saved (on the stack). For the topmost frame treat it as indication that the RA is in the link/RA register, such as on arm64 and s390, and obtain it from there. For non-topmost frames treat it as error, as the RA must be saved. Additionally allow the SP to be unchanged in the topmost frame, for architectures where SP at function entry =3D=3D SP at call site, such as arm64 and s390. Note that treating a RA offset from CFA of zero as indication that the RA is not saved on the stack additionally allows for architectures, such as s390, where the frame pointer (FP) may be saved without the RA being saved as well. Provided that such architectures represent this in SFrame by encoding the "missing" RA offset using a padding RA offset with a value of zero. Cc: Steven Rostedt Cc: Josh Poimboeuf Cc: Masami Hiramatsu Cc: Mathieu Desnoyers Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Jiri Olsa Cc: Arnaldo Carvalho de Melo Cc: Namhyung Kim Cc: Thomas Gleixner Cc: Andrii Nakryiko Cc: Indu Bhagat Cc: "Jose E. Marchesi" Cc: Beau Belgrave Cc: Jens Remus Cc: Linus Torvalds Cc: Andrew Morton Cc: Florian Weimer Cc: Sam James Cc: Kees Cook Cc: "Carlos O'Donell" Signed-off-by: Jens Remus --- Notes (jremus): Changes in v13: - New patch. Based on my s390 sframe support series patch "unwind_user: Enable archs that pass RA in a register": https://lore.kernel.org/all/20251208171559.2029709-11-jremus@linux.ib= m.com/ include/linux/unwind_user.h | 9 +++++++++ kernel/unwind/sframe.c | 6 ++---- kernel/unwind/user.c | 17 +++++++++++++---- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/include/linux/unwind_user.h b/include/linux/unwind_user.h index 64618618febd..bc2edae39955 100644 --- a/include/linux/unwind_user.h +++ b/include/linux/unwind_user.h @@ -23,6 +23,15 @@ static inline bool unwind_user_at_function_start(struct = pt_regs *regs) #define unwind_user_at_function_start unwind_user_at_function_start #endif =20 +#ifndef unwind_user_get_ra_reg +static inline int unwind_user_get_ra_reg(unsigned long *val) +{ + WARN_ON_ONCE(1); + return -EINVAL; +} +#define unwind_user_get_ra_reg unwind_user_get_ra_reg +#endif + int unwind_user(struct unwind_stacktrace *trace, unsigned int max_entries); =20 #endif /* _LINUX_UNWIND_USER_H */ diff --git a/kernel/unwind/sframe.c b/kernel/unwind/sframe.c index cf353bdbc907..fc905504ddde 100644 --- a/kernel/unwind/sframe.c +++ b/kernel/unwind/sframe.c @@ -243,10 +243,8 @@ static __always_inline int __read_fre(struct sframe_se= ction *sec, dataword_count--; =20 ra_off =3D sec->ra_off; - if (!ra_off) { - if (!dataword_count--) - return -EFAULT; - + if (!ra_off && dataword_count) { + dataword_count--; UNSAFE_GET_USER_INC(ra_off, cur, dataword_size, Efault); } =20 diff --git a/kernel/unwind/user.c b/kernel/unwind/user.c index fdb1001e3750..9ceef9b2b8db 100644 --- a/kernel/unwind/user.c +++ b/kernel/unwind/user.c @@ -48,8 +48,12 @@ static int unwind_user_next_common(struct unwind_user_st= ate *state, } cfa +=3D frame->cfa_off; =20 - /* Make sure that stack is not going in wrong direction */ - if (cfa <=3D state->sp) + /* + * Make sure that stack is not going in wrong direction. Allow SP + * to be unchanged for the topmost frame, by subtracting topmost, + * which is either 0 or 1. + */ + if (cfa <=3D state->sp - state->topmost) return -EINVAL; =20 /* Make sure that the address is word aligned */ @@ -57,8 +61,13 @@ static int unwind_user_next_common(struct unwind_user_st= ate *state, return -EINVAL; =20 /* Get the Return Address (RA) */ - if (get_user_word(&ra, cfa, frame->ra_off, state->ws)) - return -EINVAL; + if (frame->ra_off) { + if (get_user_word(&ra, cfa, frame->ra_off, state->ws)) + return -EINVAL; + } else { + if (!state->topmost || unwind_user_get_ra_reg(&ra)) + return -EINVAL; + } =20 /* Get the Frame Pointer (FP) */ if (frame->fp_off && get_user_word(&fp, cfa, frame->fp_off, state->ws)) --=20 2.51.0 From nobody Sat Feb 7 05:01:40 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BE08B35EDAD; Tue, 27 Jan 2026 15:06:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526420; cv=none; b=R+vOOuKb9Bco7Vs7ES9dIDbJ/cQc0cZBX+UhCNEjtw7EvjqcKGpOmS2JsX6CTeAokd9BdfEY67T3o0CFoIuT94qME/cpuq0HdyAwt6YxemAFQPfyiYeurNGLuD6YVYG6HRpyW496kM8jwIlfoAO4Z0JzdZz/gJv+4MBFHtcRTf4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526420; c=relaxed/simple; bh=rxY8xGBZ5yJit2+YWuz47hZhT0yoaeRIGpacQau1RRc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Q1HuMiTRZuHKpZkKZkmq8gwveqwiRJ6eaVvO77zHXCObq83iWWPfRa0Z9ercVG9D+YNxt5SGJsuZLVIYfuQ6VgYOd6oCAbdZz4pySFkmQccMKjDj1qRtpr801vBqcqu5tMgNhHau3o+cHBOb1aaD+60C/2+/KVLhn6ahTRoHRys= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=KuUi5gcZ; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="KuUi5gcZ" Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 60R8VC3L019081; Tue, 27 Jan 2026 15:06:08 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=/3PfnVmrJ4bjdUuPi bRsWkINJ7RY5gnKqjYR9SGs8lk=; b=KuUi5gcZFeyz0ICxuIdUgcsT6tsE+VaSA uo3WH0cH0I8rNElydSgIcawC0FaTGu/8Jrgh+x/3o227fX91aYQ67QA7Xp2Kf2rz 95gzrKpweL9wCDo7y26ra6n9DHfqYU9TeBikOq4vHO0g6PFVOh1LsU0rNNhM4d/+ dOs+MIpGiJBQtO+74pYyzEsVyvb4nwXG++X4odtSctKFT+ZTjc0tC/RpDWJyyOfz qfed6SEkR3xFgJvVIQIMHU/4ZQ+KtQ6BuLWFKuCAfa6tHyk8elIpRLN9XlOQVjtG 0vtRSFyZfaPL6/8YCRvA3zYpZFlcry//toK0gRJdzsHGk8Sr98nzA== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvnk6x32y-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:07 +0000 (GMT) Received: from m0360083.ppops.net (m0360083.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 60RF67I1017499; Tue, 27 Jan 2026 15:06:07 GMT Received: from ppma12.dal12v.mail.ibm.com (dc.9e.1632.ip4.static.sl-reverse.com [50.22.158.220]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvnk6x32t-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:07 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 60RD4EJN031030; Tue, 27 Jan 2026 15:06:05 GMT Received: from smtprelay07.fra02v.mail.ibm.com ([9.218.2.229]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4bw8dsh6cp-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:05 +0000 Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay07.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 60RF62VW50659822 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 Jan 2026 15:06:02 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 2575B20040; Tue, 27 Jan 2026 15:06:02 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B9B6320049; Tue, 27 Jan 2026 15:06:01 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 27 Jan 2026 15:06:01 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org, x86@kernel.org, linux-mm@kvack.org, Steven Rostedt Cc: Jens Remus , Josh Poimboeuf , Masami Hiramatsu , Mathieu Desnoyers , Peter Zijlstra , Ingo Molnar , Jiri Olsa , Arnaldo Carvalho de Melo , Namhyung Kim , Thomas Gleixner , Andrii Nakryiko , Indu Bhagat , "Jose E. Marchesi" , Beau Belgrave , Linus Torvalds , Andrew Morton , Florian Weimer , Kees Cook , "Carlos O'Donell" , Sam James , Dylan Hatch , Borislav Petkov , Dave Hansen , David Hildenbrand , "H. Peter Anvin" , "Liam R. Howlett" , Lorenzo Stoakes , Michal Hocko , Mike Rapoport , Suren Baghdasaryan , Vlastimil Babka , Heiko Carstens , Vasily Gorbik Subject: [PATCH v13 13/18] unwind_user: Flexible FP/RA recovery rules Date: Tue, 27 Jan 2026 16:05:48 +0100 Message-ID: <20260127150554.2760964-14-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260127150554.2760964-1-jremus@linux.ibm.com> References: <20260127150554.2760964-1-jremus@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-GUID: XE0RzFmCVQb5zWyHjwUBrwMS-vJMXWBs X-Proofpoint-ORIG-GUID: KAkSN1-K_xFuumNvJggSiF3ey7msAwbx X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTI3MDEyMSBTYWx0ZWRfX3BM4sLcNzZgq 6z/lYcuuColZwrV7LGol9MsOo0DjdLJJIgEql10Fo9L9tt1I6lfIUhB+TCwnuQxr41SzWdbkg2X t4NrzOWrR+mfZRm/iZ5sLT3uWmLX0pTPn/KPXrZ2a7xwvcYjSnbaXOpKCquqzz2npupcP/8UPoS 8lKSKtMwJHB7zrvWRFZEj82suALaNdBWVRX6q9pF1/eOwF0MxTKN6n4XSccM6oMEidAnw5nQRYO daYo6gM3yZJ/lr9tLXX5lwQUszkwJmdc103D9T9pFByrVymMYzHD4lukJNSBkq8qDgo742uTywe ULCAXsnj9Wkzti4oTyFQIRVHJi3hrCA+T4wXYfZnrIdNZM0Pi++bNlx8iYOF4IM4SwYLJGd8FdF dDx+yh92q2tuixN1g16+Hes7lSMhERL3sDatdRrtwPp0WbtNoLbKJaPWXo3Qs+B/h9UuA/BSJ5y zvQsKiWJNgyIUVbWDrQ== X-Authority-Analysis: v=2.4 cv=AMiVTGgp c=1 sm=1 tr=0 ts=6978d45f cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=vUbySO9Y5rIA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=7d_E57ReAAAA:8 a=JfrnYn6hAAAA:8 a=yPCof4ZbAAAA:8 a=mDV3o1hIAAAA:8 a=yMhMjlubAAAA:8 a=Z4Rwk6OoAAAA:8 a=20KFwNOVAAAA:8 a=7mOBRU54AAAA:8 a=-jr7Rsxdtpxs5_a9E3IA:9 a=jhqOcbufqs7Y1TYCrUUU:22 a=1CNFftbPRP8L7MoqJWF3:22 a=HkZW87K1Qel5hWWM3VKY:22 a=wa9RWnbW_A1YIeRBVszw:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-01-27_03,2026-01-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 spamscore=0 phishscore=0 bulkscore=0 suspectscore=0 adultscore=0 clxscore=1015 priorityscore=1501 lowpriorityscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2601150000 definitions=main-2601270121 Content-Type: text/plain; charset="utf-8" To enable support for SFrame V3 flexible FDEs with a subsequent patch, add support for the following flexible frame pointer (FP) and return address (RA) recovery rules: FP/RA =3D *(CFA + offset) FP/RA =3D register + offset FP/RA =3D *(register + offset) Note that FP/RA recovery rules that use arbitrary register contents are only valid when in the topmost frame, as their contents are otherwise unknown. This also enables unwinding of user space for architectures, such as s390, that may save the frame pointer (FP) and/or return address (RA) in other registers, for instance when in a leaf function. Cc: Steven Rostedt Cc: Josh Poimboeuf Cc: Masami Hiramatsu Cc: Mathieu Desnoyers Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Jiri Olsa Cc: Arnaldo Carvalho de Melo Cc: Namhyung Kim Cc: Thomas Gleixner Cc: Andrii Nakryiko Cc: Indu Bhagat Cc: "Jose E. Marchesi" Cc: Beau Belgrave Cc: Jens Remus Cc: Linus Torvalds Cc: Andrew Morton Cc: Florian Weimer Cc: Sam James Cc: Kees Cook Cc: "Carlos O'Donell" Signed-off-by: Jens Remus --- Notes (jremus): Changes in v13: - New patch. Based on my s390 sframe support series patch "unwind_user: Enable archs that save RA/FP in other registers": https://lore.kernel.org/all/20251208171559.2029709-12-jremus@linux.ib= m.com/ arch/x86/include/asm/unwind_user.h | 21 ++++++++++--- include/linux/unwind_user.h | 9 ++++++ include/linux/unwind_user_types.h | 23 +++++++++++++-- kernel/unwind/sframe.c | 16 ++++++++-- kernel/unwind/user.c | 47 +++++++++++++++++++++++++----- 5 files changed, 101 insertions(+), 15 deletions(-) diff --git a/arch/x86/include/asm/unwind_user.h b/arch/x86/include/asm/unwi= nd_user.h index 2dfb5ef11e36..9c3417be4283 100644 --- a/arch/x86/include/asm/unwind_user.h +++ b/arch/x86/include/asm/unwind_user.h @@ -21,15 +21,26 @@ static inline int unwind_user_word_size(struct pt_regs = *regs) =20 #define ARCH_INIT_USER_FP_FRAME(ws) \ .cfa_off =3D 2*(ws), \ - .ra_off =3D -1*(ws), \ - .fp_off =3D -2*(ws), \ + .ra =3D { \ + .rule =3D UNWIND_USER_RULE_CFA_OFFSET_DEREF,\ + .offset =3D -1*(ws), \ + }, \ + .fp =3D { \ + .rule =3D UNWIND_USER_RULE_CFA_OFFSET_DEREF,\ + .offset =3D -2*(ws), \ + }, \ .use_fp =3D true, \ .outermost =3D false, =20 #define ARCH_INIT_USER_FP_ENTRY_FRAME(ws) \ .cfa_off =3D 1*(ws), \ - .ra_off =3D -1*(ws), \ - .fp_off =3D 0, \ + .ra =3D { \ + .rule =3D UNWIND_USER_RULE_CFA_OFFSET_DEREF,\ + .offset =3D -1*(ws), \ + }, \ + .fp =3D { \ + .rule =3D UNWIND_USER_RULE_RETAIN,\ + }, \ .use_fp =3D false, \ .outermost =3D false, =20 @@ -41,4 +52,6 @@ static inline bool unwind_user_at_function_start(struct p= t_regs *regs) =20 #endif /* CONFIG_HAVE_UNWIND_USER_FP */ =20 +#include + #endif /* _ASM_X86_UNWIND_USER_H */ diff --git a/include/linux/unwind_user.h b/include/linux/unwind_user.h index bc2edae39955..92cdf38c8ade 100644 --- a/include/linux/unwind_user.h +++ b/include/linux/unwind_user.h @@ -32,6 +32,15 @@ static inline int unwind_user_get_ra_reg(unsigned long *= val) #define unwind_user_get_ra_reg unwind_user_get_ra_reg #endif =20 +#ifndef unwind_user_get_reg +static inline int unwind_user_get_reg(unsigned long *val, unsigned int reg= num) +{ + WARN_ON_ONCE(1); + return -EINVAL; +} +#define unwind_user_get_reg unwind_user_get_reg +#endif + int unwind_user(struct unwind_stacktrace *trace, unsigned int max_entries); =20 #endif /* _LINUX_UNWIND_USER_H */ diff --git a/include/linux/unwind_user_types.h b/include/linux/unwind_user_= types.h index 616cc5ee4586..0d02714a1b5d 100644 --- a/include/linux/unwind_user_types.h +++ b/include/linux/unwind_user_types.h @@ -27,10 +27,29 @@ struct unwind_stacktrace { unsigned long *entries; }; =20 +#define UNWIND_USER_RULE_DEREF BIT(31) + +enum unwind_user_rule { + UNWIND_USER_RULE_RETAIN, /* entity =3D entity */ + UNWIND_USER_RULE_CFA_OFFSET, /* entity =3D CFA + offset */ + UNWIND_USER_RULE_REG_OFFSET, /* entity =3D register + offset */ + /* DEREF variants */ + UNWIND_USER_RULE_CFA_OFFSET_DEREF =3D /* entity =3D *(CFA + offset) */ + UNWIND_USER_RULE_CFA_OFFSET | UNWIND_USER_RULE_DEREF, + UNWIND_USER_RULE_REG_OFFSET_DEREF =3D /* entity =3D *(register + offset) = */ + UNWIND_USER_RULE_REG_OFFSET | UNWIND_USER_RULE_DEREF, +}; + +struct unwind_user_rule_data { + enum unwind_user_rule rule; + s32 offset; + unsigned int regnum; +}; + struct unwind_user_frame { s32 cfa_off; - s32 ra_off; - s32 fp_off; + struct unwind_user_rule_data ra; + struct unwind_user_rule_data fp; bool use_fp; bool outermost; }; diff --git a/kernel/unwind/sframe.c b/kernel/unwind/sframe.c index fc905504ddde..b5301fa9dbc8 100644 --- a/kernel/unwind/sframe.c +++ b/kernel/unwind/sframe.c @@ -271,6 +271,18 @@ static __always_inline int __read_fre(struct sframe_se= ction *sec, return -EFAULT; } =20 +static __always_inline void +sframe_init_rule_data(struct unwind_user_rule_data *rule_data, + s32 offset) +{ + if (offset) { + rule_data->rule =3D UNWIND_USER_RULE_CFA_OFFSET_DEREF; + rule_data->offset =3D offset; + } else { + rule_data->rule =3D UNWIND_USER_RULE_RETAIN; + } +} + static __always_inline int __find_fre(struct sframe_section *sec, struct sframe_fde_internal *fde, unsigned long ip, @@ -321,8 +333,8 @@ static __always_inline int __find_fre(struct sframe_sec= tion *sec, fre =3D prev_fre; =20 frame->cfa_off =3D fre->cfa_off; - frame->ra_off =3D fre->ra_off; - frame->fp_off =3D fre->fp_off; + sframe_init_rule_data(&frame->ra, fre->ra_off); + sframe_init_rule_data(&frame->fp, fre->fp_off); frame->use_fp =3D SFRAME_V3_FRE_CFA_BASE_REG_ID(fre->info) =3D=3D SFRAME= _BASE_REG_FP; frame->outermost =3D SFRAME_V3_FRE_RA_UNDEFINED_P(fre->info); =20 diff --git a/kernel/unwind/user.c b/kernel/unwind/user.c index 9ceef9b2b8db..0405922c5c0d 100644 --- a/kernel/unwind/user.c +++ b/kernel/unwind/user.c @@ -61,22 +61,55 @@ static int unwind_user_next_common(struct unwind_user_s= tate *state, return -EINVAL; =20 /* Get the Return Address (RA) */ - if (frame->ra_off) { - if (get_user_word(&ra, cfa, frame->ra_off, state->ws)) - return -EINVAL; - } else { + switch (frame->ra.rule) { + case UNWIND_USER_RULE_RETAIN: if (!state->topmost || unwind_user_get_ra_reg(&ra)) return -EINVAL; + break; + /* UNWIND_USER_RULE_CFA_OFFSET not implemented on purpose */ + case UNWIND_USER_RULE_CFA_OFFSET_DEREF: + ra =3D cfa + frame->ra.offset; + break; + case UNWIND_USER_RULE_REG_OFFSET: + case UNWIND_USER_RULE_REG_OFFSET_DEREF: + if (!state->topmost || unwind_user_get_reg(&ra, frame->ra.regnum)) + return -EINVAL; + ra +=3D frame->ra.offset; + break; + default: + WARN_ON_ONCE(1); + return -EINVAL; } + if (frame->ra.rule & UNWIND_USER_RULE_DEREF && + get_user_word(&ra, ra, 0, state->ws)) + return -EINVAL; =20 /* Get the Frame Pointer (FP) */ - if (frame->fp_off && get_user_word(&fp, cfa, frame->fp_off, state->ws)) + switch (frame->fp.rule) { + case UNWIND_USER_RULE_RETAIN: + fp =3D state->fp; + break; + /* UNWIND_USER_RULE_CFA_OFFSET not implemented on purpose */ + case UNWIND_USER_RULE_CFA_OFFSET_DEREF: + fp =3D cfa + frame->fp.offset; + break; + case UNWIND_USER_RULE_REG_OFFSET: + case UNWIND_USER_RULE_REG_OFFSET_DEREF: + if (!state->topmost || unwind_user_get_reg(&fp, frame->fp.regnum)) + return -EINVAL; + fp +=3D frame->fp.offset; + break; + default: + WARN_ON_ONCE(1); + return -EINVAL; + } + if (frame->fp.rule & UNWIND_USER_RULE_DEREF && + get_user_word(&fp, fp, 0, state->ws)) return -EINVAL; =20 state->ip =3D ra; state->sp =3D cfa; - if (frame->fp_off) - state->fp =3D fp; + state->fp =3D fp; state->topmost =3D false; return 0; } --=20 2.51.0 From nobody Sat Feb 7 05:01:40 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7392835E543; Tue, 27 Jan 2026 15:06:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526421; cv=none; b=Ts5dVz8qFkorAx23S68/QjiWh3nfbxkb8DrhVJDtz6S5+E9gaCsA1CjfEP/fGBEXqa5+jKPUbEZEAkFbBBMh2Xtqus/mLz9uznVICuILCI2VHHq+3W6INEzzz6l415B8bZgbSSUIXFQkYfzoCsfrqMatUANCGDJ8A3ZE84mDEUY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526421; c=relaxed/simple; bh=/jYdeGCwT2aghnIxDrFoEOBZTUHBf8tO3zGiHMYNPGA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ggX6NiPczRI/IGztu2i8kJ99G/e9QhZx+og8hMxjcuBLUoQIpIRujEBezB90HNaRD2Lm89BqF8CmZlBDUGLK7DVEkII+H+RXZTIqGYjdrJwGF/HpmabmBwRxDv4rfigFDhzgr3cnOVKvubRBVjygEMeihTroO61Mzwg+IPjajzk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=N/NWS0Up; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="N/NWS0Up" Received: from pps.filterd (m0360072.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 60REnaOS009684; Tue, 27 Jan 2026 15:06:08 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=K+YHoKAw+cbn5wzmO qW1aWOmzk7X5v1pFB0m2mI6QO0=; b=N/NWS0UpWzXtbnLKLLp8d815C5U1hpII+ umo/IJHd9TgC6LFBl9u0ZD5vBYuPr4Q7V1jNvfKXMK0SBrcVhFUtOURKJrtdQBhU 6nCULSBUfRZ6t/Wo7b3aRSPu2WU21A/jQRSOBpXNlTwkyZL7e8XuTs+Jn+Rw9VJU CbjgN2MzGkdRUiYLLQmPUFbttIZKfvuNamEWxTHNcFszO9yfMdDerY2ukdNmInqH JPfl9TzQ9j4IH8R/v1GduTpKIRkYKsaYMuYjqE+te6laYhASQPsdbEIfeb48JNii Orm5/oWCMpxyTf6u5Z3mBCRON0P1QZsFTUMXX9Ke7voJEdIyqkHkQ== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvnr646r5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:08 +0000 (GMT) Received: from m0360072.ppops.net (m0360072.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 60RF4ZmU031466; Tue, 27 Jan 2026 15:06:07 GMT Received: from ppma13.dal12v.mail.ibm.com (dd.9e.1632.ip4.static.sl-reverse.com [50.22.158.221]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvnr646r1-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:07 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 60REgU5f023624; Tue, 27 Jan 2026 15:06:06 GMT Received: from smtprelay07.fra02v.mail.ibm.com ([9.218.2.229]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4bwamjrwj2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:06 +0000 Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay07.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 60RF62to50659832 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 Jan 2026 15:06:02 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 8D84C20049; Tue, 27 Jan 2026 15:06:02 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 2C4412004B; Tue, 27 Jan 2026 15:06:02 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 27 Jan 2026 15:06:02 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org, x86@kernel.org, linux-mm@kvack.org, Steven Rostedt Cc: Jens Remus , Josh Poimboeuf , Masami Hiramatsu , Mathieu Desnoyers , Peter Zijlstra , Ingo Molnar , Jiri Olsa , Arnaldo Carvalho de Melo , Namhyung Kim , Thomas Gleixner , Andrii Nakryiko , Indu Bhagat , "Jose E. Marchesi" , Beau Belgrave , Linus Torvalds , Andrew Morton , Florian Weimer , Kees Cook , "Carlos O'Donell" , Sam James , Dylan Hatch , Borislav Petkov , Dave Hansen , David Hildenbrand , "H. Peter Anvin" , "Liam R. Howlett" , Lorenzo Stoakes , Michal Hocko , Mike Rapoport , Suren Baghdasaryan , Vlastimil Babka , Heiko Carstens , Vasily Gorbik Subject: [PATCH v13 14/18] unwind_user: Flexible CFA recovery rules Date: Tue, 27 Jan 2026 16:05:49 +0100 Message-ID: <20260127150554.2760964-15-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260127150554.2760964-1-jremus@linux.ibm.com> References: <20260127150554.2760964-1-jremus@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTI3MDEyMSBTYWx0ZWRfX6cfqk7mkyDnN BKp7glWyYHb2jjLh3MumiA/bplBWiqJqruQKx/swaib6JOMAVA2drXb/+Vyi3S+6FLGjOVxX2FM xkHz3fx+zxg3nXu7uGOaaGM7hHFTc/QvHaScknYs7K7VAToz7icJnCvFXw5m0ODwgOAEzFApyMc T+m+osCzvQR5WBKDMlKs3cUo9qj90aYhdysC9ZqLsmlm2sUvv3gHo/E6NaBSwqZJ8PbhDbtRqJA uryz/Blnr9l8ZvVjyQiGS4V+d/36lXMxoA166Q6o5wit1lP06QybN6vL1gNe0jJE2BzqUQbfrQk sn9kgOczbUku7vii1yXR93Fr5shX4tnhebF2v0gG1kZAKn9Spt9hVQvCWlUYrTSXnHo1v3DAk/C TJdPERjdAZ645t4Y1JnfNpISFtf7aj/7nraVvf6JQWboLnSnPANuLA11OEp8nqTuk/Kozp1yMZd tPpJORTyQew5r8ttPhA== X-Proofpoint-GUID: Vu9HWYWmyloL_Ii75PWM7aqhnZmB2Kq3 X-Proofpoint-ORIG-GUID: mYZ-0j0k0zbvHgd1DpkIZSE_XICv4fco X-Authority-Analysis: v=2.4 cv=X+Vf6WTe c=1 sm=1 tr=0 ts=6978d460 cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=vUbySO9Y5rIA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=7d_E57ReAAAA:8 a=JfrnYn6hAAAA:8 a=yPCof4ZbAAAA:8 a=mDV3o1hIAAAA:8 a=yMhMjlubAAAA:8 a=VnNF1IyMAAAA:8 a=Z4Rwk6OoAAAA:8 a=20KFwNOVAAAA:8 a=7mOBRU54AAAA:8 a=cmUe23YjoY9pwAX-L18A:9 a=jhqOcbufqs7Y1TYCrUUU:22 a=1CNFftbPRP8L7MoqJWF3:22 a=HkZW87K1Qel5hWWM3VKY:22 a=wa9RWnbW_A1YIeRBVszw:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-01-27_03,2026-01-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 suspectscore=0 impostorscore=0 lowpriorityscore=0 clxscore=1015 spamscore=0 adultscore=0 malwarescore=0 bulkscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2601150000 definitions=main-2601270121 Content-Type: text/plain; charset="utf-8" To enable support for SFrame V3 flexible FDEs with a subsequent patch, add support for the following flexible Canonical Frame Address (CFA) recovery rules: CFA =3D SP + offset CFA =3D FP + offset CFA =3D register + offset CFA =3D *(register + offset) Note that CFA recovery rules that use arbitrary register contents are only valid when in the topmost frame, as their contents are otherwise unknown. Cc: Steven Rostedt Cc: Josh Poimboeuf Cc: Masami Hiramatsu Cc: Mathieu Desnoyers Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Jiri Olsa Cc: Arnaldo Carvalho de Melo Cc: Namhyung Kim Cc: Thomas Gleixner Cc: Andrii Nakryiko Cc: Indu Bhagat Cc: "Jose E. Marchesi" Cc: Beau Belgrave Cc: Jens Remus Cc: Linus Torvalds Cc: Andrew Morton Cc: Florian Weimer Cc: Sam James Cc: Kees Cook Cc: "Carlos O'Donell" Signed-off-by: Jens Remus --- Notes (jremus): Changes in v13: - New patch. arch/x86/include/asm/unwind_user.h | 12 ++++++++---- include/linux/unwind_user_types.h | 18 ++++++++++++++++-- kernel/unwind/sframe.c | 15 +++++++++++++-- kernel/unwind/user.c | 22 ++++++++++++++++++---- 4 files changed, 55 insertions(+), 12 deletions(-) diff --git a/arch/x86/include/asm/unwind_user.h b/arch/x86/include/asm/unwi= nd_user.h index 9c3417be4283..f38f7c5ff1de 100644 --- a/arch/x86/include/asm/unwind_user.h +++ b/arch/x86/include/asm/unwind_user.h @@ -20,7 +20,10 @@ static inline int unwind_user_word_size(struct pt_regs *= regs) #ifdef CONFIG_HAVE_UNWIND_USER_FP =20 #define ARCH_INIT_USER_FP_FRAME(ws) \ - .cfa_off =3D 2*(ws), \ + .cfa =3D { \ + .rule =3D UNWIND_USER_CFA_RULE_FP_OFFSET,\ + .offset =3D 2*(ws), \ + }, \ .ra =3D { \ .rule =3D UNWIND_USER_RULE_CFA_OFFSET_DEREF,\ .offset =3D -1*(ws), \ @@ -29,11 +32,13 @@ static inline int unwind_user_word_size(struct pt_regs = *regs) .rule =3D UNWIND_USER_RULE_CFA_OFFSET_DEREF,\ .offset =3D -2*(ws), \ }, \ - .use_fp =3D true, \ .outermost =3D false, =20 #define ARCH_INIT_USER_FP_ENTRY_FRAME(ws) \ - .cfa_off =3D 1*(ws), \ + .cfa =3D { \ + .rule =3D UNWIND_USER_CFA_RULE_SP_OFFSET,\ + .offset =3D 1*(ws), \ + }, \ .ra =3D { \ .rule =3D UNWIND_USER_RULE_CFA_OFFSET_DEREF,\ .offset =3D -1*(ws), \ @@ -41,7 +46,6 @@ static inline int unwind_user_word_size(struct pt_regs *r= egs) .fp =3D { \ .rule =3D UNWIND_USER_RULE_RETAIN,\ }, \ - .use_fp =3D false, \ .outermost =3D false, =20 static inline bool unwind_user_at_function_start(struct pt_regs *regs) diff --git a/include/linux/unwind_user_types.h b/include/linux/unwind_user_= types.h index 0d02714a1b5d..059e5c76f2f3 100644 --- a/include/linux/unwind_user_types.h +++ b/include/linux/unwind_user_types.h @@ -29,6 +29,21 @@ struct unwind_stacktrace { =20 #define UNWIND_USER_RULE_DEREF BIT(31) =20 +enum unwind_user_cfa_rule { + UNWIND_USER_CFA_RULE_SP_OFFSET, /* CFA =3D SP + offset */ + UNWIND_USER_CFA_RULE_FP_OFFSET, /* CFA =3D FP + offset */ + UNWIND_USER_CFA_RULE_REG_OFFSET, /* CFA =3D reg + offset */ + /* DEREF variants */ + UNWIND_USER_CFA_RULE_REG_OFFSET_DEREF =3D /* CFA =3D *(reg + offset) */ + UNWIND_USER_CFA_RULE_REG_OFFSET | UNWIND_USER_RULE_DEREF, +}; + +struct unwind_user_cfa_rule_data { + enum unwind_user_cfa_rule rule; + s32 offset; + unsigned int regnum; +}; + enum unwind_user_rule { UNWIND_USER_RULE_RETAIN, /* entity =3D entity */ UNWIND_USER_RULE_CFA_OFFSET, /* entity =3D CFA + offset */ @@ -47,10 +62,9 @@ struct unwind_user_rule_data { }; =20 struct unwind_user_frame { - s32 cfa_off; + struct unwind_user_cfa_rule_data cfa; struct unwind_user_rule_data ra; struct unwind_user_rule_data fp; - bool use_fp; bool outermost; }; =20 diff --git a/kernel/unwind/sframe.c b/kernel/unwind/sframe.c index b5301fa9dbc8..4dfc8cf2075e 100644 --- a/kernel/unwind/sframe.c +++ b/kernel/unwind/sframe.c @@ -271,6 +271,18 @@ static __always_inline int __read_fre(struct sframe_se= ction *sec, return -EFAULT; } =20 +static __always_inline void +sframe_init_cfa_rule_data(struct unwind_user_cfa_rule_data *cfa_rule_data, + unsigned char fre_info, + s32 offset) +{ + if (SFRAME_V3_FRE_CFA_BASE_REG_ID(fre_info) =3D=3D SFRAME_BASE_REG_FP) + cfa_rule_data->rule =3D UNWIND_USER_CFA_RULE_FP_OFFSET; + else + cfa_rule_data->rule =3D UNWIND_USER_CFA_RULE_SP_OFFSET; + cfa_rule_data->offset =3D offset; +} + static __always_inline void sframe_init_rule_data(struct unwind_user_rule_data *rule_data, s32 offset) @@ -332,10 +344,9 @@ static __always_inline int __find_fre(struct sframe_se= ction *sec, return -EINVAL; fre =3D prev_fre; =20 - frame->cfa_off =3D fre->cfa_off; + sframe_init_cfa_rule_data(&frame->cfa, fre->info, fre->cfa_off); sframe_init_rule_data(&frame->ra, fre->ra_off); sframe_init_rule_data(&frame->fp, fre->fp_off); - frame->use_fp =3D SFRAME_V3_FRE_CFA_BASE_REG_ID(fre->info) =3D=3D SFRAME= _BASE_REG_FP; frame->outermost =3D SFRAME_V3_FRE_RA_UNDEFINED_P(fre->info); =20 return 0; diff --git a/kernel/unwind/user.c b/kernel/unwind/user.c index 0405922c5c0d..eb7d9489f671 100644 --- a/kernel/unwind/user.c +++ b/kernel/unwind/user.c @@ -39,14 +39,28 @@ static int unwind_user_next_common(struct unwind_user_s= tate *state, } =20 /* Get the Canonical Frame Address (CFA) */ - if (frame->use_fp) { + switch (frame->cfa.rule) { + case UNWIND_USER_CFA_RULE_SP_OFFSET: + cfa =3D state->sp; + break; + case UNWIND_USER_CFA_RULE_FP_OFFSET: if (state->fp < state->sp) return -EINVAL; cfa =3D state->fp; - } else { - cfa =3D state->sp; + break; + case UNWIND_USER_CFA_RULE_REG_OFFSET: + case UNWIND_USER_CFA_RULE_REG_OFFSET_DEREF: + if (!state->topmost || unwind_user_get_reg(&cfa, frame->cfa.regnum)) + return -EINVAL; + break; + default: + WARN_ON_ONCE(1); + return -EINVAL; } - cfa +=3D frame->cfa_off; + cfa +=3D frame->cfa.offset; + if (frame->cfa.rule & UNWIND_USER_RULE_DEREF && + get_user_word(&cfa, cfa, 0, state->ws)) + return -EINVAL; =20 /* * Make sure that stack is not going in wrong direction. Allow SP --=20 2.51.0 From nobody Sat Feb 7 05:01:40 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3C4A635E541; Tue, 27 Jan 2026 15:06:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526419; cv=none; b=HHQv8M6n7IN7yLaHAijMJWpJQL1y4t+O6eKWyJVYMeInMR+hq5ta5ACog5hvEkzc6pkPObVfN/WjDelhb9znUPQ/tBkTcE/4W8rAhvMtEn0KA8ak7LJ3SmQ4d3BF7Xg0d3kba4srkRucIBHmgJqPzI4smm3kBAaU4dBjOOgg6o8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526419; c=relaxed/simple; bh=28Hs12xLRDSeQZJr6/eVUZu9HN7Lm9lUnh84mMvhEuY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SM5D2LhlNqT6hpzsQ/vFAXE+yboWb0jUFmYmHV/jHp9xy7wGijVioy6VYoN24WaCfL1y2NG4oCm1oo7666ocOSmhVJbLyL9GxkpSGQ1ZQu45qWgIgWyJOiudR+sKiJKyyn5044ISmHE1wnVzakmyY0PLUJe3aX/fJcaAtAAweNQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=H6ap+SwL; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="H6ap+SwL" Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 60RElpet031076; Tue, 27 Jan 2026 15:06:09 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=3oxrNqvT1rMVaA9XQ eLJXr2NbWh63PM2NKwSN0+VBoM=; b=H6ap+SwLdjS3mmSwFPbfzH2b01uoWZpF6 tM3fKMMLpQ/sylcarRsUqkOBy5pUSlt1qTsiETC6IX4orVieBgTQdv4NmLs7OjN3 SPF5oB4ELCmXOYeOOPI5ZHLzrjcUJjIKudV93L5p3AtnUJ0+yoWyTCB/HpCzO2Hx hyWDkXYLNi57QUEynV20qQ76LAetlTXKIh03bn6yMVQpVhvGkjIrARCazJMfq+ZX BjNz8NwS0sv7LqPhh3iYHWqCNYMDvYhKaDvbvmKx46r6h1D1G2BHkHwAHOGVeFrb z9KMdPSpSDbkokoOeR8cIv+hVC/k5UBLaJ5SfohZyZHb1cEY7vn5Q== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvmgfvdex-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:08 +0000 (GMT) Received: from m0353725.ppops.net (m0353725.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 60RF2vOH017959; Tue, 27 Jan 2026 15:06:07 GMT Received: from ppma11.dal12v.mail.ibm.com (db.9e.1632.ip4.static.sl-reverse.com [50.22.158.219]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvmgfvdet-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:07 +0000 (GMT) Received: from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1]) by ppma11.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 60REptcY017960; Tue, 27 Jan 2026 15:06:06 GMT Received: from smtprelay03.fra02v.mail.ibm.com ([9.218.2.224]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4bwb41ru44-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:06 +0000 Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay03.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 60RF636252822376 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 Jan 2026 15:06:03 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id F115A20040; Tue, 27 Jan 2026 15:06:02 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 926F92004E; Tue, 27 Jan 2026 15:06:02 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 27 Jan 2026 15:06:02 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org, x86@kernel.org, linux-mm@kvack.org, Steven Rostedt Cc: Jens Remus , Josh Poimboeuf , Masami Hiramatsu , Mathieu Desnoyers , Peter Zijlstra , Ingo Molnar , Jiri Olsa , Arnaldo Carvalho de Melo , Namhyung Kim , Thomas Gleixner , Andrii Nakryiko , Indu Bhagat , "Jose E. Marchesi" , Beau Belgrave , Linus Torvalds , Andrew Morton , Florian Weimer , Kees Cook , "Carlos O'Donell" , Sam James , Dylan Hatch , Borislav Petkov , Dave Hansen , David Hildenbrand , "H. Peter Anvin" , "Liam R. Howlett" , Lorenzo Stoakes , Michal Hocko , Mike Rapoport , Suren Baghdasaryan , Vlastimil Babka , Heiko Carstens , Vasily Gorbik Subject: [PATCH v13 15/18] unwind_user/sframe: Add support for SFrame V3 flexible FDEs Date: Tue, 27 Jan 2026 16:05:50 +0100 Message-ID: <20260127150554.2760964-16-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260127150554.2760964-1-jremus@linux.ibm.com> References: <20260127150554.2760964-1-jremus@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=Z4vh3XRA c=1 sm=1 tr=0 ts=6978d460 cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=vUbySO9Y5rIA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=7d_E57ReAAAA:8 a=JfrnYn6hAAAA:8 a=yPCof4ZbAAAA:8 a=mDV3o1hIAAAA:8 a=yMhMjlubAAAA:8 a=VnNF1IyMAAAA:8 a=Z4Rwk6OoAAAA:8 a=20KFwNOVAAAA:8 a=7mOBRU54AAAA:8 a=2wkDFiw1nnRQRUo0YT0A:9 a=jhqOcbufqs7Y1TYCrUUU:22 a=1CNFftbPRP8L7MoqJWF3:22 a=HkZW87K1Qel5hWWM3VKY:22 a=wa9RWnbW_A1YIeRBVszw:22 X-Proofpoint-GUID: 0wGnHg8qCGjbx3-LIzoY5IImluPfJ43- X-Proofpoint-ORIG-GUID: k8VUmwsesU7Qjy_Zf5UhIY-OXQeeDB1b X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTI3MDEyMSBTYWx0ZWRfX08dPWt8WBYHQ Qe6yBycEBxR4QECgsvau9hp6oKPG3n7t0MOt2PU/gX5DvduWwnR6Un/Y7GcAjjqXma1zYE/JKys qi+9y/KTJr2CYMbTx0PEz719NvxHk/JDRoxyrLPIkEy+Yxn94H0vlBQBSKIVZFqHtxO3bhLMpb6 tCf0gkkHyiGWbi9rL/UjsH33aFfeLAAcg0qtZj011HRK42NUPbQYc8giE4wveUe3vv6O/aPeNop b38i+anwwyEH+vNdKaOqqr1vM5x3nDKhrR26etLJMhGMKpiKvEpBWdPiKd8ZK1VECPJBBcdvnj7 9Hqv5vEW2TSunWtlFcWgrhfh5qdLE39g0sxkfVCiSUeROnifeMeUJxZwOIT/1FwyhvPgPrwW+RA nJ9BczHL6jwAskMMUJBw1mcTclI4ip3cuAUWFrmaGDqleMKxs45eeMg3jVcMmQOgR1qI52pkg7+ cKE3ruR2olsKr5Qo9Dw== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-01-27_03,2026-01-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 malwarescore=0 phishscore=0 priorityscore=1501 bulkscore=0 adultscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2601150000 definitions=main-2601270121 Content-Type: text/plain; charset="utf-8" SFrame V3 introduces flexible FDEs in addition to the regular FDEs. The key difference is that flexible FDEs encode the CFA, RA, and FP tracking information using two FRE data words, a control word and an offset, or a single padding data word of zero (e.g. to represent FP without RA tracking information). The control word contains the following information: - reg_p: Whether to use the register contents (reg_p=3D1) specified by regnum or the CFA (reg_p=3D0) as base. - deref_p: Whether to dereference. - regnum: A DWARF register number. The offset is added to the base (i.e. CFA or register contents). Then the resulting address may optionally be dereferenced. This enables the following flexible CFA and FP/RA recovery rules: - CFA =3D register + offset // reg_p=3D1, deref_p=3D0 - CFA =3D *(register + offset) // reg_p=3D1, deref_p=3D1 - FP/RA =3D *(CFA + offset) // reg_p=3D0, deref_p=3D0 - FP/RA =3D register + offset // reg_p=3D1, deref_p=3D0 - FP/RA =3D *(register + offset) // reg_p=3D1, deref_p=3D1 Note that for the CFA a rule with reg_p=3D0 is invalid, as the value of the CFA cannot be described using itself as base. For FP/RA a rule with reg_p=3D0 and deref_p=3D0 and regnum=3D0 is invalid, as it that is equal to the padding data word of zero. Cc: Steven Rostedt Cc: Josh Poimboeuf Cc: Masami Hiramatsu Cc: Mathieu Desnoyers Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Jiri Olsa Cc: Arnaldo Carvalho de Melo Cc: Namhyung Kim Cc: Thomas Gleixner Cc: Andrii Nakryiko Cc: Indu Bhagat Cc: "Jose E. Marchesi" Cc: Beau Belgrave Cc: Jens Remus Cc: Linus Torvalds Cc: Andrew Morton Cc: Florian Weimer Cc: Sam James Cc: Kees Cook Cc: "Carlos O'Donell" Signed-off-by: Jens Remus --- Notes (jremus): Changes in v13: - New patch. kernel/unwind/sframe.c | 249 ++++++++++++++++++++++++++++++++--------- kernel/unwind/sframe.h | 5 + 2 files changed, 204 insertions(+), 50 deletions(-) diff --git a/kernel/unwind/sframe.c b/kernel/unwind/sframe.c index 4dfc8cf2075e..ebf2a2905c5c 100644 --- a/kernel/unwind/sframe.c +++ b/kernel/unwind/sframe.c @@ -12,6 +12,7 @@ #include #include #include +#include #include =20 #include "sframe.h" @@ -31,8 +32,11 @@ struct sframe_fde_internal { struct sframe_fre_internal { unsigned int size; u32 ip_off; + u32 cfa_ctl; s32 cfa_off; + u32 ra_ctl; s32 ra_off; + u32 fp_ctl; s32 fp_off; u8 info; }; @@ -189,16 +193,147 @@ static __always_inline int __find_fde(struct sframe_= section *sec, s32 : UNSAFE_GET_USER_SIGNED_INC(to, from, size, label), \ s64 : UNSAFE_GET_USER_SIGNED_INC(to, from, size, label)) =20 +static __always_inline int +__read_regular_fre_datawords(struct sframe_section *sec, + struct sframe_fde_internal *fde, + unsigned long cur, + unsigned char dataword_count, + unsigned char dataword_size, + struct sframe_fre_internal *fre) +{ + s32 cfa_off, ra_off, fp_off; + unsigned int cfa_regnum; + + UNSAFE_GET_USER_INC(cfa_off, cur, dataword_size, Efault); + dataword_count--; + + ra_off =3D sec->ra_off; + if (!ra_off && dataword_count) { + dataword_count--; + UNSAFE_GET_USER_INC(ra_off, cur, dataword_size, Efault); + } + + fp_off =3D sec->fp_off; + if (!fp_off && dataword_count) { + dataword_count--; + UNSAFE_GET_USER_INC(fp_off, cur, dataword_size, Efault); + } + + if (dataword_count) + return -EFAULT; + + cfa_regnum =3D + (SFRAME_V3_FRE_CFA_BASE_REG_ID(fre->info) =3D=3D SFRAME_BASE_REG_FP) ? + SFRAME_REG_FP : SFRAME_REG_SP; + + fre->cfa_ctl =3D (cfa_regnum << 3) | 1; /* regnum, deref_p=3D0, reg_p=3D1= */ + fre->cfa_off =3D cfa_off; + fre->ra_ctl =3D ra_off ? 2 : 0; /* regnum=3D0, deref_p=3D(ra_off !=3D 0),= reg_p=3D0 */ + fre->ra_off =3D ra_off; + fre->fp_ctl =3D fp_off ? 2 : 0; /* regnum=3D0, deref_p=3D(fp_off !=3D 0),= reg_p=3D0 */ + fre->fp_off =3D fp_off; + + return 0; + +Efault: + return -EFAULT; +} + +static __always_inline int +__read_flex_fde_fre_datawords(struct sframe_section *sec, + struct sframe_fde_internal *fde, + unsigned long cur, + unsigned char dataword_count, + unsigned char dataword_size, + struct sframe_fre_internal *fre) +{ + u32 cfa_ctl, ra_ctl, fp_ctl; + s32 cfa_off, ra_off, fp_off; + + if (dataword_count < 2) + return -EFAULT; + UNSAFE_GET_USER_INC(cfa_ctl, cur, dataword_size, Efault); + UNSAFE_GET_USER_INC(cfa_off, cur, dataword_size, Efault); + dataword_count -=3D 2; + + ra_off =3D sec->ra_off; + ra_ctl =3D ra_off ? 2 : 0; /* regnum=3D0, deref_p=3D(ra_off !=3D 0), reg_= p=3D0 */ + if (dataword_count >=3D 2) { + UNSAFE_GET_USER_INC(ra_ctl, cur, dataword_size, Efault); + dataword_count--; + if (ra_ctl) { + UNSAFE_GET_USER_INC(ra_off, cur, dataword_size, Efault); + dataword_count--; + } else { + /* Padding RA location info */ + ra_ctl =3D ra_off ? 2 : 0; /* re-deduce (see above) */ + } + } + + fp_off =3D sec->fp_off; + fp_ctl =3D fp_off ? 2 : 0; /* regnum=3D0, deref_p=3D(fp_off !=3D 0), reg_= p=3D0 */ + if (dataword_count >=3D 2) { + UNSAFE_GET_USER_INC(fp_ctl, cur, dataword_size, Efault); + dataword_count--; + if (fp_ctl) { + UNSAFE_GET_USER_INC(fp_off, cur, dataword_size, Efault); + dataword_count--; + } else { + /* Padding FP location info */ + fp_ctl =3D fp_off ? 2 : 0; /* re-deduce (see above) */ + } + } + + if (dataword_count) + return -EFAULT; + + fre->cfa_ctl =3D cfa_ctl; + fre->cfa_off =3D cfa_off; + fre->ra_ctl =3D ra_ctl; + fre->ra_off =3D ra_off; + fre->fp_ctl =3D fp_ctl; + fre->fp_off =3D fp_off; + + return 0; + +Efault: + return -EFAULT; +} + +static __always_inline int +__read_fre_datawords(struct sframe_section *sec, + struct sframe_fde_internal *fde, + unsigned long cur, + unsigned char dataword_count, + unsigned char dataword_size, + struct sframe_fre_internal *fre) +{ + unsigned char fde_type =3D SFRAME_V3_FDE_TYPE(fde->info2); + + switch (fde_type) { + case SFRAME_FDE_TYPE_REGULAR: + return __read_regular_fre_datawords(sec, fde, cur, + dataword_count, + dataword_size, + fre); + case SFRAME_FDE_TYPE_FLEXIBLE: + return __read_flex_fde_fre_datawords(sec, fde, cur, + dataword_count, + dataword_size, + fre); + default: + return -EFAULT; + } +} + static __always_inline int __read_fre(struct sframe_section *sec, struct sframe_fde_internal *fde, unsigned long fre_addr, struct sframe_fre_internal *fre) { - unsigned char fde_type =3D SFRAME_V3_FDE_TYPE(fde->info2); unsigned char fde_pctype =3D SFRAME_V3_FDE_PCTYPE(fde->info); unsigned char fre_type =3D SFRAME_V3_FDE_FRE_TYPE(fde->info); unsigned char dataword_count, dataword_size; - s32 cfa_off, ra_off, fp_off; unsigned long cur =3D fre_addr; unsigned char addr_size; u32 ip_off; @@ -224,75 +359,88 @@ static __always_inline int __read_fre(struct sframe_s= ection *sec, if (cur + (dataword_count * dataword_size) > sec->fres_end) return -EFAULT; =20 - /* TODO: Support for flexible FDEs not implemented yet. */ - if (fde_type !=3D SFRAME_FDE_TYPE_REGULAR) - return -EFAULT; + fre->size =3D addr_size + 1 + (dataword_count * dataword_size); + fre->ip_off =3D ip_off; + fre->info =3D info; =20 if (!dataword_count) { /* * A FRE without data words indicates RA undefined / * outermost frame. */ - cfa_off =3D 0; - ra_off =3D 0; - fp_off =3D 0; - goto done; - } + fre->cfa_ctl =3D 0; + fre->cfa_off =3D 0; + fre->ra_ctl =3D 0; + fre->ra_off =3D 0; + fre->fp_ctl =3D 0; + fre->fp_off =3D 0; =20 - UNSAFE_GET_USER_INC(cfa_off, cur, dataword_size, Efault); - dataword_count--; - - ra_off =3D sec->ra_off; - if (!ra_off && dataword_count) { - dataword_count--; - UNSAFE_GET_USER_INC(ra_off, cur, dataword_size, Efault); - } - - fp_off =3D sec->fp_off; - if (!fp_off && dataword_count) { - dataword_count--; - UNSAFE_GET_USER_INC(fp_off, cur, dataword_size, Efault); + return 0; } =20 - if (dataword_count) - return -EFAULT; - -done: - fre->size =3D addr_size + 1 + (dataword_count * dataword_size); - fre->ip_off =3D ip_off; - fre->cfa_off =3D cfa_off; - fre->ra_off =3D ra_off; - fre->fp_off =3D fp_off; - fre->info =3D info; - - return 0; + return __read_fre_datawords(sec, fde, cur, dataword_count, dataword_size,= fre); =20 Efault: return -EFAULT; } =20 -static __always_inline void +static __always_inline int sframe_init_cfa_rule_data(struct unwind_user_cfa_rule_data *cfa_rule_data, - unsigned char fre_info, - s32 offset) + u32 ctlword, s32 offset) { - if (SFRAME_V3_FRE_CFA_BASE_REG_ID(fre_info) =3D=3D SFRAME_BASE_REG_FP) - cfa_rule_data->rule =3D UNWIND_USER_CFA_RULE_FP_OFFSET; - else - cfa_rule_data->rule =3D UNWIND_USER_CFA_RULE_SP_OFFSET; + bool deref_p =3D SFRAME_V3_FLEX_FDE_CTLWORD_DEREF_P(ctlword); + bool reg_p =3D SFRAME_V3_FLEX_FDE_CTLWORD_REG_P(ctlword); + + if (reg_p) { + unsigned int regnum =3D SFRAME_V3_FLEX_FDE_CTLWORD_REGNUM(ctlword); + + switch (regnum) { + case SFRAME_REG_SP: + cfa_rule_data->rule =3D UNWIND_USER_CFA_RULE_SP_OFFSET; + break; + case SFRAME_REG_FP: + cfa_rule_data->rule =3D UNWIND_USER_CFA_RULE_FP_OFFSET; + break; + default: + cfa_rule_data->rule =3D UNWIND_USER_CFA_RULE_REG_OFFSET; + cfa_rule_data->regnum =3D regnum; + } + } else { + return -EINVAL; + } + + if (deref_p) + cfa_rule_data->rule |=3D UNWIND_USER_RULE_DEREF; + cfa_rule_data->offset =3D offset; + + return 0; } =20 static __always_inline void sframe_init_rule_data(struct unwind_user_rule_data *rule_data, - s32 offset) + u32 ctlword, s32 offset) { - if (offset) { - rule_data->rule =3D UNWIND_USER_RULE_CFA_OFFSET_DEREF; - rule_data->offset =3D offset; - } else { + bool deref_p =3D SFRAME_V3_FLEX_FDE_CTLWORD_DEREF_P(ctlword); + bool reg_p =3D SFRAME_V3_FLEX_FDE_CTLWORD_REG_P(ctlword); + + if (!ctlword && !offset) { rule_data->rule =3D UNWIND_USER_RULE_RETAIN; + return; + } + if (reg_p) { + unsigned int regnum =3D SFRAME_V3_FLEX_FDE_CTLWORD_REGNUM(ctlword); + + rule_data->rule =3D UNWIND_USER_RULE_REG_OFFSET; + rule_data->regnum =3D regnum; + } else { + rule_data->rule =3D UNWIND_USER_RULE_CFA_OFFSET; } + + if (deref_p) + rule_data->rule |=3D UNWIND_USER_RULE_DEREF; + + rule_data->offset =3D offset; } =20 static __always_inline int __find_fre(struct sframe_section *sec, @@ -344,9 +492,10 @@ static __always_inline int __find_fre(struct sframe_se= ction *sec, return -EINVAL; fre =3D prev_fre; =20 - sframe_init_cfa_rule_data(&frame->cfa, fre->info, fre->cfa_off); - sframe_init_rule_data(&frame->ra, fre->ra_off); - sframe_init_rule_data(&frame->fp, fre->fp_off); + if (sframe_init_cfa_rule_data(&frame->cfa, fre->cfa_ctl, fre->cfa_off)) + return -EINVAL; + sframe_init_rule_data(&frame->ra, fre->ra_ctl, fre->ra_off); + sframe_init_rule_data(&frame->fp, fre->fp_ctl, fre->fp_off); frame->outermost =3D SFRAME_V3_FRE_RA_UNDEFINED_P(fre->info); =20 return 0; diff --git a/kernel/unwind/sframe.h b/kernel/unwind/sframe.h index 3fcc15534e5a..5b6112945b6c 100644 --- a/kernel/unwind/sframe.h +++ b/kernel/unwind/sframe.h @@ -66,6 +66,7 @@ struct sframe_fda_v3 { #define SFRAME_V3_AARCH64_FDE_PAUTH_KEY(info) (((info) >> 5) & 0x1) =20 #define SFRAME_FDE_TYPE_REGULAR 0 +#define SFRAME_FDE_TYPE_FLEXIBLE 1 =20 #define SFRAME_V3_FDE_TYPE_MASK 0x0f #define SFRAME_V3_FDE_TYPE(info2) ((info2) & SFRAME_V3_FDE_TYPE_MASK) @@ -79,4 +80,8 @@ struct sframe_fda_v3 { #define SFRAME_V3_AARCH64_FRE_MANGLED_RA_P(info) (((info) >> 7) & 0x1) #define SFRAME_V3_FRE_RA_UNDEFINED_P(info) (SFRAME_V3_FRE_DATAWORD_COUNT(= info) =3D=3D 0) =20 +#define SFRAME_V3_FLEX_FDE_CTLWORD_REGNUM(data) (((data) >> 3) & 0x1f) +#define SFRAME_V3_FLEX_FDE_CTLWORD_DEREF_P(data) (((data) >> 1) & 0x1) +#define SFRAME_V3_FLEX_FDE_CTLWORD_REG_P(data) ((data) & 0x1) + #endif /* _SFRAME_H */ --=20 2.51.0 From nobody Sat Feb 7 05:01:40 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 463E735F8B8; Tue, 27 Jan 2026 15:07:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526433; cv=none; b=Z2ek3rrPs+L1qF7yoi966il3dGMxtQ2lgtO4biJ8FcJWl+R3xurMqPZnfQa5E61n2THQSlDBsXCoMtoodzAguHqTQrtadI2xRLX5kQdVJqISC3bUWbPaWEdzYWlmo6jJqHH0umXp5nvTO/AfrKd8y5T4O4QbVdskvqBcR5LG07o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526433; c=relaxed/simple; bh=jqh3BXBm8UGbCkpfse64+QoGLxm4hYd677Ve+drm8hk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rM4NtXutOzP25ELvPXNTLPinMX6NTh7xr6BmrvnvpQE3BtgkNA72bIt8QsB/jhRW0NUVS97DMDwwfKBIGyq1gT+8rLixcv9Eqq+PUAsBnmeWbtlY5shg3LbOvsEq0nLlNGLF4Kpf8dV5VNGSewRyUPmjUdckG9OyoWM/W7OROIc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=FT7kiZ/m; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="FT7kiZ/m" Received: from pps.filterd (m0353729.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 60R33kS1005587; Tue, 27 Jan 2026 15:06:09 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=/CEYS4jY8hNAdRrKU OU+/JGW1W2bTK/np0UbnjKAxFY=; b=FT7kiZ/mSXlUGR7J3WsyGi4VWxUxy/ITO 6G/Tv29XBLqrUNvtGzFPzMo+KY0MKL8xz9Qfq/19fEt/lxJ5Qi8ZwBs8XLNX0dqd RqOzA75HGmLRqvXB3IUr7farlObS+NHpWaTo8u0eaKgfOVa+x1qnHeD87HSNNREv v/+OvCxF2ig7DtbMb7TvcVZO7e6UZh5RmI8VyAKSLzjA639fg8tc0MAdPWblkZ9Q N6oOWAu9AM5Y9fWrWWk/5cSqUF8nHsbIv96yPhkXwqMrNEQsgsho/jV3QyN3ub/L X9/+pWHi22gjLe6nNNzEE07kXtEgwxQ29f0fWG+UyIpNfsVVxh96w== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvnrtdygr-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:09 +0000 (GMT) Received: from m0353729.ppops.net (m0353729.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 60REl1we004130; Tue, 27 Jan 2026 15:06:08 GMT Received: from ppma12.dal12v.mail.ibm.com (dc.9e.1632.ip4.static.sl-reverse.com [50.22.158.220]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvnrtdygg-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:08 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 60RD5sZK031040; Tue, 27 Jan 2026 15:06:07 GMT Received: from smtprelay03.fra02v.mail.ibm.com ([9.218.2.224]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4bw8dsh6cs-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:07 +0000 Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay03.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 60RF630m27328962 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 Jan 2026 15:06:03 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 623CA20040; Tue, 27 Jan 2026 15:06:03 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0412D20049; Tue, 27 Jan 2026 15:06:03 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 27 Jan 2026 15:06:02 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org, x86@kernel.org, linux-mm@kvack.org, Steven Rostedt Cc: Jens Remus , Josh Poimboeuf , Masami Hiramatsu , Mathieu Desnoyers , Peter Zijlstra , Ingo Molnar , Jiri Olsa , Arnaldo Carvalho de Melo , Namhyung Kim , Thomas Gleixner , Andrii Nakryiko , Indu Bhagat , "Jose E. Marchesi" , Beau Belgrave , Linus Torvalds , Andrew Morton , Florian Weimer , Kees Cook , "Carlos O'Donell" , Sam James , Dylan Hatch , Borislav Petkov , Dave Hansen , David Hildenbrand , "H. Peter Anvin" , "Liam R. Howlett" , Lorenzo Stoakes , Michal Hocko , Mike Rapoport , Suren Baghdasaryan , Vlastimil Babka , Heiko Carstens , Vasily Gorbik Subject: [PATCH v13 16/18] unwind_user/sframe: Separate reading of FRE from reading of FRE data words Date: Tue, 27 Jan 2026 16:05:51 +0100 Message-ID: <20260127150554.2760964-17-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260127150554.2760964-1-jremus@linux.ibm.com> References: <20260127150554.2760964-1-jremus@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-GUID: SxjsYwA1yXDXlqfI_eZ-2rQJjp6_np8F X-Authority-Analysis: v=2.4 cv=Uptu9uwB c=1 sm=1 tr=0 ts=6978d461 cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=vUbySO9Y5rIA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=7d_E57ReAAAA:8 a=JfrnYn6hAAAA:8 a=yPCof4ZbAAAA:8 a=mDV3o1hIAAAA:8 a=yMhMjlubAAAA:8 a=VnNF1IyMAAAA:8 a=Z4Rwk6OoAAAA:8 a=20KFwNOVAAAA:8 a=7mOBRU54AAAA:8 a=RXKZOtKmAAAA:8 a=DUHKQo4JlzHLUktqRlQA:9 a=jhqOcbufqs7Y1TYCrUUU:22 a=1CNFftbPRP8L7MoqJWF3:22 a=HkZW87K1Qel5hWWM3VKY:22 a=wa9RWnbW_A1YIeRBVszw:22 a=UFF3uGjEBZWolfm0k6KQ:22 X-Proofpoint-ORIG-GUID: fzlXu4Q1sRnRiPU-AXpnORpn3NNFMVir X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTI3MDEyMSBTYWx0ZWRfXzioM6+7hU7xI /sMkYBqjJzi0bM7vkEHSWbo9KtL2QDd8gA13CQ1g/fn7oG37vvxkz2HZgYEma7S/SH8b7i4JL/D lVzJUMS0vMpgCCSm3B80VcsUcSodV2B55jE1e8h3Qf3QpEYQEcSlBbfxvCR593aWqCePmrvaNcK L5EQqE6bvzcifmYvzesAQgBPOV3nIGzNn5EiLg12Ir8EQnR+99+dtDk/RW0kSOavNO9T23utAe3 LJXZjJ3Lk0kew6LdxNDSzJkSiGc9GrOZfoqnisG1wCcPgdk16KFtHoTP86tE9L+M91orCZ5DNkH TtkNHOOerZV1ULJs4wBun6htyR5h+0qnVi6vcnTlSC+M4WJVMfXyrZIdJptf3xsrBx+tdREkiAT zk6d0iKRmO4QmD6FIrHMHXM+/P/LOcLCzzC+cqc1qAgc081XX2Vjd2Cy6cabMW7iyVz7WkI7+CQ vTJlzE2hZ0jbw1o+l6A== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-01-27_03,2026-01-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 priorityscore=1501 clxscore=1015 lowpriorityscore=0 phishscore=0 adultscore=0 impostorscore=0 bulkscore=0 spamscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2601150000 definitions=main-2601270121 Content-Type: text/plain; charset="utf-8" __find_fre() performs linear search for a matching SFrame FRE for a given IP. For that purpose it uses __read_fre(), which reads the whole FRE. That is the variable-size FRE structure as well as the trailing variable-length array of variable-size data words. For the search logic to skip over the FRE it would be sufficient to read the variable-size FRE structure only, which includes the count and size of data words. Add fields to struct sframe_fre_internal to store the FRE data word's address, count, and size. Change __read_fre() to read the variable- size FRE structure only and populate those new fields. Change __read_fre_datawords() to use those new fields. Change __find_fre() to use __read_fre_datawords() to read the FRE data words only after a matching FRE has been found. Introduce safe_read_fre_datawords() and use it in sframe_validate_section() to validate that the FRE data words. Cc: Steven Rostedt Cc: Josh Poimboeuf Cc: Masami Hiramatsu Cc: Mathieu Desnoyers Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Jiri Olsa Cc: Arnaldo Carvalho de Melo Cc: Namhyung Kim Cc: Thomas Gleixner Cc: Andrii Nakryiko Cc: Indu Bhagat Cc: "Jose E. Marchesi" Cc: Beau Belgrave Cc: Jens Remus Cc: Linus Torvalds Cc: Andrew Morton Cc: Florian Weimer Cc: Sam James Cc: Kees Cook Cc: "Carlos O'Donell" Signed-off-by: Jens Remus --- Notes (jremus): Changes in v13: - New patch. kernel/unwind/sframe.c | 91 +++++++++++++++++++++++++++--------------- 1 file changed, 58 insertions(+), 33 deletions(-) diff --git a/kernel/unwind/sframe.c b/kernel/unwind/sframe.c index ebf2a2905c5c..f24997e84e05 100644 --- a/kernel/unwind/sframe.c +++ b/kernel/unwind/sframe.c @@ -39,6 +39,9 @@ struct sframe_fre_internal { u32 fp_ctl; s32 fp_off; u8 info; + unsigned long dw_addr; + unsigned char dw_count; + unsigned char dw_size; }; =20 DEFINE_STATIC_SRCU(sframe_srcu); @@ -196,11 +199,11 @@ static __always_inline int __find_fde(struct sframe_s= ection *sec, static __always_inline int __read_regular_fre_datawords(struct sframe_section *sec, struct sframe_fde_internal *fde, - unsigned long cur, - unsigned char dataword_count, - unsigned char dataword_size, struct sframe_fre_internal *fre) { + unsigned char dataword_count =3D fre->dw_count; + unsigned char dataword_size =3D fre->dw_size; + unsigned long cur =3D fre->dw_addr; s32 cfa_off, ra_off, fp_off; unsigned int cfa_regnum; =20 @@ -242,11 +245,11 @@ __read_regular_fre_datawords(struct sframe_section *s= ec, static __always_inline int __read_flex_fde_fre_datawords(struct sframe_section *sec, struct sframe_fde_internal *fde, - unsigned long cur, - unsigned char dataword_count, - unsigned char dataword_size, struct sframe_fre_internal *fre) { + unsigned char dataword_count =3D fre->dw_count; + unsigned char dataword_size =3D fre->dw_size; + unsigned long cur =3D fre->dw_addr; u32 cfa_ctl, ra_ctl, fp_ctl; s32 cfa_off, ra_off, fp_off; =20 @@ -303,24 +306,28 @@ __read_flex_fde_fre_datawords(struct sframe_section *= sec, static __always_inline int __read_fre_datawords(struct sframe_section *sec, struct sframe_fde_internal *fde, - unsigned long cur, - unsigned char dataword_count, - unsigned char dataword_size, struct sframe_fre_internal *fre) { unsigned char fde_type =3D SFRAME_V3_FDE_TYPE(fde->info2); + unsigned char dataword_count =3D fre->dw_count; + + if (!dataword_count) { + /* A FRE without data words indicates an outermost frame. */ + fre->cfa_ctl =3D 0; + fre->cfa_off =3D 0; + fre->ra_ctl =3D 0; + fre->ra_off =3D 0; + fre->fp_ctl =3D 0; + fre->fp_off =3D 0; + + return 0; + } =20 switch (fde_type) { case SFRAME_FDE_TYPE_REGULAR: - return __read_regular_fre_datawords(sec, fde, cur, - dataword_count, - dataword_size, - fre); + return __read_regular_fre_datawords(sec, fde, fre); case SFRAME_FDE_TYPE_FLEXIBLE: - return __read_flex_fde_fre_datawords(sec, fde, cur, - dataword_count, - dataword_size, - fre); + return __read_flex_fde_fre_datawords(sec, fde, fre); default: return -EFAULT; } @@ -362,23 +369,11 @@ static __always_inline int __read_fre(struct sframe_s= ection *sec, fre->size =3D addr_size + 1 + (dataword_count * dataword_size); fre->ip_off =3D ip_off; fre->info =3D info; + fre->dw_addr =3D cur; + fre->dw_count =3D dataword_count; + fre->dw_size =3D dataword_size; =20 - if (!dataword_count) { - /* - * A FRE without data words indicates RA undefined / - * outermost frame. - */ - fre->cfa_ctl =3D 0; - fre->cfa_off =3D 0; - fre->ra_ctl =3D 0; - fre->ra_off =3D 0; - fre->fp_ctl =3D 0; - fre->fp_off =3D 0; - - return 0; - } - - return __read_fre_datawords(sec, fde, cur, dataword_count, dataword_size,= fre); + return 0; =20 Efault: return -EFAULT; @@ -455,6 +450,7 @@ static __always_inline int __find_fre(struct sframe_sec= tion *sec, bool which =3D false; unsigned int i; u32 ip_off; + int ret; =20 ip_off =3D ip - fde->func_addr; =20 @@ -492,6 +488,10 @@ static __always_inline int __find_fre(struct sframe_se= ction *sec, return -EINVAL; fre =3D prev_fre; =20 + ret =3D __read_fre_datawords(sec, fde, fre); + if (ret) + return ret; + if (sframe_init_cfa_rule_data(&frame->cfa, fre->cfa_ctl, fre->cfa_off)) return -EINVAL; sframe_init_rule_data(&frame->ra, fre->ra_ctl, fre->ra_off); @@ -567,6 +567,20 @@ static int safe_read_fre(struct sframe_section *sec, return ret; } =20 +static int safe_read_fre_datawords(struct sframe_section *sec, + struct sframe_fde_internal *fde, + struct sframe_fre_internal *fre) +{ + int ret; + + if (!user_read_access_begin((void __user *)sec->sframe_start, + sec->sframe_end - sec->sframe_start)) + return -EFAULT; + ret =3D __read_fre_datawords(sec, fde, fre); + user_read_access_end(); + return ret; +} + static int sframe_validate_section(struct sframe_section *sec) { unsigned long prev_ip =3D 0; @@ -610,6 +624,17 @@ static int sframe_validate_section(struct sframe_secti= on *sec) fde.rep_size); return ret; } + ret =3D safe_read_fre_datawords(sec, &fde, fre); + if (ret) { + dbg_sec("fde %u: __read_fre_datawords(%u) failed\n", i, j); + dbg_sec("FDE: func_addr:%#lx func_size:%#x fda_off:%#x fres_off:%#x fr= es_num:%d info:%u info2:%u rep_size:%u\n", + fde.func_addr, fde.func_size, + fde.fda_off, + fde.fres_off, fde.fres_num, + fde.info, fde.info2, + fde.rep_size); + return ret; + } =20 fre_addr +=3D fre->size; =20 --=20 2.51.0 From nobody Sat Feb 7 05:01:40 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2DC14367F2B; Tue, 27 Jan 2026 15:07:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526428; cv=none; b=E3Atr1pxpMFjLdAyh2rMNKAu++OXW1a+0FF6HgD6bQpy2jvHVGxnrurriJfmr3BLIK/usFlnFEmz7bqhGLWgTNIwFtCyBkRU1v0OaQc4Xa4vdmOUjHhjJ/YdEL8jKdCX6uOVC69TIuZNyY6+KtTFleWDrXmZHXpd+M4Uj/sr0dE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526428; c=relaxed/simple; bh=hvgIJfBpHoLbv5QYTk6mNM3Nal4T0cMKbuSA+NhW1zQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pv3t6ja8IGM0BJ687rqdjgEs4oVSFRGoswjTRJm7ozM5mzWvQynogf6HlZnlueMkSXKIwnx6k/JsWY1QTKwCTI/v16L2hyIKPC9IftLopUH28opsTl25zJtCjmpgsB8WbvjSzZIQ4PPS+PW0hdllaVU+rhEYbm5BR1Hs8txuP40= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=AQytbARN; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="AQytbARN" Received: from pps.filterd (m0356516.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 60R87Naa019341; Tue, 27 Jan 2026 15:06:09 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=uwWg1c07d9H+HCNvl 2tElPycvr/BKRKCv9OQussEtx8=; b=AQytbARNP4qnXj8rvVuVNw9y1Nv0ZwBh9 H6KOkadJB+231cWeUkSoNNPqszf7dHUEJUbQ1tXMiZchBmp42ymnvHXIGit7zajH sx+3q1xIZcupRSdvg+sVdpEA1AEPnGYJk7gVBrAMGO0IvUjUD/RV9UHNH1zhuESH NSvvWy4h9p90Cq00pfDA+spwCUnwDEe/fq8VKl8/pcBO4tgYONhroFHRbw6JzxUc YKWOm9eZg8+NeRAJKkDVL+Vq+6vzGzEsfxduOUMzX3GfKqOW9EafdmBhrxxcsEZv FISiyJv++HElpEC8KbOHFsM5ZtnGalsCk2/NmJzn1oBhjD4lX6gbw== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvkgmmhje-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:09 +0000 (GMT) Received: from m0356516.ppops.net (m0356516.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 60REbpce010389; Tue, 27 Jan 2026 15:06:08 GMT Received: from ppma23.wdc07v.mail.ibm.com (5d.69.3da9.ip4.static.sl-reverse.com [169.61.105.93]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvkgmmhja-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:08 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 60RDQUkk026384; Tue, 27 Jan 2026 15:06:08 GMT Received: from smtprelay03.fra02v.mail.ibm.com ([9.218.2.224]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4bw9wk91k2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:07 +0000 Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay03.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 60RF630x27328964 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 Jan 2026 15:06:03 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C176520040; Tue, 27 Jan 2026 15:06:03 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 69B1E2004B; Tue, 27 Jan 2026 15:06:03 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 27 Jan 2026 15:06:03 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org, x86@kernel.org, linux-mm@kvack.org, Steven Rostedt Cc: Jens Remus , Josh Poimboeuf , Masami Hiramatsu , Mathieu Desnoyers , Peter Zijlstra , Ingo Molnar , Jiri Olsa , Arnaldo Carvalho de Melo , Namhyung Kim , Thomas Gleixner , Andrii Nakryiko , Indu Bhagat , "Jose E. Marchesi" , Beau Belgrave , Linus Torvalds , Andrew Morton , Florian Weimer , Kees Cook , "Carlos O'Donell" , Sam James , Dylan Hatch , Borislav Petkov , Dave Hansen , David Hildenbrand , "H. Peter Anvin" , "Liam R. Howlett" , Lorenzo Stoakes , Michal Hocko , Mike Rapoport , Suren Baghdasaryan , Vlastimil Babka , Heiko Carstens , Vasily Gorbik , "Steven Rostedt (Google)" Subject: [PATCH v13 17/18] unwind_user/sframe/x86: Enable sframe unwinding on x86 Date: Tue, 27 Jan 2026 16:05:52 +0100 Message-ID: <20260127150554.2760964-18-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260127150554.2760964-1-jremus@linux.ibm.com> References: <20260127150554.2760964-1-jremus@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=Gr1PO01C c=1 sm=1 tr=0 ts=6978d461 cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=vUbySO9Y5rIA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=7d_E57ReAAAA:8 a=JfrnYn6hAAAA:8 a=yPCof4ZbAAAA:8 a=mDV3o1hIAAAA:8 a=yMhMjlubAAAA:8 a=VnNF1IyMAAAA:8 a=Z4Rwk6OoAAAA:8 a=20KFwNOVAAAA:8 a=7mOBRU54AAAA:8 a=meVymXHHAAAA:8 a=tblPhtueqqLfq7J8pFgA:9 a=jhqOcbufqs7Y1TYCrUUU:22 a=1CNFftbPRP8L7MoqJWF3:22 a=HkZW87K1Qel5hWWM3VKY:22 a=wa9RWnbW_A1YIeRBVszw:22 a=2JgSa4NbpEOStq-L5dxp:22 X-Proofpoint-GUID: SC6a_GZaLSJST4dNpImiKnux7OUA9Y5- X-Proofpoint-ORIG-GUID: jSsw6pqWwih_z9ydwCgegTWt6ewzRfS1 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTI3MDEyMSBTYWx0ZWRfXw1eBBKqDLBD+ tJT/S9j8kxQ14WzVVTLG7J6sZB/xUzwvHYKMQ7tC7bZ9MWiNkdPiS9I+mKv0zg5cKTnQ8Dli0YF sZZRaTCPjdsEAf9obXu6NqVzAsRrAanEydsm4HY+sOKgl9356Anq+6ZE1HJimJXoso+IOtQaEZr 03oKv55mB3H6NgF0X0lCcsqPgiMgFohKuJSQhVVvE60qdgkO8IAH/O/Y2uKVITC1JL+7ROZ+3Ca hqGSgg4Sv68EDZG6s2jkU9YIFq8AbhC0Gr1cdQwn94CY+R9jJ1BChvt9rzStXjxpQsDyjSfDgEu xykyXvvjlxagpfDkg1/UOZ0jPD1aQ/n5XNrvSI03d9QTfen8oYmwU5yXmqtK+2ENj7lsPLHQoph losYFkUzI9G/NpIu+/XF+rDPIp8ZmmBCJ2NHGO7x8d7lwsZjGF3pIXV8eU5jXjhD49ch1IXpEaI Pjg2ci3/5LHSTy4N6Rw== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-01-27_03,2026-01-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 clxscore=1015 lowpriorityscore=0 suspectscore=0 impostorscore=0 phishscore=0 malwarescore=0 adultscore=0 spamscore=0 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2601150000 definitions=main-2601270121 Content-Type: text/plain; charset="utf-8" From: Josh Poimboeuf The x86 SFrame V3 implementation works fairly well, starting with binutils 2.46. Enable it. [ Jens Remus: Reword commit message for SFrame V3, starting with binutils 2.46. ] Cc: Masami Hiramatsu Cc: Mathieu Desnoyers Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Jiri Olsa Cc: Arnaldo Carvalho de Melo Cc: Namhyung Kim Cc: Thomas Gleixner Cc: Andrii Nakryiko Cc: Indu Bhagat Cc: "Jose E. Marchesi" Cc: Beau Belgrave Cc: Jens Remus Cc: Linus Torvalds Cc: Andrew Morton Cc: Florian Weimer Cc: Sam James Cc: Kees Cook Cc: "Carlos O'Donell" Signed-off-by: Josh Poimboeuf Signed-off-by: Steven Rostedt (Google) Signed-off-by: Jens Remus --- Notes (jremus): Changes in v13: - Naive implementation of unwind_user_get_reg() to support SFrame V3 flexible FDEs (e.g. used to represent DRAP pattern). - Define SFRAME_REG_SP and SFRAME_REG_FP to the respective x86-64 DWARF register numbers. - Reword commit message for SFrame V3 and (upcoming) binutils 2.46. arch/x86/Kconfig | 1 + arch/x86/include/asm/unwind_user.h | 34 +++++++++++++++++++++++ arch/x86/include/asm/unwind_user_sframe.h | 12 ++++++++ 3 files changed, 47 insertions(+) create mode 100644 arch/x86/include/asm/unwind_user_sframe.h diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 80527299f859..195cb99a590c 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -301,6 +301,7 @@ config X86 select HAVE_UACCESS_VALIDATION if HAVE_OBJTOOL select HAVE_UNSTABLE_SCHED_CLOCK select HAVE_UNWIND_USER_FP if X86_64 + select HAVE_UNWIND_USER_SFRAME if X86_64 select HAVE_USER_RETURN_NOTIFIER select HAVE_GENERIC_VDSO select VDSO_GETRANDOM if X86_64 diff --git a/arch/x86/include/asm/unwind_user.h b/arch/x86/include/asm/unwi= nd_user.h index f38f7c5ff1de..ae46906c3b39 100644 --- a/arch/x86/include/asm/unwind_user.h +++ b/arch/x86/include/asm/unwind_user.h @@ -15,6 +15,40 @@ static inline int unwind_user_word_size(struct pt_regs *= regs) return user_64bit_mode(regs) ? 8 : 4; } =20 +static inline int unwind_user_get_reg(unsigned long *val, unsigned int reg= num) +{ +#ifdef CONFIG_X86_64 + const struct pt_regs *regs =3D task_pt_regs(current); + + switch (regnum) { + /* DWARF register numbers 0..15 */ + case 0: *val =3D regs->ax; break; + case 1: *val =3D regs->dx; break; + case 2: *val =3D regs->cx; break; + case 3: *val =3D regs->bx; break; + case 4: *val =3D regs->si; break; + case 5: *val =3D regs->di; break; + case 6: *val =3D regs->bp; break; + case 7: *val =3D regs->sp; break; + case 8: *val =3D regs->r8; break; + case 9: *val =3D regs->r9; break; + case 10: *val =3D regs->r10; break; + case 11: *val =3D regs->r11; break; + case 12: *val =3D regs->r12; break; + case 13: *val =3D regs->r13; break; + case 14: *val =3D regs->r14; break; + case 15: *val =3D regs->r15; break; + default: + return -EINVAL; + } + return 0; +#else /* !CONFIG_X86_64 */ + return -EINVAL; +#endif /* !CONFIG_X86_64 */ + +} +#define unwind_user_get_reg unwind_user_get_reg + #endif /* CONFIG_UNWIND_USER */ =20 #ifdef CONFIG_HAVE_UNWIND_USER_FP diff --git a/arch/x86/include/asm/unwind_user_sframe.h b/arch/x86/include/a= sm/unwind_user_sframe.h new file mode 100644 index 000000000000..d828ae1a4aac --- /dev/null +++ b/arch/x86/include/asm/unwind_user_sframe.h @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _ASM_X86_UNWIND_USER_SFRAME_H +#define _ASM_X86_UNWIND_USER_SFRAME_H + +#ifdef CONFIG_X86_64 + +#define SFRAME_REG_SP 7 +#define SFRAME_REG_FP 6 + +#endif + +#endif /* _ASM_X86_UNWIND_USER_SFRAME_H */ --=20 2.51.0 From nobody Sat Feb 7 05:01:40 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3E29335E54F; Tue, 27 Jan 2026 15:06:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526421; cv=none; b=YXA+xK6FmNB5RZoHtf3G1xtF3GMZD7ftjhiYNWLdDQJ9TuTCxz7u2v9QEKp1XXG5if2ILSnM5f2CqoJiJanrBw7F3ae9Z4jB1cipYp9ck3pQFg6ulPwZ2TrkhIlHg1b7hi+mkRTq66DoITG0wkaU49onn0ptzZ4gh8jJk/gSzX4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769526421; c=relaxed/simple; bh=9Mb4sF5aEPiyImOcC0b5wFbAvABcjXJFTpcv5Ghg+zY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tdMsQoFjnJtu8q5rSLTOkV55u6Ksfec8mxLqxkr1qiWtnUDrdYytrUlfllES0+9B9mfya+dtdfy5FsBUMZgPDGl87cGnbhcfLK0HbH6um5WIEunL5t20clE+leWat31qh37wkzNdY6NfxD1Dah97XsDyVvYRKNAJEYb+LTKbHB0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=Xtmeg+nA; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="Xtmeg+nA" Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 60R6JtXm006097; Tue, 27 Jan 2026 15:06:10 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=UQf5zjual95361Vzj JZ2yX2E8ulU1Ja6ZxON0rOjARw=; b=Xtmeg+nAYRHjQ1Xfj+y3MEKkGUiS+Qi0O f9t6V7Aujyb0/MqTcx6g0tT+QJGs1iS2GCcannRTFXZsyTZUOE0tz/+DwXSsIE6/ PacJhc/c7fSgpDa9M7U/y81YmjbRvF4aOU6Mlj3GvsizCeZLN70n6RlHtIOBZ5U8 LIB4GNXYtz6DJ3omZaRWri2kDNa0WHIeyAvGJeYUQ0erTTqC+IG482aC7eEyRcNl 7iOWiM4SzL7is1/5z0VtZv64aDK3EtESaw2Bl/GivS+MQ38yeek30HDij/ZowHAt d8wBhSXK4dVsCuvNDf0+nAcBHEByYE3+83XA/pLIfcJoQNzA8CSbg== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvnk6x33f-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:10 +0000 (GMT) Received: from m0360083.ppops.net (m0360083.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 60RF2LPK009243; Tue, 27 Jan 2026 15:06:09 GMT Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4bvnk6x338-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:09 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 60RD5pGk006707; Tue, 27 Jan 2026 15:06:08 GMT Received: from smtprelay04.fra02v.mail.ibm.com ([9.218.2.228]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4bw8sy96j1-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 27 Jan 2026 15:06:08 +0000 Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay04.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 60RF64mF30605876 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 Jan 2026 15:06:04 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 2C0CE20040; Tue, 27 Jan 2026 15:06:04 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C8E6520049; Tue, 27 Jan 2026 15:06:03 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 27 Jan 2026 15:06:03 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org, x86@kernel.org, linux-mm@kvack.org, Steven Rostedt Cc: Jens Remus , Josh Poimboeuf , Masami Hiramatsu , Mathieu Desnoyers , Peter Zijlstra , Ingo Molnar , Jiri Olsa , Arnaldo Carvalho de Melo , Namhyung Kim , Thomas Gleixner , Andrii Nakryiko , Indu Bhagat , "Jose E. Marchesi" , Beau Belgrave , Linus Torvalds , Andrew Morton , Florian Weimer , Kees Cook , "Carlos O'Donell" , Sam James , Dylan Hatch , Borislav Petkov , Dave Hansen , David Hildenbrand , "H. Peter Anvin" , "Liam R. Howlett" , Lorenzo Stoakes , Michal Hocko , Mike Rapoport , Suren Baghdasaryan , Vlastimil Babka , Heiko Carstens , Vasily Gorbik , "Steven Rostedt (Google)" Subject: [PATCH v13 18/18] unwind_user/sframe: Add prctl() interface for registering .sframe sections Date: Tue, 27 Jan 2026 16:05:53 +0100 Message-ID: <20260127150554.2760964-19-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260127150554.2760964-1-jremus@linux.ibm.com> References: <20260127150554.2760964-1-jremus@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-GUID: CqQXPkR5vg5vxNfEPomESWqMvfjyY9jB X-Proofpoint-ORIG-GUID: 4HvbmZdrXSQ5cQ-sg4CHqAxRj0cwUnvU X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTI3MDEyMSBTYWx0ZWRfX0ZKYCIui2TY0 Ptdf8Cbe5yR03Ee7564PgLuxdfDwLew4ryfy4vpQjHgkr3DZwwubVV3trwhzw4YcL2hTnQUhal+ joRDcmjf+cjIHiZwe37tTM4qTICn88rO/XNCo06foZJjHHWXk7yr03EIX3RlmcLlaU9bYY80Ayq sSUN30jSQajSoLQSNliqdMBxINGzeHjSQ4AeOSFC7IHVt0GdQhLanP6bVV6yk/4x/ofvIozx/lH D0sQ0z8WdHyEm6sgosoprBMNfMAIzBTPQEz/JVqGTA4BF1cKMSfv/wwiZWI+uZOFmYdgdBM+f8d DdWhFlzNMjDKatEBb9ssywAfA6QLKg4eHdZkFPvzDFpf2qnTzZ2lK0AuP/39zuqU2wrzmJ6BFn6 +1lO2Y4Hmk+zulk6F33MuGEkynxSEwD1ZKSwvWC3Dp4/vdQcm876FGrnXp8GdUZwNFud4EJqcGs 0aKE5925zCZSeSZQAyA== X-Authority-Analysis: v=2.4 cv=AMiVTGgp c=1 sm=1 tr=0 ts=6978d462 cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=vUbySO9Y5rIA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=7d_E57ReAAAA:8 a=JfrnYn6hAAAA:8 a=yPCof4ZbAAAA:8 a=mDV3o1hIAAAA:8 a=yMhMjlubAAAA:8 a=VnNF1IyMAAAA:8 a=Z4Rwk6OoAAAA:8 a=20KFwNOVAAAA:8 a=7mOBRU54AAAA:8 a=meVymXHHAAAA:8 a=Xd8byWXf_M4q3N6YhP0A:9 a=jhqOcbufqs7Y1TYCrUUU:22 a=1CNFftbPRP8L7MoqJWF3:22 a=HkZW87K1Qel5hWWM3VKY:22 a=wa9RWnbW_A1YIeRBVszw:22 a=2JgSa4NbpEOStq-L5dxp:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-01-27_03,2026-01-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 spamscore=0 phishscore=0 bulkscore=0 suspectscore=0 adultscore=0 clxscore=1015 priorityscore=1501 lowpriorityscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2601150000 definitions=main-2601270121 Content-Type: text/plain; charset="utf-8" From: Josh Poimboeuf The kernel doesn't have direct visibility to the ELF contents of shared libraries. Add some prctl() interfaces which allow glibc to tell the kernel where to find .sframe sections. [ This adds an interface for prctl() for testing loading of sframes for libraries. But this interface should really be a system call. This patch is for testing purposes only and should not be applied to mainline. ] Cc: Masami Hiramatsu Cc: Mathieu Desnoyers Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Jiri Olsa Cc: Arnaldo Carvalho de Melo Cc: Namhyung Kim Cc: Thomas Gleixner Cc: Andrii Nakryiko Cc: Indu Bhagat Cc: "Jose E. Marchesi" Cc: Beau Belgrave Cc: Jens Remus Cc: Linus Torvalds Cc: Andrew Morton Cc: Florian Weimer Cc: Sam James Cc: Kees Cook Cc: "Carlos O'Donell" Signed-off-by: Josh Poimboeuf Signed-off-by: Steven Rostedt (Google) Signed-off-by: Jens Remus --- include/uapi/linux/prctl.h | 6 +++++- kernel/sys.c | 9 +++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/include/uapi/linux/prctl.h b/include/uapi/linux/prctl.h index 51c4e8c82b1e..91d2c9eb3aa3 100644 --- a/include/uapi/linux/prctl.h +++ b/include/uapi/linux/prctl.h @@ -368,7 +368,7 @@ struct prctl_mm_map { * configuration. All bits may be locked via this call, including * undefined bits. */ -#define PR_LOCK_SHADOW_STACK_STATUS 76 +#define PR_LOCK_SHADOW_STACK_STATUS 76 =20 /* * Controls the mode of timer_create() for CRIU restore operations. @@ -386,4 +386,8 @@ struct prctl_mm_map { # define PR_FUTEX_HASH_SET_SLOTS 1 # define PR_FUTEX_HASH_GET_SLOTS 2 =20 +/* SFRAME management */ +#define PR_ADD_SFRAME 79 +#define PR_REMOVE_SFRAME 80 + #endif /* _LINUX_PRCTL_H */ diff --git a/kernel/sys.c b/kernel/sys.c index 8b58eece4e58..ea088b643eb4 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -65,6 +65,7 @@ #include #include #include +#include =20 #include =20 @@ -2868,6 +2869,14 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, a= rg2, unsigned long, arg3, case PR_FUTEX_HASH: error =3D futex_hash_prctl(arg2, arg3, arg4); break; + case PR_ADD_SFRAME: + error =3D sframe_add_section(arg2, arg3, arg4, arg5); + break; + case PR_REMOVE_SFRAME: + if (arg3 || arg4 || arg5) + return -EINVAL; + error =3D sframe_remove_section(arg2); + break; default: trace_task_prctl_unknown(option, arg2, arg3, arg4, arg5); error =3D -EINVAL; --=20 2.51.0