From nobody Sat Jun 13 20:57:55 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 6F7E9426D25; Tue, 5 May 2026 12:18:18 +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=1777983499; cv=none; b=ARLDSYiUfpHgqqxBvdVQKoDuQ5ybI/2TKFh1MJ3OjOdt5eDz53FHCk3Ve66ExER+7RMcO6y0b8Dhog548aaw0nyHmDdVaj03tloZO4nCpXHIpWlv7ct2cPSSZiSIZiLGzrncjT0yJpFW20BmF0cUo+HlliJXzGGCRY3Epv5YRaU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777983499; c=relaxed/simple; bh=fZ18riyn8U/4pxw2pWT+GFh7KGdnfj147QJyCDjS5m0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dTN3iIHQ9MiF0y/KyFqzj8QCra8AkL0/LQBSSNld+5O0bxF58md+yjO9/8qku/cdgA6LLHxDE4KjBtDvq6ISq00CnGqdErnjesauEoTLPXvMbnsTiwGOhe+tI+41iWNzbhTRE5WCWCB2tJG4j/SKlNan7g+9lTl24uTxKijc6Cg= 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=ErnKXTn/; 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="ErnKXTn/" Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 644KG4hJ2292989; Tue, 5 May 2026 12:17:28 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=GD3koIMDWCSTvzfmJ n4ypGNpgpj9uyVZJ+2c+Wijlmk=; b=ErnKXTn/ewKp8bL+Yp1bulUPWssex0Mbt 01h2L5+u1EitZeKzKFC9pfi137qP6K7ICMOwCgwxjD+j+dhWx8Fk5J3pLtOWPxzZ GeHcirV7aYkkggmhC79RC6+66usGsxY5NVKRtIs7YmsSrp2NvAq3vnivvf8o4oEV FQ7lObWhBCT3MG7TpLdVj1YGHhomwhjWWMkBRUGwFQvc1As86gp1g7+nhwNB2mt1 al0rTmucpE29s8bK1PR+fpKK+BBymU/VDJCfL6CMTd2udG70JQIeQuw6GPYGhoeO qDt6qc52TSVgnvg5+93tJ2sS7s13UCYL8c9RRQTh6ybdrAfacFRjQ== 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 4dw9v7bj91-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:27 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 645C9k8a032554; Tue, 5 May 2026 12:17:25 GMT Received: from smtprelay04.fra02v.mail.ibm.com ([9.218.2.228]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4dwvkjsfvj-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:25 +0000 (GMT) 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 645CHLdw10027270 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 5 May 2026 12:17:21 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B11D92004B; Tue, 5 May 2026 12:17:21 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5085F2004F; Tue, 5 May 2026 12:17:21 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 5 May 2026 12:17:21 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Steven Rostedt , Josh Poimboeuf , Indu Bhagat , Peter Zijlstra , Dylan Hatch , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" , Mathieu Desnoyers , Kees Cook , Sam James Cc: Jens Remus , bpf@vger.kernel.org, linux-mm@kvack.org, Namhyung Kim , Andrii Nakryiko , "Jose E. Marchesi" , Beau Belgrave , Florian Weimer , "Carlos O'Donell" , Masami Hiramatsu , Jiri Olsa , Arnaldo Carvalho de Melo , Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Heiko Carstens , Vasily Gorbik , Ilya Leoshkevich Subject: [PATCH v14 01/19] unwind_user: Add generic and arch-specific headers to MAINTAINERS Date: Tue, 5 May 2026 14:17:00 +0200 Message-ID: <20260505121718.3572346-2-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260505121718.3572346-1-jremus@linux.ibm.com> References: <20260505121718.3572346-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-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTA1MDExNCBTYWx0ZWRfX0LIltCL1AQDa Zt4rnO8OGdQ9jq1onIz7f2sNzyC8YoUTZfl7VjlMVoLpb745drU8RXGLbQzgpqd5XonAXXryEbR p0EaYFsyvjvtU1xY45bS15j6ugx6GbNTqcqknWGsYGlO56mjtUjDVNdFJWKkSAodQxr3+N64IBv 50lJFVv0eR9ax6BWYxIJZ6+NER/gDmnK2V9nY37Yw7Ug0Bjw3k2DYb8+QepmfplSZKwmuDzkaAY CYJ7AmJZqR6QI4iII0m5ltGbLikYXNSVMXQkpxOgNFLi9bGcXwd+R2iQcRnRCudSkEP7+hbWS65 EYdxZEbAAUEF4dombl5KNK+ColZzpB77tHsN65JPvdZN8KO7xFOXExHw++miMDu2KJXk2xo5Dls ivm7TIQ6UNH2IFKVRt3MoUK8M8l66hp9r3jm7AJwpb9eey3Xiy+rxPVGqYCvrV5v+197x20L3tx cI7/5lqiZvjYFRE+lFQ== X-Proofpoint-GUID: PCsahACsigXdLiDH_nJGbkO2jA4YCBJ6 X-Proofpoint-ORIG-GUID: FrR91evT1mN2u5qsD6w0MC6XWsuiwnAd X-Authority-Analysis: v=2.4 cv=eu/vCIpX c=1 sm=1 tr=0 ts=69f9dfd7 cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=NGcC8JguVDcA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=1XWaLZrsAAAA:8 a=VnNF1IyMAAAA:8 a=VwQbUJbxAAAA:8 a=meVymXHHAAAA:8 a=HxY8WkbW6gBkmJkjgtEA:9 a=2JgSa4NbpEOStq-L5dxp:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-05_02,2026-04-30_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 phishscore=0 lowpriorityscore=0 clxscore=1011 adultscore=0 suspectscore=0 malwarescore=0 bulkscore=0 impostorscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604200000 definitions=main-2605050114 Content-Type: text/plain; charset="utf-8" Commit 71753c6ed2bf ("unwind_user: Add user space unwinding API with frame pointer support") introduced include/asm-generic/unwind_user.h without adding it to MAINTAINERS, as well as any future arch-specific versions such as the one added by commit 49cf34c0815f ("unwind_user/x86: Enable frame pointer unwinding on x86") which introduced arch/x86/include/asm/unwind_user.h. Suggested-by: Dylan Hatch Signed-off-by: Jens Remus --- Notes (jremus): Changes in v14: - New patch. MAINTAINERS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 882214b0e7db..8e71c6e7a68a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -27862,6 +27862,8 @@ USERSPACE STACK UNWINDING M: Josh Poimboeuf M: Steven Rostedt S: Maintained +F: arch/*/include/asm/unwind_user.h +F: include/asm-generic/unwind_user.h F: include/linux/unwind*.h F: kernel/unwind/ =20 --=20 2.51.0 From nobody Sat Jun 13 20:57:55 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 7A5AE436376; Tue, 5 May 2026 12:18:24 +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=1777983506; cv=none; b=hqWKzB7spo/19x5EXs5trv1gH6iWTIE9RbkQ9edYKVR2umxN1/V42X8Rspm9POIIHxnoRSITX063Ur3T7NL0lipPfIvVrLbGxI1JGjKTuisvwdh5JGVsdPFZW6iYNmHfOmAnGH4uqhH/7H4dm0UmexDzB3Lq+JImrk0jCbi0vj4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777983506; c=relaxed/simple; bh=EvqC5shOq8sXpflB+37iYhZe4p1Sb2EjePtSUjZtrGw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cjwL1XlYd7y7nT0kPyouoii5IA1iiVPz5X7g5x7jDFVrUkb1OAL1NrHUY+Z0R3+T9PNGd815XReCaACOpzVDB1gZ4Z+Ali6dq+e76cqcVvaaDdnPBdD0ld9gY1mQiDvqmIP6qU6ws1OPF44kroz9EBsGUhrb8dqGsyJ+ytwnYWs= 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=e+mqXl5U; 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="e+mqXl5U" Received: from pps.filterd (m0356517.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6457kJCh2503246; Tue, 5 May 2026 12:17:28 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=cb5axZ1MQCM3SbM5h hLaaNLvtr3xxZVwg+3Rh4fgKoo=; b=e+mqXl5U0a/yvCq1+M9FnBsh867BtsgZY WVfw1nSlF9easYv6gF1eo2ffMZQz1pQSdUtys8hNMiVWg36p1C3xwWsoIlwi7jfO 5gZvX4dtYpPn0tIO1vX9ARq0vv93JNTI2FjVgHibb/gGe5Wfx+6QrHiThI8quhjI N5npRausirQm83MTfyX4ro6d3pAW3LXn21YSQxANa/Nv7mzXmr+8sZoYU3c+a9EJ PiscM/WNQ3MlVImIkYm8ZmdKCUczw69xLVeniCtyncqIeC7zzP07imKR22Cso26V UktMQ5IQDfcSotZTLf0lcvSGbcMiexiI9jb4ZWr5mtEz+jVUPSi/g== 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 4dw9y1bh2y-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:27 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 645C9e7N032528; Tue, 5 May 2026 12:17:26 GMT Received: from smtprelay05.fra02v.mail.ibm.com ([9.218.2.225]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4dwvkjsfvm-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:26 +0000 (GMT) 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 645CHMnb49742098 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 5 May 2026 12:17:22 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 2C87020049; Tue, 5 May 2026 12:17:22 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B63642004D; Tue, 5 May 2026 12:17:21 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 5 May 2026 12:17:21 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Steven Rostedt , Josh Poimboeuf , Indu Bhagat , Peter Zijlstra , Dylan Hatch , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" , Mathieu Desnoyers , Kees Cook , Sam James Cc: Jens Remus , bpf@vger.kernel.org, linux-mm@kvack.org, Namhyung Kim , Andrii Nakryiko , "Jose E. Marchesi" , Beau Belgrave , Florian Weimer , "Carlos O'Donell" , Masami Hiramatsu , Jiri Olsa , Arnaldo Carvalho de Melo , Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Heiko Carstens , Vasily Gorbik , Ilya Leoshkevich , "Steven Rostedt (Google)" Subject: [PATCH v14 02/19] unwind_user/sframe: Add support for reading .sframe headers Date: Tue, 5 May 2026 14:17:01 +0200 Message-ID: <20260505121718.3572346-3-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260505121718.3572346-1-jremus@linux.ibm.com> References: <20260505121718.3572346-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-Reinject: loops=2 maxloops=12 X-Proofpoint-ORIG-GUID: o86DKg4RSXle3wlAaRdZrzbpXh9uAxf7 X-Proofpoint-GUID: nDENWNPxMv8ZOgfRYBSsDaBYTnt17Di7 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTA1MDExNCBTYWx0ZWRfX0MjL72Df9714 SHdZQck2MZuHfe4LPI6ncugXgnD6tTE4GQuyagpWPsHGU/n9BpR3InT5FBZNLDUJBhdHeQgAjuG ySMOSOFRAwFqpo+SGk5ZtD+USHZojDLqXrGmiW+PCVA1Wat49CzESCh0JLp10k+AYUT3KD6qqoV ZBkVMdvkQOwC6+irLsZQFkNDMvyseAZOf9Wu0sJnyV11W4CKRUXYIvNRSAmY4cSW1bsX3ddvm7Q uGSkiXt2Tb+cweGUteOB97h8EzTpeDRl0cw0hztsFJrB094B6dkEZo+GCXN66MPEyrdyp83FFSj H6+g5suRzjwtqt8HC6VAwhs0QcMqUdt4YHFY9LL2ifSCPr3T6EfdT+KzmuAp4Qdv6D3KhavRjbs P1tSHljzmDm1h4TuHnyAf46Tl04gybfaKs/OoOe+qs0RjUXxST0Dhr8lBERepB0Rd5lKDUdCRR6 r3gKb7LH8eN87lP9Khw== X-Authority-Analysis: v=2.4 cv=UbFhjqSN c=1 sm=1 tr=0 ts=69f9dfd8 cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=NGcC8JguVDcA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=VwQbUJbxAAAA:8 a=CCpqsmhAAAAA:8 a=meVymXHHAAAA:8 a=pGLkceISAAAA:8 a=VnNF1IyMAAAA:8 a=n2P1YqxNjAFD8MGDs80A:9 a=ul9cdbp4aOFLsgKbc677:22 a=2JgSa4NbpEOStq-L5dxp:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-05_02,2026-04-30_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 spamscore=0 lowpriorityscore=0 malwarescore=0 suspectscore=0 adultscore=0 priorityscore=1501 bulkscore=0 phishscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604200000 definitions=main-2605050114 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. ] Signed-off-by: Josh Poimboeuf Signed-off-by: Steven Rostedt (Google) Reviewed-by: Indu Bhagat Signed-off-by: Jens Remus --- Notes (jremus): Changes in v14: - Rename SFRAME_FDE_TYPE_REGULAR to SFRAME_FDE_TYPE_DEFAULT to match SFrame V3 specification. (Indu) - Correct SFRAME_V3_FDE_TYPE_MASK value. =20 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 8e71c6e7a68a..24d1fe93ff4a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -27864,6 +27864,7 @@ M: Steven Rostedt S: Maintained F: arch/*/include/asm/unwind_user.h F: include/asm-generic/unwind_user.h +F: include/linux/sframe.h F: include/linux/unwind*.h F: kernel/unwind/ =20 diff --git a/arch/Kconfig b/arch/Kconfig index e86880045158..94b2d5e8e529 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..fc2908e92c7b --- /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_DEFAULT 0 + +#define SFRAME_V3_FDE_TYPE_MASK 0x1f +#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 Jun 13 20:57:55 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 416E6392C4F; Tue, 5 May 2026 12:18:22 +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=1777983504; cv=none; b=FA7GgW5i/Zf8B2fb4T8WHQWREVvSJfVybiVCODJwAWs9vttGKbLAPo2CKmH8cSHvTvbDtlXIQhpHMgK9lCBSXEyk8zVSFNA2vaAgVFN1vxiIlpuDH3r99IbJUWFLmMrCbbRaODw6DXcY0Fida+9t+LY0gnalCuh7OqwGt4wEm7Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777983504; c=relaxed/simple; bh=/ze/ZG2ZjLyl1dtpvjkvg6ULL7x6gZniWGa7Mx9+Xp4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rfVfmKhEFedDxAgsUDp/DYDFI8ns4wK6JfFLp0U30LLOQ3P5bwVcg7BCUhydxmp4muDO8uzXWwsHWgEHogikWOq71lNSCSG3PeNTL+IZRMifKSyolB61LPyndiHQtso+v9INTb2kzkdqMv29wcUXnA4hU59QtVjszgy3WsCklR8= 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=Nc8EM48t; 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="Nc8EM48t" Received: from pps.filterd (m0356517.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6457ZZaR2791324; Tue, 5 May 2026 12:17:28 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=UczKkIqfVmHqRB8Da a9rtjVAZntNUMhh16BffZj+guM=; b=Nc8EM48tKLa3YXqMMGPt3ogo5GX0/wr/n 5ABOXcujgkAYouVH2Btd1OOOKqumzuyQi1YGJkB9bcTrXZPrN18ctuEkXrMQ4mcK qsP3JzsGX1d3vGnLN9pOtWqbJXjWgILxvhjbasQwlHafLTaUkpqFKskJwl0IeMme pN+C/Q/ruDSlO0S+Dza9Yw7V2IcTqbrPPcSFLIj4lz5u9my0osidvju3SKNHmgiU uZKgRzC422Carb3l/RNNfgot2EmtF1sUaj0tOlOWx/tWKLb877vQSO8MPlFUX3YU SZ8o/2QQmKEcRVhco6jH1rp27b99GJshDdOfE5cf/OxGPhsbiyqVQ== 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 4dw9y1bh32-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:27 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 645C9g8g028543; Tue, 5 May 2026 12:17:26 GMT Received: from smtprelay05.fra02v.mail.ibm.com ([9.218.2.225]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4dwuyw1m32-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:26 +0000 (GMT) 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 645CHMXo36045192 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 5 May 2026 12:17:22 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 9B1C02004D; Tue, 5 May 2026 12:17:22 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 31F742004F; Tue, 5 May 2026 12:17:22 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 5 May 2026 12:17:22 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Steven Rostedt , Josh Poimboeuf , Indu Bhagat , Peter Zijlstra , Dylan Hatch , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" , Mathieu Desnoyers , Kees Cook , Sam James Cc: Jens Remus , bpf@vger.kernel.org, linux-mm@kvack.org, Namhyung Kim , Andrii Nakryiko , "Jose E. Marchesi" , Beau Belgrave , Florian Weimer , "Carlos O'Donell" , Masami Hiramatsu , Jiri Olsa , Arnaldo Carvalho de Melo , Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Heiko Carstens , Vasily Gorbik , Ilya Leoshkevich , "Steven Rostedt (Google)" Subject: [PATCH v14 03/19] unwind_user/sframe: Store .sframe section data in per-mm maple tree Date: Tue, 5 May 2026 14:17:02 +0200 Message-ID: <20260505121718.3572346-4-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260505121718.3572346-1-jremus@linux.ibm.com> References: <20260505121718.3572346-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-Reinject: loops=2 maxloops=12 X-Proofpoint-ORIG-GUID: giJmQWgdJ0WOmXNWmGSQSaFhX9DyKVaN X-Proofpoint-GUID: pEU73BEv-vlb3ri3d23VUWwQ4itBwYa_ X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTA1MDExNCBTYWx0ZWRfX0JWXrg8Ok70Q 4bSVl2U8pmcCJvSQN72e134eO7GtJ7avXnGZdECkXB6TZ0NvC2MdA1+IkrzLHcPYYKq4LWW7hod dErW9b6bkrJOyFWT1D8ZBUiP/uSLEh+R4lRDy1MwXh9o5ERI12/W9jK4zma6vv64go9JD1oFo8p 28jf92a6y6bNUOsmJvR+MYUKzks8nE0gI6MtFRp1za5qGW0e7An+/JwHQFRB4SSnmuX8bTlCg+h Pe28GQSjJQjc9YvDkT6oxwERGaGQl0FdPAnUJFRkzuFej22t0uKte2PhzLy/fVDW4jmx3TXFgkU 8IYCd/a33ZRcwAo1Jjbo7U+ANSO5EQwVf6gp7Oguv9WxnxW1+Xl64UeZatA1lJSMPpVlZxnMxUp 3FJueGTGih5fEeB7LX4lvCU+e4yerzeQM4/OEmjggMHaCmYB++V7nKEZzhkdGTSXBNcRLdfjfwX 3KS2nbcBEwR8shnN8Mg== X-Authority-Analysis: v=2.4 cv=UbFhjqSN c=1 sm=1 tr=0 ts=69f9dfd8 cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=NGcC8JguVDcA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=VwQbUJbxAAAA:8 a=meVymXHHAAAA:8 a=pGLkceISAAAA:8 a=VnNF1IyMAAAA:8 a=Oh2dYGMcuWX8t7tWpUQA:9 a=2JgSa4NbpEOStq-L5dxp:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-05_02,2026-04-30_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1011 spamscore=0 lowpriorityscore=0 malwarescore=0 suspectscore=0 adultscore=0 priorityscore=1501 bulkscore=0 phishscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604200000 definitions=main-2605050114 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. ] Signed-off-by: Josh Poimboeuf Signed-off-by: Steven Rostedt (Google) Reviewed-by: Indu Bhagat 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 a308e2c23b82..c1505356b6fc 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -1424,6 +1424,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 5f3fdfdb14c7..8d8195561c95 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -110,6 +110,7 @@ #include #include #include +#include #include =20 #include @@ -735,6 +736,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); } @@ -1072,6 +1074,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) { @@ -1100,6 +1109,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 c5556bb9d5f0..77909139162e 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 @@ -49,6 +50,7 @@ struct mm_struct init_mm =3D { #endif .flexible_array =3D MM_STRUCT_FLEXIBLE_ARRAY_INIT, 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 Jun 13 20:57:55 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 05E5842B757; Tue, 5 May 2026 12:18:21 +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=1777983503; cv=none; b=TtlXA3eQNhHkJcrvOEXgfJ+BUrRNqcz+0Obb15sE8Pvd0Jij8jF/8AmdtR1hyCJQN5Qun63wRvXdBmHnSJfGs/am6bTrVZqDn8AEMqiR1Z1Ts9wvcmTL9q3w99ygl3vIzbxEChtmIkZZk3jGzsqbAnNgTu0Q/+72DzOmxRyLzak= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777983503; c=relaxed/simple; bh=uIbdJGh/N9lQH49AE2Fc0NOhYTqYuvXPbyX/MRP5T8c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RddPHLeqJcOF27Lphh2dcPCHeX1Ta8TKdDRbyrMxm4nRXNU4XniOlBmobcRlNqPHob42UU5pR3LvNdeuuziHWMT5BbWkxd1FVNNa0tBvryTshFRNCVpSjTedHYxYqLLHKHMu/iY2GdcphnMDSjkyAnhjn14egtCzuAozVU6Xt9M= 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=iKjdzuXb; 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="iKjdzuXb" Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 644JlCCH1181000; Tue, 5 May 2026 12:17:29 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=9jk0sPM0F49+3xsbm n4sxo0rBP2j0R4q+y+vLeY7bZ8=; b=iKjdzuXbrhhlc+2Znc7c8kyL0c4RZpLnp BsPiUnGfd5H1BpjtK7Ii1Hnbi2kO41H15cRcsI9xc9BSx+VqMV5WwkliFfvqo0zu 9pxpEBBfiriW0rrufpMrfJGziKG9HvVY09+A22EmBthGCtFTwWGBlkarsllS3+A4 50dRIK7E0oJk6E/WmfYq1gxXJ5zrZI/UFOVDqLzLv59lIzNKIaktsp3HFd1sg2jA fuCOBiY6tfQ3lJ0cwz7l7IUSEZVUBRt8D+3pegzfXMiFx4lSFSr9/vOVQ7umGgVy LclKif646wOdKpC4dgdxFuGAx8voNl8WQUASUzOk9R4NY61Ro0tew== 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 4dw9v7bj95-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:28 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 645C9okw028585; Tue, 5 May 2026 12:17:27 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4dwuyw1m34-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:26 +0000 (GMT) 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 645CHN1828836326 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 5 May 2026 12:17:23 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0AD4D20049; Tue, 5 May 2026 12:17:23 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A16172004E; Tue, 5 May 2026 12:17:22 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 5 May 2026 12:17:22 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Steven Rostedt , Josh Poimboeuf , Indu Bhagat , Peter Zijlstra , Dylan Hatch , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" , Mathieu Desnoyers , Kees Cook , Sam James Cc: Jens Remus , bpf@vger.kernel.org, linux-mm@kvack.org, Namhyung Kim , Andrii Nakryiko , "Jose E. Marchesi" , Beau Belgrave , Florian Weimer , "Carlos O'Donell" , Masami Hiramatsu , Jiri Olsa , Arnaldo Carvalho de Melo , Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Heiko Carstens , Vasily Gorbik , Ilya Leoshkevich , "Steven Rostedt (Google)" Subject: [PATCH v14 04/19] x86/uaccess: Add unsafe_copy_from_user() implementation Date: Tue, 5 May 2026 14:17:03 +0200 Message-ID: <20260505121718.3572346-5-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260505121718.3572346-1-jremus@linux.ibm.com> References: <20260505121718.3572346-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-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTA1MDExNCBTYWx0ZWRfX0ihancRXGt18 IJyGZUNmBcdxherEL9XDBqFi4UN2bl8lc7rvenJ4XR1yTQCEpuIGpBsBKpuLuN2FabrdAXx9j5N XM9G6pf5t5G/J+Yv6LavDjt/Y58BfuZQKUTMv2L89oFYLmGxMfSVMX5l7tU2gCGYGuCwIxjBdy/ KNERiGkGifCQQs/YfrAQMXlvAfN2nMR8U4ADMEjRyqdA71NztLqpbFvJZkIxC7XBId/jUlZkHWx xQXUUc7aaOeyWYS1xhq+hv1hkZW2PbvvPzHd81xbcyNI8DtZz9x7rCTTddjnQ3fKG47ko33hk60 VjuMCZJzdMWzyYtpFK4c/ImOgvHMZs4L7FFzquAwSX+GbWyqX//6heV+0KI14c374rhIWnAfXD/ QPT2HNS6MiE02BAJy4h8bVOLLQPogUAYMOumG6h4CYOB3uOACP11bSOBqeYeHE0ohXCtMr9z9M+ 8wW08tLZ1GXf69M7LHw== X-Proofpoint-GUID: 3xPfsk7dxks5BRMKUV_Iwiir8jU8tnjU X-Proofpoint-ORIG-GUID: hJbz80oBTd2cuT1HmERswDPItq9JtWhh X-Authority-Analysis: v=2.4 cv=eu/vCIpX c=1 sm=1 tr=0 ts=69f9dfd8 cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=NGcC8JguVDcA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VwQbUJbxAAAA:8 a=meVymXHHAAAA:8 a=pGLkceISAAAA:8 a=VnNF1IyMAAAA:8 a=-G4kms3_kQfBhqX38bYA:9 a=2JgSa4NbpEOStq-L5dxp:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-05_02,2026-04-30_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 phishscore=0 lowpriorityscore=0 clxscore=1015 adultscore=0 suspectscore=0 malwarescore=0 bulkscore=0 impostorscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604200000 definitions=main-2605050114 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(). Signed-off-by: Josh Poimboeuf Signed-off-by: Steven Rostedt (Google) Reviewed-by: Indu Bhagat 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 3a0dd3c2b233..79679779f1ea 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 Jun 13 20:57:55 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 AB12142B75E; Tue, 5 May 2026 12:18:22 +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=1777983505; cv=none; b=Ppn8I6Ktmo7A4Nkmm7mTML0WD6e04fzZH66Af+P3dA8h8+Wy8Lk6IVozq8L/e+nxnevfNefVDt1lMW0MjSf7wZLywj80rgkIe4KxrJonH2UVEx7Jg791laKvAtP7gmzjWy7Ss/HV0puPX5+keTCNLEnotW741RP23XRK9WiVrzY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777983505; c=relaxed/simple; bh=lN7bpavyjPeQc7H7ZqRogDH75scZCd6aEkW4Gz6a6Jg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BRxYEbYoL3xkbIjHve0dECkl7Nt1lrU9OPxpn4zD0KmaZdy0L9PpCJVevYGyWcT4d8ITZ5+uJbWKSUQA/plXktbiejI/PEXiWQN3ty1FhJexDcnAfLK/k4WZiV9vfjl5rYug/MJMRdxTZnIY0kLxxS/FQ4ylkWKwVqnoftp6NsM= 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=bqBZ8OEx; 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="bqBZ8OEx" Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64575KMZ3279333; Tue, 5 May 2026 12:17:29 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=4ZtWqnN1RczyOwe8e D0TIQbNux3o+p4OofXFSliSMD4=; b=bqBZ8OEx0KCHo03oZEMqu1gLNKNqaLsDd ePolS8Zi1gfm4aCUNRmlYVDUBlJ68gQDXF3pxknSqVEzabRXaOAN1gy/BS/oSnLr gSp5/BBXCg3TOi8TutnxtQOvJUH9YQqUrfyj6Uj08inxUc1bnAr37NavEwNmHuf4 HPRJ+wzRVDpstP0Sue1OlGs+t0JjuH7b7TdYzxls10IUig+ZT5QRAgIFSnhXtNsg PYSG4LG2G5L4VDgEvXGaZVZCZRlGDbgzC+Gp3X938xZnYsXW1Mg8tqACDfNeCS6W UsYJ7LKzGokw1YLaPkeGBrJcw8zuMejKZRXQhQE/D3hprNPpOBQnA== 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 4dw9xxk5d7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:28 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 645C9cgQ024347; Tue, 5 May 2026 12:17:27 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4dww3h1eq7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:27 +0000 (GMT) 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 645CHNXB15925674 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 5 May 2026 12:17:23 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 84A392004E; Tue, 5 May 2026 12:17:23 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 108732004D; Tue, 5 May 2026 12:17:23 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 5 May 2026 12:17:23 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Steven Rostedt , Josh Poimboeuf , Indu Bhagat , Peter Zijlstra , Dylan Hatch , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" , Mathieu Desnoyers , Kees Cook , Sam James Cc: Jens Remus , bpf@vger.kernel.org, linux-mm@kvack.org, Namhyung Kim , Andrii Nakryiko , "Jose E. Marchesi" , Beau Belgrave , Florian Weimer , "Carlos O'Donell" , Masami Hiramatsu , Jiri Olsa , Arnaldo Carvalho de Melo , Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Heiko Carstens , Vasily Gorbik , Ilya Leoshkevich , "Steven Rostedt (Google)" Subject: [PATCH v14 05/19] unwind_user/sframe: Add support for reading .sframe contents Date: Tue, 5 May 2026 14:17:04 +0200 Message-ID: <20260505121718.3572346-6-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260505121718.3572346-1-jremus@linux.ibm.com> References: <20260505121718.3572346-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-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTA1MDExNCBTYWx0ZWRfX6XRcCVPfexRX aTxIghH1703yLbfFVYTB7LN78hCTIq0I0rKK8kVqpSK90MmaBlPR+KEDxaP3ni5cMW/hw7ZMr8K 2qSJuC3/n8b+eX5WiC9MPRZMCRT1rPVtRjREQi7w2yaciBdoteymAmvFh9zC2onCOXMsy6m1Pjk bvosyyol9h0X6aKM69UjPIZzmbok67q6QDeZglJJVy1fDk5wj45FcsptBn/QPZk5hR1InbaKEMt aj7YVkCPtMAlleGGuyrMnc2+kmJD8dQFPeu3+j1eGkzVSEoocdiQi0/HBtL1zgQnt4kvXqVO58O lcYM353sz+H5bLKFsCWngXjU5ufmspL5sEmk6aiY1+mJ3/XvisZ/YgDE0ru6s4WpcrmEi9rUq0P Tml2OMrzLwfvVWit4wHLYthRKNUMhtn4jt63DbxU610/n2GSASRcpOUoaGap58RZ9VitkRvFciZ ICXAGpKDcuk1O3VrVGQ== X-Proofpoint-ORIG-GUID: Vj8o6NPkwVYMEHIgFfh8OFeJyFbrRIvW X-Proofpoint-GUID: IVLj-N6IF1qXucqDldL-uJTnEQzfebWD X-Authority-Analysis: v=2.4 cv=ctWrVV4i c=1 sm=1 tr=0 ts=69f9dfd9 cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=NGcC8JguVDcA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=meVymXHHAAAA:8 a=pGLkceISAAAA:8 a=YuDcBBqGAAAA:8 a=-28QZkuTYErVj2SHl8MA:9 a=2JgSa4NbpEOStq-L5dxp:22 a=V9_jqlfyBUA7Gw2gN5zN:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-05_02,2026-04-30_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 lowpriorityscore=0 adultscore=0 clxscore=1015 suspectscore=0 impostorscore=0 spamscore=0 malwarescore=0 phishscore=0 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604200000 definitions=main-2605050114 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 ':'". ] Signed-off-by: Josh Poimboeuf Signed-off-by: Steven Rostedt (Google) Reviewed-by: Indu Bhagat Signed-off-by: Jens Remus --- Notes (jremus): Changes in v14: - Fix FDE function start address check in __read_fde(). - Adjust to rename of SFRAME_FDE_TYPE_*. =20 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..c60aa527984a 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 >=3D 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_DEFAULT) + 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 Jun 13 20:57:55 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 9852F43C05E; Tue, 5 May 2026 12:18:25 +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=1777983507; cv=none; b=qfkJxG5AoWUbuG11g2j3WtaBovMIFyPVjA53pYHJ0HO7VeH6xoE+RSquyx8HuFPSdLxAnMRpo0e9NWymcbptzAoWzOiTmPYtj++FA8GgkTY1J5usnYBaEmCWzHUkLShU6sYzmmfiFZFEGeJKOB/okO4xsDcszF8Bq8KbIQ07JE4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777983507; c=relaxed/simple; bh=TqyHOCoQEaUYPTtp+CjLho1N7/wi7TwlGinmGDBevhU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Hj8/t2XS06KWFWeBv0N5/r/TEv780llpJeRZrk77juzZ0TDVd+dL6YkWlpfT8JH0PC+ST2LS7NUc6PbSF0IrkBvhbekGuuIWjFFX6KkOYBgVXzEag4rCVEBGjbztiM3r1FxMvTs3yNXUCnMMAd61dB75BgSGve/OT2fetkHB2oU= 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=e1wY+P2W; 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="e1wY+P2W" Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6456dK0w2830434; Tue, 5 May 2026 12:17:30 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=k5ofOJ1moPTodwUkb fHb65qSUnojL/Rp9HGldnq8Qw8=; b=e1wY+P2WZuQUQXbFnRer74oVxovh+XLrd +yp5CK6KX5mfum1cLjx1aoOH3iaY4ROEOJfEZMYPj4c4284r6/JbR7uIm/tgPTkp Fdk2ILbq2mQhqpE6fxUpl6dwEvggLzTpOJ1tcWeDjdI97vadltUeGqiXp9rxlu7H i03iZHF7zS8wuF8GwlpnnZMyA9sdGOcBT1zu7laZYiTyzSC/AXJ/kDynqWKAjn1m 8HAiFxFSgdmpX1BXQpKx1ZNYvSLBGta6geodvqr4elOxBL2OV9aIvdCEEf8u/KMb hyGTgXhkHmJX3wU1qw7YD3ZWUn7B3sKCsjWlV97LI5UyJbqlUPyCw== 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 4dw9v7bj9c-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:29 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 645C9cg9028517; Tue, 5 May 2026 12:17:28 GMT Received: from smtprelay07.fra02v.mail.ibm.com ([9.218.2.229]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4dwuyw1m36-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:27 +0000 (GMT) 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 645CHO0U47120820 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 5 May 2026 12:17:24 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id ECB012005A; Tue, 5 May 2026 12:17:23 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 8BDAB2004F; Tue, 5 May 2026 12:17:23 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 5 May 2026 12:17:23 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Steven Rostedt , Josh Poimboeuf , Indu Bhagat , Peter Zijlstra , Dylan Hatch , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" , Mathieu Desnoyers , Kees Cook , Sam James Cc: Jens Remus , bpf@vger.kernel.org, linux-mm@kvack.org, Namhyung Kim , Andrii Nakryiko , "Jose E. Marchesi" , Beau Belgrave , Florian Weimer , "Carlos O'Donell" , Masami Hiramatsu , Jiri Olsa , Arnaldo Carvalho de Melo , Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Heiko Carstens , Vasily Gorbik , Ilya Leoshkevich , "Steven Rostedt (Google)" Subject: [PATCH v14 06/19] unwind_user/sframe: Detect .sframe sections in executables Date: Tue, 5 May 2026 14:17:05 +0200 Message-ID: <20260505121718.3572346-7-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260505121718.3572346-1-jremus@linux.ibm.com> References: <20260505121718.3572346-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-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTA1MDExNCBTYWx0ZWRfX32jibKdZJZCs ZePO5pCYnL9OPPWGB+AZwqGlPiDnBByysOkOSBVZvn8MiB3mja0YLF8/Ruf+NpxcjzsyqtRNzB+ gsfKQ2gwcFfF0IyoZqZAInphG1u+bRB865bCSXLOmW2y7Cg8leSRCSrPZB/sNT3YbGGNeWQIcWA 09rflUMWCqfEDyGcK+2HK9GAQ1YxRS4u44QTN5yBBVIEeSxuaAAWjZJI/+FBKr5I97M93zRpsyF cbJrdE9tBFzMujYhBpbYAytSKGl89pE/gR3QUUUenfmWMizQqJd+9HtrP57M2PWZ1If1CkXCXyU 5vRtZKMsuWgN0Maon0OkBzppepywSd/Vme2iXJ4y2ZMzb3CZQps5NXfXqg/ekT7Bq5DpTEL3Fkq y/Ku3HOQoJp/N+p9tNKW15ckxVVNXqOb0MToCl3Nr1xYZgZ2ELQ26OvOo5z+IW0nsv8MZUY5Rdp lTlxGy0TmBroDdkqSeQ== X-Proofpoint-GUID: fzj9uFsf6c7HKjWKSDnaPdn2Yfv-VtP_ X-Proofpoint-ORIG-GUID: PWKs1mmxDnri6Rb3HU6o6VZrxoTM0UrX X-Authority-Analysis: v=2.4 cv=eu/vCIpX c=1 sm=1 tr=0 ts=69f9dfd9 cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=NGcC8JguVDcA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VwQbUJbxAAAA:8 a=meVymXHHAAAA:8 a=pGLkceISAAAA:8 a=VnNF1IyMAAAA:8 a=eNuN5pRUQDBy6NUwPKcA:9 a=2JgSa4NbpEOStq-L5dxp:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-05_02,2026-04-30_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 phishscore=0 lowpriorityscore=0 clxscore=1015 adultscore=0 suspectscore=0 malwarescore=0 bulkscore=0 impostorscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604200000 definitions=main-2605050114 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". ] Signed-off-by: Josh Poimboeuf Signed-off-by: Steven Rostedt (Google) Reviewed-by: Indu Bhagat 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 16a56b6b3f6c..55047659a3cf 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c @@ -48,6 +48,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 ee30dcd80901..e2a7dbed2e80 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 Jun 13 20:57:55 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 D76C2392C4F; Tue, 5 May 2026 12:18:16 +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=1777983498; cv=none; b=RBHKOgp2MeM2NPt1bp1GdPSZub1zcbEQYrMCD3cRpGy9pGUcqFxFMPu6GsaksDNgRg4/d2DX2asCEa7qiyxSOttMgoNdSjyJ/nVIENjvFhliQKbjVlf8O1ePygDVRPVX04uH+bEPj2OLqefYVOHtkeOWuPYHteXdUNhCWfpR38w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777983498; c=relaxed/simple; bh=VglWC5QjBmwSCIAAVXJjNHx/C67wfgsvPJQGG5CiALo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sR35KV8r7m2f8ml69D5KLGkOYcbXQNxgeX6dg499m2v/zV71/Za8eGxySHWUuhk6AedN+zuB5YCPXZu9fT2DV4ZBcYvql3H9qV1XwSt63dWs2oNCquCG4ELW+ZrhM7hAc9sIaRWMv3Z5fO52qZ959loCWUFWPrW9D2yi2jhXkyc= 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=rfAcTdCf; 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="rfAcTdCf" Received: from pps.filterd (m0356517.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64581TKo2735981; Tue, 5 May 2026 12:17:30 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=FvnhYyrYWxk5OBPJw rKrmJeEttrxtHxGpLoGH3hJxZs=; b=rfAcTdCfZTdCJIhg279MiEJuXikE+HU87 VW1NgFhBqmN66S2/ZP/MFVX49Npq4TmI7nXuUz4dunypkCq0+hCWVEZO8a/oubJW aokHCUARaQXlCdfCdiT5SuCvZcrX0QFx7WHIa1YEpOqxkf202VhNkfCxE2PJlsl4 kEq4kZgolvFpJHVVcQ+9K6vmH8F2qxlwRjNERx4L4+b1VDKXotZtkVX7pfRUwDEj E6fky+n4f8TIMvhs86IafghGrDB3Wk7aSTuhyzjVE14vlYbT5Z1r/LQnd98meHsP TxO+uVjm5OsRVoSwCc3CRnM1hBn/gWeeXIfK4zrCV9paRbCtwt+cA== 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 4dw9y1bh3b-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:29 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 645C9c1v029300; Tue, 5 May 2026 12:17:28 GMT Received: from smtprelay07.fra02v.mail.ibm.com ([9.218.2.229]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4dwwtg9bma-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:27 +0000 (GMT) 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 645CHO2G50921758 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 5 May 2026 12:17:24 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5B30B2004B; Tue, 5 May 2026 12:17:24 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id F223D20063; Tue, 5 May 2026 12:17:23 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 5 May 2026 12:17:23 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Steven Rostedt , Josh Poimboeuf , Indu Bhagat , Peter Zijlstra , Dylan Hatch , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" , Mathieu Desnoyers , Kees Cook , Sam James Cc: Jens Remus , bpf@vger.kernel.org, linux-mm@kvack.org, Namhyung Kim , Andrii Nakryiko , "Jose E. Marchesi" , Beau Belgrave , Florian Weimer , "Carlos O'Donell" , Masami Hiramatsu , Jiri Olsa , Arnaldo Carvalho de Melo , Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Heiko Carstens , Vasily Gorbik , Ilya Leoshkevich , "Steven Rostedt (Google)" Subject: [PATCH v14 07/19] unwind_user/sframe: Wire up unwind_user to sframe Date: Tue, 5 May 2026 14:17:06 +0200 Message-ID: <20260505121718.3572346-8-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260505121718.3572346-1-jremus@linux.ibm.com> References: <20260505121718.3572346-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-Reinject: loops=2 maxloops=12 X-Proofpoint-ORIG-GUID: LBHznMHNrGwcMIVAjy5FTSmb0VZFbhh9 X-Proofpoint-GUID: iMK_zE08jUSeI2qYJTeWXZRqSR2k0krj X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTA1MDExNCBTYWx0ZWRfXywHpJhLi2dEn P9AYd5vJFwFBj0+QRrHYpUfiE+qsWW8lwgPfGnTbYrZ00nCVd4cVw13LfK5s1O+tqWVdchKQslK P4iR3E6GuDFf42quEGZwgu2CjLxSkt2L44ESlTNYSxJQCqp9A4nS4cOAiQ2pkR5IZPE/fFk1VeH Ppl2kp2xH17XuTsAgd6F0apNsu9Pk6Uu06A9SnfxcnXeqLVLAnVq2/GzfZSeZLyRKuOQxY2/3Ey qbuRpwUyaU3cA079v56RztjzEqB6/TbBlDf7BNq6APTgO9RAmbChK+go9kOHT9muzzeRNe5F8/p OwaEq73tBWmeq+z7x0oW0x8GHFuuiUVtas0zTiKF42wcb7pK9+Rs2EO78dvX97hdm7l2EuRmrEN jdsw7wtnZLzh0qhZHZxxIRHNa4XB6tIbdx/zFRoArcVSgpGE4u38Cf+t73M0M+Bbjcw12Z1HUce 6mkwA8D02yA9a3vywMA== X-Authority-Analysis: v=2.4 cv=UbFhjqSN c=1 sm=1 tr=0 ts=69f9dfd9 cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=NGcC8JguVDcA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=VwQbUJbxAAAA:8 a=meVymXHHAAAA:8 a=pGLkceISAAAA:8 a=VnNF1IyMAAAA:8 a=ItKwCHsCKAUqeRWvWoIA:9 a=2JgSa4NbpEOStq-L5dxp:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-05_02,2026-04-30_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 spamscore=0 lowpriorityscore=0 malwarescore=0 suspectscore=0 adultscore=0 priorityscore=1501 bulkscore=0 phishscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604200000 definitions=main-2605050114 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(). ] Signed-off-by: Josh Poimboeuf Signed-off-by: Steven Rostedt (Google) Reviewed-by: Indu Bhagat 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 94b2d5e8e529..37549832bd1f 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 Jun 13 20:57:55 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 1F778426EC4; Tue, 5 May 2026 12:18:18 +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=1777983500; cv=none; b=rmXwSdZrRwnQrBOP1LfZjVC0MlBYk0G5HD1a3iUf/3UdtdBJncmgL7PcQc0xvg2XUzQ0ejG8k5ic+4hTd8l0pT3aG+YvPzVQy/qAtcxjxpby+p2izZECEGU+cYC65wzHOWVGUh7GVWDliQ/So5sV83LLJdLVMinXO9HmSypgzKY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777983500; c=relaxed/simple; bh=lnqUBHPpzXbWDkV21nilebs+kDCcwN10JV8SRrKWPOs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JVevv6+LS6DiduTXq4DD+pfwJA2JGkpn/Q+TY0bFYUDKM0a2mWpRzSHO99W79la1TfHASldanv71IUNZdm2pia+WP/e+3hPuYCm1qWKl/ys5QntIu0ryHkCOJ+ap/TNoUeIVvmg1rquqShhT7mwy0tHGqozilu2LvS6+UrN7q2k= 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=X7cka+Fx; 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="X7cka+Fx" Received: from pps.filterd (m0356517.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64563I0U2236368; Tue, 5 May 2026 12:17:30 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=dLUdkq8a3Y1OwT5DX jpOwlqcJtqrXG3rf2YuzJ2NkbA=; b=X7cka+Fxlkuxg3fa7fL7DkyXZdCRhE2pz BTBsiVrkaYM1y4geOYzbsmoSvkPnMdBNsqscjhBQMbVaD4W3GuhJFGMQVaZriqzx c8ArxrKaNVLBMzM9hgRFgcZs5yeph2wxIKej0NeiOQMn9VxVWYmA24OFZwkL1kAm xh2acRy2RRTLccqg159V5hWMJw7bQn/raaNQtnM+8rBX4zK7gc2ee5dcJL6b3DDF enqhF57N9MwN17Naz/gJJqXCYCg5GPWyWHf8pVoa0cOYfJpdo8KYP0qVjEVFeINh yXEt8CghXIfPfDFEmVte/p+FLwv0VZYTM1VOEwW0hjAzV6/nuHVrQ== 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 4dw9y1bh3e-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:29 +0000 (GMT) Received: from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1]) by ppma11.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 645C9bkD015131; Tue, 5 May 2026 12:17:28 GMT Received: from smtprelay07.fra02v.mail.ibm.com ([9.218.2.229]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4dwx9y98g0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:28 +0000 (GMT) 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 645CHOUg43057458 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 5 May 2026 12:17:24 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C46192004B; Tue, 5 May 2026 12:17:24 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 6092D2004D; Tue, 5 May 2026 12:17:24 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 5 May 2026 12:17:24 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Steven Rostedt , Josh Poimboeuf , Indu Bhagat , Peter Zijlstra , Dylan Hatch , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" , Mathieu Desnoyers , Kees Cook , Sam James Cc: Jens Remus , bpf@vger.kernel.org, linux-mm@kvack.org, Namhyung Kim , Andrii Nakryiko , "Jose E. Marchesi" , Beau Belgrave , Florian Weimer , "Carlos O'Donell" , Masami Hiramatsu , Jiri Olsa , Arnaldo Carvalho de Melo , Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Heiko Carstens , Vasily Gorbik , Ilya Leoshkevich Subject: [PATCH v14 08/19] unwind_user: Stop when reaching an outermost frame Date: Tue, 5 May 2026 14:17:07 +0200 Message-ID: <20260505121718.3572346-9-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260505121718.3572346-1-jremus@linux.ibm.com> References: <20260505121718.3572346-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-Reinject: loops=2 maxloops=12 X-Proofpoint-ORIG-GUID: 1-0-ys_TCaBcSRISAfsRo81sfod1BNXN X-Proofpoint-GUID: w5dqYWUxr6Si0ukN1IIY6K1w76LcbiVL X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTA1MDExNCBTYWx0ZWRfX8Swk4vct0uCk p7COYGCK6DzKtfxlk1afvXZijPdN3wCiC0Z9nP8yt/ZyATSIGhc+GqitKeNkfW6Hzihx2ZDaqUC QtG+jDGO6sw4aR7+RltMPB9Hc1qTqx6XTpwnt+ufrb7xCOhatT37skvkwV6/fqgnGtvWeR13HmD lrGkU0QUpyc30+rlWTK50ckHXiTdVG2DPHQwbX2VSZ1e6EcWPRfGEf+KE2/4gJdnvVJUDBs31gA bif6mtQbO/GL9mQxm40/zy2++U4l8mz2ELbPgJaSe7doX/Q0stZpOB6MgfXFwBoczPiI4FpibPV +1sZU0xJHOHMaazO0EHbRe3i6tdVUKkHc9cmLmRcbh3VDVdh7VgjtEn+zYgBGyOTrCO2npUFepH TzHja9M/YguCYSSHj9pGqdtvM56gG8cHnd9BfGI2HnQuaEV/JXxJq9XV4Xrgvlx+ztiiU4wzSE8 uBUFxa5zAhEBX7MQZ6Q== X-Authority-Analysis: v=2.4 cv=UbFhjqSN c=1 sm=1 tr=0 ts=69f9dfda cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=NGcC8JguVDcA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=pGLkceISAAAA:8 a=VnNF1IyMAAAA:8 a=_1qlYuAciRtwIPuEvDgA:9 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-05_02,2026-04-30_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 spamscore=0 lowpriorityscore=0 malwarescore=0 suspectscore=0 adultscore=0 priorityscore=1501 bulkscore=0 phishscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604200000 definitions=main-2605050114 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. Reviewed-by: Indu Bhagat 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 Jun 13 20:57:55 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 9E007393DDC; Tue, 5 May 2026 12:18:17 +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=1777983498; cv=none; b=ix6JzyuWvkyhjV9M7ADpjAIrqbh93dnJlLZM/mzmIvrkDph0xr13clU3e4XodU5Yi6lEw7PTjBknp4HH25pt1pe7gtpofeI1wHscPRi4eJN/uh0dQZxLRTmtAvCmuqfkXoGRMVHJRlerENf8JUpFZEzc+ezXdsAgOjPABhMGRIs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777983498; c=relaxed/simple; bh=fYp/UfRYBUkzJLmQCxdXC1AOIjsLrcAf3YX9BfFjL1g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hhUD3TPZ7PjtpprHajbK5joQClHlT8eYNTAcgrbq5PgeWNvwzmfIzljmuoju6OG4nkRh8WCWd5GwSMsWgbTwC6TEamoKvjXUJb092QBohlLmBeeKJ9zdZoW88c7gPkZkDEXYBV9NUdauVgGM5zQfneFLvrCTPnga8StlHM8TK6A= 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=VEwxoKQy; 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="VEwxoKQy" Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6457XVQv3464145; Tue, 5 May 2026 12:17:30 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=1rPRr3FZStWFGzetx 6++VNjJW1FkjSSD795lGjO3e+g=; b=VEwxoKQytBh8r2anKmrQqsD/fQrUCoyYI dPEgpHAorlGbTKN9hFnqiHfk/Y70Z7kIWHvhdgrbZpSi4YaocTbjDKQqkv6lQWXL 1o0+YDWR+sKsS/D/CcTo7avul1PUaW9nRyzLfsqTn1zBmM69KJpPyq+C7woDYKdN fcQRoxnIEWlCLJZM9kW2MrJB9BZtw+FmW8jW73vfP4fRPIkPcBtS8TRGL69vMoz7 Vj89YJgsQw7Sd8KiewtLXRLG1ZLGtU18ROXSc1iTrGLOctoRq+2BOjp/mjPbUVh5 MWNl3YnG8wqTMpFdrhyD/gKO4UfR7SmvWmh7J/4OBUyNEikLfXTog== 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 4dw9v7bj9h-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:29 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 645C9a40030210; Tue, 5 May 2026 12:17:28 GMT Received: from smtprelay01.fra02v.mail.ibm.com ([9.218.2.227]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4dwukq9nmn-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:28 +0000 (GMT) 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 645CHPVF59375896 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 5 May 2026 12:17:25 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 322A42004B; Tue, 5 May 2026 12:17:25 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C98F42004E; Tue, 5 May 2026 12:17:24 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 5 May 2026 12:17:24 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Steven Rostedt , Josh Poimboeuf , Indu Bhagat , Peter Zijlstra , Dylan Hatch , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" , Mathieu Desnoyers , Kees Cook , Sam James Cc: Jens Remus , bpf@vger.kernel.org, linux-mm@kvack.org, Namhyung Kim , Andrii Nakryiko , "Jose E. Marchesi" , Beau Belgrave , Florian Weimer , "Carlos O'Donell" , Masami Hiramatsu , Jiri Olsa , Arnaldo Carvalho de Melo , Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Heiko Carstens , Vasily Gorbik , Ilya Leoshkevich Subject: [PATCH v14 09/19] unwind_user/sframe: Add support for outermost frame indication Date: Tue, 5 May 2026 14:17:08 +0200 Message-ID: <20260505121718.3572346-10-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260505121718.3572346-1-jremus@linux.ibm.com> References: <20260505121718.3572346-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-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTA1MDExNCBTYWx0ZWRfXxs+poCAAGGNG 9Cfil+KpyvOWZ9eNrzo7p0DMXBFB8ddw/Z1jToIBMfBbF8gMOySE1DKHJWcGx47Gnac7WNDTiLo taNPOzcwB6Y8H6i8+1Pp4KPU6O2MUhFcCVbjeAmZURahIZN00aaJLb84ENmOF9mGSz+ks67MlTr rWIEqS/rjtv0J3bSVM1foQruayIKEyaxqJNlMCE5TMuK5spshFERy06ksgWNkD9fIzJybSvy8B3 ewWKJrKeorztqyjQ5ewij1YeHGFgGAgz/tqg52Kodd3NY4+bhgFswOXORS6TxaC/pufO+nVvMNa lvDsil9mJNjZR2uQAp/BAI5qeJIaCVQtOqPedhVQXoftsOrMd2EDrjECVrxiqBzenGD4t2J7Ncu CisLkq4sGFxUfvR9G99vD6Ar6DfjXVzC1S5QvuSL4Y/xZu+Qjhz09vn8ebdNyklOCvsy4Qs4CeP 2aUlUKu8+wPP2shbgRw== X-Proofpoint-GUID: efVzNbBCZREIKW4fO6gioglIN0VcT-tB X-Proofpoint-ORIG-GUID: BJSUMIXg6C-mMKI5aio-_pcfAq0a41Zm X-Authority-Analysis: v=2.4 cv=eu/vCIpX c=1 sm=1 tr=0 ts=69f9dfda cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=NGcC8JguVDcA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=pGLkceISAAAA:8 a=VnNF1IyMAAAA:8 a=U72JrVpwKSe1qDC-WCIA:9 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-05_02,2026-04-30_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 phishscore=0 lowpriorityscore=0 clxscore=1011 adultscore=0 suspectscore=0 malwarescore=0 bulkscore=0 impostorscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604200000 definitions=main-2605050114 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. Reviewed-by: Indu Bhagat Signed-off-by: Jens Remus --- 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 c60aa527984a..9c755965ab83 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_DEFAULT) 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 fc2908e92c7b..ed111fd0d702 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 Jun 13 20:57:55 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 A0E2C426D34; Tue, 5 May 2026 12:18:18 +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=1777983499; cv=none; b=XpA1HX9o7oIqO3LLpKY2tOa2lALbe5CUIhpYLmN2t5R9d67z4YW77own+rXpmlczorSOOL2o3ec/C7Wf+RZsNLj77YKIG3SSEKV4sRWmaiElq+dJbDBfcKK9MbaZdFXtN/W8wuK2Tcr2dJntuSGHIto5O3PfXfQhKBj6MX/Zt20= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777983499; c=relaxed/simple; bh=675na9vsCoXv8tox5IMYDO9IyTVbBYKfk5OauS8xnmM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=l1XTt5Yw1SOfAVbfoThUdyBZWtV7Fsqb4dklNC+DUsC+858c82NGcXQTZZ8nNlPkkDDLtD3Vx3Eg1vREVf3kB7JzrLNb1TEiEDVf+ADfWiEK2bD+JAM6dxdRjAwc2jEWtD7i1qDgNGbNySG7wNSjFLv+4Z9DrbRsnxty4767Azw= 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=kNLQOMGT; 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="kNLQOMGT" Received: from pps.filterd (m0353729.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6457t57h3129134; Tue, 5 May 2026 12:17:31 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=iNs3Y5ZU0LMKYw7iv foZwS9abNt5pBN18h3+cHfz8vo=; b=kNLQOMGT45sNJUKfCx5DazoFMR5iaKEya f7AJC1kHFgwx24Cq8Qr+5bGh30z1hgRXDyzzivPb3M9A1XgPQNOTQ5CyH/jTdGJc fkniqWMHy22GoDb8MPSGBsyXPlDMRcFTm0Jceyy/TEh5Evl+/81CeU7Iu/tH+W2A wSCNZy6VtG31DEqNaz0SoFzF8EOy9bwo7BvEB9mAjvYLMcoSgRtNdPbmgCWuOkbr DJt3r7dCNmyLrT2X/g8UOVGoT1zwyT6R4apya69zVxsSmt83ksJl2wNstv/gwHTl ZkD008BkZ/l/3SUq4GPNaPsib1Ze7CMdZ+nCUnSdWJHXEPFqGKskQ== 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 4dw9x4kg68-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:30 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 645C9cRH029301; Tue, 5 May 2026 12:17:29 GMT Received: from smtprelay01.fra02v.mail.ibm.com ([9.218.2.227]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4dwwtg9bmc-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:29 +0000 (GMT) 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 645CHPJ362718426 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 5 May 2026 12:17:25 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 9877E2004B; Tue, 5 May 2026 12:17:25 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 375382004F; Tue, 5 May 2026 12:17:25 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 5 May 2026 12:17:25 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Steven Rostedt , Josh Poimboeuf , Indu Bhagat , Peter Zijlstra , Dylan Hatch , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" , Mathieu Desnoyers , Kees Cook , Sam James Cc: Jens Remus , bpf@vger.kernel.org, linux-mm@kvack.org, Namhyung Kim , Andrii Nakryiko , "Jose E. Marchesi" , Beau Belgrave , Florian Weimer , "Carlos O'Donell" , Masami Hiramatsu , Jiri Olsa , Arnaldo Carvalho de Melo , Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Heiko Carstens , Vasily Gorbik , Ilya Leoshkevich , "Steven Rostedt (Google)" Subject: [PATCH v14 10/19] unwind_user/sframe: Remove .sframe section on detected corruption Date: Tue, 5 May 2026 14:17:09 +0200 Message-ID: <20260505121718.3572346-11-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260505121718.3572346-1-jremus@linux.ibm.com> References: <20260505121718.3572346-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-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTA1MDExNCBTYWx0ZWRfX6xUgbgTo4ceS ogZQAdgcIJIxxAM+lzBqmWsNXHd2tIdvRpsDN+Y31Ido5wd68n1WDlJruNNeSZUOEHqYFhMl5Hj sjPQllmx0M8dL11QbRovN10WbQwsUTHPyHGk/7FfBEHQ5YF3UITY8M87rG3sPebNJVuAQ/B+TRZ Tc5mjq1sUTICz70+2sYaZ0tFOdnXF6W4iET8DVRqXQbOkIXNFKr5QqxWivNbQf1pRxtljjubtjA H3P9bzHgjYBZ9MClRH2HN2JzEnKK5fVcttL7M/hhO5+d8b6zuOB8hwCB57SuC1e5d+ad/W0pVcq JFruxSg1dI6fmh1Tm6K3mQHuO/h097JMzGri0AiBn477WdIpmnBgJ0DoEukZdwMmiTib1yjqrBI fAHn80dtnB5hcsdAOilefvyqg1apcVRz3SVrQJKC2F0bpj5SOT5DC/GGHE+9nV8ti4iHa+lsWao lbIE2SxdCiWn9G0h4QA== X-Proofpoint-ORIG-GUID: ESkL7T1J9FVU0MH5Wd6VBq7slO6ISNoe X-Proofpoint-GUID: EITj1tVrY_lYmK7h90v0ZPscXET4p3YI X-Authority-Analysis: v=2.4 cv=W7UIkxWk c=1 sm=1 tr=0 ts=69f9dfda cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=NGcC8JguVDcA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=VwQbUJbxAAAA:8 a=meVymXHHAAAA:8 a=pGLkceISAAAA:8 a=VnNF1IyMAAAA:8 a=QUyUFLFTtUP4SZQqb90A:9 a=zZCYzV9kfG8A:10 a=2JgSa4NbpEOStq-L5dxp:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-05_02,2026-04-30_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 adultscore=0 lowpriorityscore=0 malwarescore=0 suspectscore=0 spamscore=0 clxscore=1015 phishscore=0 bulkscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604200000 definitions=main-2605050114 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. Signed-off-by: Josh Poimboeuf Signed-off-by: Steven Rostedt (Google) Reviewed-by: Indu Bhagat 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 9c755965ab83..8eed6a7d9625 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 Jun 13 20:57:55 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 96ED347887A; Tue, 5 May 2026 12:18:27 +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=1777983511; cv=none; b=Apvj27iG48Q59d+GuoPCDW41Imt17dzFpqOqQey64tkKRnP42zUSqrE/ZyEjoeNjG0bqcC8Tu2G4r5k7/BSGZMOpmonBgrpmhi5ahZmQDI5unGu90teC2vwRlS9xElS720N6BWZDxJCnBOtGIZI6EkO2c27lMG5TUeagHD7Eio8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777983511; c=relaxed/simple; bh=viBifxWRQ3eYaMMM9FPQ5EDGk1u15cPG/xV85A05+l0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aeuGwDEus7k5r8NnU9/GT/K8jnRmkEgO/5Ov9lxAL50/jEDwAPmvfy2GqLJuh2YShB5VWc8XtgL8NTkWIqI0yfQaW1tlVaJRsYP/83MBinp7HLUoNxrv3HCifdETorVCXF1J4Fh+dNU0Rxt0IjZ6uf/dmoL3jGeq2nVea0NGSsA= 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=rDomqQ2a; 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="rDomqQ2a" Received: from pps.filterd (m0360072.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6457qr752577247; Tue, 5 May 2026 12:17:31 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=Ap4R3Nrb3HGP7jBBk w2h44aTj83fiw6YNumkdQ+8Wn4=; b=rDomqQ2aW2F5/pROfhBY74OdDg1ktM3rz KS4z2oqf6KkQxZVErlc84gn6cUQJyf35J6VEM+hYgFLk/IK+scUnhhmS30OUueUy qeGw4B4JdIyQh2xhq3H3qX1UuybhTzqzfzYu0N4fULTWGISvB0jsOjI/3LX1TMcU vZm99rr0tWTgWPjSUIV6ZgQOLuR4zDlmjd2Pq9PWotsZbKBiyAZSvzQsjp6El775 H4fYi+tRgJ1qd7az7i3jnxFcItSNG1bVcTBJCVQAdOfJEpNC1s0Tq5GFbgzo4eL7 Gq+2fpNt+qc2BSU6wQ/DBm+MriHc42SIh+6pfu/9Q/y9yex1M22ig== 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 4dw9y4k7da-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:30 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 645C9exV028527; Tue, 5 May 2026 12:17:30 GMT Received: from smtprelay02.fra02v.mail.ibm.com ([9.218.2.226]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4dwuyw1m3h-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:29 +0000 (GMT) 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 645CHQ4c38338910 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 5 May 2026 12:17:26 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 136512004B; Tue, 5 May 2026 12:17:26 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 9DA022004D; Tue, 5 May 2026 12:17:25 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 5 May 2026 12:17:25 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Steven Rostedt , Josh Poimboeuf , Indu Bhagat , Peter Zijlstra , Dylan Hatch , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" , Mathieu Desnoyers , Kees Cook , Sam James Cc: Jens Remus , bpf@vger.kernel.org, linux-mm@kvack.org, Namhyung Kim , Andrii Nakryiko , "Jose E. Marchesi" , Beau Belgrave , Florian Weimer , "Carlos O'Donell" , Masami Hiramatsu , Jiri Olsa , Arnaldo Carvalho de Melo , Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Heiko Carstens , Vasily Gorbik , Ilya Leoshkevich , "Steven Rostedt (Google)" Subject: [PATCH v14 11/19] unwind_user/sframe: Show file name in debug output Date: Tue, 5 May 2026 14:17:10 +0200 Message-ID: <20260505121718.3572346-12-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260505121718.3572346-1-jremus@linux.ibm.com> References: <20260505121718.3572346-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-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTA1MDExNCBTYWx0ZWRfX4GgQhG5eHyFU lPmBYNeOIzla9WMhZ9EHgLETmoIU1cOal0VdLRAKDFe8lW1N5EqqeUT80toSh0XUF1YwOdx8xD9 q/yF9nK1Gqw9hAhimX9Ru5UpMhXLU7B+Jk0htDh4n5VBbYC2PRKyvkP+jGXaL0J1dz09+JwgwvN nmflUx0RxoEv2GfEASg1OanAGGcxAakNmDVzlxqLjP8HDBQP4DPnv4djoaDxxs0InG3lak7enIf SobeJGGaWn1kWbL+w0sjAMYhxMTyl+GKFZg+v8PmMhz4blZGhRYt3SwtV158Sw+2bqJY3nbrMwW 4TSV6WEJG+w9YtrRYJS9KVNyHJvNIe8D7PJ7NmAbUMr85jn1z9zAj5ZCsN4jDtDsVeY5ThFLAqt obJjVu02oEBG79RuMOyuHcBefiNPMmNU5IiikOPA8jPnuYQiAzfjue7nxje5KU85/tjFcnstQVt uHunGn6PZZSlg4/T7Hg== X-Authority-Analysis: v=2.4 cv=J4GaKgnS c=1 sm=1 tr=0 ts=69f9dfdb cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=NGcC8JguVDcA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=RzCfie-kr_QcCd8fBx8p:22 a=VwQbUJbxAAAA:8 a=meVymXHHAAAA:8 a=pGLkceISAAAA:8 a=VnNF1IyMAAAA:8 a=zNP608caSEEB7r2JvF0A:9 a=2JgSa4NbpEOStq-L5dxp:22 X-Proofpoint-GUID: 9v8pnJzrnbMWWnYp9-7dXnWNVOkpzn-s X-Proofpoint-ORIG-GUID: pL154LcnXQ1O3B4PHlmZYcrV1mui3esL X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-05_02,2026-04-30_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 clxscore=1015 malwarescore=0 bulkscore=0 suspectscore=0 priorityscore=1501 spamscore=0 phishscore=0 adultscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604200000 definitions=main-2605050114 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 ')'". ] Signed-off-by: Josh Poimboeuf Signed-off-by: Steven Rostedt (Google) Reviewed-by: Indu Bhagat Signed-off-by: Jens Remus --- Notes (jremus): Changes in v14: - Uppercase terms FDE and FRE in debug messages. 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 8eed6a7d9625..4419626f0173 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 Jun 13 20:57:55 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 AEE1B43E9FE; Tue, 5 May 2026 12:18:26 +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=1777983509; cv=none; b=Fb+PJYf4BjcQpBm2hhhfj8Rpl2HFks6aSUSX+LDgtBxOwM0ndGe9OJXKCk20o1q1kvcVpTHaMlVMe4AhaEO6mgxc7swZfdSytgVtGKx3pWaJxMyIPzZ9mx+Qe0fN0217ipRBCmyRydUZmbxn5mBCdxiR/Zq099UHmzCmSJY7Sik= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777983509; c=relaxed/simple; bh=lFXJxRD06GQlrP29g3rKxVgvQz46ankTIhSef8smu4A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KUe8irixc84k+WkdmVEjymlLhZgO530vLidBHB3BjwTI94FAVu5RmUTEAPl7qHbVZODKpWI3dZ+moB93VObu4mY/I1hdJ1FjogKgCH5/tVZ2HIIJLHlWPPb1dWH5ZzmuIEczwqp7frk9J/ixIGEjCRvPSbfQj1IyqEqHEBK1l0c= 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=RhIrlItx; 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="RhIrlItx" Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6456sTaI3267730; Tue, 5 May 2026 12:17:31 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=0qo6Cq/QqoAOgdkng BJ9m2aLKOfy7KyVNjR2/kvaw74=; b=RhIrlItxalXC6ZalJ4S8iHvI86P2pY1U9 PhzfVDdfG36dv6TC8deEwExYmYnVazWesLLLKbGVA8d0UVAw47EUbLEZF6U6gqFo 9UiP+9H6T2q1oYYVPyq37qb8xC/suYl6tvzkxRRaxhyO9J4aM14pXv2+JZyRe4YC KiIeDTuvxoZhAZFO78G9EldtRetD0VQrCisRN919nSBhsaJ+R6jxqN7LWn3+Ubq7 uvNFhB/JJImgijbQoLwzd1E8Kd6UiVfkaGeUPQAwPfw9MXwxyJbvo6qBsKx3B3qc /eFut5CSbKsUKupJS8DqQAWSrdw/xsSsWx4l988LmhwnQ0+pu5hmw== 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 4dw9xxk5df-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:31 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 645C9dZg024356; Tue, 5 May 2026 12:17:30 GMT Received: from smtprelay02.fra02v.mail.ibm.com ([9.218.2.226]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4dww3h1eqa-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:30 +0000 (GMT) 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 645CHQYi49217992 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 5 May 2026 12:17:26 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7879F2004D; Tue, 5 May 2026 12:17:26 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1895A2004E; Tue, 5 May 2026 12:17:26 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 5 May 2026 12:17:26 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Steven Rostedt , Josh Poimboeuf , Indu Bhagat , Peter Zijlstra , Dylan Hatch , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" , Mathieu Desnoyers , Kees Cook , Sam James Cc: Jens Remus , bpf@vger.kernel.org, linux-mm@kvack.org, Namhyung Kim , Andrii Nakryiko , "Jose E. Marchesi" , Beau Belgrave , Florian Weimer , "Carlos O'Donell" , Masami Hiramatsu , Jiri Olsa , Arnaldo Carvalho de Melo , Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Heiko Carstens , Vasily Gorbik , Ilya Leoshkevich , "Steven Rostedt (Google)" Subject: [PATCH v14 12/19] unwind_user/sframe: Add .sframe validation option Date: Tue, 5 May 2026 14:17:11 +0200 Message-ID: <20260505121718.3572346-13-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260505121718.3572346-1-jremus@linux.ibm.com> References: <20260505121718.3572346-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-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTA1MDExNCBTYWx0ZWRfX0n8bhYrUt/Wd v2k47IzZtbc5qAluNlkTei2+tmJQX4WrLUBPyE7Br7LGgf5QX+jTi9rrsN5f/Q1/ZgQHbwyA2rv E6HedSEeBj9KaOqlor93Qj1FRlVL1/CRLe4JkTJRm5+T0Qb66i/GrByKBtdkh3B6XNHVImQDlmQ q+XIBOV0n/1SVBcPf0l4+puk3fGCJyxhK2OJWrWP4GIczG8LtjE9NHLF/SXFQEFX6un9E9okQj1 P4uIQrhUIqOB/ROlhr6+aLkq7z9/7+0lADy62XSNtnVwiqxfebWWCBHwY1pdIf9AOEMoi4v5ug2 OQwZh+JMNp3/Z4LnykbeBz+39Erg3meV1oV33SeNd0Nv80xvsWRULQ80A2Anz3h28mN964yzZiH TwD0ZvaNa17YG79CttDkAZ25G3pKs5PVikifHL/vbnPCvj0VEZiENWdMqZYGdZTNSNhD5Pl9o/K RlXc7WPNusKw1oOc3Wg== X-Proofpoint-ORIG-GUID: SseGS5jIfVdN1j1a36Pn4T9SB34tECVI X-Proofpoint-GUID: 10ODE_W-5MYBr1AE7GtK2kI3nZ5f5n-J X-Authority-Analysis: v=2.4 cv=ctWrVV4i c=1 sm=1 tr=0 ts=69f9dfdb cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=NGcC8JguVDcA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VwQbUJbxAAAA:8 a=meVymXHHAAAA:8 a=pGLkceISAAAA:8 a=VnNF1IyMAAAA:8 a=RXKZOtKmAAAA:8 a=X__uKv6Ezr3YNgStCWAA:9 a=2JgSa4NbpEOStq-L5dxp:22 a=UFF3uGjEBZWolfm0k6KQ:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-05_02,2026-04-30_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 lowpriorityscore=0 adultscore=0 clxscore=1015 suspectscore=0 impostorscore=0 spamscore=0 malwarescore=0 phishscore=0 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604200000 definitions=main-2605050114 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. ] Signed-off-by: Josh Poimboeuf Signed-off-by: Steven Rostedt (Google) Reviewed-by: Indu Bhagat Signed-off-by: Jens Remus --- Notes (jremus): Changes in v14: - Add debug message if safe_read_fde() fails. - Update function names in debug messages. - Uppercase terms FDE and FRE in debug messages. =20 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 | 101 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+) diff --git a/arch/Kconfig b/arch/Kconfig index 37549832bd1f..132249d342a3 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 4419626f0173..45988cdc5c37 100644 --- a/kernel/unwind/sframe.c +++ b/kernel/unwind/sframe.c @@ -367,6 +367,103 @@ 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) { + dbg_sec("safe_read_fde(%u) failed\n", i); + 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: safe_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 +573,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 Jun 13 20:57:55 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 A3A054279FD; Tue, 5 May 2026 12:18:23 +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=1777983505; cv=none; b=jr3V59qMkdgiiv21FesV7Qg0Cdm7Azy1UpS0LpELr+X10DJXiuKfKp9Oi3d1b7Vw+yrOi7QJTURlXG89tvVAV21ly+MXLN6qfgx6uKPPEQS7uHLxcFcNzNTF8AVq9uykSjyeBlrff36u+745hIFyAjNTDTKbOB5s2WPpihPkLQw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777983505; c=relaxed/simple; bh=Rq8NtWyVBLzeSzuEWBLpmeUq4HoQkvathgaw2Gi8Y0A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UGbS1nEndys/W3OEjGqq+cLZ7h+Jvaa/Ec40QtFUSI0SoFUAicms3IgJFKp/VCDSOsppJFrJA3O1goYi9e+8wEgdxWtnr/Pb2bJSn2I96MhFvLmfb97PCJSvtJPUFrEwsdliO1mHK/n3cFJrfjqiWUrsCTDOJrJaP+ukvyEXIK4= 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=bs2VY2sV; 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="bs2VY2sV" Received: from pps.filterd (m0356516.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6457HxL43253820; Tue, 5 May 2026 12:17:32 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=fp1+xLYDCmmQpaXa0 GhRyZ3txTr6LJNU+sIx4JTk2yo=; b=bs2VY2sVy88C+O8BUtObtf/+9iBZmh8wm GoW7GqpdXGmZZH/KUL2Z5h5409DdM0+PYcEg0eDezGMidxHsNaK5ShxPzS1sZ3Oh zRSg9q8xTOvsJTbza7XwsoXy8RlgSPA6kwyq7LmSq0TOwUfI4w49w+LueKvcktZD aRbSdDBOgwniqiQ3xT9Gg05re7SMsTgVMviIEkZPTD8vYUrJ8LXaevi7RcZ2ddCZ w1x7VTvGfEgBmyyhXKNHIt4uaR0jDJPPkKriGg34JjdF3anNLhwS4+Pwn9rBU7z8 F0faT3dPyx4fWIVS7fTdCV9So6lZSw1c59XbVsE6Fhr5Y1P+yE8qg== 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 4dw9w6b773-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:31 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 645C9aen028944; Tue, 5 May 2026 12:17:30 GMT Received: from smtprelay02.fra02v.mail.ibm.com ([9.218.2.226]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4dwwtg9bmf-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:30 +0000 (GMT) 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 645CHQsK51577110 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 5 May 2026 12:17:27 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id DB1CD2004B; Tue, 5 May 2026 12:17:26 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7DF0920049; Tue, 5 May 2026 12:17:26 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 5 May 2026 12:17:26 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Steven Rostedt , Josh Poimboeuf , Indu Bhagat , Peter Zijlstra , Dylan Hatch , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" , Mathieu Desnoyers , Kees Cook , Sam James Cc: Jens Remus , bpf@vger.kernel.org, linux-mm@kvack.org, Namhyung Kim , Andrii Nakryiko , "Jose E. Marchesi" , Beau Belgrave , Florian Weimer , "Carlos O'Donell" , Masami Hiramatsu , Jiri Olsa , Arnaldo Carvalho de Melo , Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Heiko Carstens , Vasily Gorbik , Ilya Leoshkevich Subject: [PATCH v14 13/19] unwind_user: Enable archs that pass RA in a register Date: Tue, 5 May 2026 14:17:12 +0200 Message-ID: <20260505121718.3572346-14-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260505121718.3572346-1-jremus@linux.ibm.com> References: <20260505121718.3572346-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-Reinject: loops=2 maxloops=12 X-Authority-Analysis: v=2.4 cv=XPQAjwhE c=1 sm=1 tr=0 ts=69f9dfdc cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=NGcC8JguVDcA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=pGLkceISAAAA:8 a=VnNF1IyMAAAA:8 a=9BsmwnrB0_sKC25V_9YA:9 X-Proofpoint-ORIG-GUID: H2VCySc_vDGAaueYcs90S4FVKgDHL5RF X-Proofpoint-GUID: eTbJ_UWu_DjCDFnu5ti1_ElXraB_HknH X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTA1MDExNCBTYWx0ZWRfXwKMWSf7IevOd DpZx1N4JciusH35DQMxiGUsh0WrWOAHej9k6Zd05SLSE+MzQ5IFLn1JgaAHwqJ9ELE+1MpVOIfY G8+Orjk+3rKBI4+WlZwq8fOQChdEY8u+7Kkpaq3qJXvw0i6LBhBCabQuCh2Vda0ZUbWgJYp0m2W dtLp3ZkdVtJqYkLkJKVcjs4ZQ03W4ID5iJ4xlsf6WG8AWKRs+E+srO7uZItCT/cipVBU6ur3JXE ImQbABji0oKDJcrWWhbndDLIi3IJMUEgEFF3Yy5ff6TLVFPpAvgWkF9JZUdunc8OzWXv4qBjeBx YCyjiE3bJ1zxnUSKcztZwCK3dVfcANgD4VU4mWKtn9ZaXHcVAU58GTvxucI1VrjAEJsrqQqWEG6 Zh4K2DIZY36tdsjz/NMnk4UJ0+Opoip4rfp27YrF/7bQalHbfeO4sSQqiWAKJPgeHYjHvM+iE4a bN4xQo4c4l5xMDZChuw== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-05_02,2026-04-30_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 lowpriorityscore=0 suspectscore=0 adultscore=0 spamscore=0 priorityscore=1501 impostorscore=0 phishscore=0 malwarescore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604200000 definitions=main-2605050114 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. Reviewed-by: Indu Bhagat Signed-off-by: Jens Remus --- 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 45988cdc5c37..d5e0fa04b99a 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 Jun 13 20:57:55 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 4178C423A62; Tue, 5 May 2026 12:18:22 +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=1777983504; cv=none; b=e5f7ObUwhrueySaZRg97D83KjQIXH4vYF389z5p4hXeEn6b1uSG1Xx49/9lziZjpceE2ZRL9TaLU7pwJ9ebNQUm3gTECgY19Vskhx8P0LKyn1SadeTP91CLLAMIA0i6NYU0RBR5yuZMQAqa13C1JHtq97dd2fa66owCT1vNkv3I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777983504; c=relaxed/simple; bh=6D70xgnfaV85V3maswNaB3qlxHlQue6yuz7etmDE50k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=eSmnTF3uuoIgRF7z+POwR4/6tFy7w8TFli6WAK7M97x0OdXCl2/iK/fW2YQturPKxnzkpjPqH/8FgDJNbUiiIyX16BUQ0+nNCb5h0gY/WJnbw0DxaMEihlmpZiEsxi7ueKGBcMgyxP1fW0Q7kXj9zqFhmKdbzjj6oLC7Nx3wKrs= 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=FttzhKCJ; 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="FttzhKCJ" Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 645AF2Us963512; Tue, 5 May 2026 12:17:33 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=AqkRAL/F99BswCpNX xBkMsZDONc7WSoAsmYzBCMlE/E=; b=FttzhKCJzAKCa9IJVeIrO713e2CR5igL1 m2xgyu3IMZul5FMziNKnqvaM61KVxfpbNrXPpK8lsWPsoNkYj6BBwerjikaSxAwr WNZw3GAHQqxDYMDO5PoJcZdSAXSDDwMdInDRmTWhF9EXx9QqnV+lrJh+luKjpqhR nwz3cGmSRfIPqdlqpQDOGfGL29loe7CM469chD2A5nvSFq5bOBApxRR+7+r6jf6I W7bPEPy3XM+LOm8VX6+/u07lbPnLMdwUTleUzCtBGoLfD5Y0Ltt/4kiZejc0xM9Q WveBoVVsdWL4Xjg+vct3Uotk8USkYRAsWmi03/61YDrw/PXPAxeyA== 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 4dw9v7bj9v-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:32 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 645C9okx028585; Tue, 5 May 2026 12:17:31 GMT Received: from smtprelay03.fra02v.mail.ibm.com ([9.218.2.224]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4dwuyw1m3k-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:31 +0000 (GMT) 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 645CHRMD57082294 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 5 May 2026 12:17:27 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 522AE2004B; Tue, 5 May 2026 12:17:27 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id E23D72004D; Tue, 5 May 2026 12:17:26 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 5 May 2026 12:17:26 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Steven Rostedt , Josh Poimboeuf , Indu Bhagat , Peter Zijlstra , Dylan Hatch , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" , Mathieu Desnoyers , Kees Cook , Sam James Cc: Jens Remus , bpf@vger.kernel.org, linux-mm@kvack.org, Namhyung Kim , Andrii Nakryiko , "Jose E. Marchesi" , Beau Belgrave , Florian Weimer , "Carlos O'Donell" , Masami Hiramatsu , Jiri Olsa , Arnaldo Carvalho de Melo , Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Heiko Carstens , Vasily Gorbik , Ilya Leoshkevich Subject: [PATCH v14 14/19] unwind_user: Flexible FP/RA recovery rules Date: Tue, 5 May 2026 14:17:13 +0200 Message-ID: <20260505121718.3572346-15-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260505121718.3572346-1-jremus@linux.ibm.com> References: <20260505121718.3572346-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-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTA1MDExNCBTYWx0ZWRfX0wRCLw1jLLWz WDXtsIOYA1bpJRM9NL7n9w+WuJE3fZ0sghrbhXA80rjVn+TJxwyDqef7Tj2AyE9LmEH2kVVRr47 aCMw4aKhUweeAvX3L/6rG3QJrLAhjiYdyaLCfjWtVXITRmbmY6eOChpe2qhQrUleIdn0abE+8Bk oqvin1EOSezmh3pjQrQmPm7dgYcBOHKlkzEjyKVTTQKMV2ucvLi2FbO+aFoKGfNdWsNdD9cziHM SGltGgqgvf9vqe8eBhaFlQHENvjhPFOzxvILcWosv1umy2zs2i8QMLI6N9KKFgfjTws5aBuU20Q NWGPFM5kRXNH71mPvHhUxCJ/xVIB3Q7p9O6gRO/3+lqqvdP3BPkJlDpmsSHIQ7xrIdn7MyP+bbH xww+Ingn9cAHByC3DSCisPcyvZJKxjspMdAbEitTn6VTm0pkFh6pE2PLBiS6+3508WRhVD5QaR8 lf1PpcLAH5eQoR6sFtw== X-Proofpoint-GUID: pnR1nFaxQUpyd1FpSrOluPbIAnOgGWMX X-Proofpoint-ORIG-GUID: YDladW5h7pO8Ko9AlmaJN6qgQyb2EtqC X-Authority-Analysis: v=2.4 cv=eu/vCIpX c=1 sm=1 tr=0 ts=69f9dfdd cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=NGcC8JguVDcA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=pGLkceISAAAA:8 a=VnNF1IyMAAAA:8 a=GjvnxKKRlEeFsqGDDKkA:9 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-05_02,2026-04-30_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 phishscore=0 lowpriorityscore=0 clxscore=1015 adultscore=0 suspectscore=0 malwarescore=0 bulkscore=0 impostorscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604200000 definitions=main-2605050114 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. Reviewed-by: Indu Bhagat Signed-off-by: Jens Remus --- Notes (jremus): Changes in v14: - Improve comment on why UNWIND_USER_RULE_CFA_OFFSET is not implemented. (Mark Rutland) 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 | 53 ++++++++++++++++++++++++++---- 5 files changed, 107 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 d5e0fa04b99a..cc57804aa3b1 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..89aecfbe3e84 100644 --- a/kernel/unwind/user.c +++ b/kernel/unwind/user.c @@ -61,22 +61,61 @@ 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 doesn't make sense for RA. + * A return address cannot legitimately be a stack address. + */ + 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 is currently not used for FP + * (e.g. SFrame cannot represent this rule). + */ + 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 Jun 13 20:57:55 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 AB04B4279F1; Tue, 5 May 2026 12:18:22 +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=1777983504; cv=none; b=VR0j4Nep/JDRo98CLdQvL+mgTkSrp9AEdemBSewh4YpFu6nejpmEqfAGyaSvSeRRQ9KXAk0FbcQOKqDv6TO2VN4pAZ0MNGwRwLukjfhLbpGR/yGbTJiy7hmNeQ06vSutMmY0HWy35p8i99284DMggT7mk1pINj6g4mAvuKJtyxY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777983504; c=relaxed/simple; bh=325VJjRklVDW8E8/B/hxvVNAkYwtntYRyCbrLjB1yjA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tvyF3FHIrr3WpXnE8ico9NMB2Hd5+g2NxS5+ZYoqpiKuTO7ttxcHW+ujAfIrIG1mbX6R1g+C0pqtb6xGbWY2FFkP/lPT5iqeaIvWOHIPWcj7nZ5pElDD/JjFoXk2MCRPxdYSIeDuuyjO+DlUWPlZ7AO6QZdNPr9DUthFxSfrBRE= 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=M700GsI6; 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="M700GsI6" Received: from pps.filterd (m0356516.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64557vch2799040; Tue, 5 May 2026 12:17:33 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=D7noqCPYCazcZYmeg zK8gDeD27rc6gFSdojocdj+bIE=; b=M700GsI6fpLxZY39qIuGfs8gU26ppyxzt sTplffnoicHjs9+1ukSb26TbYpOQlLySg2kQUv0cDeGIVvD4CDpuvhL45B3t7FqD LwKvPFKxfuzxx2zFnaWUJnShUivIqxtVIDim4w8i6YPEs32rMD1b6LfLEAIKX2sr COeA467Lpo6rlqBv+VDLDKACNFUKAra3J2s1ji+DBqKJe0AFlYNk4FyRA4OJqq0w fZM5YTddQNuUcMqcOUrOw3YUVUQrHN79ZUAGqntPHVXpN6AKpwl5gaXoE72TChbK N/txdF4hoddSlcYVw09BZf1ITgzLf7WtSDh0dCN7VuNbdF4JG5IwQ== 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 4dw9w6b778-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:32 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 645C9jXE024681; Tue, 5 May 2026 12:17:31 GMT Received: from smtprelay03.fra02v.mail.ibm.com ([9.218.2.224]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4dww3h1eqe-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:31 +0000 (GMT) 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 645CHRWj53412098 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 5 May 2026 12:17:27 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B4C862004D; Tue, 5 May 2026 12:17:27 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 574E42004E; Tue, 5 May 2026 12:17:27 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 5 May 2026 12:17:27 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Steven Rostedt , Josh Poimboeuf , Indu Bhagat , Peter Zijlstra , Dylan Hatch , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" , Mathieu Desnoyers , Kees Cook , Sam James Cc: Jens Remus , bpf@vger.kernel.org, linux-mm@kvack.org, Namhyung Kim , Andrii Nakryiko , "Jose E. Marchesi" , Beau Belgrave , Florian Weimer , "Carlos O'Donell" , Masami Hiramatsu , Jiri Olsa , Arnaldo Carvalho de Melo , Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Heiko Carstens , Vasily Gorbik , Ilya Leoshkevich Subject: [PATCH v14 15/19] unwind_user: Flexible CFA recovery rules Date: Tue, 5 May 2026 14:17:14 +0200 Message-ID: <20260505121718.3572346-16-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260505121718.3572346-1-jremus@linux.ibm.com> References: <20260505121718.3572346-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-Reinject: loops=2 maxloops=12 X-Authority-Analysis: v=2.4 cv=XPQAjwhE c=1 sm=1 tr=0 ts=69f9dfdc cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=NGcC8JguVDcA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=pGLkceISAAAA:8 a=VnNF1IyMAAAA:8 a=3ITeoxp6sJ8ea140DuYA:9 X-Proofpoint-ORIG-GUID: kbRZY4IQNb44J3QDwjWTe3rrmKPEvSrT X-Proofpoint-GUID: IKG3yKTeIFE_ZvRr4_l1EAD91bUT7u7_ X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTA1MDExNCBTYWx0ZWRfXxw+wtvybTk5m UqUmubf+XGIa50ShpnhdjdKR1mte9y4sEK1qLuS9ZV8b1CEzY8RiGsm65HWuU7vB3vAlpZv9t0q lSekdtoA4Ekrkv69qxCRBHfJzW3xI9R4HA65x51hotseMjTtFL9bkbNl0MbQoGD90upqC64XF1X jcy13mu5SBssMZC414Xlb/3DSrPnBqN/SZYE0NcP16MVD9qc0mQjb07qZnag5Kel1N2zvyN2F66 ENlzb2BGRDJOr1lkHLxG6SuXiYlb32lhMQRrbgg2fiFDL8TTW6YZHDlH/zvW8icecZc5iwvqnLS R5niyvNfawCpuQMm1jE9WO9C7yCVkw6tORgog2ulun0BE+4PmqAbnk07p1AktjeHO4E52rkMCAk YJrufw3+Rq1I6WQbldYZd71huomWhxFfAU2wJqbGArKwpqQC81f4HU1sQ0xEGq08osD6ea+wgEX Nop9U7RssFhhKcvX0vA== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-05_02,2026-04-30_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 lowpriorityscore=0 suspectscore=0 adultscore=0 spamscore=0 priorityscore=1501 impostorscore=0 phishscore=0 malwarescore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604200000 definitions=main-2605050114 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. Reviewed-by: Indu Bhagat Signed-off-by: Jens Remus --- 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 cc57804aa3b1..2721f4af53fd 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 89aecfbe3e84..3d596da588d0 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 Jun 13 20:57:55 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 C759E426EBA; Tue, 5 May 2026 12:18:20 +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=1777983502; cv=none; b=sa1MLCYEdW0FdlrFeXgnlT+jzFLEUEbZ1uQ4hBHBz2aJJ3M+p0RKoYsOw309r9b+we/qnKwLFeCIcJaAQHUzHPGYKuS5o/+Y666F4NCCkm6TSOmjYJ+sGoESiNVEai5XjoT9qscxzTBIbBPusnp61jYq++X0rc2u0qusTy2paq0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777983502; c=relaxed/simple; bh=CLWqXq58D5Ww3s0r4pGvNuGsgGbUL1uD2+MrAuwjZ5U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=L4gUdHj9XMC5SoYihdmotd8mpqB58gYhcEnHtCzB1iw7eMrGR72lUJ/lO50ltwE16YfjzuBonU0vFnJCgs4PvLmaxHhPIYC9TwMioxdfovwaNLxEVh7w7JzikpJaOftarynhwttDkjjdsBeDb/N+hocv+wl45AopPA8iZtqaKEM= 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=nWBecXxG; 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="nWBecXxG" Received: from pps.filterd (m0353729.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64574GDf2528070; Tue, 5 May 2026 12:17:33 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=VkinFh3ULMyOyQWo1 OXTyMS3O4RxPLnkiDcpQ3dnu0Y=; b=nWBecXxGAZ93Xe86FMeSp+miHcB03YbjM pAY4ZUCvKRqh/qobTMmS9qLlb446aclNCarNHHaj8TSxixqcHpMvdow5TiAJCJcT fifjBIBmULq4KpCj/XKbKg3YQ3Qo8X7bMFHRuVhshMO96cB2p85MvukVjTOiTk40 hQ76MUCvLhU4fVADC2Kf2F5zLxEwYUx11Zt00yHgaxSjYZvWObpMVo/9mfyIYXiS 5SyjCoX5zzSp5rFmCGi2MLyokgz9DHEvavGIsFbK6FVZ/SxZ9Tq5OjfLMl5hwIot 34yfQM8yoyb30DBd2LxgO8QvITJ9afT6c8+fOSmHpSeIdAiePq4fA== 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 4dw9x4kg6e-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:32 +0000 (GMT) Received: from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1]) by ppma11.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 645C9bkE015131; Tue, 5 May 2026 12:17:31 GMT Received: from smtprelay04.fra02v.mail.ibm.com ([9.218.2.228]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4dwx9y98g7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:31 +0000 (GMT) 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 645CHSKK10027278 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 5 May 2026 12:17:28 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 2BCB52004B; Tue, 5 May 2026 12:17:28 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id BA3272004F; Tue, 5 May 2026 12:17:27 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 5 May 2026 12:17:27 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Steven Rostedt , Josh Poimboeuf , Indu Bhagat , Peter Zijlstra , Dylan Hatch , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" , Mathieu Desnoyers , Kees Cook , Sam James Cc: Jens Remus , bpf@vger.kernel.org, linux-mm@kvack.org, Namhyung Kim , Andrii Nakryiko , "Jose E. Marchesi" , Beau Belgrave , Florian Weimer , "Carlos O'Donell" , Masami Hiramatsu , Jiri Olsa , Arnaldo Carvalho de Melo , Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Heiko Carstens , Vasily Gorbik , Ilya Leoshkevich Subject: [PATCH v14 16/19] unwind_user/sframe: Add support for SFrame V3 flexible FDEs Date: Tue, 5 May 2026 14:17:15 +0200 Message-ID: <20260505121718.3572346-17-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260505121718.3572346-1-jremus@linux.ibm.com> References: <20260505121718.3572346-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-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTA1MDExNCBTYWx0ZWRfXw1JUsrtXLcEO 5bcM1Q7udRjDWwGepeK0RB3c0qjwS8qnaTKVR9OikaA7nc4fRVnhBinLOx9pZ6vPt/JmSi/cU6V 6EY+WmT2SKJWdJCbWD2Ycob56TM2lsvAtCiOcPTsGw5LOruS7dOQpCJAfvyOJndOP8wCnZ9Er1a b1jCCSBCF6faGFdFWK6ZJjiGfJCPrivJI/Ii080VezpuNQQncdHMqH2sKlgHzVTjr5M/PEYqiv0 LAyyYyZbzTtZmdVNlRLsDWr9/2kWucVfUbGcYLkBLc3sCGt+DwlC4J27kiKAD220Iw/iChX6rfi jse/xD3Bh5bttPnAZtRNAtKrlNZYnUadY1KFSeuJs+GSiEHuDnKx9dT+jqCcYdP6XqPbVlf2lwa cz/YdM9TCrzWwqTebPzG5d3DPiQkF4TLFRurdqP97g9SACIrMX9F0aRGW+fQBHZOIndD1Lb9qx5 3G4cuEVKT7UafGmrRYA== X-Proofpoint-ORIG-GUID: y9NN_JPVPXZ7jhSJxQB-Eap1PJ7jnP8- X-Proofpoint-GUID: dnK4MdIAv32awsP0hR-w9A4NtvC2OvG1 X-Authority-Analysis: v=2.4 cv=W7UIkxWk c=1 sm=1 tr=0 ts=69f9dfdd cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=NGcC8JguVDcA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=pGLkceISAAAA:8 a=VnNF1IyMAAAA:8 a=VwQbUJbxAAAA:8 a=meVymXHHAAAA:8 a=2wkDFiw1nnRQRUo0YT0A:9 a=2JgSa4NbpEOStq-L5dxp:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-05_02,2026-04-30_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 adultscore=0 lowpriorityscore=0 malwarescore=0 suspectscore=0 spamscore=0 clxscore=1011 phishscore=0 bulkscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604200000 definitions=main-2605050114 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. Reviewed-by: Indu Bhagat Signed-off-by: Jens Remus --- Notes (jremus): Changes in v14: - Rename __read_regular_fre_datawords() to __read_default_fre_datawords() to align to SFrame V3 specification (default FRE). - Rename SFRAME_FDE_TYPE_FLEXIBLE to SFRAME_FDE_TYPE_FLEX to match SFrame V3 specification and adjust to rename of SFRAME_FDE_TYPE_*. - Rename SFRAME_V3_FLEX_FDE_CTLWORD_*() to SFRAME_V3_FLEX_FDE_CTRLWORD_*() to match SFrame V3 reference implementation. - Add arch/*/include/asm/unwind_user_sframe.h to MAINTAINERS. MAINTAINERS | 1 + kernel/unwind/sframe.c | 249 ++++++++++++++++++++++++++++++++--------- kernel/unwind/sframe.h | 5 + 3 files changed, 205 insertions(+), 50 deletions(-) diff --git a/MAINTAINERS b/MAINTAINERS index 24d1fe93ff4a..6812f581d44b 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -27863,6 +27863,7 @@ M: Josh Poimboeuf M: Steven Rostedt S: Maintained F: arch/*/include/asm/unwind_user.h +F: arch/*/include/asm/unwind_user_sframe.h F: include/asm-generic/unwind_user.h F: include/linux/sframe.h F: include/linux/unwind*.h diff --git a/kernel/unwind/sframe.c b/kernel/unwind/sframe.c index 2721f4af53fd..2ba2c8b385f9 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_default_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_DEFAULT: + return __read_default_fre_datawords(sec, fde, cur, + dataword_count, + dataword_size, + fre); + case SFRAME_FDE_TYPE_FLEX: + 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_DEFAULT) - 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_CTRLWORD_DEREF_P(ctlword); + bool reg_p =3D SFRAME_V3_FLEX_FDE_CTRLWORD_REG_P(ctlword); + + if (reg_p) { + unsigned int regnum =3D SFRAME_V3_FLEX_FDE_CTRLWORD_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_CTRLWORD_DEREF_P(ctlword); + bool reg_p =3D SFRAME_V3_FLEX_FDE_CTRLWORD_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_CTRLWORD_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 ed111fd0d702..add62ba2c0a6 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_DEFAULT 0 +#define SFRAME_FDE_TYPE_FLEX 1 =20 #define SFRAME_V3_FDE_TYPE_MASK 0x1f #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_CTRLWORD_REGNUM(data) (((data) >> 3) & 0x1f) +#define SFRAME_V3_FLEX_FDE_CTRLWORD_DEREF_P(data) (((data) >> 1) & 0x1) +#define SFRAME_V3_FLEX_FDE_CTRLWORD_REG_P(data) ((data) & 0x1) + #endif /* _SFRAME_H */ --=20 2.51.0 From nobody Sat Jun 13 20:57:55 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 B1F07427A0A; Tue, 5 May 2026 12:18:23 +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=1777983506; cv=none; b=LUbiiHb4YQbAEG++ENRNtxwkOOLuUDnx25GDOq33z+6AQYLGH7bz1MeKYxnbzG1yFpb3wMu/6Z2bnELKQapddD71NMwnmymGmBZy93642BzLPhNNTpLsC3uIAiLKG5UIYr9ERHVZeLAjXJQXABYQ7xKexTKkOQTH+7yXAw1LmFs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777983506; c=relaxed/simple; bh=l4WR0hIZnig9haaUwjdtJMydwN7+1d3AIgs5JbgOOXk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LlB87dh6+8Ypfod7dRgydIOWAoIOblsC5rZVc+5ypiVaRQ3xPg1EGMQw0SfcA+vu0PwgVlPOjcCxOZWMNsEZojVNO0aIXsWeL0LevyLVG1ooh9HgnDVOQQjcmGlufV+pQEdyIGijQaENendbE02OKq8isF7ynUSfQ92zCsY+CZU= 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=XYpw+7Ah; 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="XYpw+7Ah" Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 644Nx5wk1446669; Tue, 5 May 2026 12:17:34 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=BsJFflFxi0TyekZiM Z22S7kAUExaFPaOXKgOlpUzzOo=; b=XYpw+7AhXLgr4Rr7B6pyHK6/CB4mzWjzV TnadZL2o0mfdNYk2AQT0QQhiKf96Rmz5d+hNzPLJQ7cd8JANdwrAGh1Vkz9oSGcp Mr/xhH8r7vdp01/JrzPw5jaRVxAAJC7v5ElmZYayR1Kv4Qq9urwyyhThryV4hW/S n2fcXDS9bJFBD9DPvIVgEwvhM6fdhtdJ25IPflssKQZKqsrfjtHcBJpOWN3mNI9U pDslnhLw4/MVVi7ULDeZfWc7kyjdOxt4qYZwMB0cD2uCYZ7dx/0JQ/qrO41TFAuh oy/P1fq95PIJTARtIXD1FIjB44EqkmA2FFsAG8CUPG3ttjjgyg7bQ== 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 4dw9v7bja1-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:33 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 645C9fVW030232; Tue, 5 May 2026 12:17:32 GMT Received: from smtprelay04.fra02v.mail.ibm.com ([9.218.2.228]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4dwukq9nmv-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:32 +0000 (GMT) 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 645CHS0610027286 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 5 May 2026 12:17:28 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 95C382004B; Tue, 5 May 2026 12:17:28 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 313FA2004D; Tue, 5 May 2026 12:17:28 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 5 May 2026 12:17:28 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Steven Rostedt , Josh Poimboeuf , Indu Bhagat , Peter Zijlstra , Dylan Hatch , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" , Mathieu Desnoyers , Kees Cook , Sam James Cc: Jens Remus , bpf@vger.kernel.org, linux-mm@kvack.org, Namhyung Kim , Andrii Nakryiko , "Jose E. Marchesi" , Beau Belgrave , Florian Weimer , "Carlos O'Donell" , Masami Hiramatsu , Jiri Olsa , Arnaldo Carvalho de Melo , Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Heiko Carstens , Vasily Gorbik , Ilya Leoshkevich Subject: [PATCH v14 17/19] unwind_user/sframe: Separate reading of FRE from reading of FRE data words Date: Tue, 5 May 2026 14:17:16 +0200 Message-ID: <20260505121718.3572346-18-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260505121718.3572346-1-jremus@linux.ibm.com> References: <20260505121718.3572346-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-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTA1MDExNCBTYWx0ZWRfXzk8oGrimpxjw LBbsRfMUas3OGl13Gyy6y51GgI8gtf+Fke5e9wGSjaVWpBYGQDzSaQuD84p6+sk8c4a1XfMntep WdiWlgyzFrrODDWHPyJbVUDz6M7q+BZ74ovGGPV+KS8iuwvhZCdrhEiNRu4eX3/ckJurh92iOVx qIM0ooh1FOwqZewoVqGJQkAw0csJTyFZfweBMSrYA6Ns53UY9bWhnXNSzpcS0tYAqodT635N4Th z3s2rwRtebuAIbyt8+eor47oUcgot1f0yKCIAK5XArKsQm9cD3qIZk6LAeepazLcXRBljbm9BmP /MLHA1tevVdRNXQyhQvbBdHWIu3puSwbAJbIn8HEu3bDTE0M/5dj8H0W8unC9d3RYaVIwqyS7fl 0X/9KdZljzmW4Kfs4rbJJfHPNmUxBvmKHJL3VPRmnzBNpHvBu3HbJxZECs5DpCNitcNdVEaFsTD b6DvdamqFHD04kSti9w== X-Proofpoint-GUID: TQbmsIJlRq3L3ufjnmpXUJYzstWtmNml X-Proofpoint-ORIG-GUID: 5CxLYMeQdm8PctbsYmOZMYbX2qSPMeyW X-Authority-Analysis: v=2.4 cv=eu/vCIpX c=1 sm=1 tr=0 ts=69f9dfde cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=NGcC8JguVDcA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=pGLkceISAAAA:8 a=VnNF1IyMAAAA:8 a=RXKZOtKmAAAA:8 a=S_iktsTmVn5NcIvqSDAA:9 a=UFF3uGjEBZWolfm0k6KQ:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-05_02,2026-04-30_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 phishscore=0 lowpriorityscore=0 clxscore=1015 adultscore=0 suspectscore=0 malwarescore=0 bulkscore=0 impostorscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604200000 definitions=main-2605050114 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. Reviewed-by: Indu Bhagat Signed-off-by: Jens Remus --- Notes (jremus): Changes in v14: - Adjust to rename of SFRAME_FDE_TYPE_* and __read_default_fre_datawords(). - Update function name in debug message. 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 2ba2c8b385f9..98346412078b 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_default_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_default_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_DEFAULT: - return __read_default_fre_datawords(sec, fde, cur, - dataword_count, - dataword_size, - fre); + return __read_default_fre_datawords(sec, fde, fre); case SFRAME_FDE_TYPE_FLEX: - 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; @@ -612,6 +626,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: safe_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 Jun 13 20:57:55 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 AEF5C441041; Tue, 5 May 2026 12:18:26 +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=1777983509; cv=none; b=r1Xf02egJLBDIR+8ZA3U7Rcugllf7Yn9ajtfon0CVXTUIaJBhxTZRkvL/rfNb0C6gKLbtBvAdAgkDuOqHKA4LgbEb3EGD6884jSLCkvB+u7a+AfrbEW2DLM2UcV5kUHwFHzIkQFMtOYom1aDYk1cdDdIeDv+oKqDBmk4EtDwCcs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777983509; c=relaxed/simple; bh=dQ3MEkFBssymppa9xBBcf1/EKwkyzQUKOzvnCZiUpyE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VGEfgO5fY6hzMaIt06kTm9S4+LjsnqFSIp28Iq8Yh3a8nPpT3fMkf0SFYeDRwr/KltLxy0ylf1vWP2yCnGtqs48bTzeRFK1qMwjBwLElG8L97or+8ETmcmqrYeB99OOpHykC9KM94e+LqDZiYKByrpjj9WleT0hqqG58d1uelqU= 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=FtfZd4ry; 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="FtfZd4ry" Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6456A3de3182093; Tue, 5 May 2026 12:17:34 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=x08tC+lfWLJ46E0BX z9C4AQirN+u4zkUsjRqoQtFpXY=; b=FtfZd4ryPVkLU7KElGl42+t6ua2i+5MPX jSKgi+4yIyMlJS7Ibui3E7r/LLOa2gwUHm+sbE0dScbkiFppYIgyIX8QFSxiJNxQ BcO4t3p3kzWNhQKu8mAzepFQbxVWpE/B8p3YQ/TOiVlPLfjzhxv7LBJKa2rPxfW1 fibTcToytoBGjEbKYCb/pTHH1hrrfi8GMScujpka6DpPcTzIdvw1XoKson5yhZ1c TqwNnWbWVweyNFWECeF4PcaT0YqHHldmevMwfiI58UMXznZ4204zKiP5s32780lT OrL7F8ROQzRpTjvevtK7vhZ2DBFHTWd6B9evzQjVb5S3hQKBrKSFA== 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 4dw9xxk5dq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:33 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 645C9dd0028522; Tue, 5 May 2026 12:17:32 GMT Received: from smtprelay05.fra02v.mail.ibm.com ([9.218.2.225]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4dwuyw1m3n-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:32 +0000 (GMT) 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 645CHTff48955718 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 5 May 2026 12:17:29 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 089EB2004D; Tue, 5 May 2026 12:17:29 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 9B3212004E; Tue, 5 May 2026 12:17:28 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 5 May 2026 12:17:28 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Steven Rostedt , Josh Poimboeuf , Indu Bhagat , Peter Zijlstra , Dylan Hatch , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" , Mathieu Desnoyers , Kees Cook , Sam James Cc: Jens Remus , bpf@vger.kernel.org, linux-mm@kvack.org, Namhyung Kim , Andrii Nakryiko , "Jose E. Marchesi" , Beau Belgrave , Florian Weimer , "Carlos O'Donell" , Masami Hiramatsu , Jiri Olsa , Arnaldo Carvalho de Melo , Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Heiko Carstens , Vasily Gorbik , Ilya Leoshkevich , "Steven Rostedt (Google)" Subject: [PATCH v14 18/19] unwind_user/sframe/x86: Enable sframe unwinding on x86 Date: Tue, 5 May 2026 14:17:17 +0200 Message-ID: <20260505121718.3572346-19-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260505121718.3572346-1-jremus@linux.ibm.com> References: <20260505121718.3572346-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-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTA1MDExNCBTYWx0ZWRfX5eIgOiYSAVYE gElSVNIYwjC+gm3x9lJpoB3LhvyZaM8ze69qZvB0gkry/I2PHAEKK/M+0J5TilUholuTcn6JMjy RqwDtQzBNP7c52ykWcs4vBzV8Kp7lzrSkEbL6vCRA2Syg9STB8zwvaEnB1/qoC3w2XsxAeJUvH4 nVpavikiq9He78B41gzJu+SY2m6RDpEwuKrwO8UPKFNg4Eh/EWQ/k/CNR4fo+/Du9BzfYuwy9cX lxbSQYuxBhp5/sShe0Y+SG+yB2YJXfR1cQsWPvL8lyyfY5fvuyPDLd2NVVD9jZEQelF2KxfCteg Lo3sQc4HS8+QPHcyDi0cnci2/EfR70uH4wXjtMQgEDVFiCM9c2XFCdV984+Q/5cxQKBGbxOtlTN xvUMXQJ7TmNMi5rnc5guWvcMBxmX3RF3edENd8v02WbNpszEIzStA4PU7xKMSwGcXRBtsubJ9rv kNWp0wqRkScUu6NA6MQ== X-Proofpoint-ORIG-GUID: AQlMQiA4R5gyjNW1nup077lPuGq6n5_t X-Proofpoint-GUID: rWYMWQbXEDhvt5xo-cN5CNnAkkafnuaD X-Authority-Analysis: v=2.4 cv=ctWrVV4i c=1 sm=1 tr=0 ts=69f9dfde cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=NGcC8JguVDcA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VwQbUJbxAAAA:8 a=meVymXHHAAAA:8 a=pGLkceISAAAA:8 a=VnNF1IyMAAAA:8 a=Nb24OjdhCh9FoptYTSsA:9 a=2JgSa4NbpEOStq-L5dxp:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-05_02,2026-04-30_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 lowpriorityscore=0 adultscore=0 clxscore=1011 suspectscore=0 impostorscore=0 spamscore=0 malwarescore=0 phishscore=0 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604200000 definitions=main-2605050114 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. ] Signed-off-by: Josh Poimboeuf Signed-off-by: Steven Rostedt (Google) Reviewed-by: Indu Bhagat Signed-off-by: Jens Remus --- Notes (jremus): Changes in v14: - Drop superfluous empty line in unwind_user_get_reg(). =20 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 | 33 +++++++++++++++++++++++ arch/x86/include/asm/unwind_user_sframe.h | 12 +++++++++ 3 files changed, 46 insertions(+) create mode 100644 arch/x86/include/asm/unwind_user_sframe.h diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index f3f7cb01d69d..51286dfdb5f4 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -302,6 +302,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..b80f0ec0f7a7 100644 --- a/arch/x86/include/asm/unwind_user.h +++ b/arch/x86/include/asm/unwind_user.h @@ -15,6 +15,39 @@ 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 Jun 13 20:57:55 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 96FD847887C; Tue, 5 May 2026 12:18:27 +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=1777983509; cv=none; b=dSQGZ3Y6UhgaQpZl81V2Mvvd2Vw576XitqhCC1BWsqcmfPhjkPdMz9TvF0xKpoM7K6nQuNJVMrq4emrZbSLr646fxHZzLuSzXTR/Tmis4LFFLB/9RCiy9Pm8boPCSzcf4LBuVuO5hwg7nqylWXFzdBQjASjuNiDi5mg3fH6RNoI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777983509; c=relaxed/simple; bh=MKiZHpQYhzSaqobTOwaf24W+UVE4a06VWzhTprabQwg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qdANXbr/oElhg2mEthIWcReZSVM/ZRVNXQd5qEQKAVwkhARP5AgIbH2FI2aaV902OV+PcTPzTQ+xW5aLPo6ItlNZEZVBhZYre+J1TAhBDHGfdBp+vvBgmbUMs36MDT/+zHToBV/wT62TMrq89QVbQuPvgosCW4wtZKrkjv0Xqn4= 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=kyp1OubG; 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="kyp1OubG" Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6456vErd3189768; Tue, 5 May 2026 12:17:34 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=1rW6pODOLpmIW3dM1 Bj/JMJas2e2YSTbOVAnzl9U3D0=; b=kyp1OubGgmq8yPgzuacnELa/FzlQiqpAM F2RLXOVKW1jTgdZEihdLaJKSWQEETxLQVXki82oqVkcvfX6781cVVJUaBR1ZPBkj N0PmFT/SjM4t+iU5KF2K9k1Yl5JUG16ATAPZWZJaX3GpmOqxMPF9N2t8+Ki1ESqq gLZxhxICDnmkobCkkB6iwnVbkY/Qc0o9ohUmAt2a5KSyHP8wQMovYRJWpL91XnCU s00+4oPNYy2HR3R7vJDW5fV70BhGNVSEZbQ0vS43agrHvvBkPvg7z0gFFHKwZ+cZ Y/ztn777I3IDf4NV/P289BnH+3+/FNibj1qiVHbWvTenJ7yUt2k+w== 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 4dw9xxk5dr-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:33 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 645C9cRI029301; Tue, 5 May 2026 12:17:33 GMT Received: from smtprelay05.fra02v.mail.ibm.com ([9.218.2.225]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4dwwtg9bmm-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 05 May 2026 12:17:32 +0000 (GMT) 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 645CHT6t34079162 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 5 May 2026 12:17:29 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 6EBAD2004B; Tue, 5 May 2026 12:17:29 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0E92E2004F; Tue, 5 May 2026 12:17:29 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 5 May 2026 12:17:29 +0000 (GMT) From: Jens Remus To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Steven Rostedt , Josh Poimboeuf , Indu Bhagat , Peter Zijlstra , Dylan Hatch , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" , Mathieu Desnoyers , Kees Cook , Sam James Cc: Jens Remus , bpf@vger.kernel.org, linux-mm@kvack.org, Namhyung Kim , Andrii Nakryiko , "Jose E. Marchesi" , Beau Belgrave , Florian Weimer , "Carlos O'Donell" , Masami Hiramatsu , Jiri Olsa , Arnaldo Carvalho de Melo , Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Heiko Carstens , Vasily Gorbik , Ilya Leoshkevich , "Steven Rostedt (Google)" Subject: [PATCH v14 19/19] unwind_user/sframe: Add prctl() interface for registering .sframe sections Date: Tue, 5 May 2026 14:17:18 +0200 Message-ID: <20260505121718.3572346-20-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260505121718.3572346-1-jremus@linux.ibm.com> References: <20260505121718.3572346-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-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTA1MDExNCBTYWx0ZWRfXzbsTop3bX66g LFiQGRpKphTx+FUh9jEV6F2mi58EPDFgxFbUXetud3vbgciG1RsLfGwS/gX5l4YJnKpa/c5nGFT WRjicReZwI0HzjFm/H5IUZOb1FDYHTbHp3nYRBkbrNIRcpkJZOh/opCakmyrv2zYFO4PdsKjJFb xIetshmi2Vh8hav4xj0vOZYl5LwjqTgq3pIQ30rRFC+1kWJa3QMZYUBpGjGAgTDyQStije4jWqR bRQOugZgIlwd4QegBoUr4hvNJNniIN/GhGykR40eS2Qf97iE9Trf/1incLwqCbRJnRrynURh+LJ 9J953rqmcYJ4dG4TWsUApQtqnfCGv61Sh+QD9sJLmiRjrEtmC9fd6yopKZFYtHqgPwVuLFXBViP lhYzsBEhtmuL3bZX9SVHBUo/p4X3Pce7Vu5GUiJ5T1bfe4NCGflJ3aCqWqPEGiBOGcOrkNYX5pM dGoksnPkr6KLIKnBPTQ== X-Proofpoint-ORIG-GUID: wsKsPePIPbR1Pf5sSmwvRTZBUPpHqZJm X-Proofpoint-GUID: 1K7W285VYx8m3b0nv1DHxzyyYXFMAPBc X-Authority-Analysis: v=2.4 cv=ctWrVV4i c=1 sm=1 tr=0 ts=69f9dfde cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=NGcC8JguVDcA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VwQbUJbxAAAA:8 a=meVymXHHAAAA:8 a=pGLkceISAAAA:8 a=VnNF1IyMAAAA:8 a=1RKwvADtGVyjO38rMG4A:9 a=2JgSa4NbpEOStq-L5dxp:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-05_02,2026-04-30_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 lowpriorityscore=0 adultscore=0 clxscore=1015 suspectscore=0 impostorscore=0 spamscore=0 malwarescore=0 phishscore=0 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604200000 definitions=main-2605050114 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. ] Signed-off-by: Josh Poimboeuf Signed-off-by: Steven Rostedt (Google) Reviewed-by: Indu Bhagat Signed-off-by: Jens Remus --- Notes (jremus): Changes in v14: - Bump PR_ADD_SFRAME and PR_REMOVE_SFRAME. include/uapi/linux/prctl.h | 6 +++++- kernel/sys.c | 8 ++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/include/uapi/linux/prctl.h b/include/uapi/linux/prctl.h index b6ec6f693719..0aa0ec971843 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. @@ -416,4 +416,8 @@ struct prctl_mm_map { # define PR_CFI_DISABLE _BITUL(1) # define PR_CFI_LOCK _BITUL(2) =20 +/* SFRAME management */ +#define PR_ADD_SFRAME 82 +#define PR_REMOVE_SFRAME 83 + #endif /* _LINUX_PRCTL_H */ diff --git a/kernel/sys.c b/kernel/sys.c index 62e842055cc9..6e81e82bc991 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -65,6 +65,7 @@ #include #include #include +#include =20 #include =20 @@ -2906,6 +2907,13 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, a= rg2, unsigned long, arg3, break; if (arg3 & PR_CFI_LOCK && !(arg3 & PR_CFI_DISABLE)) error =3D arch_prctl_lock_branch_landing_pad_state(me); + 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); --=20 2.51.0