From nobody Sun May 24 20:33:24 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 0A6093DA5D9; Thu, 21 May 2026 14:26:20 +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=1779373582; cv=none; b=UD8bTi0sUC7fD/+uzcPYjPtlhkvJOvlqNUir5V8SIKBKzC/8ASEZi+2iMH6+dx191q/Tt9q6gc3xqC00FZbU1tB36UJbrMVpdpBnWxQWMHSHy3oP4HtnBML+HgU9LLMiq1T9v2j5wktP0F2oYXgt9Qp9IxJ6G3EchlKuqcRIw5w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779373582; c=relaxed/simple; bh=Coil9KclyKK7MQZtjsj+zggHftTuc+AXqbu8taw5uMo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OZguUjW/GSsp7y3S/gFsmYpYpV1qKsfMajCRK/kMBJmLHd7waYRSwDluss/2zSHbKkIqm+NEeweZYeWMRk6Au23d6zv5EQToIfy7TH2+4YXm6o/IUlRpeaM2EM0rDuc3Y+rPxbSDZZ/Iv1xdzAKJbX8oMoxrJnnb3QPKG/d1NDA= 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=e1zg6m/i; 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="e1zg6m/i" 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 64L6fYnI3442044; Thu, 21 May 2026 14:25:55 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=odsVNex6R2VPSghnY Dx1oLCB8plgZo4cXgSkUOTP2c4=; b=e1zg6m/iYlHhgLyx+hMuwAkAWk3ZzVC1B hLKRgi6y0zliDHyYukEbJqLRNpPszE9O/rfoK8J3C7hMt1oga5Fm9FVt+X7cao9L us8eq7TOGDSj32NBzHQKXhc1WzF6AeqvUF6v8JWaEjQdaFa56wbnLFbYRl3toqUe Wl13zVt8ztKByTSVIww/k3jD/1Jj3q64FYbZmQ6rstbre1B46cCmveWkWenD+2Pe XiyJ4WiE1ygNtxMutpqhNJYW3CF3IW9X88XTKDbrlx+DBRI4Taxn6zJ0lsoZ7JPE G6O6oIUzg7Ff/qdRvtnNsO9qBSLjkIWIPt6q8+ZgAbARWnnhDtmug== 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 4e6hawe81w-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:54 +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 64LEO56O027486; Thu, 21 May 2026 14:25:53 GMT Received: from smtprelay01.fra02v.mail.ibm.com ([9.218.2.227]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4e739w4pek-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:53 +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 64LEPn8I55575022 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 21 May 2026 14:25:49 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7B9DA20040; Thu, 21 May 2026 14:25:49 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 218CC2004B; Thu, 21 May 2026 14:25:49 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Thu, 21 May 2026 14:25:49 +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 v16 01/20] unwind_user: Add generic and arch-specific headers to MAINTAINERS Date: Thu, 21 May 2026 16:25:27 +0200 Message-ID: <20260521142546.3908498-2-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260521142546.3908498-1-jremus@linux.ibm.com> References: <20260521142546.3908498-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: AW1haW4tMjYwNTIxMDE0MiBTYWx0ZWRfX92eZC6wen46x kxu8UG75ZEncSDV0735GvcPY4I9+w6aQWteAEM1zFldIBHPS/H1A/3mQy2tXIb3CqRS/sZrSXu+ p7Jn0pLoFFuz9VcjINWcX4wSq+vUpbqFY6sHmwcHfC4+IpJAZ648LqiyDsA095TX3DEW8OAR3CO nQlPqPBE/0KI/ZcbvOvVglCSuokU6mVPIG/xi4FzOF6yGvNl8FtdC20wlYd7KJPWF73RyTGVJmt 3XEP9iiTe3HuPvIHZmkEJCQ6dqbOx7FcjiYqZkPdkhuRfq8hryu9GkpFn1CaT6MTwi3QC/YafZA Q0R7/Gr3fIKpUWEUFED1xx7V8WD34A4rEFGnp64nZEA4qpmztglb3KFYZx96RVidb3QFQEGxxiA c5ADZ3Ek2IlvJBPVlc/g9EpNxjJSg1Y96QOtQ2BjlPtJi4NwRNGm2pIiHN9rwngS7f6BmHA3J3t Znr01a7wks369aWhEFA== X-Authority-Analysis: v=2.4 cv=Np/htcdJ c=1 sm=1 tr=0 ts=6a0f15f2 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=1XWaLZrsAAAA:8 a=VnNF1IyMAAAA:8 a=VwQbUJbxAAAA:8 a=meVymXHHAAAA:8 a=HxY8WkbW6gBkmJkjgtEA:9 a=2JgSa4NbpEOStq-L5dxp:22 X-Proofpoint-ORIG-GUID: E0A2RAdLlwCHEwSkTaCKzShIPO3jyXhx X-Proofpoint-GUID: WjzRShqmm6nzPcB1FGiCH2jEoUe8nwSr 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-21_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 spamscore=0 clxscore=1015 priorityscore=1501 impostorscore=0 lowpriorityscore=0 suspectscore=0 adultscore=0 phishscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605210142 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 c2c6d79275c6..7434e9d7b33f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -27874,6 +27874,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 Sun May 24 20:33:24 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 5A9143EFFBA; Thu, 21 May 2026 14:26:25 +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=1779373587; cv=none; b=LIIhC0f7Nn06qh5Si1GYAAxVA3HWD6tiHo2UQPkC7Pn0Qf1cBdqeF9zAKU3aQzWoWtGbm67hjqMhL0b+MSuP9u8G2Rkp17MCA30H5PbacEN/QE1jaeVt1jchYaq2B7Roe/9zQIC7TetLwhhachp1rzSAPZl2ErlHLliv0utLXqw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779373587; c=relaxed/simple; bh=40eCuTAya7UOGfTpyAXI86nQufMPTC+FPH5MAZEmNXk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Dn6znAu7wJpPfY+FubKdfnoM6O9K7YrcEyMpgJiLyCMUuQTjAagOwAUny0vNORPrnbVsMlX6Ti60R2b9w0cLH428mfMeduy1TZhdK3ogQdd7yRN61FxwEdMe0PhO0Z5VSuCc9thWvDT1OsMglayfXI/m9bgep8XAUAQFU5kKrqQ= 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=fQhK+zSq; 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="fQhK+zSq" 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 64L6u7ST935604; Thu, 21 May 2026 14:25:55 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=Q5n7SZa1kCJjW4GKz WdX9Nc0n7Hf175be+HBk4Nr0Ko=; b=fQhK+zSqJfj82Z9vnvUX3dObv0Uym+99H 44pt5JTKxAWOvy5cX6kJZQrR0ZCZW++Mqo3MJGa4HIqAMy1M/d3lfSBTOFwEs6Uz A/JxysW1iQJjuuJkS3Q3HDlzJ+BVDThLZMgM20BVioi3WZsiZfvNOmX4lTPrhOVH 3SXIkGQRX+0lYuTBS/d7xmkIVWyxBetdhUGg2FaBT4t9WPKGTL+dQF1GHzkXcD9P cAmV4zyb7J1N4NNiONAw+t9aVW8QXO2qkTfy141GRFE4oYAIfhlIG5Ygm6Qfzup5 SP+nfXgs2UHKexmF0AQsKHeExE0NvWBVX58Bq5Zv0OTP9fEEwQtYg== 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 4e6h88p6fc-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:54 +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 64LEO56d027493; Thu, 21 May 2026 14:25:53 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4e739w4pem-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:53 +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 64LEPoa027722136 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 21 May 2026 14:25:50 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id E5DC920040; Thu, 21 May 2026 14:25:49 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 8119B20049; Thu, 21 May 2026 14:25:49 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Thu, 21 May 2026 14:25:49 +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 v16 02/20] unwind_user/sframe: Add support for reading .sframe headers Date: Thu, 21 May 2026 16:25:28 +0200 Message-ID: <20260521142546.3908498-3-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260521142546.3908498-1-jremus@linux.ibm.com> References: <20260521142546.3908498-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: 9mX7Kvdhwp1YCbUfaxoGBJ4HGhkDKZBd X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTIxMDE0MiBTYWx0ZWRfX0d6KUTcGxViw Y/BcyHGhc3iFCKPDbGVKSoaOWUK7P6FpDGNWtYh2p+/BOkNh2QmmApIdFUqfVpRsmMhfs3K2Ek4 Qi0ANvPVIgGHR0BZ2TRHnS2EJLV8ORi0Rse4KmNPP5XCSsJmJw1P2QkgL7m8MyNsrDazOwjU4Kr iqjD4Fvr4FGYOpx+G3rfVg1qRZOPHfJ5lo2oSWTLfNfWrSOFMreoc6zigVJxi90tZnP4VowiT2O vt4xe+MfCQllgFrnO3qm1oOwGBdxzFwyQ+9zmPyTZUpTOeCll6HlqPV1PpvEUcuR1Suxvqze5E7 DYErYnd3qNfnXNPoiXUdET94VJF2botCwh5SjL8bVPUF7ml57QBxrWrz+gK0+0mT++ZcGKB0k5z k4V+O9cyqj0KlYPBlqw/Vl0cHxay9taVTfILsGYmNVWVNJiG0PZrS1u1tt3k6OieAa6/rt+FxuF Mp8Rcl5xSnDsi/Ml2AQ== X-Proofpoint-GUID: aeocA9vtgS32qEU2K3fTLFtrfy0TUdDa X-Authority-Analysis: v=2.4 cv=apyCzyZV c=1 sm=1 tr=0 ts=6a0f15f3 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=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-21_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 lowpriorityscore=0 priorityscore=1501 impostorscore=0 bulkscore=0 suspectscore=0 adultscore=0 spamscore=0 phishscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605210142 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 v15: - Improve text/sframe section start/end validation. (Sashiko AI) - Use GFP_KERNEL_ACCOUNT instead of GFP_KERNEL (see memory-allocation.rst, section "Get Free Page flags"). (Sashiko AI) =20 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 7434e9d7b33f..a9b42b67a88d 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -27876,6 +27876,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..d24e9d4f8bef --- /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 >=3D sframe_end || text_start >=3D text_end) { + dbg("invalid 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_ACCOUNT); + 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 Sun May 24 20:33:24 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 5267E3F2117; Thu, 21 May 2026 14:26:27 +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=1779373589; cv=none; b=gI0IWtqD+ZYOOzCuCDZGiaudY2rvkPChLSHZam2ApSOv6R4IMst7ojkw/4U94YBGomjsQxU3cqTlIObNcWMerrzz01eBjFlmsEDAGEntpNVG1vuSDnHGkrRQ5LcUVhFwXSgui+BGbXPPWWvi+TJlmz24KAgnEIl/eajMgchX2Zs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779373589; c=relaxed/simple; bh=nbgs9b1LiBi7EkQyVJ99aslt6wxpJ5iUyTUxq5BfjEs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EsLKyQ/8xKSgxm0Say4YKW+SO0dJB8XtlmxwmjrfvrdP8TikffdXKbdEma8+zxdGm+rDCE+jcs6kSXtjVumi2+Tst44zOcB8D7ok7UndUbQ3GfMof/h+YpYrSbX3TW5NLPWYElbhopFVw9LiwczxnaScgjoW05YHNSD/P4XFnfQ= 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=HAJHkPnQ; 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="HAJHkPnQ" 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 64L0PXHV843724; Thu, 21 May 2026 14:25:55 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=9+eu9KzFa/Mwxg1rA 2DGgUyHvjGhvtpbE7NFlm9DmI8=; b=HAJHkPnQQtCMbJLV5PFiwjGe+d3aeds+4 kG52XRu2jmTUIarlMntXCY2PJc20syYggBBXg0da31wy52SX23lIpfFEjoCMLIVB ARs04yeWzgTK7rFj1c9HULxBgGRpXqhu0Svsb9ZoCejEqb6S66JiVSiPr3gUYgXG m/4jdi5SVIBCygsx0RZQoKghf6Uee+7UFFsIbOUaS3fkreKdeKUYuKQBcZd1+4yV pvIqnD1xh9xw5Lzxs2eEzzY+Ear/lYEEOPmMLWHf/8aRpI/h4ecI/fGaOc3cWz62 u+h9gIgefiNUa9SWliOiRL2SGc7UIGXeguLay8lbrnGJkWFQZ6AfA== 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 4e6h9y7gqx-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:54 +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 64LEOF4Y001794; Thu, 21 May 2026 14:25:53 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4e72wqcssu-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:53 +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 64LEPoHr27722138 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 21 May 2026 14:25:50 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5783C20040; Thu, 21 May 2026 14:25:50 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id EB4812004B; Thu, 21 May 2026 14:25:49 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Thu, 21 May 2026 14:25:49 +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 v16 03/20] unwind_user/sframe: Store .sframe section data in per-mm maple tree Date: Thu, 21 May 2026 16:25:29 +0200 Message-ID: <20260521142546.3908498-4-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260521142546.3908498-1-jremus@linux.ibm.com> References: <20260521142546.3908498-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: AW1haW4tMjYwNTIxMDE0MiBTYWx0ZWRfXy2kGxoTWZUbO a78ioVhmxv/1Lm6FHJOueC62PP3+MWmHHI1LNaxZaU1/sMIILjZAjT69q9xw97AE2rPM35YbPd4 gaK+i8KjVGnA/DPvNwGk+9FdMTSBXevGhIUvhYRsQNS8wgCotPd/44FysqH0kuiC4C+Vjg0ulxI zIElyF56mFunOuO/U27DsVUEZosxGszceqVawJx0IMF1dQIxz1dvcR+0Hn5LLGSP/41LYjj/0xg S1bV8ARPvlSJnTdhhtsn4CyuXl0msuJ4YqYJGE4jrc7yqpEC4hw5PrNSAho48BkePXOePCl1hA8 3LRvXLOCoFH5xXpe3oeZD1vekiI5wZXmjnF8D8YL20ufSL/KuqGLZeu4Sh8oWenjIzAYGDeYcD2 +nDEf4Mc+cglk6Rwg2HG8p0AlTbysoCwVlDnn9ssvY+FylxYzH7blxHVIDkZtGmCZIEcNCyr+XL ZVrW1XNiY0DrdGoMgJA== X-Authority-Analysis: v=2.4 cv=BNuDalQG c=1 sm=1 tr=0 ts=6a0f15f3 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=VwQbUJbxAAAA:8 a=meVymXHHAAAA:8 a=pGLkceISAAAA:8 a=VnNF1IyMAAAA:8 a=kG-nbKyDqmrV4dykLI8A:9 a=2JgSa4NbpEOStq-L5dxp:22 X-Proofpoint-ORIG-GUID: Yj0LaF0FkTic88FYSwchjc-y2t1JuMc4 X-Proofpoint-GUID: quXsH3SVjBwEiRlwOCP6xl2xWRlzy7vU 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-21_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 priorityscore=1501 malwarescore=0 impostorscore=0 suspectscore=0 lowpriorityscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605210142 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 --- Notes (jremus): Changes in v16: - Move SRCU definitions from patch "unwind_user/sframe: Add support for reading .sframe contents" here. (Sashiko AI) =20 Changes in v15: - Fix text section end passed to mtree_insert_range() to be inclusive. (Sashiko AI) - sframe_remove_section(): Add guard(srcu) to guard access to sec->sframe_start. This also guards access to sec->filename in __sframe_remove_section(). (Sashiko AI) - Use GFP_KERNEL_ACCOUNT instead of GFP_KERNEL (see memory-allocation.rst, section "Get Free Page flags"). (Sashiko AI) arch/x86/include/asm/mmu.h | 2 +- include/linux/mm_types.h | 3 ++ include/linux/sframe.h | 18 ++++++++++ kernel/fork.c | 10 ++++++ kernel/unwind/sframe.c | 68 ++++++++++++++++++++++++++++++++++++-- mm/init-mm.c | 2 ++ 6 files changed, 99 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..38047760e252 100644 --- a/include/linux/sframe.h +++ b/include/linux/sframe.h @@ -2,9 +2,14 @@ #ifndef _LINUX_SFRAME_H #define _LINUX_SFRAME_H =20 +#include +#include + #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; @@ -19,18 +24,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 d24e9d4f8bef..46dba3cb016d 100644 --- a/kernel/unwind/sframe.c +++ b/kernel/unwind/sframe.c @@ -19,6 +19,8 @@ #define dbg(fmt, ...) \ pr_debug("%s (%d): " fmt, current->comm, current->pid, ##__VA_ARGS__) =20 +DEFINE_STATIC_SRCU(sframe_srcu); + static void free_section(struct sframe_section *sec) { kfree(sec); @@ -81,6 +83,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 +125,74 @@ 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 - 1, + sec, GFP_KERNEL_ACCOUNT); + 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 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) +{ + if (!mtree_erase(&mm->sframe_mt, sec->text_start)) { + dbg("mtree_erase failed: text=3D%lx\n", sec->text_start); + return -EINVAL; + } + + call_srcu(&sframe_srcu, &sec->rcu, sframe_free_srcu); + + 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; + + guard(srcu)(&sframe_srcu); + + 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 Sun May 24 20:33:24 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 8304A3FFAD5; Thu, 21 May 2026 14:26:31 +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=1779373593; cv=none; b=FvZJ27JRMFH3HA4jF3YAzGejcDrVTYn1OzoLvieZUpmxg5/0fWu66pyO0lhbDSNGGcRHVTNrAkJaP0J6VYoen7eEMhVxvcR8nLH/hTTwTrp05xdBYiJXuaJhu5azyVpn0U7t0srIEdY8oqqq0Y6hw5yy7vQqCRLl0DPSykkHpuw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779373593; c=relaxed/simple; bh=GxFK9qK2waswmn5a7hcrsAgsdmlfzO/Yu+YXlBPdaIw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GUkLh0EZ7+qWE36itxcOPOKqtWkqTL/ttWGd5Ril2V2iRPUsFX60DgaX+a4RmX/8gBlkUtC0f1Rk5PMGsL4ZpUrA+pms/jUl8u3EJMVajqhOi9fmNvy8DPmu1J84Ys5sYTetO7gU/ZLluYZgv2SwTbU/XTy0QwPS6zPpfq/KBhc= 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=Zh6v7aCn; 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="Zh6v7aCn" 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 64L1dtx24007920; Thu, 21 May 2026 14:25:56 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=1ZooUzQ2QaJzPuYG9 6lOZVdY7QXHL/KbZhDury++wpE=; b=Zh6v7aCnHl6/ehEMjfuOJkhk3yeaW6Uvx zvrImVf3YiYdBKKU4fXBjc8PG2089AIC/ZYMuoJ5QijMEQ89rfDgXcXqsM2zOwDJ Mn1N/+ULPK5J3/yXOzneKJKq3zwA08snacFQCQwLNcV4XukIFiWcikkqEKhxA7o3 9A3EMjc1dECCtWGo1z2snvWwTrfLGp0zXjpp21+ap+UpveX0Eh7PLwPXXAIaBJ+C n7PnfQmz+ARgPv+4mbjQf5fOqsjiLYpPDU/s8H1J49u8jXgNNgfZac+opSEmCRUV +ayFca78G5SEg3cy/q8xHu/IW7vs/rRyqX7ZX8P1dr0DLZfd2+Nzw== 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 4e6h9y7gr2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:55 +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 64LEO5qt027490; Thu, 21 May 2026 14:25:54 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4e739w4pep-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:54 +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 64LEPo5n17891762 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 21 May 2026 14:25:50 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B4D962004B; Thu, 21 May 2026 14:25:50 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5CB0E20049; Thu, 21 May 2026 14:25:50 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Thu, 21 May 2026 14:25:50 +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 v16 04/20] x86/uaccess: Add unsafe_copy_from_user() implementation Date: Thu, 21 May 2026 16:25:30 +0200 Message-ID: <20260521142546.3908498-5-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260521142546.3908498-1-jremus@linux.ibm.com> References: <20260521142546.3908498-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: AW1haW4tMjYwNTIxMDE0MiBTYWx0ZWRfXwO0m16WCn4hD o/Ob3KO5UXgAEzdmWXWXgi80XvDvQ9aeLk78rCbWBk5lPAWKNbYTnbSV0kdJoKG7kjIXYpTkcJq uhoM1bHkWYfA29QdEcBCE7ROqgrohRZ4/Ew90D4ARkiS0nO9tzg4FvE54maqPU2uwz7A2+CSPs1 ggcLqIFwv5fDbY+cAnNkJLUTRvI4wmJp3Oo86A7ulT2Mbw/fBGWSRWWxMA6ak6beezsmBbjAghh 5HvGs0gAkGe1odKWNmZz8dFoXyiuWIiUje1Eg/grZ3BFNjpCkhZ1BGIAazPJYHXm3y4iCXkajt/ cueDwbRgDI4mgFH+ctn9rbYwMg4AQEiKoEfOaU7j89fKfN/Z6ljT1EdkBtc7Q01qXL77MAQN3a1 OIbdPeG2eWIEvWn/Ot7OV2yRK/vatxjrkWSQmvb2nfO9GlzKhnjFDe2BQwv/kfE4F75pDIqhJWe ebr+QFLR8GUj2rOdCXw== X-Authority-Analysis: v=2.4 cv=BNuDalQG c=1 sm=1 tr=0 ts=6a0f15f4 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-ORIG-GUID: MJqE03EPVOgKZfrWFiKGuHq0HUysVT8O X-Proofpoint-GUID: MIgYzg3bxZ8sWXFHjYoqPLKNUx8wptn5 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-21_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 priorityscore=1501 malwarescore=0 impostorscore=0 suspectscore=0 lowpriorityscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605210142 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 --- Notes (jremus): Changes in v15: - unsafe_copy_from_user(): Use const void *__src. (Sashiko AI) 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..235886106f31 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); \ + const 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 Sun May 24 20:33:24 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 A28323F4DC1; Thu, 21 May 2026 14:26:27 +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=1779373590; cv=none; b=N3cGCIkdmBgdxuN/zn/d868IgXNseBWj8qUj5u2KQf7L9famrsPHl7eP5CK3iMI2+4ZKCur/7t0t7WSpJAMIfkBanfO1r+s29lgxzsL0hY9EHJZZidrYoTnAnHQmEIkPYk2Fguu5Nf2hzcu3P5hew+hoKScmAaF9WvOQUQtEatM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779373590; c=relaxed/simple; bh=gDkBpHQcxeodFHi82woyLdz1XO0GYUo997e5fFv6FsM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=butKq3af5BV7C87VPACoaWY1OiMjff2RTdCFqsmQoi+kl8/rQW/DuiQncOmmIKzZXts7+TSZxrPQtXAus4tCwBYs4gEh9XWc/ycreAx+GtQzLl9z1mijHqDnDNND221LBo3Noo8xT0tkmrLj8uNInlI0xLEgRi20psIJImeDIAM= 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=ipeEtmR/; 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="ipeEtmR/" 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 64LBBENk1522114; Thu, 21 May 2026 14:25:57 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=eASCnMgc6rfNC1Rzn pdZo4UAmVmQlzW6RDQt5jpiuXA=; b=ipeEtmR/RptD7K9cpddBEnq1hsvP6oKHs scnfXENq6v94re16JF34DqqQcw3QeA5h25I6gYHtmUVpmhDOAjMigULYAF0CkXgY 6yu3BN523cvc3uzHB+WRSCjBhdRTC1C2ldxXQabV0Na+lcEq0DkZ8fEMNdh2el44 3nTG6vynRPG7Mh6aiSCIWx4ZG2uzH09u+HLxPvaNFfShdESYRQSMgOYLfJHrLBbT 7PaFNJmRH1THylWM8lElLaDr/+OLAlbkd+0l4BPq594KEqGGRwOMGul7NjgDl/wf iChRXEtAjJl9lsUn7pvw99ZouqbyeG/pfRnzPS8uAcHU0Qp2mcQlQ== 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 4e6h9y7gr8-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:56 +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 64LEO5c5017107; Thu, 21 May 2026 14:25:55 GMT Received: from smtprelay07.fra02v.mail.ibm.com ([9.218.2.229]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4e73wkcjcn-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:55 +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 64LEPpKU50528532 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 21 May 2026 14:25:51 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 34D3320040; Thu, 21 May 2026 14:25:51 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id BB2E82004D; Thu, 21 May 2026 14:25:50 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Thu, 21 May 2026 14:25:50 +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 v16 05/20] unwind_user/sframe: Add support for reading .sframe contents Date: Thu, 21 May 2026 16:25:31 +0200 Message-ID: <20260521142546.3908498-6-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260521142546.3908498-1-jremus@linux.ibm.com> References: <20260521142546.3908498-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: AW1haW4tMjYwNTIxMDE0MiBTYWx0ZWRfXzM9tzVuB9At8 JIzoeoqz1In+tZuIdL8K03HsFHZAUr8+DJEUnQeolooQJfSfmpqWBjXP76YgolVEMMEUpLSwgSf 5CaV0FzZ9UsQG4SlTGncvMQsYjQ1kOVrR8Fk/s9M6aCuW4NwIRq5hEpz9GLRyZP7trHu6fqmj5w aqT4nPHHbGVXrtE6wpHGC5KIUbW9ZbBoOKDg4faSbXMZhCaliuXNGCjMM57Z4Wn3TYCkarZTanT +cts1qoNVaSDLngkqGzatYV2RF2pURuhqoTte8vfLT2cb5TJ8UXN+68b7UOnk+qtof04CozwHYk sC8bOUXwKcC0aI01dUEHq0xy/wsnckYW5NmswCWQVG1omRFL8b1x/jHfgiHJHmCu6IiMoBoG012 MVYxj8sbHpOS/DTkgUpvBYjtCzjNEXmq8RpAqr4R2Cy21J9jO1jbYQ1khTFwWBXnnviMQI0pfXq Xq3illrKAvQIU2GLl1g== X-Authority-Analysis: v=2.4 cv=BNuDalQG c=1 sm=1 tr=0 ts=6a0f15f5 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=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=meVymXHHAAAA:8 a=pGLkceISAAAA:8 a=YuDcBBqGAAAA:8 a=eEjjhumUK4yHDpHCs10A:9 a=2JgSa4NbpEOStq-L5dxp:22 a=V9_jqlfyBUA7Gw2gN5zN:22 X-Proofpoint-ORIG-GUID: yAzelrH9X6qqcMbuAY6v4ZUAkj6Y5qCQ X-Proofpoint-GUID: B5tVsh0kPgJpsXxGGJXnLp27nY_bG9iY 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-21_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 priorityscore=1501 malwarescore=0 impostorscore=0 suspectscore=0 lowpriorityscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605210142 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 default 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 v16: - __read_fre(): Compute FRE size before mutating dataword_count. (Sashiko AI) - __read_fre(): Convert user read access to scope-based cleanup. (Sashiko AI) - Move SRCU definitions to patch "unwind_user/sframe: Store .sframe section data in per-mm maple tree". (Sashiko AI) =20 Changes in v15: - __read_fde(): - Validate FDE repetition size for PCTYPE_MASK FDEs to be non-zero to prevent division by zero. (Sashiko AI) - Validate FDE PC type for supported values (i.e. PCTYPE_INC or PCTYPE_MASK). - Validate FDE function end against text end. - Validate FDE's number of FREs to be less or equal to FDE's function size, as each FRE must cover at least one byte. (Indu) - __read_fre(): Validate FRE function offset against FDE repetition size for PCTYPE_MASK. - Change type of struct sframe_fde_internal field fres_num to the one of struct sframe_fda_v3 field fres_num. - Normalize error code usage (.sframe is removed for all but ENOENT): ENOENT: No sframe or no FDE for IP found (FDE found but no FRE found is EINVAL) EFAULT: Bad address EINVAL: Invalid input or sframe - Build-time checks for config options: - 64BIT: SFrame V3 only supports 64-bit architectures. - HAVE_EFFICIENT_UNALIGNED_ACCESS: Unaligned access to 16/32-bit SFrame FRE fields and datawords using unsafe_get_user(). (Steven) - Reword my changelog in commit message. =20 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 | 3 + kernel/unwind/sframe.c | 362 ++++++++++++++++++++++++++++++++++- kernel/unwind/sframe_debug.h | 35 ++++ 3 files changed, 396 insertions(+), 4 deletions(-) create mode 100644 kernel/unwind/sframe_debug.h diff --git a/include/linux/sframe.h b/include/linux/sframe.h index 38047760e252..9a72209696f9 100644 --- a/include/linux/sframe.h +++ b/include/linux/sframe.h @@ -4,6 +4,7 @@ =20 #include #include +#include =20 #ifdef CONFIG_HAVE_UNWIND_USER_SFRAME =20 @@ -30,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) { @@ -48,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 46dba3cb016d..2de29c836f6b 100644 --- a/kernel/unwind/sframe.c +++ b/kernel/unwind/sframe.c @@ -15,12 +15,355 @@ #include =20 #include "sframe.h" - -#define dbg(fmt, ...) \ - pr_debug("%s (%d): " fmt, current->comm, current->pid, ##__VA_ARGS__) +#include "sframe_debug.h" + +struct sframe_fde_internal { + unsigned long func_addr; + u32 func_size; + u32 fda_off; + u32 fres_off; + u16 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; +}; =20 DEFINE_STATIC_SRCU(sframe_srcu); =20 +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_start, func_end; + struct sframe_fde_v3 _fde; + struct sframe_fda_v3 _fda; + unsigned char fde_pctype; + + 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_start =3D fde_addr + _fde.func_start_off; + func_end =3D func_start + _fde.func_size; + if (func_start < sec->text_start || func_end > sec->text_end) + return -EFAULT; + + fda_addr =3D sec->fres_start + _fde.fres_off; + if (fda_addr + sizeof(struct sframe_fda_v3) > sec->fres_end) + return -EFAULT; + unsafe_copy_from_user(&_fda, (void __user *)fda_addr, + sizeof(struct sframe_fda_v3), Efault); + + fde_pctype =3D SFRAME_V3_FDE_PCTYPE(_fda.info); + if (fde_pctype !=3D SFRAME_FDE_PCTYPE_INC && + fde_pctype !=3D SFRAME_FDE_PCTYPE_MASK) + return -EINVAL; + if (fde_pctype =3D=3D SFRAME_FDE_PCTYPE_MASK && !_fda.rep_size) + return -EINVAL; + if (_fda.fres_num > _fde.func_size) + return -EINVAL; + + fde->func_addr =3D func_start; + 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 -EINVAL; + + func_addr_low =3D func_addr; + + found =3D mid; + low =3D mid + 1; + } else { + if (func_addr > func_addr_high) + return -EINVAL; + + func_addr_high =3D func_addr; + + high =3D mid - 1; + } + } + + if (!found) + return -ENOENT; + + 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 -ENOENT; + + 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; + unsigned int fre_size; + u32 ip_off; + u8 info; + + addr_size =3D fre_type_to_size(fre_type); + if (!addr_size) + return -EINVAL; + + 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 >=3D fde->func_siz= e) || + (fde_pctype =3D=3D SFRAME_FDE_PCTYPE_MASK && ip_off >=3D fde->rep_siz= e)) + return -EINVAL; + + 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 -EINVAL; + fre_size =3D addr_size + 1 + (dataword_count * dataword_size); + + 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 -EINVAL; + + 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 -EINVAL; + + 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 -EINVAL; + + fre->size =3D fre_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 -EINVAL; + + 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; + void __user *sframe_start; + int ret; + + if (!mm) + return -EINVAL; + + guard(srcu)(&sframe_srcu); + + sec =3D mtree_load(&mm->sframe_mt, ip); + if (!sec) + return -ENOENT; + + sframe_start =3D (void __user *)sec->sframe_start; + scoped_user_read_access_size(sframe_start, + sec->sframe_end - sec->sframe_start, + Efault) { + ret =3D __find_fde(sec, ip, &fde); + if (!ret) + ret =3D __find_fre(sec, &fde, ip, frame); + } + + return ret; + +Efault: + return -EFAULT; +} + static void free_section(struct sframe_section *sec) { kfree(sec); @@ -32,6 +375,15 @@ static int sframe_read_header(struct sframe_section *se= c) struct sframe_header shdr; unsigned int num_fdes; =20 + /* SFrame V3 is only supported on 64-bit architectures */ + BUILD_BUG_ON(!IS_ENABLED(CONFIG_64BIT)); + + /* + * Unaligned access to 16/32-bit SFrame FRE fields and datawords + * using unsafe_get_user() via UNSAFE_GET_USER_INC() + */ + BUILD_BUG_ON(!IS_ENABLED(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)); + if (copy_from_user(&shdr, (void __user *)sec->sframe_start, sizeof(shdr))= ) { dbg("header usercopy failed\n"); return -EFAULT; @@ -122,8 +474,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 - 1, sec, GFP_KERNEL_ACCOUNT); 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 Sun May 24 20:33:24 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 30EC53EDE61; Thu, 21 May 2026 14:26: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=1779373584; cv=none; b=Fo4n8NVIhHTAz/bnT4p/lVDKAq34g70XM2VcCemm2kdC6PamNadNZzYZlFi6raYwLEtlAws+57iWPk4gvpmCqpZXahhhcLHwdV8MR9pq+7460e6Qw7uZ1zpyhFf/q1dLJ3dpw7+KWxct4T7VhvZOQ7xMXXJmPizJVLr36JVGbTg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779373584; c=relaxed/simple; bh=Wro/b6jYmgm7DDfIhqot8C8Ej0U9e1lJqurx/bCiZps=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Ayy5EPQDmji0uBepyPkTJkuWbKHL4hnsFAg5yA5OIY/a0WzG8jhiBPZFpXKvLJo6Qf11pqfKKIXbIIos8UWerqTvRRYIWTTX6S54Ct7d3yMdzb0hqnukF5z9gQQM1rJOJrGPX+w1Hpmzb4Job3RUi1cDrLXk5esx/1/6NKcX0pM= 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=iZeZjlWo; 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="iZeZjlWo" 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 64L1kP7S2907049; Thu, 21 May 2026 14:25:58 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=SmI34slVZs1BNH9m6 +m2YOZNt+zp/AB28hIWnnNMMn8=; b=iZeZjlWoa3xojRQ9GYDXflQBwFUAqq3KP PwrdPAAYWNnwxiHWuYpU5A0ZeySHLsEs8VwXeAdSd3Stinke4jbgo5e76MyX4Agu mozc/rVVPuTGwegRMLPPLdURfmfoGWj634slWKnmLjGWz8nFjC60znOPeKqszx6E 43SBHY1aFmHZ4fL2YvyfXq1o3oBoawTxeOcKdquFPQJq/oaBy6Cfdl3FUzRJwBYn DI+aPy0cTv8KfqZuf1c9UJecMNH/JD2Ijx2qI2IR6wGA0yLQ+3O9kkez90obtOdC URQTYg+uS7EqlkI4FiRNlSbBD+4HxZH4KvcP1qn3hAtMqwdMpJgnA== 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 4e6h8myd9t-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:56 +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 64LEO56P027486; Thu, 21 May 2026 14:25:55 GMT Received: from smtprelay07.fra02v.mail.ibm.com ([9.218.2.229]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4e739w4pew-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:55 +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 64LEPpqS47448364 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 21 May 2026 14:25:51 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 919A620040; Thu, 21 May 2026 14:25:51 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 3AA0B20049; Thu, 21 May 2026 14:25:51 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Thu, 21 May 2026 14:25:51 +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 v16 06/20] unwind_user/sframe: Detect .sframe sections in executables Date: Thu, 21 May 2026 16:25:32 +0200 Message-ID: <20260521142546.3908498-7-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260521142546.3908498-1-jremus@linux.ibm.com> References: <20260521142546.3908498-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-GUID: BXQPl9o_9hJlojKYzPjBMR-se2WqGftm X-Authority-Analysis: v=2.4 cv=GYMnWwXL c=1 sm=1 tr=0 ts=6a0f15f5 cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==: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=eNuN5pRUQDBy6NUwPKcA:9 a=2JgSa4NbpEOStq-L5dxp:22 X-Proofpoint-ORIG-GUID: l9IPRIG7Wx9EHFafGw2nEDMxjUpnlYg9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTIxMDE0MiBTYWx0ZWRfX7G3DLMzxR02p juBaGJ9UnhbR11PxgAq77UYKxICjNn9Bkz5kgWYIHO5o9QUgP+HOS3nSHsis4WpHkk+U8+LjCPU tHxmmejAbCHLoBzLgAXfE3q5ruren8okSHXrUcGCY/pFnw8Fs4HsY66QPIfEpe8V/1Aqnqy+F0p Zv6IZbXjOPGADi1TxPN7TAh9N4C+XJQdSSMtJWKDbcYbE1665cbc+jEKOFObXwrHCMtRpl6Agiw HfAqD1NaRfE5iSqruKcHYjgz6V8zJnkv11g3Zuo9tiQwgKiGllH4sHY5Oj4TJQ6L/cpGdtMRhTE Yos8nAUr75yuxIExbXCZ0SmrJxIhH/2lZOrrUZrMkEVlmLUhuFP06rXDnlet8MQSO+b1zrF106d 63ejUjr73QcXxcpUeuG7NZBGmB0Z1Z9MvHE8mpDJQ0+8QW8tW0zXZbJJYbXB3fPJ87PEegZPssw LClfBuW9WvSWSlfadBg== 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-21_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 malwarescore=0 lowpriorityscore=0 priorityscore=1501 bulkscore=0 adultscore=0 suspectscore=0 spamscore=0 clxscore=1015 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605210142 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 --- Notes (jremus): Changes in v15: - Only add sframe for text that is PT_LOAD in addition to PF_X. (Sashiko AI) 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..980a9f229cd1 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 && eppnt->p_type =3D=3D PT_LOAD) + 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_ppnt->p_type =3D=3D PT_LOAD) + 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 Sun May 24 20:33:24 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 9620B3DE451; Thu, 21 May 2026 14:26: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=1779373584; cv=none; b=r8RqMWGqk94v1CVje9jWYdJsBE+4xO3/RfbBcPmt2FL+mcM/AW+UL392APJrXW3guWlsQ8SZ2JvMSfErgMCk05BiGOBz8e0cjAnCO+LFA6gSmA6C7dwuG1KsOTKbIfcExqjg9gTmzBf7cGbc+tJa4/+yne1khsxM5BOijL7jryU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779373584; c=relaxed/simple; bh=VglWC5QjBmwSCIAAVXJjNHx/C67wfgsvPJQGG5CiALo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tXLagwUWInezU/45q9U5Z8ZeG2MyNmgpprkwPUbbv0FLMzDAi36Su6A8TtmJx/0M+dNk5B9MDiFw9B1DLeYMWpa7MPPeJc9P98Q36QclufhkT1ViSHpBQm22l4a0C7TL9BVKj5gOscEH8z/5em31IXd1tpf1YOy5Pil8PzCEwTQ= 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=PzSTxvG+; 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="PzSTxvG+" 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 64L1b1mX3214577; Thu, 21 May 2026 14:25:57 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=PzSTxvG+zUJDfQtYO+5eJd2RxQRLxrGHk aCqFN8j4BX82bfbkRYglMyk+YSagOt60WoqzGUC+R7JP+3Pf8U8bqc9QadYo8sAJ mW3Q8HrDn5VzZHj9THwNzllG5dykmHxRLClGb/k55A4e+CW1SKVNtUX6i5VpSx+8 6lbuI78S7S1v4/btgl41KYl1WXlWEheHcuZ464UaIY/JHsLdWLFTDhfmE7qMFcKA rqkZF7i20Y96TTrB3GNhyDj8RTDRSwSEVRdSymkm/bZZ2G4wlouoOmVQoxQuHoHn M4DH5GU2JMbt3bd9w6nY1NrxQ75hyCKlNgXOSV/86slYpxj6+cs3A== 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 4e6hawe824-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:56 +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 64LEO6Om017119; Thu, 21 May 2026 14:25:55 GMT Received: from smtprelay02.fra02v.mail.ibm.com ([9.218.2.226]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4e73wkcjcs-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:55 +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 64LEPqUR50856384 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 21 May 2026 14:25:52 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id EEDAA20040; Thu, 21 May 2026 14:25:51 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 978382004B; Thu, 21 May 2026 14:25:51 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Thu, 21 May 2026 14:25:51 +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 v16 07/20] unwind_user/sframe: Wire up unwind_user to sframe Date: Thu, 21 May 2026 16:25:33 +0200 Message-ID: <20260521142546.3908498-8-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260521142546.3908498-1-jremus@linux.ibm.com> References: <20260521142546.3908498-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: AW1haW4tMjYwNTIxMDE0MiBTYWx0ZWRfX5cPz7+SzHrWN Nxa7dM704y2kOk5lq7rrcEsCKbESVqbyYtqZpBAu4I8a2PqfJ1uveZNer4IgFy3C0h+3zkBLic0 p8lh+krGSSDnDYHU59kuRFnpxLjCcrtNVInJYGDD3HEItNGdFjt4V5IO/4OtgnlNqlGiP3d1iID WLspnHGIz7PMORn8F+9hLFHglqsBJOCN0qRSbmJjtjLQzL7Nbx+4B3YyqXqzUkFMmighMJU/POf O2VGUukVwoWc3HYDQ26DzgKZewmQSoZGwwy4+8dGoP/4MRxfsgjHrMdbjJpMSz4GhHrQNZgmhgG sMUT1k5lvwL+62YcMY1ocnxoQanzju/vhcqOghkGFythwnE/oWZV0YizMPWuY/u4qXaE4Afpn3b ojK+Ib3/ZdicKajF5ipovweyCo/HgEiZEFikT5JelpoS6ECfcr5WzK5LePSTd75gswl2NMFblOa FUxRXHu1nPSeb2Usj8w== X-Authority-Analysis: v=2.4 cv=Np/htcdJ c=1 sm=1 tr=0 ts=6a0f15f5 cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==: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=ItKwCHsCKAUqeRWvWoIA:9 a=2JgSa4NbpEOStq-L5dxp:22 X-Proofpoint-ORIG-GUID: erpxgp4-yIAbyBSFs8dWTTSRpqokbHrh X-Proofpoint-GUID: y6XOmu7WISs7NQ9XdEa_-tlGoDw_v9-g 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-21_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 spamscore=0 clxscore=1015 priorityscore=1501 impostorscore=0 lowpriorityscore=0 suspectscore=0 adultscore=0 phishscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605210142 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 Sun May 24 20:33:24 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 250F03E1695; Thu, 21 May 2026 14:26:42 +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=1779373603; cv=none; b=nKC44YKWh0jtfr53o3PTVSyQZn3GP08P/km+Aw+A2wyPFmgFWvcKRrpyLymynzGXhhtkGaADfxEO047988Cb9p+/y6kSPeU6xkRqmFqF5uR6szzEQdMRIW04XfdYZIaa2ap6xwO45rfpxdSjldFd/86SdjmEku4l5r5OxjE9Wak= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779373603; c=relaxed/simple; bh=lnqUBHPpzXbWDkV21nilebs+kDCcwN10JV8SRrKWPOs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KEk+MS5mOSFZPwXjI8GCPshs9uwGLEahyTdeDicajcBA9qtQsJSFqgb7DlKvAKzJA6PnCPnxMXus7YcNkOaBIvRZyTkF8S1slp95V2Aok5ZJycAoIqlubVJYGl7t0TLLg7N7Uhp8G1RKL/Kzn9uwSD4Uum9YGtKLgT6al8QDo6o= 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=j4Du8KgI; 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="j4Du8KgI" 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 64LBVPOJ271835; Thu, 21 May 2026 14:25:58 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=j4Du8KgIApJgAohv8CFRqcAykYsTymGs7 N/XLg32AAbJC+mQmMqdAcFkxRj6zomQbHS3SVt4G0agihIzaEMhaxM6xg0QSLC5v mikLELCp3PrnQe1T3tZ+JCfhp3UgGWQ7dTxOQc79sNI/iCQ9j8MV4QrfB3msMhwf MIjZBzjyW7yThlAnL7F6PZYj7dWKipQOvzUxO4dzsia0dxuq0nJql8qwWUUWqoqd sifPRWl/3KPLs3nPa68zb9LiO5nKJfm0h0/6t3bcuC22fjk6n2rT5o0KNYLEIA6O f348nae+GpZOxkwKOc9yOoAeCZC3LtrJw+KsgGSovyt4DSgOL0iUQ== 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 4e6h757dqe-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:57 +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 64LEO92l001746; Thu, 21 May 2026 14:25:56 GMT Received: from smtprelay02.fra02v.mail.ibm.com ([9.218.2.226]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4e72wqcst0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:55 +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 64LEPq4T45678870 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 21 May 2026 14:25:52 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 55C8920040; Thu, 21 May 2026 14:25:52 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 002AD20049; Thu, 21 May 2026 14:25:52 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Thu, 21 May 2026 14:25:51 +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 v16 08/20] unwind_user: Stop when reaching an outermost frame Date: Thu, 21 May 2026 16:25:34 +0200 Message-ID: <20260521142546.3908498-9-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260521142546.3908498-1-jremus@linux.ibm.com> References: <20260521142546.3908498-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=ffCdDUQF c=1 sm=1 tr=0 ts=6a0f15f5 cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==: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-ORIG-GUID: fUfePOnfi9_oEKj4Abvipy8o3-nPleKs X-Proofpoint-GUID: c8elz6F9YYxRXonNj5nq1kxFANaA4Iy3 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTIxMDE0MiBTYWx0ZWRfX6N2qZycI2BBT jLDodVQXz80U+52pLCZg+xmQAY7Ow54WWQdZJSDAhgkmx06upvMLkZwcaApQt53aW+Io6peTD3Z 81I0CRQmOPlgvFLHpAgYYsMHPrfSZQJJ3IYakPW5fjsW2I1SWx6yAOnmv7rB7WVqWMaxtBltwPZ EXQwF1GQxWx6JIckdTQJlHZhF5gYU+QlcrScerf+JVVewo2+nBOXNFDhHVlavkPQadyE5XF6+iT ZDkM+Pidu8gUtfbSJlC1a1S3IQhLzcW13losOWp8JWXIwzx2jF2OSsV/eI7+cqny6nmOO8g56fR YZijlyIYV5ZArd1SdT6tBkr7g+0LnXNncEqtBHNGwpgrqrhqh1NJlLAxFo52OTtp/FjrxO0LIYP 6HOc+PV2I14kVXZemJ9lvpxlWyBD2DbyEDmjJXkJKd8u4vjA3oeiBg+88eV71u8s0anv4nhMoL3 cBIi0jv8QOnf0Q6VA2w== 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-21_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 spamscore=0 phishscore=0 suspectscore=0 adultscore=0 clxscore=1015 impostorscore=0 lowpriorityscore=0 bulkscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605210142 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 Sun May 24 20:33:24 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 B85233F4DDB; Thu, 21 May 2026 14:26:27 +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=1779373590; cv=none; b=Z/CDP4P4tQzGw0IsHQHhTjf8eC5dDdk9vGFqx9YLYergRoPTm2UHgkCg1157Ahr0KQY7S8GFjd0uRt0oqTjr9xVpfz34t2xFMlwqpFU+mRTPABXWUPt6u84Qw/lJ70swkYAV7PMU0ByxaKJkfuWDpUe0/D6IbgIH8lpBdYyg4sM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779373590; c=relaxed/simple; bh=8sU6dng2VpH5BI9Fg+BdbA7UQfT9/7ylu864IlNGg0I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QmQy+3jyZViiLvtXAa65a06cYvmiPztWdN47c+RmQyN2vOkX6WepZE/nzTCzkhuA2VjMjW9eJb7OucsWH30U03xR5fi82QtJvrcXu8oSKgERT8WqVAYgY9Xd2uFsimHDwx47Wp4rkqrJUczezkehtyvblHNGgiXV6NSZtty42gs= 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=cxSEsK2R; 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="cxSEsK2R" 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 64L56Khr069859; Thu, 21 May 2026 14:25:58 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=ZOI+endUXTAW/hiF8 xST2Onr+K2NDqLcMTY3E9gHalc=; b=cxSEsK2Rq8pv0nfKEUhpLknSYTXA+4ddy V8+e4s4ccwzeYtjKbBF7YtBNtzaa8lkUrDsynV7JGU6oNX1O5MkysGgp8v2W/MyY 2qulRMUXTpo3b0DfG8et47Y+opqk9CJC7/o2OpGF3LkgYDBMYQq3McYSqkAvZK0A 9c/ArtQNA7k/rGp8pB5U13eczh3Cv1ggbpTsAs3JoKfQzUCDKgzBIGtoHoewvBvR F1GMVJwh3EtaoOwEIWlypg05LkHMDLGEB46klGIdAzER3LMjvL81xDFcnjQrIqu+ EFpNKohy1KkrA5nqJS7ew+7SZMCmnoXvXtDQjfw+NqUFL3il5Itnw== 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 4e6h8myd9v-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:57 +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 64LEO5Oq002166; Thu, 21 May 2026 14:25:56 GMT Received: from smtprelay02.fra02v.mail.ibm.com ([9.218.2.226]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4e754gmbhr-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:56 +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 64LEPqTC45678874 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 21 May 2026 14:25:52 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B023520049; Thu, 21 May 2026 14:25:52 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5ABBA2004B; Thu, 21 May 2026 14:25:52 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Thu, 21 May 2026 14:25:52 +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 v16 09/20] unwind_user/sframe: Add support for outermost frame indication Date: Thu, 21 May 2026 16:25:35 +0200 Message-ID: <20260521142546.3908498-10-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260521142546.3908498-1-jremus@linux.ibm.com> References: <20260521142546.3908498-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-GUID: 7rCW1Kl3JiSQvbDTjkeDjn_xdyYqbIvC X-Authority-Analysis: v=2.4 cv=GYMnWwXL c=1 sm=1 tr=0 ts=6a0f15f6 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=pGLkceISAAAA:8 a=VnNF1IyMAAAA:8 a=U72JrVpwKSe1qDC-WCIA:9 X-Proofpoint-ORIG-GUID: 6oi19XfIJtW8o8a5alhlhnDu9LdS-yia X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTIxMDE0MiBTYWx0ZWRfX+FQqoPmuqXsx spCH1rZ3/2BhMfree/aFtSJg3/02POcjFlCrrjiN0okatgPjd28Aeh3lymXLoDeWa+wtRSmOJcM I/EtAEa5ooi4R1zT4zKnIraBpiliFKoLGy/ADAq10WPQVulIhzdtF6nNG15bhdcoSk8b9+YLVQE Mw9OHusxDuB75oNGcBCOq5cHhmJ1f+VHBh/YhT4g4KLUC9FM7VtUtCkUkKSbQqY9tsl0ZSCKK7f xmkI0JOHIlFM2+4pDdULWxFDr2IwGa/FZU6EQotKYZh6+lagDGWe1fm5gfgpqxiROOzTrTXybLJ HUzvDUEc+hevIctj4eKTSAp2P1l6GFj8DuHsSm8xh2/4YLrSyPidA3VIG2cg5k3Qitn9nSaCcXG jGzkUPOpILjCHE+0QitaRHCBKjMS3jX7yYRgRc36dGgLUx9DjINpAvRtTcsgoWzSq/Mc0tGC9pw 6AOOqClSEssxylHmfSA== 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-21_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 malwarescore=0 lowpriorityscore=0 priorityscore=1501 bulkscore=0 adultscore=0 suspectscore=0 spamscore=0 clxscore=1015 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605210142 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 2de29c836f6b..41ece3ca62a1 100644 --- a/kernel/unwind/sframe.c +++ b/kernel/unwind/sframe.c @@ -231,7 +231,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 -EINVAL; fre_size =3D addr_size + 1 + (dataword_count * dataword_size); =20 @@ -242,6 +242,17 @@ static __always_inline int __read_fre(struct sframe_se= ction *sec, if (fde_type !=3D SFRAME_FDE_TYPE_DEFAULT) return -EINVAL; =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 @@ -262,6 +273,7 @@ static __always_inline int __read_fre(struct sframe_sec= tion *sec, if (dataword_count) return -EINVAL; =20 +done: fre->size =3D fre_size; fre->ip_off =3D ip_off; fre->cfa_off =3D cfa_off; @@ -328,6 +340,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 Sun May 24 20:33:24 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 5A9C53F0746; Thu, 21 May 2026 14:26:25 +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=1779373587; cv=none; b=GZo33IuqjAtL1wd7MtVv6V2dYPtw/J7TJghRY1GRrw0ePu6nhLtIhVr9nhbSL6oq+cUPRM27NNYDgLK7XEQWLcTKZayzHrieHDNQFloFWou0vRvqes3HeiRaALNrbnXhl07L5Us4j2XcZ3Zuv9wCQvEZxHmE/CpBXNPoqmdz+94= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779373587; c=relaxed/simple; bh=hCINMaJDj7DdoNxUYM6s6ApHXzn9LGNe4xtm80Mux+0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=h419NMABrbTEbSimWB7GDQGbB60fVfHEeszLJ73uu6eiDZwANODxBxei6DGarxn7qAOikebBkjUCoJ4jJCF6M30uxa0EHxJ7941aHTpQdXR0rEL5w7UAE22KL5rvETleluA/RkoG6Y4DvPLeACvE/6FbqBUhEUPJiHrlCGuQhC0= 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=KXiwd8eI; 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="KXiwd8eI" 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 64L3Sedp3907161; Thu, 21 May 2026 14:25:58 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=Jllwd3IYu88g5M0bX d8eQQThFlgyU/4CLxomaWScev4=; b=KXiwd8eIpi+PCPdzIKhYx1dhvbjNizdNs j2PtIbsXFMXpibMHMcXUcodPo4AwZ6hH7mg4UIZDjjBqNmIhZVlb+jAwgdoHLAlx nHHw15HDLkGzRs+s79+oA3+c8lyGr9mdiWKjRCG/Uy01N5kjcFr2ve3QwXk3ShLu jNllobYArrhrkv3dMDQUuWptZmxqtcEuiqPKxYAbmeIBYh05OXXazEJWLqz0th+o Iw9C/QofyE5oI7bkBMicamLYunfDtxmFOqj1/RBMMcCdyjRfHmfGLuIippOlGocJ kkHgNQGX3S1yQ3NfvneHdurDgzdnWx51vpCrxckA0uwoZESlKMcTg== 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 4e6hb8p5ry-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:57 +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 64LEODcN027545; Thu, 21 May 2026 14:25:56 GMT Received: from smtprelay03.fra02v.mail.ibm.com ([9.218.2.224]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4e739w4pey-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:56 +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 64LEPrrM57278946 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 21 May 2026 14:25:53 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 18FF120049; Thu, 21 May 2026 14:25:53 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B586120040; Thu, 21 May 2026 14:25:52 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Thu, 21 May 2026 14:25:52 +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 v16 10/20] unwind_user/sframe: Remove .sframe section on detected corruption Date: Thu, 21 May 2026 16:25:36 +0200 Message-ID: <20260521142546.3908498-11-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260521142546.3908498-1-jremus@linux.ibm.com> References: <20260521142546.3908498-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: AW1haW4tMjYwNTIxMDE0MiBTYWx0ZWRfX5Cb9SNjh14zV CLa3w/v/zIcsC358NYpHV7oe41D+S35qEgs/fiIYo7k3IxWQQD3j+Nb56SExE/70gCmw6AIRrvK sBXLd3/Oup55nFRYOQ5rz9fEfCCds3b1+NSk6UXvwuPy/t5KO1qan2jOYXpc5yaBzxWBF7jmbl2 rit11+e4j8jSDSZAl5vVnldt5Q9yX5FvWZV+RW1vtQy5i72HrCtzlaf9XP1ESoKqbLUdWgq4r9g u/d7fPKXnGzDF+Ql3IgLdWCM1nD+qqMCCBTEkRrdOOHYQOeC1j/x/KQMjpRms2lWhKUVycAquqp 53XF2HZ3mtlMViozEINL9rG2nEuCrJt9OhZpC27FAsoqi8wUCyU9mkgGEl0kiwmHPUwvyZAz2m+ FPH1KwpW2IT2pOXJ/fXnkwC0Vy+uJtw2Z8AeTBWVCa+xRIjl7tV9ouqET1wLYvVIvMlUiVoREi+ zXY88qfywmdsoq07W5A== X-Proofpoint-GUID: Fx4VTBMqCayqEJuwq0j-4rAKT7n5LpoY X-Proofpoint-ORIG-GUID: Q54U5td7LPxOfnBGczdYla305bi7dNFy X-Authority-Analysis: v=2.4 cv=aYBRWxot c=1 sm=1 tr=0 ts=6a0f15f6 cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=NGcC8JguVDcA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=VwQbUJbxAAAA:8 a=meVymXHHAAAA:8 a=pGLkceISAAAA:8 a=VnNF1IyMAAAA:8 a=yLRsOmMQGpVHI0ogWx0A: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-21_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 adultscore=0 bulkscore=0 suspectscore=0 lowpriorityscore=0 clxscore=1015 spamscore=0 phishscore=0 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605210142 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 --- Notes (jremus): Changes in v15: - sframe_find(): Align to normalized error code usage and remove .sframe for all but ENOENT. Also remove if user_read_access_begin() fails. kernel/unwind/sframe.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/kernel/unwind/sframe.c b/kernel/unwind/sframe.c index 41ece3ca62a1..e0eb2adf5a07 100644 --- a/kernel/unwind/sframe.c +++ b/kernel/unwind/sframe.c @@ -371,10 +371,15 @@ int sframe_find(unsigned long ip, struct unwind_user_= frame *frame) ret =3D __find_fre(sec, &fde, ip, frame); } =20 +end: + if (ret && ret !=3D -ENOENT) + WARN_ON_ONCE(sframe_remove_section(sec->sframe_start)); + return ret; =20 Efault: - return -EFAULT; + ret =3D -EFAULT; + goto end; } =20 static void free_section(struct sframe_section *sec) --=20 2.51.0 From nobody Sun May 24 20:33:24 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 5A8693EFD1F; Thu, 21 May 2026 14:26:25 +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=1779373587; cv=none; b=T0dErNKDNXE38PfKtO9o/yHRng8X5vfBJwEUlXBjMIqrFCnixnvtH5tKQ+Az2hBdRnKC3Yd0H6CfbKkevQaUIGJ6GL6FY/2kOTvijcBqQFfPCQIcRnT7O3K0NfrjpT/205BEAVTd4jiEb0vcc0J0WOZcceHaCv0ubedN1cP6DiQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779373587; c=relaxed/simple; bh=TWEk6F3RaiWrCJ2RrQpM4xeDIdxImbLTUtoFLQ6Ucuk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ue15IqAwThiuf2khR0jhP9N/LslpRw02pVUXRA+aYp2jkFe0yZNyALWC4dfg9xznn9zQmEMnIz9W7K+frT6VlaraYtXhpXWZylFh3wPdPshkVT3FRPSZdoVJDMEXC5jqpuGuMdQsRk18Cb3E55hfQSfsBwRJABQ3d7EtXITeITQ= 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=Zd5Rh94G; 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="Zd5Rh94G" 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 64L1SiTa811826; Thu, 21 May 2026 14:25:58 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=RJbYLbBCunARAkexC BPIaYfKkGr0g5Hp8xsvdMvOuGE=; b=Zd5Rh94G9FCHJnhpZV0UgyKUGJItK+Qj4 O1TmsLPKDat0LuPY2lpo3uhjWdjSBQL6KPAdPxIsIjR1zAK6BM4wZtqCwKqffeZN AnRLrwra7O5qL6wxIYxUxQb8QTn32xzeZ10MAuBpRw0QrerLkITdvdqewkLULdyi LU+f7Zk29HC+Jwu07u/3Y6eqlPSGhqJh3kJvkCRQ3I+02PTQO0oaXWLNMSN5V9Ar u2LHDsFWr0IwMHWbs1y/4WWroa4QewvE5ApmqM3ygldhbDgNSm2CUhtdoO6gWwHu 6jptL//dU6SgtM0HV9EtSaIPPrRfGg+YGE/eKr85Z+dxcoGWvzccQ== 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 4e6h88p6fn-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:57 +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 64LEOCmd031749; Thu, 21 May 2026 14:25:57 GMT Received: from smtprelay03.fra02v.mail.ibm.com ([9.218.2.224]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4e74dhvg7e-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:57 +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 64LEPrFl51118430 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 21 May 2026 14:25:53 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7D99D2004D; Thu, 21 May 2026 14:25:53 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1E2EC2004B; Thu, 21 May 2026 14:25:53 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Thu, 21 May 2026 14:25:53 +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 v16 11/20] unwind_user/sframe: Show file name in debug output Date: Thu, 21 May 2026 16:25:37 +0200 Message-ID: <20260521142546.3908498-12-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260521142546.3908498-1-jremus@linux.ibm.com> References: <20260521142546.3908498-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: OG6_1GvXnp9XCYBYePjMSPCRFU8PQ7o9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTIxMDE0MiBTYWx0ZWRfX7alz74T3v5dF MizONbWUXel8uRV5y7xi7S0CKnUqNuA8/0XW7woDrzT3AJjJfglEBJ84+YyDXc3rrD+r96iMFLV cI6i4aENuRYKdfPHwl0vqnPO6N5kARzC1dXlSQbdqJvHjXPUwgzay14W9QTRNJX3O3fbIU+/bfV 7cKGYWjMjJEY3fktrh/5R1HS9Wh4V0EmwPCr/1n2E1+KNiGYpPnmViLc6JyNwLqnnY2ZdJLFfyF xyJp/il0OQNrubRgjM3LnsFzmcrKNdc7uOJblw5e8nFYmvhlBoTF08NY8RLChp8TKFt/BUrztzi brNxseVz5Dta7DuGFI4U4uLz6yAyMshk9ty+p1XX7WDT85jdBVtLwwTCG2ZGgugxQFKNRigZqNQ 0UBG47CF2XD/mp+fR5rSC5wFPtkYowbK6xlmi4O8xfWD8pU7xaqrJWFLVGmzyniTym/3jnAzZPH MbFLejO1z0FOoXHqg9Q== X-Proofpoint-GUID: qquEerBesUTiIF3hcpHY_IsFPH1JTuMj X-Authority-Analysis: v=2.4 cv=apyCzyZV c=1 sm=1 tr=0 ts=6a0f15f6 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=ySwrbc1SU130mKywBQUA: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-21_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 lowpriorityscore=0 priorityscore=1501 impostorscore=0 bulkscore=0 suspectscore=0 adultscore=0 spamscore=0 phishscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605210142 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 v15: - Use GFP_KERNEL_ACCOUNT instead of GFP_KERNEL (see memory-allocation.rst, section "Get Free Page flags"). (Sashiko AI) =20 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 e0eb2adf5a07..2cfa274cd8dc 100644 --- a/kernel/unwind/sframe.c +++ b/kernel/unwind/sframe.c @@ -372,8 +372,10 @@ int sframe_find(unsigned long ip, struct unwind_user_f= rame *frame) } =20 end: - if (ret && ret !=3D -ENOENT) + if (ret && ret !=3D -ENOENT) { + dbg_sec("removing bad .sframe section\n"); WARN_ON_ONCE(sframe_remove_section(sec->sframe_start)); + } =20 return ret; =20 @@ -384,6 +386,7 @@ int sframe_find(unsigned long ip, struct unwind_user_fr= ame *frame) =20 static void free_section(struct sframe_section *sec) { + dbg_free(sec); kfree(sec); } =20 @@ -403,7 +406,7 @@ static int sframe_read_header(struct sframe_section *se= c) BUILD_BUG_ON(!IS_ENABLED(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)); =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 @@ -412,18 +415,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 @@ -435,7 +438,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 @@ -491,6 +494,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); @@ -500,8 +505,8 @@ int sframe_add_section(unsigned long sframe_start, unsi= gned long sframe_end, ret =3D mtree_insert_range(sframe_mt, sec->text_start, sec->text_end - 1, sec, GFP_KERNEL_ACCOUNT); 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 @@ -523,7 +528,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..a63e75cccc70 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_ACCOUNT); + else if (vma->vm_file) + sec->filename =3D kstrdup_quotable_file(vma->vm_file, GFP_KERNEL_ACCOUNT= ); + else if (vma->vm_ops && vma->vm_ops->name) + sec->filename =3D kstrdup(vma->vm_ops->name(vma), GFP_KERNEL_ACCOUNT); + else if (arch_vma_name(vma)) + sec->filename =3D kstrdup(arch_vma_name(vma), GFP_KERNEL_ACCOUNT); + else if (!vma->vm_mm) + sec->filename =3D kstrdup("(vdso)", GFP_KERNEL_ACCOUNT); + else + sec->filename =3D kstrdup("(anonymous)", GFP_KERNEL_ACCOUNT); +} + +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 Sun May 24 20:33:24 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 47C703F1654; Thu, 21 May 2026 14:26:26 +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=1779373588; cv=none; b=JINyHvRdLV3ocFMu0m8Nbb8GDt4gmGhLVAnfoAFWLOE5DmQpSlg/oMUGExh7P76sghZHNkSdoTHFzce6wL3tX2U8cj6sBj5+rUBJJHEXsCpPG+EzZ92zf5XmvEoJ27HgvnVfMra1vsKavJmbSbjbqwoEfjaGD3J5lJyQGfNpB24= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779373588; c=relaxed/simple; bh=K7j7s1hKGT9orYnSjhuHJEtDs4VO1OrMDU45eK9W8kM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PKcKMo9C8Yt50eihV6zZyDik/q2xrWGBcNTy5KjNpcEum81aNR9132Yz9lk69TwWPidfFhFAJDh+cvGQGyl75Dx3tFFwiX0MRuIGhCAr5TpoWfE7dh7xkga3aNPxSZO46Rhm+k+t8fkfcT461KBGe869jvipy/dhmo0IrHH0Cmo= 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=YtVgdokE; 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="YtVgdokE" 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 64L5YUGO220135; Thu, 21 May 2026 14:25:59 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=dlatXtmLcK/YWpio4 LvTurctcguDyO2LElxStpBPkjI=; b=YtVgdokErE214+LMLt8M9j4TDpgG5P1R0 UJzMWT/nGjHdLIMDpeWlGYO2V9E+2Xm32CBGHiJjsN/hRTdOFN58BC8Sb44dWv+L 0y+F+pg7US6Jr9rIohwA/TxC3wmcIHzDc7WlSPXbmFixWc65sVgwbwmoSjws67cm xRtcV6klyEyYlH1VYuQpxJ9a2Bf7ZMlX4Zx3JTI49ZGl3pqtVwlXFJ0sqho3F/e0 uR0crHW+NtDeJTg0T8WOdTcpeZy7PRJMXeq79XFbc/7ygaj4nKnAznsOlR97OKV6 zG1xuxVG5uWaOW/u4fAZXHlW+F7glUdEa/Y6IfRYlFx09iuwdTg/g== 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 4e6h9y7grj-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:58 +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 64LEO7Ao002174; Thu, 21 May 2026 14:25:57 GMT Received: from smtprelay03.fra02v.mail.ibm.com ([9.218.2.224]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4e754gmbhs-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:57 +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 64LEPrUh47579558 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 21 May 2026 14:25:54 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id D9DCD20040; Thu, 21 May 2026 14:25:53 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 82C452004E; Thu, 21 May 2026 14:25:53 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Thu, 21 May 2026 14:25:53 +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 v16 12/20] unwind_user/sframe: Add .sframe validation option Date: Thu, 21 May 2026 16:25:38 +0200 Message-ID: <20260521142546.3908498-13-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260521142546.3908498-1-jremus@linux.ibm.com> References: <20260521142546.3908498-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: AW1haW4tMjYwNTIxMDE0MiBTYWx0ZWRfX75JMwD44D9po Tc2RJGNzA99v0U34GDmAJZcsfdGsiEbNz28O6pUZx4vtcRt6344OlxoXzCtSJ9bIZdlVgyDD4to c9rV6vBbT+cqsHTY9/vgTmryhGeZ0Vd1SdKqSPAdHX0AEvVaMzhO28w581fS771GtdaRlNd27FO xGr+hY2oMYn9ju5VMf7ZmYRI3XlQXUCFVe+9D5n+Vnj+9lgHV388nRVqs7uTo4UKLNnoYJXJs4a j6eoeP/s5u1U0AtLegph1nlAjjq9aFnNz+YHRuryRLw/VwF0SfRKdJpgiVUionX1uEjIMGkehvF D06F5G13u6UJ+LsvjBcpjcFwpTEPMx7ziYP602PI0+REPIYKeNflVrN8oysnXZUcv9Us0MJPbix zT7CBmXsz4Xi5oW/G+SZ7nvSPSEYg8PMNxAUdXIs6Dy2FnkjrFFxmI1lcjlI1VToOYIS36yqTb1 KNYgYFDCotEXo+YPTWQ== X-Authority-Analysis: v=2.4 cv=BNuDalQG c=1 sm=1 tr=0 ts=6a0f15f7 cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==: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=RXKZOtKmAAAA:8 a=iNKnMr3YqTL5pEm6fAYA:9 a=2JgSa4NbpEOStq-L5dxp:22 a=UFF3uGjEBZWolfm0k6KQ:22 X-Proofpoint-ORIG-GUID: sacPi_ffize2HNJD9Ulb5EI3vTRjMch- X-Proofpoint-GUID: 2kWA44K5Xjeos5_bgX_8kSIVrC6qCLZb 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-21_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 priorityscore=1501 malwarescore=0 impostorscore=0 suspectscore=0 lowpriorityscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605210142 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 v16: - sframe_validate_section(): Allow for a FDE[0] function start address of zero. (Sashiko AI) - sframe_validate_section(): Replace alternation between two FREs with simpler logic used for FDE and use a prev_ip_off. =20 Changes in v15: - sframe_validate_section(): Fix format specifier for number of FREs in debug message. (Sashiko AI) - Normalize error code usage (.sframe is removed for all but ENOENT): ENOENT: No sframe or no FDE for IP found (FDE found but no FRE is EINVAL) EFAULT: Bad address EINVAL: Invalid input or sframe =20 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 | 92 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 111 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 2cfa274cd8dc..e6d66ae8e7ac 100644 --- a/kernel/unwind/sframe.c +++ b/kernel/unwind/sframe.c @@ -384,6 +384,94 @@ int sframe_find(unsigned long ip, struct unwind_user_f= rame *frame) goto end; } =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) +{ + struct sframe_fde_internal fde; + unsigned long prev_func_addr; + unsigned int i; + + for (i =3D 0; i < sec->num_fdes; i++) { + struct sframe_fre_internal fre; + unsigned long fre_addr; + u32 prev_ip_off; + 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; + } + + if (i && fde.func_addr <=3D prev_func_addr) { + dbg_sec("FDE %u not sorted\n", i); + return -EINVAL; + } + prev_func_addr =3D fde.func_addr; + + fre_addr =3D sec->fres_start + fde.fres_off; + for (j =3D 0; j < fde.fres_num; j++) { + 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:%u 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; + } + + if (j && fre.ip_off <=3D prev_ip_off) { + dbg_sec("FDE %u: FRE %u not sorted\n", i, j); + return -EINVAL; + } + prev_ip_off =3D fre.ip_off; + + fre_addr +=3D fre.size; + } + } + + 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); @@ -502,6 +590,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 - 1, sec, GFP_KERNEL_ACCOUNT); if (ret) { --=20 2.51.0 From nobody Sun May 24 20:33:24 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 F0264407CFE; Thu, 21 May 2026 14:26:45 +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=1779373607; cv=none; b=a/Fet3zvK9m5fQxIqY+J6BAhHd5IqNBR/K1JnGjJAosPRFUyqL4McCCkeNgWlF3AzbTbCl73lGjVNHpq/GzR0yun1bZ0oUf/SxnwymHqn7NfrmLIlN75N+cKSz/GZOrdzv4hB5E5oFgnIS2ddyIYLozDpL46J2ovrfvdD4VX97Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779373607; c=relaxed/simple; bh=kGNjjC6C+f+uGmlVEj/aSeixIT/e1bSybpI13YtquDc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gXj/NPuzwOFCbGBmt3amnZI+1zfDX46Wo9mzGatuEQqZnByX7D1XdfTeFtkwUUnGwXApS86dFgHBim8wuQ873g/72iQSXaT5Ein5hc61Id/O4EC9HasP/JfWeyJw2eDbys9UoqaBf6jtPimqYEU0Kj+NadFM92915pM6csGxu/c= 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=pUdm0lBP; 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="pUdm0lBP" 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 64L5K7gl3386862; Thu, 21 May 2026 14:25:59 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=tXpNIe7iOtik2FWOA aKIlzFM00E3KzCJxJoD0NRH//s=; b=pUdm0lBPLgSHbq0mC/1gqs3dP72iRCvTL KaUXSrsywK5Wj62x7TVnnWXnklmZ8CjBWXn6EHeR23PDoYMAD6fkwG51ms2ee/xn pvZ6BTZFLK6TH1GoATaPXtc3ijsaUQTeORkz8RUacrq7GVNizlJ8Zxq2Ny10z77o 0KJ861PXsednjzFlzip+r5JFWy1hnBP1SwgJgKsBZh4WOcNpCJLOjvew0VXNQ1is zUw8CQK5PQJ3nbzaot0RSx+JNCw5KcS7kV5rsb5ACQ6GpvRptS2CH/Y8v3lgUVI7 EmDv/MkJI5SXW9Yk/NKq9UYUxNik0SVuI1Pc/1XTEuzpfwg21GMjw== 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 4e6h757dqm-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:58 +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 64LEODZ1001765; Thu, 21 May 2026 14:25:57 GMT Received: from smtprelay04.fra02v.mail.ibm.com ([9.218.2.228]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4e72wqcst5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:57 +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 64LEPsdj13959518 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 21 May 2026 14:25:54 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 400DF20040; Thu, 21 May 2026 14:25:54 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id DED2F2004B; Thu, 21 May 2026 14:25:53 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Thu, 21 May 2026 14:25:53 +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 v16 13/20] unwind_user: Enable archs that pass RA in a register Date: Thu, 21 May 2026 16:25:39 +0200 Message-ID: <20260521142546.3908498-14-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260521142546.3908498-1-jremus@linux.ibm.com> References: <20260521142546.3908498-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=ffCdDUQF c=1 sm=1 tr=0 ts=6a0f15f7 cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=NGcC8JguVDcA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=pGLkceISAAAA:8 a=VnNF1IyMAAAA:8 a=c48flIb4C_QYATK_dV0A:9 X-Proofpoint-ORIG-GUID: TsRj1JK-9_NOcNAOrQ63hcnC1LYaBrQq X-Proofpoint-GUID: Gdy2mtPuOEojV51mMXhNIPimxaNVlX4F X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTIxMDE0MiBTYWx0ZWRfX3yjef41rB6Zq R5QuYeXLnQXPv5yOZJtgEzPNqCZoGljYuGOY2ZTi/xxP8a872DH9BJyBNOI46C81IrXvgyioPci +UgEhseJ/1XimuVL7sBjRH/fTUFCvRKjvlFGNF8nYFKJ/GSfkWEUsH4bOlgXtuxw+Ebp2KGgtUS McY1qXokwYq8O1P8MRbvvsUoxPjkA7rrQVGbcsZm7UveHaG6/9epJvFlA2xolz07Mg0XIsSi90M ojW51J/m1bNLhqB/gG6u5p0CmrCfTHWl1bgvgscjFKHeCq4mCOfFFjDo68cZj7WowXQ2Yi1buOv sDiNrk4R0mtK+wwujhdkOHuzm1EKG52ZStG1YByTEbvvhNfED1M2g3llRi3D+f0E6wWnywGZUFg j86oOUVHV+6/TnWjN0nbwnIS7PP8LPlKquYErnPn6f/VYMyoi5azRjus8cDXg9v0JDWZG9JN1Md yBMjriBPfVegPwClbQw== 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-21_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 spamscore=0 phishscore=0 suspectscore=0 adultscore=0 clxscore=1015 impostorscore=0 lowpriorityscore=0 bulkscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605210142 Content-Type: text/plain; charset="utf-8" Not all architectures/ABIs pass the return address (RA) on the stack on function entry, like x86-64 does due to its CALL instruction pushing the RA onto the stack. Architectures/ABIs, such as s390, also do not require the RA to be saved on the stack in the function prologue. In particular, the RA may never be saved to the stack at all, such as in leaf functions. Unwinding must therefore not assume the presence of a RA saved on stack for the topmost frame. 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 --- Notes (jremus): Changes in v15: - Define pr_fmt(). - unwind_user_get_ra_reg(): Use pr_debug_once() instead of WARN_ON_ONCE() to prevent user-triggered warning/panic. (Sashiko AI) - Reworded commit message. (Indu) include/linux/unwind_user.h | 10 ++++++++++ kernel/unwind/sframe.c | 6 ++---- kernel/unwind/user.c | 20 ++++++++++++++++---- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/include/linux/unwind_user.h b/include/linux/unwind_user.h index 64618618febd..7bf58f23aa64 100644 --- a/include/linux/unwind_user.h +++ b/include/linux/unwind_user.h @@ -23,6 +23,16 @@ 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) +{ + pr_debug_once("%s (%d): unwind_user_get_ra_reg() not implemented\n", + current->comm, current->pid); + 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 e6d66ae8e7ac..d573c2529926 100644 --- a/kernel/unwind/sframe.c +++ b/kernel/unwind/sframe.c @@ -257,10 +257,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 -EINVAL; - + 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..afa7c6f6d9b4 100644 --- a/kernel/unwind/user.c +++ b/kernel/unwind/user.c @@ -2,6 +2,9 @@ /* * Generic interfaces for unwinding user space */ + +#define pr_fmt(fmt) "unwind_user: " fmt + #include #include #include @@ -48,8 +51,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 +64,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 Sun May 24 20:33:24 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 9BBF13F4DC1; Thu, 21 May 2026 14:26:40 +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=1779373602; cv=none; b=sIvNOe/qYG6X8nbofPcr7ysdUr+tamo83n8jZ5wvSP69L9lmiptCwE9dIdzdkbR1C5+tX4ZO1xQfVVuKteto8B5Z/kwfpZrymQ2rOS6ISkI6jH4G62xpixn2UY9DDzm7QvTnAnrkV5EmkQLF8gFwLpMtwb5g/xQPOae+u0bHovI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779373602; c=relaxed/simple; bh=tBxgMRFW3oVzUEBCp759XnjpfbJFLS4xJYAL06NKQUk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SOb7vgbXPWyK3fKXwGHhjI7dN/W6IWMmNsA0oM+jWY7UTC3zAx79KXXKSAqutLWma0W3MLugm2PjoRLhzdjCjAqC89oKRhCikpTHE4zfnR3vi1Vvaj5Y/1fmLzZ3YFlCecaR+KYyr3fGPhQTuME8tu9xvdZ5u1jjN7zy6IhNGDY= 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=SVNyYgbV; 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="SVNyYgbV" 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 64L5oY1Q3690499; Thu, 21 May 2026 14:26:00 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=SclQrTXePMXj7pOgM rGu5ZG8CuomE2zXQeZd0Yj1oYM=; b=SVNyYgbVNRYm1RiQnbVu4eZFQazyWqMMA 5TuKAZxttyNW7eKheijtkk3r7032z3MG87n2ZHgZ1+/UKY5JXaYiXTxvQRJN5vMK MeERjEBSF9vGtWBB4CPdw35JafZSBGCsvFPRNrtSLrcaP/iM92ishqCgW7qaon4O dxdvMLtMu2/PFOcf49Lo/vSJuTvJGl5IIsQq0vz7sL/lK5vcba4p+AWoiwoAujyh VUuyzhOn3PRiLKk7UR/URuuh/h89kIZEt1X3BJlpPZKfddxB2H6T/D0XFg8DbUBy bhSX3D4Zg5cd2XwY3UGsDeRUu795LP5H2A21kemizfnL2Bs29ePIg== 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 4e6hawe82c-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:59 +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 64LEO7SC017127; Thu, 21 May 2026 14:25:58 GMT Received: from smtprelay04.fra02v.mail.ibm.com ([9.218.2.228]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4e73wkcjcx-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:58 +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 64LEPs7B13959524 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 21 May 2026 14:25:54 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A330A20040; Thu, 21 May 2026 14:25:54 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 453FC20049; Thu, 21 May 2026 14:25:54 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Thu, 21 May 2026 14:25:54 +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 v16 14/20] unwind_user: Flexible FP/RA recovery rules Date: Thu, 21 May 2026 16:25:40 +0200 Message-ID: <20260521142546.3908498-15-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260521142546.3908498-1-jremus@linux.ibm.com> References: <20260521142546.3908498-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: AW1haW4tMjYwNTIxMDE0MiBTYWx0ZWRfX7ZJUSBf+G3UK rKmL9YDYxs5kgr1rUEmOtySwt5fGtl4H3LXCqT81sm1MtfXPshvCW8iShgRzRGOmcbzU5TbmSRs ypiqn5cqLz+5t882EsSF/RgrA9IWe3qAYJ6Bey1rWWsZaPNcGF99G7ZtdSCFyrmSpiWjzIy8lGP xwPnNkk340J8pgifFHmkNHMc8tEwFvYKXzhUKAzFLZeQVijIsMmnQpcODCVLtRE66qEaeZZJyfg WHK6mpPltkhvjDp9CqetN7Acy0Utzy+xRLgc1Zcu6HoBXRCwZCFxGN4uZZbuMOfbFN7nyGzMMRk LEgQWE1fxvvzENmDwxj//aUmIc7f4iSWgFHVbukQ9J8r7x3fPiTUDFv3I1ybZ3MjyGzxWquVF6T LWsRxxV37be2QFffthDOvSdgAd9sw+qksVN8GQ9EWw6v+90nAcuEOfni783XRWa8JjfK70u2HWZ UT9yZOKMy2FjzDAdiXg== X-Authority-Analysis: v=2.4 cv=Np/htcdJ c=1 sm=1 tr=0 ts=6a0f15f7 cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=NGcC8JguVDcA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=RzCfie-kr_QcCd8fBx8p:22 a=pGLkceISAAAA:8 a=VnNF1IyMAAAA:8 a=-jr7Rsxdtpxs5_a9E3IA:9 X-Proofpoint-ORIG-GUID: kfl3y-ieUDsfAhXe2KpIVQTdWdSUw17V X-Proofpoint-GUID: Q1sNHVN-26xTnZgcdTlOZrfmCnml6aRf 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-21_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 spamscore=0 clxscore=1015 priorityscore=1501 impostorscore=0 lowpriorityscore=0 suspectscore=0 adultscore=0 phishscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605210142 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 v15: - Define dbg_once(). - unwind_user_get_reg(): Use pr_debug_once() instead of WARN_ON_ONCE() to prevent user-triggered warning/panic. (Sashiko AI) - unwind_user_next_common(): Handle UNWIND_USER_RULE_CFA_OFFSET for RA and FP to use dbg_once() instead of WARN_ON_ONCE() to prevent user- triggered warning/panic. (Sashiko AI) =20 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 | 10 +++++ include/linux/unwind_user_types.h | 23 +++++++++- kernel/unwind/sframe.c | 16 ++++++- kernel/unwind/user.c | 70 +++++++++++++++++++++++++++--- 5 files changed, 125 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 7bf58f23aa64..6aca38f89ddd 100644 --- a/include/linux/unwind_user.h +++ b/include/linux/unwind_user.h @@ -33,6 +33,16 @@ 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) +{ + pr_debug_once("%s (%d): unwind_user_get_reg(%u) not implemented\n", + current->comm, current->pid, regnum); + 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 d573c2529926..29a874a67f32 100644 --- a/kernel/unwind/sframe.c +++ b/kernel/unwind/sframe.c @@ -285,6 +285,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, @@ -335,8 +347,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 afa7c6f6d9b4..c6a2abac78e0 100644 --- a/kernel/unwind/user.c +++ b/kernel/unwind/user.c @@ -12,6 +12,17 @@ #include #include =20 +#ifdef CONFIG_DYNAMIC_DEBUG + +#define dbg_once(fmt, ...) \ + pr_debug_once("%s (%d): " fmt, current->comm, current->pid, ##__VA_ARGS__) + +#else /* !CONFIG_DYNAMIC_DEBUG */ + +#define dbg_once(args...) no_printk(args) + +#endif /* !CONFIG_DYNAMIC_DEBUG */ + #define for_each_user_frame(state) \ for (unwind_user_start(state); !(state)->done; unwind_user_next(state)) =20 @@ -64,22 +75,67 @@ 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; + case UNWIND_USER_RULE_CFA_OFFSET: + /* + * RA =3D CFA + offset does not make sense. + * A return address cannot legitimately be a stack address. + */ + dbg_once("UNWIND_USER_RULE_CFA_OFFSET invalid for RA\n"); + return -EINVAL; + 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; + case UNWIND_USER_RULE_CFA_OFFSET: + /* + * FP =3D CFA + offset is currently not used for FP + * (e.g. SFrame cannot represent this rule). + */ + dbg_once("UNWIND_USER_RULE_CFA_OFFSET unsupported for FP\n"); + return -EINVAL; + 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 Sun May 24 20:33:24 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 78DCB3F166E; Thu, 21 May 2026 14:26:26 +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=1779373588; cv=none; b=YHbv7+rObhrQUECWAj+C0P5vN7DrMTnfXy9dFw4tWMzVjWWmmSeXcAsBdF2dGC+M7KW5ZBGbBOalxlH+myUl9nB916eF2UMQ6VwxOqBKcB3EhbaSsV9EefjSXeC/5hZteOiyLihdnsV9Acdu0tCQmw+VrgPYQcD1gKquGQq7ixc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779373588; c=relaxed/simple; bh=50HJd/e4rTjOq72KktMVmpl7tM44FzaKfVCkBCdacEA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Yk0ILKcS0gIqu0y85WfnlXyZYy0ISAr+uY8imi0cCWdxL7oASySYVPgfDkZ3ql9kK/Zdj5gbmVMJCKoWY0cJCPMm8RVfjnmYfJmlcZtUewD984wN10ZU7RbU5W96dwjD6lbJbiTI9qkRIIch/pCn80lNVX1E9BzrND5HZz6H7jw= 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=e0Ywr07o; 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="e0Ywr07o" 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 64L56Khs069859; Thu, 21 May 2026 14:26:01 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=5irpr9rOlWjTWrqmW 482DA2bRuYyju7MyCwzXKRg+uU=; b=e0Ywr07onk9FcOp5qUG1/jwrfyqcr/GU7 eEU604e3M65Tf0sTXHr6CdwMxr9UZmFSJYopHy7jhpQbKdd9JTfQEFH44xDZ0rLH oqn6XAxLk5k2DZ9KkEXrjrCxvBzK7Lu6PrxOzY+JdfJ8ozFjnzmmgmyPMqFhh9Ii fWsbfC9tJe3UfNPaoWCf9ydY62nF0KguZFgh/ZmsoD6A/jSdMUEbgujOsJdDrMRq imViCKbi32RVAKKjtAIE+u0689E7Tf0U6p6QIpczGl2H4W5NE7OYfRQPKV/XV3bF w0kvQ53YqjZ+QC+fqWpkaDiTDfSyCCELZL+71VgYMy10sTQTH3JQA== 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 4e6h8myda6-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:26:00 +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 64LEOCKi031746; Thu, 21 May 2026 14:25:58 GMT Received: from smtprelay05.fra02v.mail.ibm.com ([9.218.2.225]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4e74dhvg7h-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:58 +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 64LEPtQs41746878 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 21 May 2026 14:25:55 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 13A3D20040; Thu, 21 May 2026 14:25:55 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A86CC2004B; Thu, 21 May 2026 14:25:54 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Thu, 21 May 2026 14:25:54 +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 v16 15/20] unwind_user: Flexible CFA recovery rules Date: Thu, 21 May 2026 16:25:41 +0200 Message-ID: <20260521142546.3908498-16-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260521142546.3908498-1-jremus@linux.ibm.com> References: <20260521142546.3908498-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-GUID: kwhKWSQeOAXgzUmfflqpuN0wDjKfueBz X-Authority-Analysis: v=2.4 cv=GYMnWwXL c=1 sm=1 tr=0 ts=6a0f15f8 cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=NGcC8JguVDcA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=pGLkceISAAAA:8 a=VnNF1IyMAAAA:8 a=BPVtMwLGy6aXIs-GLTYA:9 X-Proofpoint-ORIG-GUID: 6RquB8GktKPEIBT5chMdl5xPc8EKjIzb X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTIxMDE0MiBTYWx0ZWRfXyoEnIV/bfXRh isAk2DjOkMXZyrH532IbLlnMwNTmqvg9jJ9slIx1qFEHqYxd7GFsoKt95nCPvm38KS5WQByyuX8 s3AHrMWP4KkbYrpBXlbmsRCieTOJ+wxZ409zD5VsZH1tT3bnfjBCITUHivN/hvp7PclPI+/qUo7 J4Imcon2yQrobiJnqZ4SGIvXajywFoMkP8zb1ZBqjfsB+FFh0IlBLhEdh3RsMrn4RkSyA1gMmRm tPCm5JIsgmikq8dLo1zI1q5679+xTWR30GFG9pr+o7GhncOKTkFsfWnDh2IEmIFHcuYBEUTVH+p DkAXU7GdBbYJ+fERkuYjTTH72gIa1FVPoS1YLpaHDqtL45lxS+j6l14G2yG0UTPvTIBIK8qDv37 4SpW7kupcZzHz7sNkzuuapYZlGPOW3sjgnyfYh1eu2OnYebQ7wobBQ4ds1gMYcw7OeZ6UTC567r GGRTszWzSGZEpR0J++Q== 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-21_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 malwarescore=0 lowpriorityscore=0 priorityscore=1501 bulkscore=0 adultscore=0 suspectscore=0 spamscore=0 clxscore=1015 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605210142 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 *(SP + offset) CFA =3D FP + 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 --- Notes (jremus): Changes in v15: - enum unwind_user_cfa_rule, unwind_user_next_common(): Add support for SP/FP-based CFA recovery rules with dereferencing. (Sashiko AI) arch/x86/include/asm/unwind_user.h | 12 ++++++++---- include/linux/unwind_user_types.h | 22 ++++++++++++++++++++-- kernel/unwind/sframe.c | 15 +++++++++++++-- kernel/unwind/user.c | 24 ++++++++++++++++++++---- 4 files changed, 61 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..c18be5b7d586 100644 --- a/include/linux/unwind_user_types.h +++ b/include/linux/unwind_user_types.h @@ -29,6 +29,25 @@ 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 register + offset */ + /* DEREF variants */ + UNWIND_USER_CFA_RULE_SP_OFFSET_DEREF =3D /* CFA =3D *(SP + offset) */ + UNWIND_USER_CFA_RULE_SP_OFFSET | UNWIND_USER_RULE_DEREF, + UNWIND_USER_CFA_RULE_FP_OFFSET_DEREF =3D /* CFA =3D *(FP + offset) */ + UNWIND_USER_CFA_RULE_FP_OFFSET | UNWIND_USER_RULE_DEREF, + UNWIND_USER_CFA_RULE_REG_OFFSET_DEREF =3D /* CFA =3D *(register + 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 +66,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 29a874a67f32..daa97d8b0231 100644 --- a/kernel/unwind/sframe.c +++ b/kernel/unwind/sframe.c @@ -285,6 +285,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) @@ -346,10 +358,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 c6a2abac78e0..447061b10613 100644 --- a/kernel/unwind/user.c +++ b/kernel/unwind/user.c @@ -53,14 +53,30 @@ 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: + case UNWIND_USER_CFA_RULE_SP_OFFSET_DEREF: + cfa =3D state->sp; + break; + case UNWIND_USER_CFA_RULE_FP_OFFSET: + case UNWIND_USER_CFA_RULE_FP_OFFSET_DEREF: 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 Sun May 24 20:33:24 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 E87A93EF64C; Thu, 21 May 2026 14:26: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=1779373586; cv=none; b=MWOXWgQQcYxFVtAa7JNv/OYqSlCwC9Bt1j2HeY14CTEXJ/CdQqH34Z4G53LaU2zCoS7u9s8nL5VKOPKWkPJkIKR/tFZUHUx+zXIJKCjX5aHf49ewlQaiqqTCFUjhJMBL/iQ/fM6fq3dMFVWg5VIn5GpF3DWEn5RBmgSBQB02tSE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779373586; c=relaxed/simple; bh=Lek3FoDkD1nLKIa45zCNBM+iyUKz6eohHbKhDhvzkYo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rlORAq+IyVC7hvXSHJjTraFLE3/6GLzWgJukJS9OwqjGwlS4+3M1Y8ZKP8i/H4C4lreMx9OIvmBWvFF9gQIzTuSFz8HXyCdpkgF2eSvfMYF1LFjZHfYeNmJwMTC/Xueu3/MYlz1d8rBhwBBSZWlVDk5uBGQS2ws9wwkYMNhBfZA= 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=I7StSIzD; 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="I7StSIzD" 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 64L6aa7S3901160; Thu, 21 May 2026 14:26:01 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=fj34Hxw8OmO1XreQP mifGNH4anzSb1oTetriPvSQoAo=; b=I7StSIzDXXChcV6vu9/VqUSslAmy2Etu2 47Bsrzj3ldoMqTdFuQfCVSU1reotUyLVBP6ecaKOIzFUcYlQEuAotnXDZJtK9R3L jpo+65pQiyP2DPO/6gIRJrlFB3YTTpixsJd35o2kImrOJlaeIzUXFF9M2AIcADcY ZR68Dukz5rrpmE5aNrj+h2nno0pgA2mRB/BcXhLD2lnQUpLdqDI494nZfWUUaqye aVe/eetcf1d841RtypdjbI4O15HAa+bGJKxmm4vy+Lol9luBY7gxr4FZz40aVZr9 MozKGRH3Mc2DCdzaFlpglbrVjXTgHLhhjvIfiqGocvnYWF0gXIhMw== 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 4e6h8myda7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:26:00 +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 64LEO5mf002155; Thu, 21 May 2026 14:25:59 GMT Received: from smtprelay05.fra02v.mail.ibm.com ([9.218.2.225]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4e754gmbhw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:58 +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 64LEPt5641746882 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 21 May 2026 14:25:55 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 8083720040; Thu, 21 May 2026 14:25:55 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 18D7120049; Thu, 21 May 2026 14:25:55 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Thu, 21 May 2026 14:25:55 +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 v16 16/20] unwind_user/sframe: Add support for SFrame V3 flexible FDEs Date: Thu, 21 May 2026 16:25:42 +0200 Message-ID: <20260521142546.3908498-17-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260521142546.3908498-1-jremus@linux.ibm.com> References: <20260521142546.3908498-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-GUID: MGhftGt0CGJtqdbQA7LpVm3I6HBV813l X-Authority-Analysis: v=2.4 cv=GYMnWwXL c=1 sm=1 tr=0 ts=6a0f15f8 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=pGLkceISAAAA:8 a=VnNF1IyMAAAA:8 a=VwQbUJbxAAAA:8 a=meVymXHHAAAA:8 a=8hFt8YRx_kKiWWpTwHgA:9 a=2JgSa4NbpEOStq-L5dxp:22 X-Proofpoint-ORIG-GUID: Ex4YXw1v8QCNNWO1yMPNipa4QQnzOUeO X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTIxMDE0MiBTYWx0ZWRfX6gS7F3SzEskC heV9GEFGrnoMW4gAnRZf4DDnnOxuiuhviKeMMdt0X9KjhOzOqNHfRHcPt4X5T/y8KVXAyNzc16D /dVBiIk8Jr5GOb0l/1SQ3Q9WvJykbxz/7SQowLY0XKEul/ITMa+FKdPnBs7V0gYtu0S+/0dtLaX aFfScjNUn6dILwcarnswKMt2zV48dQjVopl3k8L0AQDQ7lZrsf4GW73m3QhrpWwiLNPqr6DrZqz HRu+hIIRJUR6M3T+IcEp/zaF2vJi12FN8D0I/u5/SlmwkdCwVEJxFR/mIwkpiJW5jF7D/GYbjXV bra67gM22iI+ib2QdslRTC0kNu2uqrNZNwkPlab89gfRRdOAF7jRzmD87P1eofJ0k8TvWqS+OZ+ 6jrBoRI0tJYIKNP+Otb7lUUZMkbab4pDjWSD+B+x7cV1ihj/JdVQ+YvRWlkgb4olycVTut7Lz2q 971HaLDAinhjFAeBYrA== 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-21_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 malwarescore=0 lowpriorityscore=0 priorityscore=1501 bulkscore=0 adultscore=0 suspectscore=0 spamscore=0 clxscore=1015 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605210142 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 v16: - __find_fre(): Move declaration of ret to function scope to resolve compile error. (Sashiko AI) =20 Changes in v15: - __read_flex_fde_fre_datawords(): Add comment on FRE dataword RA/FP location info decoding logic. (Sashiko AI) - Fix outermost frame (FRE without datawords) handling to not cause sframe_init_cfa_rule_data() and ultimately sframe_find() to fail with -EINVAL. (Sashiko AI) - sframe_init_[cfa_]rule_data(): Reject FRE control word with reserved_p=3D1. (Sashiko AI) - __find_fre(): Return RC of sframe_init_[cfa_]rule_data() if bad RC. - Normalize error code usage (.sframe is removed for all but ENOENT): ENOENT: No sframe or no FDE for IP found (FDE found but no FRE is EINVAL) EFAULT: Bad address EINVAL: Invalid input or sframe =20 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 | 287 +++++++++++++++++++++++++++++++++-------- kernel/unwind/sframe.h | 6 + 3 files changed, 238 insertions(+), 56 deletions(-) diff --git a/MAINTAINERS b/MAINTAINERS index a9b42b67a88d..25f0b933511c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -27875,6 +27875,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 daa97d8b0231..b623dca072da 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; }; @@ -200,19 +204,160 @@ 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 -EINVAL; + + 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 -EINVAL; + UNSAFE_GET_USER_INC(cfa_ctl, cur, dataword_size, Efault); + UNSAFE_GET_USER_INC(cfa_off, cur, dataword_size, Efault); + dataword_count -=3D 2; + + /* + * Each RA/FP location info consumes either two datawords + * (control word + offset) or one padding word substituting + * for that pair. Padding is only valid as substitution if + * followed by further non-padding location info. Therefore + * decoding only proceeds with at least two datawords. Any + * leftover trailing datawords are invalid and rejected by + * the final check. + */ + + 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) */ + } + } + + /* Reject trailing padding or unknown extra datawords */ + if (dataword_count) + return -EINVAL; + + 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 -EINVAL; + } +} + 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; - unsigned int fre_size; u32 ip_off; u8 info; =20 @@ -233,80 +378,105 @@ static __always_inline int __read_fre(struct sframe_= section *sec, dataword_size =3D dataword_size_enum_to_size(SFRAME_V3_FRE_DATAWORD_SIZE= (info)); if (!dataword_size) return -EINVAL; - fre_size =3D addr_size + 1 + (dataword_count * dataword_size); =20 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 -EINVAL; + 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. + * A FRE without datawords indicates an outermost + * frame. Zero-initialize CFA, RA, and FP location + * info, except for the CFA control word, so that + * neither sframe_init_cfa_rule_data() nor + * sframe_init_rule_data() fail. */ - 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--; - - ra_off =3D sec->ra_off; - if (!ra_off && dataword_count) { - dataword_count--; - UNSAFE_GET_USER_INC(ra_off, cur, dataword_size, Efault); - } + fre->cfa_ctl =3D (SFRAME_REG_SP << 3) | 1; /* regnum=3DSP, deref_p=3D0, = reg_p=3D1 */ + 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 - 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 -EINVAL; - -done: - fre->size =3D fre_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 + bool deref_p =3D SFRAME_V3_FLEX_FDE_CTRLWORD_DEREF_P(ctlword); + bool reg_p =3D SFRAME_V3_FLEX_FDE_CTRLWORD_REG_P(ctlword); + bool reserved_p =3D SFRAME_V3_FLEX_FDE_CTRLWORD_RESERVED_P(ctlword); + unsigned int regnum =3D SFRAME_V3_FLEX_FDE_CTRLWORD_REGNUM(ctlword); + + if (reserved_p) + return -EINVAL; + + /* CFA recovery rule must be register-based */ + if (!reg_p) + return -EINVAL; + + 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; + } + + 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 +static __always_inline int 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); + bool reserved_p =3D SFRAME_V3_FLEX_FDE_CTRLWORD_RESERVED_P(ctlword); + + if (!ctlword && !offset) { rule_data->rule =3D UNWIND_USER_RULE_RETAIN; + return 0; + } + + if (reserved_p) + return -EINVAL; + + 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; + + return 0; } =20 static __always_inline int __find_fre(struct sframe_section *sec, @@ -321,6 +491,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 @@ -330,8 +501,6 @@ static __always_inline int __find_fre(struct sframe_sec= tion *sec, fre_addr =3D sec->fres_start + fde->fres_off; =20 for (i =3D 0; i < fde->fres_num; i++) { - int ret; - /* * Alternate between the two fre_addr[] entries for 'fre' and * 'prev_fre'. @@ -358,9 +527,15 @@ 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); + ret =3D sframe_init_cfa_rule_data(&frame->cfa, fre->cfa_ctl, fre->cfa_off= ); + if (ret) + return ret; + ret =3D sframe_init_rule_data(&frame->ra, fre->ra_ctl, fre->ra_off); + if (ret) + return ret; + ret =3D sframe_init_rule_data(&frame->fp, fre->fp_ctl, fre->fp_off); + if (ret) + return ret; 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..1a2528e4b149 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,9 @@ 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_RESERVED_P(data) (((data) >> 2) & 0x1) +#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 Sun May 24 20:33:24 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 D3D863E172B; Thu, 21 May 2026 14:26:51 +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=1779373613; cv=none; b=lBtzvbBXIYjlWaYzkrHJIgHc8Z4PaN61kehYtbyMn9CRV7JI4FvGCDjYxenP0FxXf/HsAy2ZpoW5iVoYXqroQ+ek4OsnpkheLE8YxJNmwseWlM8cAZkhU1XkOcXO+Lmh24CRc/WWy4175NFHn3GNzgEOa4hnaECVc7I4R2GVdtE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779373613; c=relaxed/simple; bh=XcwWMypJbPWWrCNjeepiU26+0QLMlfiMK9eWkfbKjRc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=a5s7sYkW9a/OI0bhLDlYsCcAdS6eAEFdZ+uT8MnjhEYv6OmA3FynEsERIZvJQkKR/5Spp90LvJIDheY0XfLhDVChAeafCRKSEk0uL8ZLUJSLyBFJ/r5eahNUluW8joqStdae/aEeME2w8yWMcoHgxO3YB3F0ZV7THwD6YEUqGnY= 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=hrRvAv6k; 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="hrRvAv6k" 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 64L2ZhCr552016; Thu, 21 May 2026 14:26:01 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=bAXX+tXFoepmleJYQ yZsSgeoqwCmF0jZLGknM1dht9E=; b=hrRvAv6kA5mKwUHaBd+W2FpOQs4Wpt2kz XFOhw5B0iiT2+R+3qmYTdnzAH2vtd0NvgojT8MmNcWMXn6P/mjyxvFshA5+g/gvD 1lJ7MYO/djbekqr/iUD7Mfdll0KzmNW/kghq6BRG3zbK9u+0dm04nbcCZXpHJSnm aNHGp7D/oLqDhbYT9aavrsRiKMxzo4yLSta2ED/yWhSYtVQFDzSEtuSpJp7s1+PH ASt/jlhDu81HR7nu21IdOom9knoesooKRBjUGxLlBC5cPA+rj+1ZQR9Xi2IpxdAo c15CIOG5VlwFOAFZCO6bwPpjEa2vKJqsi4I5w2DRIUQM55l+gg8RA== 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 4e6h9y7grw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:26:00 +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 64LEO59A006181; Thu, 21 May 2026 14:25:59 GMT Received: from smtprelay01.fra02v.mail.ibm.com ([9.218.2.227]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4e75kyc9tv-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:25:59 +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 64LEPuTI60817690 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 21 May 2026 14:25:56 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id E45DA20040; Thu, 21 May 2026 14:25:55 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 85B682004B; Thu, 21 May 2026 14:25:55 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Thu, 21 May 2026 14:25:55 +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 v16 17/20] unwind_user/sframe: Separate reading of FRE from reading of FRE data words Date: Thu, 21 May 2026 16:25:43 +0200 Message-ID: <20260521142546.3908498-18-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260521142546.3908498-1-jremus@linux.ibm.com> References: <20260521142546.3908498-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: AW1haW4tMjYwNTIxMDE0MiBTYWx0ZWRfX2bXFpxhRPDPH Zc7lbHxbLe/UJzeKtrvgFot5w+OnF6zmRVB3nwQqn16XdbVgYAN0fJW8Hak9lC1WDAMBP1Qr02s KC8SSZI1zh4AMnxafzBpituNpru1V912j6klurs0YGIXZv8x4BtkfpSXdb8rHKXWI0TlaA3Bu9y mkUPKMjoiZCu8vMBjSDRU5V+JRHgiDcmCZOSfbVLNirOjr8y1zRiufqpJkWqZlQI5KgS20DICEb jSSEskavsbCM6q7QwkD1KDbZJIH1KVAfbJFLS3RhUHIRI1BJwiEdDTLfEPWMk64Yfrx/ScAE7qO GgrCi4p1i9UV0uIGElHG74pDXawE36BlPiWLDHz5vmXgGWPjy8hTVzP8efVQkJfer9ErPjYtWP1 NeABBvnGu1l5rZwi9VCK8pJ1s6zTB5sW3oVrlNvNjEKlEGANUC6v5eVBEVPQGYwE2Xofi0NeYZD WQhygoIjVUsnBdILN5g== X-Authority-Analysis: v=2.4 cv=BNuDalQG c=1 sm=1 tr=0 ts=6a0f15f9 cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=NGcC8JguVDcA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=pGLkceISAAAA:8 a=VnNF1IyMAAAA:8 a=RXKZOtKmAAAA:8 a=p_lxmaMNnb8s4VerTYQA:9 a=UFF3uGjEBZWolfm0k6KQ:22 X-Proofpoint-ORIG-GUID: drJApyXJj2y9hpl5tbDEjhRo_6IKVXYK X-Proofpoint-GUID: wGVBeE2STrhp9aFps6BixI2H6PEIK6K6 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-21_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 priorityscore=1501 malwarescore=0 impostorscore=0 suspectscore=0 lowpriorityscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605210142 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 v15: - sframe_validate_section(): Fix format specifier for number of FREs in debug message. (Sashiko AI) =20 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 | 99 +++++++++++++++++++++++++++--------------- 1 file changed, 63 insertions(+), 36 deletions(-) diff --git a/kernel/unwind/sframe.c b/kernel/unwind/sframe.c index b623dca072da..7f439600b0f0 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); @@ -207,11 +210,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 @@ -253,11 +256,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 @@ -325,24 +328,34 @@ __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 datawords indicates an outermost + * frame. Zero-initialize CFA, RA, and FP location + * info, except for the CFA control word, so that + * neither sframe_init_cfa_rule_data() nor + * sframe_init_rule_data() fail. + */ + fre->cfa_ctl =3D (SFRAME_REG_SP << 3) | 1; /* regnum=3DSP, deref_p=3D0, = reg_p=3D1 */ + 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 -EINVAL; } @@ -385,26 +398,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 datawords indicates an outermost - * frame. Zero-initialize CFA, RA, and FP location - * info, except for the CFA control word, so that - * neither sframe_init_cfa_rule_data() nor - * sframe_init_rule_data() fail. - */ - fre->cfa_ctl =3D (SFRAME_REG_SP << 3) | 1; /* regnum=3DSP, deref_p=3D0, = reg_p=3D1 */ - 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; @@ -527,6 +525,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; + ret =3D sframe_init_cfa_rule_data(&frame->cfa, fre->cfa_ctl, fre->cfa_off= ); if (ret) return ret; @@ -610,6 +612,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) { struct sframe_fde_internal fde; @@ -648,6 +664,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:%u 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 if (j && fre.ip_off <=3D prev_ip_off) { dbg_sec("FDE %u: FRE %u not sorted\n", i, j); --=20 2.51.0 From nobody Sun May 24 20:33:24 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 30AD83F2116; Thu, 21 May 2026 14:26: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=1779373589; cv=none; b=tNkBbWb17yiSyKcaq1zMxPVIs64A2+YS7KcGHELTIWiEltLbOHdrRJEu1QrPYhKGsgPpGCsa66bwblc6CopThFco0E8dDgZSmWkv7NRYSi7F4JJDvi88WSj99kCozB9nk4FSnQ7oGJkHBkBxjbThADpZlP8WgPK5XCA8Vv/9Hok= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779373589; c=relaxed/simple; bh=PxGFto0ETm23/XG9xHE9rXz+H05vrOYLXZtE1bAvbEM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pZgiDEqAijNtFihfO0TcydHOjf8XrpbvDhGn4nOL+AH4nZWA3JVA0UDmnrLVeiDJLrB2qrZVrePZvH+4iId/M3Bpd5MbBRXHkSn+y5hMNqtQ1A5fng4NgcLlafkWBN5383rmAs7zXUEIVRlRAPKpCl9KNFd8UmsAK8OdOAaHDqc= 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=Csfx0ud8; 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="Csfx0ud8" 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 64L8OkB1730699; Thu, 21 May 2026 14:26:02 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=HNBbQrdilxxlDo0Yj e7LeqecVTV4lI2XIhl/nW9XXj8=; b=Csfx0ud8DpVys08I2TdPcGbcMNRJCXJ7z EnSoQc6HonQTdhGkuulAO7Ti+pCh/ksHm3Yx+Str/soZAot22XyTSaXbSHKqLycj 7+/9hCKsIO95uafTiaW17shUBXT7xmXt0v0iCycIewdB3HLJW57DO9veYP3NVk+F u3nMiWwUO26Ln8nfsFI6WTkdNq263x8YBzfBNGFA1YUefp8/RfwKkyKjXZc2VSH/ bT0URaZq2tEfGg6WxtpTLOmjZ9v+S6S+vPTPiIuANPDDZLdMujclzE2bGFuENhNi 3KFHkEtU5lo1KQ8A4tmp0TuxIYX6xvJsFvnbFi37OgNVQwjHDm5Aw== 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 4e6hawe82k-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:26:01 +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 64LEO9CT017140; Thu, 21 May 2026 14:26:00 GMT Received: from smtprelay01.fra02v.mail.ibm.com ([9.218.2.227]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4e73wkcjd4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:26:00 +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 64LEPuVl60817692 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 21 May 2026 14:25:56 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4B49D20040; Thu, 21 May 2026 14:25:56 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id E991520049; Thu, 21 May 2026 14:25:55 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Thu, 21 May 2026 14:25:55 +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 v16 18/20] unwind_user/sframe: Duplicate registered .sframe section data on clone/fork Date: Thu, 21 May 2026 16:25:44 +0200 Message-ID: <20260521142546.3908498-19-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260521142546.3908498-1-jremus@linux.ibm.com> References: <20260521142546.3908498-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: AW1haW4tMjYwNTIxMDE0MiBTYWx0ZWRfX+GIwmHyIgaa/ iEMghHH4xbHeQil90KcOstoov9/WrDDO4cxm2pB3MlIUpyID/lULwzJNnParCu5NOfdFvMkHjCA FX5nb0pj6Cg0otKRgSg3ZT5igTlwEBgvFeJ3DZ1qWpGEGGWwqptxnIbBL2enYAt/H4K2Wi3yDKC DRRHUCC5ld8qBj+Pr+f9Be8bXVvHMJfTTDjfSbGCrYREVVwBcmQK6Q9mhWcJJxc0CTUCj8NyYrc KYLuyfVYTm0kxrLsr+sXT0VNkWonMCkQvdTfPBAM/Cxx2G9SetZ2tj1IEKieZUo9FfL6LireQAV NyLEfRLTfMacAvYSIvK8xQPC7qckrDYA1p8xFb3iZawaUX7eG2Uv8WNkB4nHNxcdnPN4jX1Hkil DvTt/rGc1HPJDyhZNN9ioC78iM3OK8CzdgXKIKjYMfZMSV1/LCcf07HOEvPnyUlLUN9mrM2g7EU MEpcz1sYsFXFCIJW0wA== X-Authority-Analysis: v=2.4 cv=Np/htcdJ c=1 sm=1 tr=0 ts=6a0f15f9 cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=NGcC8JguVDcA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=RzCfie-kr_QcCd8fBx8p:22 a=VnNF1IyMAAAA:8 a=kI6mnXzX5LrxlMcTYKEA:9 X-Proofpoint-ORIG-GUID: viyUSvPYT66c6XW7QL_nwW9bHxSJ5P4k X-Proofpoint-GUID: 5moAB6J8yQJuyxeXvVQmFH_ITAiPkjsW 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-21_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 spamscore=0 clxscore=1015 priorityscore=1501 impostorscore=0 lowpriorityscore=0 suspectscore=0 adultscore=0 phishscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605210142 Content-Type: text/plain; charset="utf-8" When duplicating a process' virtual memory mappings also duplicate all of its registered .sframe sections stored in the per-mm maple tree to enable stacktracing using sframe of the child process. Signed-off-by: Jens Remus --- Notes (jremus): Changes in v16: - dup_mmap(): Drop unnecessary CONFIG_HAVE_UNWIND_USER_SFRAME #ifdefs. (Sashiko AI) - dup_mmap(): Call sframe_dup_mm() prior to arch_dup_mmap(), so that comes last. =20 Changes in v15: - New patch. include/linux/sframe.h | 5 ++++ kernel/unwind/sframe.c | 48 ++++++++++++++++++++++++++++++++++++ kernel/unwind/sframe_debug.h | 7 ++++++ mm/mmap.c | 5 ++++ 4 files changed, 65 insertions(+) diff --git a/include/linux/sframe.h b/include/linux/sframe.h index b79c5ec09229..91889b4fe3dd 100644 --- a/include/linux/sframe.h +++ b/include/linux/sframe.h @@ -28,6 +28,7 @@ struct sframe_section { }; =20 #define INIT_MM_SFRAME .sframe_mt =3D MTREE_INIT(sframe_mt, 0), +extern int sframe_dup_mm(struct mm_struct *mm, struct mm_struct *oldmm); extern void sframe_free_mm(struct mm_struct *mm); =20 extern int sframe_add_section(unsigned long sframe_start, unsigned long sf= rame_end, @@ -45,6 +46,10 @@ static inline bool current_has_sframe(void) #else /* !CONFIG_HAVE_UNWIND_USER_SFRAME */ =20 #define INIT_MM_SFRAME +static inline int sframe_dup_mm(struct mm_struct *mm, struct mm_struct *ol= dmm) +{ + return 0; +} 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) diff --git a/kernel/unwind/sframe.c b/kernel/unwind/sframe.c index 7f439600b0f0..db88d993dff1 100644 --- a/kernel/unwind/sframe.c +++ b/kernel/unwind/sframe.c @@ -875,6 +875,54 @@ int sframe_remove_section(unsigned long sframe_start) return 0; } =20 +static void __sframe_dup_section(struct sframe_section *sec, struct sframe= _section *oldsec) +{ + sec->sframe_start =3D oldsec->sframe_start; + sec->sframe_end =3D oldsec->sframe_end; + sec->text_start =3D oldsec->text_start; + sec->text_end =3D oldsec->text_end; + + sec->fdes_start =3D oldsec->fdes_start; + sec->fres_start =3D oldsec->fres_start; + sec->fres_end =3D oldsec->fres_end; + sec->num_fdes =3D oldsec->num_fdes; + + sec->ra_off =3D oldsec->ra_off; + sec->fp_off =3D oldsec->fp_off; + + dbg_dup(sec, oldsec); +} + +int sframe_dup_mm(struct mm_struct *mm, struct mm_struct *oldmm) +{ + struct sframe_section *sec, *oldsec; + unsigned long index =3D 0; + int ret; + + guard(srcu)(&sframe_srcu); + + mt_for_each(&oldmm->sframe_mt, oldsec, index, ULONG_MAX) { + sec =3D kzalloc(sizeof(*sec), GFP_KERNEL_ACCOUNT); + if (!sec) + return -ENOMEM; + + __sframe_dup_section(sec, oldsec); + + ret =3D mtree_insert_range(&mm->sframe_mt, + sec->text_start, + sec->text_end - 1, + sec, GFP_KERNEL_ACCOUNT); + if (ret) + goto err_free; + } + + return 0; + +err_free: + free_section(sec); + return ret; +} + void sframe_free_mm(struct mm_struct *mm) { struct sframe_section *sec; diff --git a/kernel/unwind/sframe_debug.h b/kernel/unwind/sframe_debug.h index a63e75cccc70..2503972155e8 100644 --- a/kernel/unwind/sframe_debug.h +++ b/kernel/unwind/sframe_debug.h @@ -48,6 +48,12 @@ static inline void dbg_init(struct sframe_section *sec) sec->filename =3D kstrdup("(anonymous)", GFP_KERNEL_ACCOUNT); } =20 +static inline void dbg_dup(struct sframe_section *sec, struct sframe_secti= on *oldsec) +{ + if (oldsec->filename) + sec->filename =3D kstrdup(oldsec->filename, GFP_KERNEL_ACCOUNT); +} + static inline void dbg_free(struct sframe_section *sec) { kfree(sec->filename); @@ -61,6 +67,7 @@ static inline void dbg_free(struct sframe_section *sec) static inline void dbg_print_header(struct sframe_section *sec) {} =20 static inline void dbg_init(struct sframe_section *sec) {} +static inline void dbg_dup(struct sframe_section *sec, struct sframe_secti= on *oldsec) {} static inline void dbg_free(struct sframe_section *sec) {} =20 #endif /* !CONFIG_DYNAMIC_DEBUG */ diff --git a/mm/mmap.c b/mm/mmap.c index 5754d1c36462..8715be691488 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -48,6 +48,7 @@ #include #include #include +#include =20 #include #include @@ -1844,6 +1845,9 @@ __latent_entropy int dup_mmap(struct mm_struct *mm, s= truct mm_struct *oldmm) goto loop_out; } } + retval =3D sframe_dup_mm(mm, oldmm); + if (retval) + goto loop_out; /* a new mm has just been created */ retval =3D arch_dup_mmap(oldmm, mm); loop_out: @@ -1893,6 +1897,7 @@ __latent_entropy int dup_mmap(struct mm_struct *mm, s= truct mm_struct *oldmm) vm_unacct_memory(charge); } __mt_destroy(&mm->mm_mt); + sframe_free_mm(mm); /* * The mm_struct is going to exit, but the locks will be dropped * first. Set the mm_struct as unstable is advisable as it is --=20 2.51.0 From nobody Sun May 24 20:33:24 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 C41BF3DCDA0; Thu, 21 May 2026 14:26:26 +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=1779373589; cv=none; b=MjNfD9rN4oi3QOfjp1dkttrZFMw96nkfsT68qayTbgLw0a2BjARcb4LbUG3IO9Sxj9UJb8Nq04Wn7tupMmz8JmyavgpAZD4akQBkzgw5JH1hs81pdKFT5A/S3t+5ktU8FGgEmxiZv+IVq8/GpKB6YpVJmPqwbmL3XWJrTd7rE2c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779373589; c=relaxed/simple; bh=v9zR+CxaBwVN8AGwvg5kcpnBTB/dRkF7ZIq0HuQ3Qrg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JES46/9q064GOdQcYp15kYtd5pWsifLBIiuf8TMeDTTQXO9TN2VqksfwPzCEayTMDQJlcdZST03CUgUDrVv1WLUQQw/4lUqj+0AxfPEoLSOOUvX1474ikhBfahtEnEfWcS7JbrL4vN3DCN6K3hcprWKTSmKkyhZVVIF8DymLSX8= 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=qnijCFYT; 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="qnijCFYT" 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 64L3WRtY3952986; Thu, 21 May 2026 14:26:02 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=MtnVctqCs7YoKq/Mw D8B6NDfS4Kt/fyB5yJ2+IDDGco=; b=qnijCFYT0JL+d8HnxNf9t8ZlQAxhk7L6k J+flA3rmfhq/uqxsTHz94h5il9Fx6mtk0/kh09W3Vo+nhmRBNuGs2D72mjvE/pGR yrxqhkkiZMYg6QulApK7pW1pgdNqClP1l3pvAr1gAiSMkGLysJncNHt7WpYe3Tjh j323k6JjGTswHC7H91TqpVYuZtxHGR+b+MuVoPZQ+ummkaGAw73pE7oT8XSSYEHH IBt2vSh453hmjLetJS3jdG2u87NJfo2SEFlE10OyXB3A8UsG/+Uu22ZXvFSUtkku WSCzJtOn+9WsunNjn7qUg3ThKY5JbkCWCwUxqUPj2XgWpwiuulnPg== 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 4e6h9y7gry-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:26:01 +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 64LEOBZh006250; Thu, 21 May 2026 14:26:00 GMT Received: from smtprelay01.fra02v.mail.ibm.com ([9.218.2.227]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4e75kyc9ty-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:26:00 +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 64LEPuaE31195492 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 21 May 2026 14:25:56 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A796120040; Thu, 21 May 2026 14:25:56 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 50B7A2004B; Thu, 21 May 2026 14:25:56 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Thu, 21 May 2026 14:25:56 +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 v16 19/20] unwind_user/sframe/x86: Enable sframe unwinding on x86 Date: Thu, 21 May 2026 16:25:45 +0200 Message-ID: <20260521142546.3908498-20-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260521142546.3908498-1-jremus@linux.ibm.com> References: <20260521142546.3908498-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: AW1haW4tMjYwNTIxMDE0MiBTYWx0ZWRfX3aaks8cGjNm/ ++Hr5s8xN4Bi/HcgSMZbVJDia2CFlHihPXcLfrpysBicMwvkgv01mTsG+AguXD6KQppz+xCCvWD Lsavazdi0eqA0ubzOXDk6vokeV0DpL0BRgTFmkoXmbfwIPDfcaG+CsP/7LNa4hrPFQVDtVZtFTp AR6lb4Ac3IOIOG0chZ0bKa4CtpPKu4kegP/N1OUNrhS9W8JKrHQ+4+oZHRF8BNj1ob6eRpRfgNI 629nlNETdm0RE1tyF2zpUF2XOKM2LIMrozNNjecbL1yldZweTpso4I8imUxAzv0xX9lbGnd8tw8 UQCwmRqu/Vfj1s6g2kl8TVo7yEWkEH7T6ggR3amhuPdh/DcwtHgwtKt1xMMX2X1LpEMyDSWiZBf Vmm7DIQ5aR5rj2Huw54rqaS/p70JkuJYhir1ZpxKNcyFTiWp75ZNVgnPK8SOiEe0TN4+ExKxCPs 7zC8v33/3avKxWQLtwA== X-Authority-Analysis: v=2.4 cv=BNuDalQG c=1 sm=1 tr=0 ts=6a0f15f9 cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==: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=BJDwMle8H-fvePKCLUUA:9 a=2JgSa4NbpEOStq-L5dxp:22 X-Proofpoint-ORIG-GUID: yzX4j4RwPWUINlwMZXvrPIwazG-uPnkZ X-Proofpoint-GUID: ImyEabwoZ1xRcpTYbu_y2YOmZgnpuTgb 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-21_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 priorityscore=1501 malwarescore=0 impostorscore=0 suspectscore=0 lowpriorityscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605210142 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 v15: - unwind_user_get_reg(): Fail if !user_64bit_mode(). (Sashiko AI) - unwind_user_get_reg(): Simplify guarding using CONFIG_X86_64. - unwind_user_get_reg(): Add pr_debug_once() if unsupported register number. =20 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 | 39 +++++++++++++++++++++++ arch/x86/include/asm/unwind_user_sframe.h | 12 +++++++ 3 files changed, 52 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..942475235431 100644 --- a/arch/x86/include/asm/unwind_user.h +++ b/arch/x86/include/asm/unwind_user.h @@ -15,6 +15,45 @@ static inline int unwind_user_word_size(struct pt_regs *= regs) return user_64bit_mode(regs) ? 8 : 4; } =20 +#ifdef CONFIG_X86_64 + +static inline int unwind_user_get_reg(unsigned long *val, unsigned int reg= num) +{ + struct pt_regs *regs =3D task_pt_regs(current); + + /* SFrame only supports x86-64 */ + if (!user_64bit_mode(regs)) + return -EINVAL; + + 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: + pr_debug_once("%s (%d): unwind_user_get_reg(%u): unsupported register nu= mber\n", + current->comm, current->pid, regnum); + return -EINVAL; + } + return 0; +} +#define unwind_user_get_reg unwind_user_get_reg + +#endif /* CONFIG_X86_64 */ + #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 Sun May 24 20:33:24 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 9C1DF3D9055; Thu, 21 May 2026 14:26:41 +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=1779373602; cv=none; b=diEnHSekN5gt1NLaOpnCW6FRPFFpXTM2fPcgNgZIfWe31Dvf8LwqUpETdjRU1IS+0MqYPGSyybXrqPwzTyMwbYtnFfecnSl7cZWlNI24sN5q+aMIKB0A+YiKoGxZmv7/JnbHnsMR4/4SxI3iE74vXwqjXwnpEjBvhbDQbsxrKTg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779373602; c=relaxed/simple; bh=pOTifWMyDUr3KztHc7ELPe1Ms++E6svSTXBfgYLa2PY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RzLWjBS0TBRMAi64xZunXfcJZCHBt8d9UcLF8KLzDOs3sh017nHAm7s+aKwsT3Vr2G+uO4SR/Cnyvny7BPlvqqNl6YsW/Qd1FSbszznjAV6UQXwdpJKsWq/n9PccNcaaSw9pLMkQeEeGJbXCPIpVXP9c35IpgMw5VNQ55Gc+K8w= 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=pSEyqh5w; 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="pSEyqh5w" 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 64LE9rhJ069465; Thu, 21 May 2026 14:26:02 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=WbHj9iJ7NuBWvii1A /p//5DBJ1F6JGPeRMLlnMLO6Uc=; b=pSEyqh5wjnpwsukgafEIKddJxopOs7y00 +ZVILJpPdafoQiR3lHLzdY5zow3hdI5apSbb2NO4bvdBltLH2yfsjKiBLhtoAC6r aGtZ6nz+50g9mzN/iO3g96O+nQkRGW5LQdt+SKahj/41CZPTp3Zglxmi5c3sbLDN q2pAHMqFQA6lL78WObsRroZc9t7F7Iv7Koy6w6IFomRnLPWjv5xCwhIst9nuYVuQ lihv2aMNneCF7saQ1ASb3sdwMBeBzDsulq5gVTD82ocvPGG9FyeXKE+cvIeGU8Zt 0q0QqmC8YPudR2asfHbWJQD6iotyOVEq2dtQ1paDsVI26tW0FwIKA== 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 4e6h8mydaf-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:26:01 +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 64LEO5Xo006184; Thu, 21 May 2026 14:26:00 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4e75kyc9u0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 May 2026 14:26:00 +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 64LEPvdL28377478 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 21 May 2026 14:25:57 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0FF9720040; Thu, 21 May 2026 14:25:57 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id ACC5120049; Thu, 21 May 2026 14:25:56 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Thu, 21 May 2026 14:25:56 +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 v16 20/20] unwind_user/sframe: Add prctl() interface for registering .sframe sections Date: Thu, 21 May 2026 16:25:46 +0200 Message-ID: <20260521142546.3908498-21-jremus@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260521142546.3908498-1-jremus@linux.ibm.com> References: <20260521142546.3908498-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-GUID: OUZAgxwN4FB_fHaCqX_mujPmJt2qr6ue X-Authority-Analysis: v=2.4 cv=GYMnWwXL c=1 sm=1 tr=0 ts=6a0f15fa cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==: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=1RKwvADtGVyjO38rMG4A:9 a=2JgSa4NbpEOStq-L5dxp:22 X-Proofpoint-ORIG-GUID: zPlQu9xIGGGD_WQ6kxrO-9UCFhYyJMIb X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTIxMDE0MiBTYWx0ZWRfXyY3olyWCekyi Vgu5puGG/58e0KVOmBgnDleJsWKu5skVuUeu9MEMW540HMEn82k8pL2woSITI3dfVuzeQITqgtE FtQxRrvYhpYHLOrg0T/raneNKl51iH5L1KVi0ng359JsFiooL5Z6lGf7+f6dy0/d/sGxfamK7AH fZrNVBNTiJqPTvxgrc5D2EUrrz0we3uexp+nSYV8NhMnoE1NsY4/LucQpfFA36fnLF97CKsWXtN gPRDjnrjASTL7Sw2lOm+VqWFXNOTemJNkkSBXd7Qf3J7M6b/jiiIUVpTV+JNRIAYSsyJ7kBn/Ud nScPxkS3Jv0jMZv/WDl7gJ15AD7NrVuzaRJMCb8+fBiK2k/g7SwkOihgGyDmgCr/n194XKibiYF Olt5LUyD7TmnrXjN/02jsp+kn7tHLlK8xYpajCGfCRwXX65o5fGeUF5pOOJD+oc8kuv3kpG7OcH LO2C3nVxBMIQbx262eQ== 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-21_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 malwarescore=0 lowpriorityscore=0 priorityscore=1501 bulkscore=0 adultscore=0 suspectscore=0 spamscore=0 clxscore=1015 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605210142 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 v15: - Fix rebase error (missing break). (Sashiko AI) =20 Changes in v14: - Bump PR_ADD_SFRAME and PR_REMOVE_SFRAME. include/uapi/linux/prctl.h | 4 ++++ kernel/sys.c | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/include/uapi/linux/prctl.h b/include/uapi/linux/prctl.h index b6ec6f693719..bd0bf828b033 100644 --- a/include/uapi/linux/prctl.h +++ b/include/uapi/linux/prctl.h @@ -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..b0a9b1e3ccd7 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -65,6 +65,7 @@ #include #include #include +#include =20 #include =20 @@ -2907,6 +2908,14 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, a= rg2, unsigned long, arg3, if (arg3 & PR_CFI_LOCK && !(arg3 & PR_CFI_DISABLE)) error =3D arch_prctl_lock_branch_landing_pad_state(me); break; + case PR_ADD_SFRAME: + error =3D sframe_add_section(arg2, arg3, arg4, arg5); + break; + case PR_REMOVE_SFRAME: + if (arg3 || arg4 || arg5) + return -EINVAL; + error =3D sframe_remove_section(arg2); + break; default: trace_task_prctl_unknown(option, arg2, arg3, arg4, arg5); error =3D -EINVAL; --=20 2.51.0