From nobody Mon Sep 28 12:34:31 2026 Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11021074.outbound.protection.outlook.com [52.101.70.74]) (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 41ADA30BF4F; Fri, 21 Aug 2026 15:18:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.70.74 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787325501; cv=fail; b=VYjZ970XY7sGrjhGFPv7csWas53Qqdd9f1CU0FWS5iqSTgMpmMSw0Yu404B6PemJaaWXmudm1/QUxuBIcZZGZtkhsHqq1j1ubNS625HQ8BOxAekREOW3mbl7YpOM/r77kruRU2WDNIKBXeAYg/uR/Sd4S0qvnF8RD/0dXItztJM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787325501; c=relaxed/simple; bh=4MlY32o9imioGrow2WwwFCcZtoaXQ7NaWanAMurV1bo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=C7uQWe48w7cucwmSOpkGEzYDAYd6lvo/6TkFZYXCQDnPWrpAzu74DU/X9rwyjRLcXZ2kw2ZmZCTgTD89Rk67NCrVj3FcrNqGFIiVvew4Woi9tRGKmINd8tHjaJ5yprmWRmoZk3IqqSrVHDHlV5zMqLtep2kDfWyxzT6zzOULE7I= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=yacoub.de; spf=pass smtp.mailfrom=yacoub.de; dkim=pass (2048-bit key) header.d=yacoub.de header.i=@yacoub.de header.b=W7GhHKse; arc=fail smtp.client-ip=52.101.70.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=yacoub.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=yacoub.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=yacoub.de header.i=@yacoub.de header.b="W7GhHKse" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=PQwxw2uISuCVC0k2VtlgZvGNpxX3KPH1grYag/K4Aivm0us+zDr2+noWYY9G8uGYOh1zmnOFr05FKeluaXa1PbEUQ7ST9yMftq45arTk3wDF7JfGuulvfOKSUsMhShK7OizjhLx38X+E/9udegBxR02Nt63GD1kTRR4xKhht7r6vFvm00W6fCiFTtli/WwOrfF8lbgTRo0ixVxYv+L45qcpEhaql2vC9oUEPVzguWeK/pT00ixzECxaDpikMd4RjUSLL18z1lZpqQFT7MLq9kF0X1HMMkNK7xFOPqZiaat2kYj6k6ktVOf+giZlSCIV0kBxYnP6K+YrW0wWng1AkJw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=0clhfyWKBx03k+1NNPeIVrDEwSsG5a86QmaQalvMuic=; b=ib8/MsI6U8pJSK34ICrACUu7Vk6czg4Q9EL625TSe/eTHXgw1F8P1+D+DpOI11DZGcTPmLgjBjQqz1uVlC12OgP4xinlGCcJZQ+GqOWOQofOs5+naa5I6ZWEknIP8HgN4bVOo835BsNVzeo2xsrnxQ9Zsz7FFp83nDL3drH498HoBuydSfC1IbP8pb9UPjRvD+EtL2XQmkN4FUO/h7keI/FDCy1TXpZsohcSm9/iDJl7N7Q0gnQLt8mw25GWE6ja0SyrIRbCQ5TJdqKbF/JfsmJc5t4PXwmjAPeEx/osdk5N+HytiXTKJlMfs5OMe2MJcK8CkG6j0rv9zu6tAxSAkQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=yacoub.de; dmarc=pass action=none header.from=yacoub.de; dkim=pass header.d=yacoub.de; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yacoub.de; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=0clhfyWKBx03k+1NNPeIVrDEwSsG5a86QmaQalvMuic=; b=W7GhHKseLzc22hYINb8REl59HxqAmDYMqdmzvVfO6h4mkS0VVNVPoHW7p2u9GjQRi7MtvcFfaq34xaxBOLU0DyHeQznioCP7LvlyKYaVVGSmkj6Vmfkh3ULVLTSz8UIBHtqq9nyb4eA5NyoyYZgw9C1x1FlEHlAAViNmHMJ5aMpolRYDQ+IE5GjcdOxun0r4LvNj1v20yOqzqAte3XIYDMw/lfhJvaleGkt572I+Qj7R9LCQmvrkqCCr7w6C7Ea8gak9S+0j/gy22+V3ro1TuzeXikHXmuXuV8wDJV64KZfbVqpUVw8yQpr87CVICyqjEjuPyRsE7dp7QGSogfUGYA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=yacoub.de; Received: from MRWPR04MB12069.eurprd04.prod.outlook.com (2603:10a6:501:99::13) by AM0PR04MB6963.eurprd04.prod.outlook.com (2603:10a6:208:18b::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.339.10; Fri, 21 Aug 2026 15:18:16 +0000 Received: from MRWPR04MB12069.eurprd04.prod.outlook.com ([fe80::37b9:4b72:7864:5809]) by MRWPR04MB12069.eurprd04.prod.outlook.com ([fe80::37b9:4b72:7864:5809%4]) with mapi id 15.21.0339.010; Fri, 21 Aug 2026 15:18:16 +0000 From: Ramin Moussavi To: Michal Simek , Michal Simek Cc: linux-kernel@vger.kernel.org, Arnd Bergmann , linux-arch@vger.kernel.org, Sam Price , Neal Frager , Waldemar Brodkorb , Michael Eager Subject: [PATCH v3 1/5] microblaze: wire up sigaltstack Date: Fri, 21 Aug 2026 17:18:05 +0200 Message-ID: <20260821151809.1233057-2-ramin.moussavi@yacoub.de> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260821151809.1233057-1-ramin.moussavi@yacoub.de> References: <20260821151809.1233057-1-ramin.moussavi@yacoub.de> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: FR4P281CA0250.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:f5::8) To MRWPR04MB12069.eurprd04.prod.outlook.com (2603:10a6:501:99::13) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MRWPR04MB12069:EE_|AM0PR04MB6963:EE_ X-MS-Office365-Filtering-Correlation-Id: 664af97e-bc4b-49a4-0345-08deff976caf X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|366016|376014|1800799024|10067099003|11063799006|56012099006|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: QwBLPpnPwooHJY3Pa445EhKwwiWzdYtNS0E7y8KJ1YAL97UKKxFurquA3LpPI27yprOqeRmbE9tsA9W6xqj+EpkM4x/N/UnDuKbrhFhOPmB3aqgDE81JjKbTZJ+nSbrQ3cRrkiEb5CZdnCcgs+ENKuW9rWE8bFbr/pi3FCWynwauYx5vKeFzRXqYOOUI1szeCUtYflFOx/8KpOYQWoA7CoE/+LbmkakgieXA4CZ6X58bCknGokxLoxZKFRB64gcbqzDShoiSNAVN8kIjtjlR7PlNPsqS4lwRU/GZzp5SrYEU42OfRYnBavlJoKZOO6EX93zZtwJKNxjoZ2m+0g1dGjyOMcvCT5v8FxqLfOCiHBGppMonWGtk7NJFuN/GpceTqLJGRY9A6yGeOLR3FxmZA9MxgTiK8SJYZbKVAaeHIQUz/rT56CiyI4VCptAqymvdN+vpe19Hq1OMWCJJa7+tTmLdWHhUhpNyahCFTGFn48W3Kho5vkqcdDX0/hRPpNq+r/zz0lXXBB//jrNhVOLPSIBt2BIvLyPXoBUjM0uWOW/2W3/UfP8qXrh21JIpcAqkPwaihdTrfBG7cNrjHms4BL1cLM/DsgP0zIfNyU+y0ZTlfOhV5YJCf6M45x6buVGLvBMGoTVPJcYW0dEVp6JVkveDqFotrfZPZL5b8VRipOs= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MRWPR04MB12069.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(23010399003)(366016)(376014)(1800799024)(10067099003)(11063799006)(56012099006)(22082099003)(18002099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?CM/nTUN88jDIWEgVYrB9vnv0IN/oc+w+zNhASfoS5VOtD0iI8kPJY9rzhRCo?= =?us-ascii?Q?txIt8qxXm9acgD8LtHNiPdVPlrTyjBkZzu/i34eC6b/w1uJFyoimiezeibuL?= =?us-ascii?Q?uv2iqaWl+I1JO4z05PwhbCjeq3yUPW757ixtpp+mrZiqUPLDDXPssl/7LINw?= =?us-ascii?Q?9+3NL4at8YRoSzkjrMsRPC0EHEAIf30m0wi/ggY0WKRm2sSp03EkqzuQlzwd?= =?us-ascii?Q?0adPBmdOmyQ3IrS+5Gcm+g15qq3QgcAF4C7wCvpg0vCu9m9IjWN01cHy2uPe?= =?us-ascii?Q?9i/WNi8BMSqpIcJgjKfg3MfAtI5tO4FOYg7cL9fBsMX43RhqVNwDh+aK4iyl?= =?us-ascii?Q?ldX73yK0myVUMrHhFaFtgOAKASMlLNIERQXkmpTbwgPlNVVkjoek8rnkmWv/?= =?us-ascii?Q?OHgOrcghZS0QxagN0lEztJ3NNhHaPq39s9KbpQpWqMSPQ1KYUjMK9sf3rtOC?= =?us-ascii?Q?S5dzsinfTCZ+xKEK3WrNBO5pXpr4xjimHbw0mvKhTErBM3nqqmp7UEf9CQYe?= =?us-ascii?Q?wdei2yf4/yRhQUEw1mG6DxOmLC7KgH1J+cfPZS5l8zNlIg8cbl7Goa23oIu8?= =?us-ascii?Q?9aNr9HbUtdu7QdOJu7JlVpK2t977B7QUBOp8Dv18AraII2TM6v/z378g4p1u?= =?us-ascii?Q?aY9HPtWmaLHjCf3kyj0cBdzpYCq3/2kt5SunrU297vXj3h4TfxOH86SkvTto?= =?us-ascii?Q?BfiEGIv7MltllAixODTTEaVluWxd4Ssf+LjcO/xBOpeF66NEPdWK2acxX8FR?= =?us-ascii?Q?aCVCnupAoQMCveexu62TxAmAiWDGFxlrh7NrKDnRe/ICy5IJ8/VeQy74I8rm?= =?us-ascii?Q?1AADDkaSgyukb+mDtAUNBRGGaqINSRZUkY0hNaNsol3V9dUXu01q7TRYzPle?= =?us-ascii?Q?IMd26y/XriZo4rAA47cgOvkrPDFiedwHJp8QzTxxPBWBAxV7Zfxt3ENsH6VB?= =?us-ascii?Q?/wvh7Yv+HgHeN1DsQinXY3HSk/xyIsfjwzlDBli5ER0fT4JCeD3GroUsg7+t?= =?us-ascii?Q?lfiDYgsBOb6YVFLfPN3BU6J88d47papEvpTidr7gY95KPAlBhM22knmZh19r?= =?us-ascii?Q?T21CgPoimAHEmMRh95R8DSs0y3O33AL2pQJN3cnsPgJzAPdgQZ8Kc1xC/u8b?= =?us-ascii?Q?GZUQtkeSFgjcBP/c4C24X6Til4yL9zsphAWGLPYMNMlEYKOY+1rn55AS6d0u?= =?us-ascii?Q?5bgStNI92XrXh0w5xdCsM4hxYoHa0r69foFu1rtV0ysZP60yRTgJhi86OhpG?= =?us-ascii?Q?JxCd8niA9TZL+h56K8zXMIFuAMqkfnfrXPrsN5C/O3QAC+OUI6bnZrI7rOaF?= =?us-ascii?Q?ddeUPfya5k8uHCDzYeZNqfoZk+Tqcgb7OlHBd7Gq54KMj1dql7Ub4fnv5Tc+?= =?us-ascii?Q?HpY4KxdNEQ4bX/40SGEEEnpDs4APqkDUk1XaoF0pLDY0+EWKdbFVkTkl2wre?= =?us-ascii?Q?md9IvseNWMVqYQEI5+GztAzNsnQg0vUqKuMjFhCTzQZGFTbiv3ablvrgvTMJ?= =?us-ascii?Q?ApaihMf3AOCnqizFp2Wsa/mg8OHnzPC48g+Q94oK8UoLMysFSCn3qDpbxQ3X?= =?us-ascii?Q?fN5/yYusTh9Gc4PnZ4Y8t36MvhIsmApWOFLewC6OYaOLHpZ+3iC3+wU8tvLw?= =?us-ascii?Q?er+1qxM37M18t8OeKyI+tD9z3qtykGLTu5D3lSUOb3A9Lr5OXbxsQTfWV1Gk?= =?us-ascii?Q?SUicqCEtXKu51w49sC/kLI5TBbe3tN4P2hrY+FynzdcnuZylFMsx7plGuhtB?= =?us-ascii?Q?boYR8ktUTg=3D=3D?= X-OriginatorOrg: yacoub.de X-MS-Exchange-CrossTenant-Network-Message-Id: 664af97e-bc4b-49a4-0345-08deff976caf X-MS-Exchange-CrossTenant-AuthSource: MRWPR04MB12069.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Aug 2026 15:18:16.2688 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 2e96c4fa-c0f0-4eed-b0b5-8f85f5e8376c X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: PtjrfnnsUlob33QyCOVtVHI/koBvO1YQxSZ69bYJrxZEI8lNHYE9NsDqgtD2z9JvLLP8q25CQUyxl1SBYruWdfCAWXKInN3axLW2hYhvx10= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR04MB6963 Content-Type: text/plain; charset="utf-8" sigaltstack is wired to sys_ni_syscall - microblaze is the only architecture without it - although the microblaze signal delivery code fully supports the alternate signal stack: get_sigframe() picks the stack via sigsp(), setup_rt_frame() saves it with __save_altstack() and sys_rt_sigreturn() calls restore_altstack(). Wire it up to sys_sigaltstack. Tested on qemu petalogix-s3adsp1800 (microblazeel) with the uClibc-ng test suite: the five sigaltstack-dependent NPTL tests (tst-cancel20/21, tst-cancelx20/21, tst-signal6) pass; before this change sigaltstack() returned ENOSYS. Assisted-by: Claude:claude-opus-5 Signed-off-by: Ramin Moussavi Tested-by: Waldemar Brodkorb --- arch/microblaze/kernel/syscalls/syscall.tbl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/microblaze/kernel/syscalls/syscall.tbl b/arch/microblaze/= kernel/syscalls/syscall.tbl index 223d26303627..b4ce48e8a874 100644 --- a/arch/microblaze/kernel/syscalls/syscall.tbl +++ b/arch/microblaze/kernel/syscalls/syscall.tbl @@ -193,7 +193,7 @@ 183 common getcwd sys_getcwd 184 common capget sys_capget 185 common capset sys_capset -186 common sigaltstack sys_ni_syscall +186 common sigaltstack sys_sigaltstack 187 common sendfile sys_sendfile 188 common getpmsg sys_ni_syscall 189 common putpmsg sys_ni_syscall --=20 2.53.0 From nobody Mon Sep 28 12:34:31 2026 Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11021074.outbound.protection.outlook.com [52.101.70.74]) (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 4FF6A47DD78; Fri, 21 Aug 2026 15:18:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.70.74 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787325508; cv=fail; b=c9WrOOIZ+2C4eNSiYeoo1UhVZaDBv0Y35A3/spoZ+46281v+/HhE1EMr/NG391WUMFz6lhb1synp5NdgOEyhVr3N0mKI7plS+k1pVG2e2WVVJvFhd/FErT9L9zVtXCkQ7Ywm8iQ4B3fGTQ+BrZr5vVdbICnKaO64gCHRzv9S3ZA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787325508; c=relaxed/simple; bh=Hldp7ewlMcuvdLG3Vn5HRr48hriZfyjhvl9GR9wo66M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=mXSlI76+bPEuRVyU1aZ8sr0/HsNnj7R0ijwct2YqE21qmY11lGF9+k3TfLNgTjBdy7Pjzy6vjjOZw150LejSDKa1jCAtxy44TP0B6QnH7Wm6NpQcJID235hlA+UE8/U0cSv/pUDuN0SuLEMdPX+f5klrHhkEJLinYiX8KCJfqWw= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=yacoub.de; spf=pass smtp.mailfrom=yacoub.de; dkim=pass (2048-bit key) header.d=yacoub.de header.i=@yacoub.de header.b=aG6twZ23; arc=fail smtp.client-ip=52.101.70.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=yacoub.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=yacoub.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=yacoub.de header.i=@yacoub.de header.b="aG6twZ23" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=bSyc+VvqaPLcb8963F9wCptRRwJzyUSiGLEgf28Ye3odlmo35/6rmnFVpGzWwDwINGFmyeh77KXbF6DnlwosQviV/DZV6cik01KOj9K8sWXoafa4KooohI5o0zzbQXakNnZFjXK3Ly5SOCkQKFpI2RdmZv8gX9W/sK1OLgwyTnobAUQxPt2deFyAkAN7vatOHBoq0Ea3TGh5Fgc++nIeWLwrA5vQJ5369QJuDyYl8ws4+MbljuZJVhdlPzf94rJMw7934bhra7Ud8X0Dm7Uvj76JPfvSDS6ohWgey0GqAfYgZV6t31Hb7+AJxvo2CzuNvd3JPy79/POSXa8nvH1BdA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=GTD4ix38jIyvdEfFR6UD3f1M85fDsXJ3Iom0skXErW8=; b=WIL4fwkYa3xplCfgS5x/G5KpDPT201jujIEvjOL69p+z+kP6p1mzIUuxG70aNCMySpu7HFAZB5AutzG184E6py00T8i9yHP+Xm6WmMtRzKPlw6ZcyiKFaiQVLZCyBA/lbjReeaVstFAoz3aud2V4e/y4m2CQ0EB6gOUO3hT7/PgWjslNp1Bd58SVcLyQnC/9bRDLRZHC1G1RAqoBUE3+gATfdvc6h6PR5wuulQcebw0OhHqh6kRWMmrI37cXRscYBb1xniXz18JDtBgMdxBsfL/sr+B0UM4bHuktpWxkIihEoKvimw2LMPBkkRzRGpISzOjvDxcAPB30apO/eY+7+A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=yacoub.de; dmarc=pass action=none header.from=yacoub.de; dkim=pass header.d=yacoub.de; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yacoub.de; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=GTD4ix38jIyvdEfFR6UD3f1M85fDsXJ3Iom0skXErW8=; b=aG6twZ23AVNOpLBmWjOd+E5FOuIorS9eUy7CBIrT5LzjFlM6HemXM79Yvt228JbQFhJa9j3XMMIprB5/dLWkKIjaUN/zQRRhu7V2rI8kZP54w2Lhwvlp70PBVSndSeoj/WQEL+tBB5TQ31zc+n2gbZ1cULfp2MO/dX5Qry59NahVaKqbKglCtG9maFavdBrBsaXTzQXzzjZZYcvRKpthLGjLU8wXNoVPKqeLJC/tN8r9cr4RZICgulEBXFMODAzJ5XhSGi7NZH1HTojlHQashzFJuN6rj+3IPW8TMb4arRulMs9KJerJaVfX9Mtm2xiWkyzRs4QDESOgv9ZvmqtffQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=yacoub.de; Received: from MRWPR04MB12069.eurprd04.prod.outlook.com (2603:10a6:501:99::13) by AM0PR04MB6963.eurprd04.prod.outlook.com (2603:10a6:208:18b::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.339.10; Fri, 21 Aug 2026 15:18:16 +0000 Received: from MRWPR04MB12069.eurprd04.prod.outlook.com ([fe80::37b9:4b72:7864:5809]) by MRWPR04MB12069.eurprd04.prod.outlook.com ([fe80::37b9:4b72:7864:5809%4]) with mapi id 15.21.0339.010; Fri, 21 Aug 2026 15:18:16 +0000 From: Ramin Moussavi To: Michal Simek , Michal Simek Cc: linux-kernel@vger.kernel.org, Arnd Bergmann , linux-arch@vger.kernel.org, Sam Price , Neal Frager , Waldemar Brodkorb , Michael Eager Subject: [PATCH v3 2/5] microblaze: reserve the ABI argument-home area in the signal frame Date: Fri, 21 Aug 2026 17:18:06 +0200 Message-ID: <20260821151809.1233057-3-ramin.moussavi@yacoub.de> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260821151809.1233057-1-ramin.moussavi@yacoub.de> References: <20260821151809.1233057-1-ramin.moussavi@yacoub.de> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: FR4P281CA0250.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:f5::8) To MRWPR04MB12069.eurprd04.prod.outlook.com (2603:10a6:501:99::13) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MRWPR04MB12069:EE_|AM0PR04MB6963:EE_ X-MS-Office365-Filtering-Correlation-Id: 0b6cb89e-9547-4d94-1210-08deff976cfe X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|366016|376014|1800799024|10067099003|11063799006|56012099006|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: kgNRuGZZgkELVhk+UhzWQV+b0mQJcYX95kLz9qC994np/9tLdNKW9TGLNDdw0AlqYjqvz71j6sf8h73RlDwdhk6sco4csP8uf7STLEaaPo+aGlXZQDQwF8R1o7TJNXciyrcQd+qvCw9OoH3bg6Q0h0p4khUqN4doJaNzWdqyBv4KEnkSUUekPXmkRu9Cn2TXJp5no7he5zzft8XgkwUjsMfZV54xtPoVU01YwfNcqgMPuCman5tfpSGWv4y+l1xO2bPHobNR+6ekIUqv6CNapjzMwUoU7gkAQSm1PD2GzeSN3krEgz297Gf5UWNHeJwA4FeubqLBq9NzTjK95CB4GnN+D7uhsUKLJaz8jAfgHQbA5slTazYta2wjToYr34eBZXangPiObLuDNRjotTfMLPlbg4jp6z94AEm0OC/YM0PK9AC6FYg/z6PcUvfBGMtfiUg9Zxr8VHZKvlNIErmE99hyfXnOgxvbHuBh8J7aTRVzn1NRzeKMJcKRZnqNAN02D3vEsHkqdxXzRIqBqhsV8rZUNrpz6TMO9TxvKXEZzw/9nl4ul6WSKYDSUxgBis6oDW6NxgnaYP+sXaTqmwDT0uhgl7ryL/vtXJ0gReWKCZsMFZz4o8/qnyTkGIUFnpdV9ZhJmeIPxGvXH4zhBQBlXvmgwwzw3Msrbc5cYOaFDro= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MRWPR04MB12069.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(23010399003)(366016)(376014)(1800799024)(10067099003)(11063799006)(56012099006)(22082099003)(18002099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?u+kHMIjGvXGZG1Kk77mCvEEeBvzXqNKkMGXK1hGFLjpg6VRX1hHFGc8xImEu?= =?us-ascii?Q?9nz8vKM9nb+TRxzpRzcqGXftOs+MayTKPMlbdLR4lrf9kM1IuKTazZzXPC59?= =?us-ascii?Q?rWMkV+gIR36vObofWDRNY0kEw3QM3HRPhP/6UxCVaddonguzW79UfXCpTN/i?= =?us-ascii?Q?vMSyyqHC5wkxqUl7J84SL+NMBJPIMK3KpVMc1YzCAae4ONMpTxcokVEexHU8?= =?us-ascii?Q?25VTSdcb2Js0HULS8GNgnslU6c3rwo4nl8FvSO4BVuIDEjzpOCuxbbYi1R01?= =?us-ascii?Q?v6+GN8t5Nw07EMO14DLbDX4XSXJENIRtsAjTZyAV9e1otyoYMycG0mQVXndS?= =?us-ascii?Q?/tQiC3ZBv4DSfn2H1fSPmrruTo28+brEgJAusHu1FU+vtlneJzVg0FJL88Qa?= =?us-ascii?Q?d0DApv/635S3DoObec7UnuuknXApQMEi9FMcDgygsASqxvUw6W/G75IgmKLf?= =?us-ascii?Q?sBq5+kENWpgM51gb+zeixMyu0DSBxmdJ3uNUXjOl0aTed4Pli8i9OvFAYYus?= =?us-ascii?Q?HU1PAibl8BIhH9dPyhF2JJU+X4Z+cEfVYZ4vJ6l8wAPZX8cmKDiztir4SvpD?= =?us-ascii?Q?0aN5ZdrOTMuGt2NGPNY76IyUvrDqTeH+Ubs9VSP0jW5LgBDvXT7dtQRe4OHw?= =?us-ascii?Q?ozIS24bIfnODKCFeS9AKblpheThYWZVbMbNEVlzuoxsgyYwI2fxhQk/0WY8X?= =?us-ascii?Q?Myk8YgH6lopSFS1z/LbkmHxSwQvWrHk9LUSg2Lh0cpFx0zXNFDvAY9696189?= =?us-ascii?Q?eSL30MtJZ/X2OzLNDMqJNqVo1bUnWj10wJ55Wp0zVQFgtZMKXKqVf4XbVi9h?= =?us-ascii?Q?pV9MKBNLwjwL6IJVd+jDEbEzu6vbgaOlhTnFolm8rW3ElTvFokOcPSfmflO+?= =?us-ascii?Q?zBSSkCuNUI0xqq74BLbdT/v892USOWDS6KWcQPNQ4lVH6oPW2ghWp7NxKZR6?= =?us-ascii?Q?chE2RgZZx88e97EPjuitNWOXOlD7ZHML9WU705GaiJposLhB5ir5E9Sz5w1P?= =?us-ascii?Q?pD7oHO1Zic6SROOTOnJQuxsDj1SiQVLWTRVCVoQr0rJN7CLMuTAgATIeYD1E?= =?us-ascii?Q?dg6t8PoZupDWAy5md4SRpbXm+IwPzuWG3hUIHh8b2GZDEvy7xNQ/fBd0EjVJ?= =?us-ascii?Q?eH3bbTq4hZdGZh7C2gLxvsjCNy4TeoQWYtXM9WlTiJ+1azVHSpYyKq/EOkIY?= =?us-ascii?Q?bymmqVQpc1dkIpJj5FvhGAjO2nAFUNewWeoWlZKqGfyacvDTCD665XaomLW1?= =?us-ascii?Q?xBSbeB4rvau6JQ0uiFQ62DjWjBS0ksbnBuOIJXVUsYMCAU37G/jZMYC2UGvl?= =?us-ascii?Q?Jrr66hrlH3XmAYpLb8dIhmwwWxnbRV3/CGcWKCNseASJCLzKDDOX1KpOwQzF?= =?us-ascii?Q?L220X3HJs9HyX1JreKrZH60csKynpfPSeHalFFwlVJvsrnkly1WPtgxb9axw?= =?us-ascii?Q?sItVN+0zKTiDlIEiYDk4DfT5lu1Q3BzdEr4QDEiAMcjIosuww3e6oJetBOd+?= =?us-ascii?Q?on39O1AfnUKCF7qJuSfXNDguXu2ijwyJ2kGbXVRmEV/PFVxIa0NLsNiP12FC?= =?us-ascii?Q?+FiMASI4mc66JLODAOs6pH6+vKQQtKIaEhY7LR94aebzUC3UJZKDqYIHmBSk?= =?us-ascii?Q?iZiX7k20v9Ev8Gn1Qip0lhwAivVXmNWgr7/YhDl+MpViAw1qReLSdGzMs3ab?= =?us-ascii?Q?G/KMXIqI0+8PpavzcPGmwwVZane68KO+LplhC7DIHvu5epn6ahHQJE+XFHs9?= =?us-ascii?Q?rHktlo7ceQ=3D=3D?= X-OriginatorOrg: yacoub.de X-MS-Exchange-CrossTenant-Network-Message-Id: 0b6cb89e-9547-4d94-1210-08deff976cfe X-MS-Exchange-CrossTenant-AuthSource: MRWPR04MB12069.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Aug 2026 15:18:16.7630 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 2e96c4fa-c0f0-4eed-b0b5-8f85f5e8376c X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: sMjc4SnCphLKrx3K6RIdHwndmKtptYrGg2CF7IRxlRjcAne6mWW+ZZQJJ7FuB2VpZl0Vba0yzzPNxlAzB6twdarrFTlQZpWo0/KBUpqh2SU= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR04MB6963 Content-Type: text/plain; charset="utf-8" The MicroBlaze procedure call standard reserves [r1+0] for the return address and lets a callee store its incoming register arguments r5..r10 into the caller-provided home slots at [r1+4]..[r1+24]. When the kernel enters a signal handler it sets r1 to point at struct rt_sigframe, whose leading member is the siginfo prepared for the handler. A handler that homes its arguments - which an unoptimised (-O0) build always does - therefore overwrites the first 24 bytes of that siginfo, so an SA_SIGINFO handler reads corrupted values. The stores stay within siginfo (128 bytes) and do not reach the ucontext behind it. Reserve the home area by making a seven-word gap -- the return-address slot plus the six argument slots, 28 bytes -- the first member of struct rt_sigframe, so the handler's argument stores land in scratch space instead of clobbering siginfo. Tested on qemu-system-microblazeel (petalogix-s3adsp1800) with the uClibc-ng NPTL test suite: tst-timer4, tst-timer5, tst-mqueue5 and tst-signal6 pass; before this change they failed because the handler clobbered the signal frame. Fixes: 2148daa9c45f ("microblaze_v8: Signal support") Cc: stable@vger.kernel.org Assisted-by: Claude:claude-opus-5 Signed-off-by: Ramin Moussavi Tested-by: Waldemar Brodkorb --- arch/microblaze/kernel/signal.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/arch/microblaze/kernel/signal.c b/arch/microblaze/kernel/signa= l.c index c78a0ff48066..4956014a9937 100644 --- a/arch/microblaze/kernel/signal.c +++ b/arch/microblaze/kernel/signal.c @@ -49,6 +49,14 @@ struct sigframe { }; =20 struct rt_sigframe { + /* + * Home area for the handler's register arguments: the MicroBlaze + * ABI reserves [r1+0] for the return address and lets the callee + * store r5..r10 at [r1+4]..[r1+24], and r1 points at this frame + * when the handler is entered. Without the gap those stores + * corrupt frame->info. + */ + unsigned long abi_gap[7]; struct siginfo info; struct ucontext uc; unsigned long tramp[2]; /* signal trampoline */ --=20 2.53.0 From nobody Mon Sep 28 12:34:31 2026 Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11021074.outbound.protection.outlook.com [52.101.70.74]) (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 5AB5A4D2EE1; Fri, 21 Aug 2026 15:18:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.70.74 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787325510; cv=fail; b=UDpbRlD/3D6kCaZhghzU3V5jsSsHXOzdeNd9QqHAkgaaFtucjWz7TrgZtmsqiNkgvzhlP+AK+pSbgzZE5xCvF7CblHQCESRDE5JFPeBwIPm/5a0u+XBrPK+LvabEOdmoxvnQX/ATMaQoUsIbMgSW7MioNsapahFlbz4lNthpBCs= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787325510; c=relaxed/simple; bh=mAMllYFGV+hYCBLYZQH2ES2mqidbjatT1jCtaDl5WDU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=uJMvMG74tiIvlibZqNbgtdJc1ITX6SRfSqMZqZO6dOCzwKkj1Tm/LINH9fhnW5HWGD9I9VwGkgYK7ePHpYxeshogAFIPmuW2WUOd4e+Kn0/3r+aP4LbM3oNy8k2rDGCWmAb5Z0fOUU8i4THNk09aqMeph4SVYvckteBg+xR/eGs= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=yacoub.de; spf=pass smtp.mailfrom=yacoub.de; dkim=pass (2048-bit key) header.d=yacoub.de header.i=@yacoub.de header.b=LNLR1d4C; arc=fail smtp.client-ip=52.101.70.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=yacoub.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=yacoub.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=yacoub.de header.i=@yacoub.de header.b="LNLR1d4C" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=qLRBcoJIBfJ/WfgP9Ne9qwWnxl5spzxy4oafCPJ4fDnEJKsAjWnari1xYnYD/m4OcljrmTV4Nd5utxgoHwbmLl7XPggCl/At9XUN+qnXrc/GhsyVoIjn+MDulCpM21Ki1jhNrM0Jh8b3EUYrxd57xkmB8kHpcebvku1c+tlKpzYx2np6jgvc59j+Zv3hkNBpz4fUCMGNKhdAM+FcJ0OKJzTc9VRbp9HF25nkMfp2YHrpoO7ZX/iOF2awBiFPfA8piZD0Y8fV45znBVtQClKg/lgmK8MNuFzbJWuP/BWVpnjyizIx4UCY6yi2+UmT8Jy6Objc/XnvqlHeVmvB7V1n2g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=PZNhoNtM4fhDzHo/E7OOBCGYQSH/NriUzPBgPloFxNc=; b=w+Pesrj8HHn1ZXWI2ClP/EhUzySD392tYMxr3aPmKJPvl8/JXjEOib9Jg67PGG2pXV7oPzno0kTrcA7pUC+DOo1zoOqZHJZ9DUxufuOLV4AdAPxDSuzK8HcLDgoS4DcJi8TkDlvjTABZSNLK6+F9uMr1SaRA32YYz0Scw/nkaOrCTTm2O0dEPUQHFMtYk0OZfRpUbSJZs51amu/TkvQqdA37DAL9cAHpn2DBFHoB8o2nH71jzgAzWjJASuOm0bFVW7LKvVIi5Je80AvzOoZYUeXptaN5Vt5Xu/DXk6HKIvPQYwkRr4VRay/SrXIizhXGIhFl9CLNhacVZWZh3GrA+Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=yacoub.de; dmarc=pass action=none header.from=yacoub.de; dkim=pass header.d=yacoub.de; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yacoub.de; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=PZNhoNtM4fhDzHo/E7OOBCGYQSH/NriUzPBgPloFxNc=; b=LNLR1d4CzAFXHWuFoH3SMv7u6EnL6K38DPkUeov7tYfKEpF4bCC7e33xo5Zg7rP62nReot99I+Cm8U3x5qR9mcESD+P6qx8TW5B0yiVI3EkpaOkcAf3sKwUh2A92obZKsBj363CG+SllDroZSz/oEIAynZoUEa4fRuvWWP9dmONo1rIrA1dkzL0TdhTYjw1G5Gq5Oln5qPzqBPi6qsdWAbfWcpSZtiDGGJlpp8KHEkeuoD4+LzoBSnUmu1x/+YwhVkXIX1i7gcaVYoTetlPP1ufwqtfEuRx5UyOetoJ0iIt3chYXcFM69VcCijU6bRAZcjZJ9b5rwp8jlr+TBGd9pQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=yacoub.de; Received: from MRWPR04MB12069.eurprd04.prod.outlook.com (2603:10a6:501:99::13) by AM0PR04MB6963.eurprd04.prod.outlook.com (2603:10a6:208:18b::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.339.10; Fri, 21 Aug 2026 15:18:17 +0000 Received: from MRWPR04MB12069.eurprd04.prod.outlook.com ([fe80::37b9:4b72:7864:5809]) by MRWPR04MB12069.eurprd04.prod.outlook.com ([fe80::37b9:4b72:7864:5809%4]) with mapi id 15.21.0339.010; Fri, 21 Aug 2026 15:18:17 +0000 From: Ramin Moussavi To: Michal Simek , Michal Simek Cc: linux-kernel@vger.kernel.org, Arnd Bergmann , linux-arch@vger.kernel.org, Sam Price , Neal Frager , Waldemar Brodkorb , Michael Eager Subject: [PATCH v3 3/5] microblaze: don't clobber r3/r4 restored by rt_sigreturn Date: Fri, 21 Aug 2026 17:18:07 +0200 Message-ID: <20260821151809.1233057-4-ramin.moussavi@yacoub.de> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260821151809.1233057-1-ramin.moussavi@yacoub.de> References: <20260821151809.1233057-1-ramin.moussavi@yacoub.de> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: FR4P281CA0250.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:f5::8) To MRWPR04MB12069.eurprd04.prod.outlook.com (2603:10a6:501:99::13) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MRWPR04MB12069:EE_|AM0PR04MB6963:EE_ X-MS-Office365-Filtering-Correlation-Id: c3e89866-f011-4d3f-1695-08deff976d45 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|366016|376014|1800799024|6133799003|10067099003|11063799006|5023799004|56012099006|22082099003|18002099003|3023799007; X-Microsoft-Antispam-Message-Info: kjlZxESBwW8eDe0JrNCizwI5pAX/elZWVithh4tdFwrH7U5O7/12xm1ba4JaWWAhs1gZbykdASZkqv7A9mo6zkKv4HUNu34W5Bf+oc+KMUvfmcFDMXMQHqEP1PZIgO5FUrYkoN6MbAt8Fz4E82efNyOl13lxFOmxgtXPOx+d4dlzk1DgzEHzZFvJBpodV1jOgWekMWxrq+M/zJr/48EJ46acu6synAE4o2luh9pHNzbZEiy3FoDTFn7sY6e3cS91HZP6BX87INZ1rr+jcnzeXGbhhmmPwPD5au1sfR3Gs13p4YZE3GiTOJpvsMnk1cIMQ1Z1k2Ty5jqmbR2eBHNH8Sk6dQ2XfSzxAQcgzKZGNaEQSzu91JCNp/xtqEE47j1/vsuUAg+dAUpEcQ9nmEgrQDE+bJkk2uqEIVMSAQzeqgsPkWaQ817T0YBk7fPnsXRh8xzJjhnFlxrKseWjimGzbrxFBqmwZ5P6qJvpGWi+8/R6jvj1zFn5VNrIN0ocHaX0wp5X787EgpdmVYusmvv5W2HQSXXoo1qIjkcedcfdVxKOzTB+ERwMXV2tg/8g5Xw4aeMMPkuHU/d0aAbl/nqb1GnVaNqsOohuuEIwrGmOD2WIYsBVU68xMNeXQHYYLzV0D/3RCddVL/OwAuXK49xJxbee9Qc+stOHPKQ0iL+0sMs= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MRWPR04MB12069.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(23010399003)(366016)(376014)(1800799024)(6133799003)(10067099003)(11063799006)(5023799004)(56012099006)(22082099003)(18002099003)(3023799007);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?2XPaQZVidC4MM/LVWCRd1qOprEwIyZW8lSezSZkaLsNidFxerCgksTwJ49fw?= =?us-ascii?Q?bQ+kh4UuXVqHWeRbfwX1/Y7C8096bQnDtQRZCTwdTzT8a4QAyjFRBF7wKkG3?= =?us-ascii?Q?ilMpXAYkB/QssX9O836ehcG3zWAihJHV1O8Hjw6/FAsI+ddi3/2sUUy5BFIR?= =?us-ascii?Q?aDJAQVAXOxNnhN/XQgpGXAmSus/4PXyyIGXxykBbs1a3d+ROKvibBa2lKKF+?= =?us-ascii?Q?CsIPE1SnEVmG89eW+SQ4hDbYG/awIZJr3hExgeWYyvk5CWQa7ZKblvz8Zd9Y?= =?us-ascii?Q?whTHYvyFPaSOiAV6e0j5XfycHie3VLUzNNqdAMr2nCHgXvdYknM74oCXzw3O?= =?us-ascii?Q?Om+6RwzyLU1nGL8rq1aXsfqf1p02KquJTJoIQjJ4x1iUxlOsUWbuj82buuS4?= =?us-ascii?Q?Q+LJnwuZ4RT1LVsiDtWPQxlV+NgZcxzOT1MtcdXY1GbxV/jK2meF2jjkedrl?= =?us-ascii?Q?P7QgeTWcni/KdwuDMw7jzeVcwzo/kvthIDRLk04mgI7NGPeOvwJyepip+h+o?= =?us-ascii?Q?+1wGvk/3lt0caTxHEIgCZPKge/vK1PbgeArS2S/0mtL0sVDkS6HYYcMEpF5D?= =?us-ascii?Q?ddvBZFI6fZJPxQfeAYjMjRxOHokIxPB+NBByaLvfhumvi8F6aYL/fzIFrM4U?= =?us-ascii?Q?Li1XxKBgQRZA7VQ5sTls58VrkjcxJRK1YBu0qfeBr16+//cYySoQ/gu3/YSr?= =?us-ascii?Q?EZo6718UasRfvm2CAURxENCvX2LILPNE/iRFaAEkLzewBpK7I9bM3IdfBN6n?= =?us-ascii?Q?Psi9+cz32U0zU3BdKGK9E0d6t0fePV+/0zWw747XFdTOBZgyGkBo55qMxa+G?= =?us-ascii?Q?euYsrMO1YWNGT76pLtI4Dnk2dC09T2/4hZqlbRtLLdQywiO8erjMvd1o3Jrj?= =?us-ascii?Q?bmL65LaIdVHB/YAhqc1b3E7/2IOuFGJx/yX+gxoKUL4dJ695++ZtG2tyk/GE?= =?us-ascii?Q?YKqCf9ASY1Qu95pm3FGbSLntlPfSwxPvYFRMOee+M7faV4Tw9O7XObH+s1oL?= =?us-ascii?Q?tIHL94CwgP+8GrieTwXyGhPG5qVvBS99jRmGqbbNtYpWA/n4e9i+durkho9/?= =?us-ascii?Q?TQV9OxKtY1KcCLCAwJkt0ELrLDmwARJ3E9ZDBh1IcERGdmFO/SuRKYQo8a0a?= =?us-ascii?Q?nauUAIKEYpvhyVaBCju373ZYCAoSaZL2PgNxp/nhwdkjT0pmLgo/9UNXYWSM?= =?us-ascii?Q?d4oJGisnFb24EMSPgpn/IpxYot96nXPTgNnlFCthQHLP5rT0i32P2LkbLm3V?= =?us-ascii?Q?3OW3CLSdt6H6838+WHEmTbU+fHpBPEI4NKuUmRckgbaEdtY12CZe4Dr8QaI/?= =?us-ascii?Q?Z2bIYCNivM8s/asXJ121Ug2VOjxEY6rs0N99qBOiFtGbojdCBSOtiYUOuU9q?= =?us-ascii?Q?g/S72VRTrBMvcv/tERavkFy4nUdyiNLgNhoZKgo3aEdg8gsPdPPA0GjgAPIx?= =?us-ascii?Q?AAEFaEw1BGMt/2O3maaeXUcsLvDNlcH00eAxxfwyLCnoHFAA3vPRI6TtOVFU?= =?us-ascii?Q?ULaVziMCs4jM/pNph7ebNTr9RFX7S6lZe1B13nKiDEDabAm/33tjhSj59FNT?= =?us-ascii?Q?dose1FqPuPtQJFN/K0aciUBY6LpqeX37kmqU6vzJG8iZfl/8L4faMfvOKnUE?= =?us-ascii?Q?vufzpEhL04vIu6Rycu7xwWl+DXiP8xN+wxDO+CKUd0/XIsc0EjocAwRFW6Iy?= =?us-ascii?Q?sfBSzOv/4t9PMOE3KBSim4HLjlfhtdjBvM7acJzDHB9dslatGoCVem6ixWf5?= =?us-ascii?Q?ARAvNvM1gw=3D=3D?= X-OriginatorOrg: yacoub.de X-MS-Exchange-CrossTenant-Network-Message-Id: c3e89866-f011-4d3f-1695-08deff976d45 X-MS-Exchange-CrossTenant-AuthSource: MRWPR04MB12069.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Aug 2026 15:18:17.2256 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 2e96c4fa-c0f0-4eed-b0b5-8f85f5e8376c X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: a+DNoQcbIObPK9AmBL7y4e0wOM4ZmlLX8458tiV4npeUgKh92/eqZFe+djFn24OrhxtGigKt8aML/z61E9PXfA1be2MgFhTmjl1lpP7BR4I= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR04MB6963 Content-Type: text/plain; charset="utf-8" ret_from_trap begins by storing the system call return values r3 and r4 back into the saved user pt_regs. That is right for an ordinary system call, but sys_rt_sigreturn() returns through the same path and has to be transparent: restore_sigcontext() has just filled pt_regs from the signal frame, and every register must reach userspace exactly as saved. The two stores overwrite the restored r3/r4 with whatever the C function left in those registers. Only r4 is actually lost, and that follows from how sigreturn is written everywhere rather than from chance. Architectures have sys_rt_sigreturn() return the restored return-value register precisely so that this writeback stores the restored value -- arm returns regs->ARM_r0, riscv and csky regs->a0, arc regs->r0 -- and microblaze does the same through *rval_p =3D regs->r3 in restore_sigcontext(). But the entry macros treat r3 and r4 as a pair, so ret_from_trap writes back two registers while a C function has only one return value; nothing carries the restored r4. Commit 791d0a169b91 ("microblaze: Fix sys_rt_sigreturn_wrapper") introduced this in v2.6.37. The old wrapper saved r3/r4 before the call and reloaded them from pt_regs afterwards; switching brlid to brid removed the only point where they were reloaded, and the stores have been overwriting them ever since. Fix it the way the sibling paths already behave: ret_from_irq and ret_from_exc restore the full register set and do not perform these stores at all. Label the instruction after the stores ret_from_trap_no_rval and enter there, biasing r15 by -8 so that the ABI return "rtsd r15, 8" lands on it; naming the entry rather than computing ret_from_trap + 8 keeps it correct if the number of stores ever changes. Restoring the old save/reload would work too, but costs four memory accesses and a branch to undo damage that is better not done. Any value the compiler keeps in r4 across a signal is lost. The tightest windows are the lwx/swx compare-and-swap retry loops gcc emits for atomics: in uClibc-ng's libc.so alone, 50 of 364 such loops hold the address in r4. This is not specific to one libc -- musl passes the address as "r"(p), and glibc has no microblaze atomic-machine.h and so uses gcc's __atomic builtins, which expand the same way. Triggering it needs threads plus a signal storm, which is why it survived 15 years. Reproduced on qemu-system-microblazeel (petalogix-s3adsp1800) by running the uClibc-ng NPTL test tst-eintr1 40 times against an unchanged userspace: on v7.2 built with gcc 16.2.0, 23 of 40 iterations died with SIGSEGV without this patch and 0 of 40 with it; on v7.0 built with gcc 12.5.0 the same comparison gave 6 of 40 against 0 of 40. The register dump of a failing iteration shows the signature: a zero r4 and a fault at address 0, while r3 came back intact. Fixes: 791d0a169b91 ("microblaze: Fix sys_rt_sigreturn_wrapper") Cc: stable@vger.kernel.org Assisted-by: Claude:claude-opus-5 Signed-off-by: Ramin Moussavi Tested-by: Waldemar Brodkorb --- arch/microblaze/kernel/entry.S | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/arch/microblaze/kernel/entry.S b/arch/microblaze/kernel/entry.S index 582d7256d815..fea235f139d7 100644 --- a/arch/microblaze/kernel/entry.S +++ b/arch/microblaze/kernel/entry.S @@ -434,7 +434,13 @@ C_ENTRY(_user_exception): C_ENTRY(ret_from_trap): swi r3, r1, PT_R3 swi r4, r1, PT_R4 - +/* + * Entry point for returns that must not store r3/r4 back into pt_regs, + * i.e. rt_sigreturn, which has already restored them from the signal + * context. Reached as "rtsd r15, 8" with r15 set to this label minus 8, + * so it stays correct if the number of stores above ever changes. + */ +ret_from_trap_no_rval: lwi r11, r1, PT_MODE; /* See if returning to kernel mode, if so, skip resched &c. */ bnei r11, 2f; @@ -518,6 +524,15 @@ C_ENTRY(ret_from_kernel_thread): =20 C_ENTRY(sys_rt_sigreturn_wrapper): addik r30, r0, 0 /* no restarts */ + /* + * rt_sigreturn restores the full register set from the signal + * context, so it must skip the r3/r4 syscall-return stores at the + * head of ret_from_trap which would otherwise overwrite the + * just-restored r3/r4. Every C function returns with "rtsd r15, 8" + * -- the ABI return, where the 8 skips the caller's branch and its + * delay slot -- so bias r15 by -8 to land on ret_from_trap_no_rval. + */ + addik r15, r0, ret_from_trap_no_rval - 8 brid sys_rt_sigreturn /* Do real work */ addik r5, r1, 0; /* add user context as 1st arg */ =20 --=20 2.53.0 From nobody Mon Sep 28 12:34:31 2026 Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11021074.outbound.protection.outlook.com [52.101.70.74]) (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 F0CFC43C7B9; Fri, 21 Aug 2026 15:18:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.70.74 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787325514; cv=fail; b=GIFop0bgwBC6S55XJHPBOUVGzu8e75vLLUcSvMBxKlw+Bt9A19mKQ8jgGXDJ9P12yGuMDDXPFk4JFqdNKe+OlxhQBaUtlsmkSlk8cJmxOZCOzXmUAO80OyBcI/8qOH1QbvKhKtfoI111eb64sNV/CsWSB9ZUhAKw9NmoNeop1dw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787325514; c=relaxed/simple; bh=UkhpzA581tfmqu/7JerQCWjcupuF2Xa13yOGB6DY9os=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=c7pII2I7n3WiAArCv2dCt+HWd3t6+pfw4P+KV6MMlYwtZD0WsgGOuqQjEJKSmf9yF1t3nC80qtWL4vKXR88e16244pLxsXaYyyebL/sH3j3MGv5c21SXf62ZEUtE+1wDTY2JaOb4ZTvtuHODaD830tIQ63CHimXA0Pm1tVWR5KM= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=yacoub.de; spf=pass smtp.mailfrom=yacoub.de; dkim=pass (2048-bit key) header.d=yacoub.de header.i=@yacoub.de header.b=k+Qv17AB; arc=fail smtp.client-ip=52.101.70.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=yacoub.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=yacoub.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=yacoub.de header.i=@yacoub.de header.b="k+Qv17AB" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=AKZNr6clToeHNPvxcTIxmpFS5qERK55EN3hdEQ+nRW4ZGtVruSC9MKE+3OEECjw+1LnUiARjUPpN1JUNlkUY+w7jn7qAv1ovU23XAJTYMK6RcjXah6ajVOhhW6E4kxHBXfRR2UgT8VPvQlGgGeZqA5rDizx5J2loG71eQEaRgCMSifFrc6HK7bgtMcjWps+OqeTSHtpS1sGuJwQzDUT7eRRM7ni/H9rCzFOBZwuHbcAJq0Zl+XuqYRXtFj/HvcWo5gXJsNniDNkS2HLwOHKF5aSpgDyMCZLm4/Cri/9haT1sPH46AG7q0RvFNqyzEl8+ElzSYMQxvVbysss4yXbsVA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=SqSydulCCnKytUwxLm2X25zQvimqY9O2KFuKA9EQrE4=; b=qeGYHkZuiU2NRuX3mct1TaGneF/EKgGAZ+7B9RwgW32r+HQh/Eh0rQcHcnNwhmmyoOy1WdCChjFT/Aa6Dnule6Kjjw/YxYrKUJKjTKzuUIetdthBc3J3aJC5pf8902OWnXdSavygeljvpUNVO4fAf9lt85Yy9JBArZnZLfE0x12Oll1JI/bLrWNV0bMtXAqm6KsC8sJmwjKatLzZcVtdHbHLmMxad9tGVvo9X8IR4yfeP5JBywPOZY3aLIHkMZRX2HJwr3tvEibsz5wnmXWXI/EhWmvGaL+y6PwcodLbEKMzgXlMofU10vAYCdDwfI9WA7lhM1TghucwmnP+5e9uOA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=yacoub.de; dmarc=pass action=none header.from=yacoub.de; dkim=pass header.d=yacoub.de; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yacoub.de; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=SqSydulCCnKytUwxLm2X25zQvimqY9O2KFuKA9EQrE4=; b=k+Qv17ABvgicKL497N/McLJypZz6NkkC0s3+4yipCJ6mI5k4k9KGn2mzD5IyncPwVZIuLcHro5vL+gJaYVwPH2dNQQoH8/ZrWoYw44Vx/gUV0MOKZ5KV/8B9/TZns7R2Bx1BcuzKVFiH/0ZSwHvnl7vsFBFSDv0ybThF7cjYQ4R49eOx4axvpNox5jp5gCJNqkr3HAp5P/7FpyYt5MyKRdUhd/n4MoMPNVs/g/b40D1qHOIz6LjweQG8IfobL/ntjixiKmMlSUMFKi6LJAc8NkdMVXyLGDlUqgwugYCggom4ALJmRPio1exeGWUx8+lNTALoajkZVLpGasig91Azog== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=yacoub.de; Received: from MRWPR04MB12069.eurprd04.prod.outlook.com (2603:10a6:501:99::13) by AM0PR04MB6963.eurprd04.prod.outlook.com (2603:10a6:208:18b::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.339.10; Fri, 21 Aug 2026 15:18:17 +0000 Received: from MRWPR04MB12069.eurprd04.prod.outlook.com ([fe80::37b9:4b72:7864:5809]) by MRWPR04MB12069.eurprd04.prod.outlook.com ([fe80::37b9:4b72:7864:5809%4]) with mapi id 15.21.0339.010; Fri, 21 Aug 2026 15:18:17 +0000 From: Ramin Moussavi To: Michal Simek , Michal Simek Cc: linux-kernel@vger.kernel.org, Arnd Bergmann , linux-arch@vger.kernel.org, Sam Price , Neal Frager , Waldemar Brodkorb , Michael Eager Subject: [PATCH v3 4/5] microblaze: restore the ABI argument home area below pt_regs (PTO) Date: Fri, 21 Aug 2026 17:18:08 +0200 Message-ID: <20260821151809.1233057-5-ramin.moussavi@yacoub.de> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260821151809.1233057-1-ramin.moussavi@yacoub.de> References: <20260821151809.1233057-1-ramin.moussavi@yacoub.de> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: FR4P281CA0250.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:f5::8) To MRWPR04MB12069.eurprd04.prod.outlook.com (2603:10a6:501:99::13) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MRWPR04MB12069:EE_|AM0PR04MB6963:EE_ X-MS-Office365-Filtering-Correlation-Id: 9c39d3a9-9d9d-45eb-60e3-08deff976d95 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|366016|376014|1800799024|6133799003|10067099003|11063799006|5023799004|56012099006|22082099003|18002099003|3023799007; X-Microsoft-Antispam-Message-Info: 1KgT1FjwL1urEa0XqNVSilMapZTlTcc5WqP4l/Z8I0mkUQuaz3MsQQkhyVnKZ+TD8+Tsk51aCPKU9q8jKFsH3u2hWFPkL/E8q47Ugr05R4cXIJi01y63GRTkoqQVQEIFTFvv6/ZXVu4UOQABeJCKtqHkX80ZFESkbjrNO/cQLS1gk2yE9B7BNoEx9fMowYdKReDOYVeYycem7lhbf+s6uOLOf/xhvfjLPnxj+dTOvtjoCPB72H+wk0L3XmDMGOIw33uco3oEjd5IMQk0hCJbo9Kw8WhORpqsdviexq/d21HjnbAxGcwl5yHOWQLAZTv17R42Ym0mcfBH29qCzMqUTJd41qBy13qZG1fAJjujEUF9lTKMLaTRCUIqZ8iKkHEQpK/0dNMLzsopaBIeC6PXk7Stykdjzb+Pp2jFBSVXKytTcN/MkK2yuCUi8WEjriw1Sj4m2JpewDizck0M66gLZgZeqaA8v1wsJN3npzU2hW0fm1dssKLHrNZfPlQkAUNtVMjSNRBmkXJsNQJLiU9yR4+pTpI1/R4BQg/HdQIbav9vhbjQnzLOW2GGRx9XmUXPqGFNtr5b+H4Ll6fWYcSReuR3WnkfzDIiqDb2wf0dcekQLUS07LyRv68v1qw0rozWkETCFzpr597c8Qla1PHaEDhOWn8SMvct+B94a1CsFeE= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MRWPR04MB12069.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(23010399003)(366016)(376014)(1800799024)(6133799003)(10067099003)(11063799006)(5023799004)(56012099006)(22082099003)(18002099003)(3023799007);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?qQCw9sNZ5XRG+Dw1cNjtnMIFxQ2FrHKrxcPCeStd2U9x1oB9/b++YLtdA8f1?= =?us-ascii?Q?ftpAPyKsCoNRTSGNfXduCJHOJ7ZZEZ5vcwUEiIhIK6Np/Rk+p20iOFurn/Vl?= =?us-ascii?Q?3b8J0OttemSM5o+4BvjzQic6kUaS9S4wZwAXUQBK0aVaqLXTzlyeS34bYIau?= =?us-ascii?Q?hV5NAZEVkhzU/ShNfBRMaNtHcL1Zk9CMJgr60+CG9KHZVj4zgM8AzOJffPra?= =?us-ascii?Q?HXVaHJGGb5h64qbq/9Jh5Ajutys05G0U8taLEYZCTDtuFNamMNiUK8QPMjAJ?= =?us-ascii?Q?T4/JQ212mv/ddJGinO8rsWywAuW4hSKculUBG8UVTVF8zxuLksJZQ9QxiXfb?= =?us-ascii?Q?rmHH9GoRefwjAaYF5m54HQV8i0Hv1lJDRizhxWnh7dNQUE9a/OT+k/XSxvni?= =?us-ascii?Q?VLeCPwKK/za0XXq1Hjzmmm5yXDaNLgokKfxCGxSEBjJuevYAjF0rbd/6hzBM?= =?us-ascii?Q?rF8DviIdwjaODurjKui+AXwWTLEq4yLH3gWouRZYBUpF8cUyTIXCCFV6jZ/O?= =?us-ascii?Q?zKLvgEjTrL9TGHlGoHZqJ1OED3CiXO7S0nTGIKcjpxr1UMy5ZdX2kasKhQU+?= =?us-ascii?Q?54d7jPkBxVLjMT6Yh9ZJDIepm0uWlR/CNQ3zfinihSTzrjioNnRvb3SvLq2f?= =?us-ascii?Q?z8eIKJOMUfWvhr6gqV2PuTTnJNQawJYC8tprwxoxZqGuYkkrw5iKbhiozdeq?= =?us-ascii?Q?6YMSpf7vx90uGD1N8iQKB324YgnRDqJoadj7suzTl7OUcWcuN3adz9DPO5Wf?= =?us-ascii?Q?ZmaCHjSIJvDwPxzcmU5xIG5z/iXxUhmEXBtIrMzDEOjbxwUqQIrDx30BWE/B?= =?us-ascii?Q?8bwk6aydnVfra1iE9b0lK3VE7p5dOsQsDZeOvHsGIusCcR2isnmgtdxi2gY6?= =?us-ascii?Q?PE3IKkH6m9X1XgI5lujH239LhuZAx++k+jhEUzmx94Q+7Z/iy2eezUI003D6?= =?us-ascii?Q?COHx+Ddbgb7KfCqihrCDeSDRjzhthW6e8+vlEnvL3wTyDF0SMBxkKe1EVGFQ?= =?us-ascii?Q?F7m39QbxcP9AgcCsWokA+KhGYWXPusYe0mNMZ4j60z3clAUQD3T59xK52PZL?= =?us-ascii?Q?xBG+Wtp5FE2ssRiEHV+JSh1+ganU2Zinj6N9RAhH0B1kwscfwjTzEl9S8N8p?= =?us-ascii?Q?TvTpRTsme13HyDERgiF53NFKJAGW8sJn9PyGpl/6R0Cim4bBVuW02wCVhwo+?= =?us-ascii?Q?S9hgrMe9ugpHGMeyNfE0TkL/ufSmV5dBQd2RaXGxtafSYxqAFZBL429IrT8+?= =?us-ascii?Q?8tMnMonWrhI1RNW6U6eVi0S8sfPryHsgDuLmkotJTuo6UFQUbR2/8j2QskgO?= =?us-ascii?Q?cxnonKsmmp1R/nnS2llS9fW28toWnEhmQzZOPm8+nL55Sg05DKBIjHzBRUhJ?= =?us-ascii?Q?G7Q7yhpOLL88oumC/UUfaHP0isKC0xk7nvHiJmA2hZsnTs7JDwtBv/sX1PDC?= =?us-ascii?Q?nA2KXoh4478uULHjyCLqmXENfe/O6kelXqyr5rLLGVx7qehUzutMdVqjdW2x?= =?us-ascii?Q?8+muXocUyDRA3Z6SnSKexTySvXboAm/DsWFPrGG+s5DYoy7NWA9+/9WsD8Km?= =?us-ascii?Q?oClFvdGJiakgiKo8Jeyu3P5ps3lXIOjwxFuRNBgWe3lwCMzsWBpox+OfLjpJ?= =?us-ascii?Q?34w7uqTOOBT171i0V2R5gMmAIXdDQD60QMsEIh3RgFYw2TaWH6BIauVGWCAB?= =?us-ascii?Q?QrKtZ+yC3tLNKqO5JJZuekWTJ+jJW5XpDKas7ddpEuP3meftb8izSgLsuYSi?= =?us-ascii?Q?dPv2+tTZq4J8M/OUR4HaH73gxqP0LIM=3D?= X-OriginatorOrg: yacoub.de X-MS-Exchange-CrossTenant-Network-Message-Id: 9c39d3a9-9d9d-45eb-60e3-08deff976d95 X-MS-Exchange-CrossTenant-AuthSource: MRWPR04MB12069.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Aug 2026 15:18:17.8013 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 2e96c4fa-c0f0-4eed-b0b5-8f85f5e8376c X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 8Fzv2//r2Lqum3MECnZiQim5jZ81YXvrdxr2aBI0B7i33PXW0TCorkJAo9zYCTOvshYJO+h1L0c2Asly46nujhIYRZQ26w5A/aencj7qwZM= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR04MB6963 Content-Type: text/plain; charset="utf-8" The MicroBlaze ABI has the caller reserve stack space for the arguments it passes in registers: REG_PARM_STACK_SPACE is 24 and OUTGOING_REG_PARM_STACK_SPACE is 1 in the gcc backend, so a callee may write to [caller_sp + 4, caller_sp + 28). The kernel calls C functions from entry.S with r1 pointing at pt_regs, handing the callee license to spill its incoming arguments over the saved registers -- the syscall dispatch is the worst case, where the first argument slot is PT_R1, the saved user stack pointer. This was latent until GCC 15: since 3b9b8d6cfdf5 ("ira: Scale save/restore costs of callee save registers with block frequency") the allocator prefers spilling incoming arguments over copying them into callee-saved registers, and a kernel built with gcc >=3D 15 (without the TARGET_CALLEE_SAVE_COST workaround some distributions carry) corrupts PT_R1 on the first syscall: init takes SIGSEGV and the kernel panics. The kernel had exactly this reservation until 2011: commit 6e83557c38b4 ("microblaze: Remove r0_ram pointer and PTO alignment") removed STATE_SAVE_ARG_SPACE and with it the PTO offset, as part of cleaning up what was thought to be copied-from-v850 leftovers. Restore it: the frame is STATE_SAVE_SIZE =3D PT_SIZE + PTO, r1 stays at the frame base through every asm-to-C call, and the saved registers are reached at r1 + PTO + PT_*. PTO is 28 rather than the historic 24, which was one word short: FIRST_PARM_OFFSET is 4 and REG_PARM_STACK_SPACE is 24, so the area spans [sp+4, sp+28) and needs 28 bytes. With 24 the last argument slot overlapped pt_regs' r0 -- harmless only because r0 is the constant-zero register. STACK_BOUNDARY is 32 bits, so 28 needs no further rounding. Two places deliberately keep their mainline addressing. hw_exception_handler.S needs no offset change: its real-mode handler saves into the standalone pt_pool_space buffer rather than a stack frame, and _unaligned_data_exception works through a pointer to pt_regs in r7, where plain PT_* offsets are already right. And the user-SP reload after popping the frame keeps PT_R1 - PT_SIZE because PTO cancels there: (PTO + PT_R1) - (PT_SIZE + PTO) =3D PT_R1 - PT_SIZE. Both are exactly as the pre-2011 code had them. The instruction count is unchanged -- the same instructions with different immediates, no per-call reservation and no trampolines. The cost is 28 bytes more kernel stack per saved frame. Fixes: 6e83557c38b4 ("microblaze: Remove r0_ram pointer and PTO alignment") Cc: stable@vger.kernel.org Assisted-by: Claude:claude-opus-5 Signed-off-by: Ramin Moussavi Tested-by: Waldemar Brodkorb --- arch/microblaze/include/asm/entry.h | 13 + arch/microblaze/include/asm/processor.h | 2 +- arch/microblaze/kernel/entry.S | 329 +++++++++--------- arch/microblaze/kernel/hw_exception_handler.S | 5 + arch/microblaze/kernel/process.c | 5 +- 5 files changed, 189 insertions(+), 165 deletions(-) diff --git a/arch/microblaze/include/asm/entry.h b/arch/microblaze/include/= asm/entry.h index 9efadf12397c..05acf4d7bc4b 100644 --- a/arch/microblaze/include/asm/entry.h +++ b/arch/microblaze/include/asm/entry.h @@ -21,6 +21,19 @@ =20 #define PER_CPU(var) var =20 +/* + * The MicroBlaze ABI has the caller reserve an argument home area: + * REG_PARM_STACK_SPACE is 24 and OUTGOING_REG_PARM_STACK_SPACE is 1, so a + * callee may write to [caller_sp + 4, caller_sp + 28). The kernel calls C + * with r1 at the frame base, so reserve that area below pt_regs and reach + * the saved registers through PTO. This restores what 6e83557c38b4 + * ("microblaze: Remove r0_ram pointer and PTO alignment") removed; the old + * value of 24 was one word short and left the last argument slot + * overlapping pt_regs' r0. + */ +#define PTO 28 +#define STATE_SAVE_SIZE (PT_SIZE + PTO) + # ifndef __ASSEMBLER__ DECLARE_PER_CPU(unsigned int, KSP); /* Saved kernel stack pointer */ DECLARE_PER_CPU(unsigned int, KM); /* Kernel/user mode */ diff --git a/arch/microblaze/include/asm/processor.h b/arch/microblaze/incl= ude/asm/processor.h index d59bdfffca7c..595c24db2728 100644 --- a/arch/microblaze/include/asm/processor.h +++ b/arch/microblaze/include/asm/processor.h @@ -73,7 +73,7 @@ unsigned long __get_wchan(struct task_struct *p); # define task_regs(task) ((struct pt_regs *)task_tos(task) - 1) =20 # define task_pt_regs_plus_args(tsk) \ - ((void *)task_pt_regs(tsk)) + (((void *)task_pt_regs(tsk)) - PTO) =20 # define task_sp(task) (task_regs(task)->r1) # define task_pc(task) (task_regs(task)->pc) diff --git a/arch/microblaze/kernel/entry.S b/arch/microblaze/kernel/entry.S index fea235f139d7..dfca6ce2d628 100644 --- a/arch/microblaze/kernel/entry.S +++ b/arch/microblaze/kernel/entry.S @@ -177,78 +177,78 @@ syscall_debug_table: 1: =20 #define SAVE_REGS \ - swi r2, r1, PT_R2; /* Save SDA */ \ - swi r3, r1, PT_R3; \ - swi r4, r1, PT_R4; \ - swi r5, r1, PT_R5; \ - swi r6, r1, PT_R6; \ - swi r7, r1, PT_R7; \ - swi r8, r1, PT_R8; \ - swi r9, r1, PT_R9; \ - swi r10, r1, PT_R10; \ - swi r11, r1, PT_R11; /* save clobbered regs after rval */\ - swi r12, r1, PT_R12; \ - swi r13, r1, PT_R13; /* Save SDA2 */ \ - swi r14, r1, PT_PC; /* PC, before IRQ/trap */ \ - swi r15, r1, PT_R15; /* Save LP */ \ - swi r16, r1, PT_R16; \ - swi r17, r1, PT_R17; \ - swi r18, r1, PT_R18; /* Save asm scratch reg */ \ - swi r19, r1, PT_R19; \ - swi r20, r1, PT_R20; \ - swi r21, r1, PT_R21; \ - swi r22, r1, PT_R22; \ - swi r23, r1, PT_R23; \ - swi r24, r1, PT_R24; \ - swi r25, r1, PT_R25; \ - swi r26, r1, PT_R26; \ - swi r27, r1, PT_R27; \ - swi r28, r1, PT_R28; \ - swi r29, r1, PT_R29; \ - swi r30, r1, PT_R30; \ - swi r31, r1, PT_R31; /* Save current task reg */ \ + swi r2, r1, PTO+PT_R2; /* Save SDA */ \ + swi r3, r1, PTO+PT_R3; \ + swi r4, r1, PTO+PT_R4; \ + swi r5, r1, PTO+PT_R5; \ + swi r6, r1, PTO+PT_R6; \ + swi r7, r1, PTO+PT_R7; \ + swi r8, r1, PTO+PT_R8; \ + swi r9, r1, PTO+PT_R9; \ + swi r10, r1, PTO+PT_R10; \ + swi r11, r1, PTO+PT_R11; /* save clobbered regs after rval */\ + swi r12, r1, PTO+PT_R12; \ + swi r13, r1, PTO+PT_R13; /* Save SDA2 */ \ + swi r14, r1, PTO+PT_PC; /* PC, before IRQ/trap */ \ + swi r15, r1, PTO+PT_R15; /* Save LP */ \ + swi r16, r1, PTO+PT_R16; \ + swi r17, r1, PTO+PT_R17; \ + swi r18, r1, PTO+PT_R18; /* Save asm scratch reg */ \ + swi r19, r1, PTO+PT_R19; \ + swi r20, r1, PTO+PT_R20; \ + swi r21, r1, PTO+PT_R21; \ + swi r22, r1, PTO+PT_R22; \ + swi r23, r1, PTO+PT_R23; \ + swi r24, r1, PTO+PT_R24; \ + swi r25, r1, PTO+PT_R25; \ + swi r26, r1, PTO+PT_R26; \ + swi r27, r1, PTO+PT_R27; \ + swi r28, r1, PTO+PT_R28; \ + swi r29, r1, PTO+PT_R29; \ + swi r30, r1, PTO+PT_R30; \ + swi r31, r1, PTO+PT_R31; /* Save current task reg */ \ mfs r11, rmsr; /* save MSR */ \ - swi r11, r1, PT_MSR; + swi r11, r1, PTO+PT_MSR; =20 #define RESTORE_REGS_GP \ - lwi r2, r1, PT_R2; /* restore SDA */ \ - lwi r3, r1, PT_R3; \ - lwi r4, r1, PT_R4; \ - lwi r5, r1, PT_R5; \ - lwi r6, r1, PT_R6; \ - lwi r7, r1, PT_R7; \ - lwi r8, r1, PT_R8; \ - lwi r9, r1, PT_R9; \ - lwi r10, r1, PT_R10; \ - lwi r11, r1, PT_R11; /* restore clobbered regs after rval */\ - lwi r12, r1, PT_R12; \ - lwi r13, r1, PT_R13; /* restore SDA2 */ \ - lwi r14, r1, PT_PC; /* RESTORE_LINK PC, before IRQ/trap */\ - lwi r15, r1, PT_R15; /* restore LP */ \ - lwi r16, r1, PT_R16; \ - lwi r17, r1, PT_R17; \ - lwi r18, r1, PT_R18; /* restore asm scratch reg */ \ - lwi r19, r1, PT_R19; \ - lwi r20, r1, PT_R20; \ - lwi r21, r1, PT_R21; \ - lwi r22, r1, PT_R22; \ - lwi r23, r1, PT_R23; \ - lwi r24, r1, PT_R24; \ - lwi r25, r1, PT_R25; \ - lwi r26, r1, PT_R26; \ - lwi r27, r1, PT_R27; \ - lwi r28, r1, PT_R28; \ - lwi r29, r1, PT_R29; \ - lwi r30, r1, PT_R30; \ - lwi r31, r1, PT_R31; /* Restore cur task reg */ + lwi r2, r1, PTO+PT_R2; /* restore SDA */ \ + lwi r3, r1, PTO+PT_R3; \ + lwi r4, r1, PTO+PT_R4; \ + lwi r5, r1, PTO+PT_R5; \ + lwi r6, r1, PTO+PT_R6; \ + lwi r7, r1, PTO+PT_R7; \ + lwi r8, r1, PTO+PT_R8; \ + lwi r9, r1, PTO+PT_R9; \ + lwi r10, r1, PTO+PT_R10; \ + lwi r11, r1, PTO+PT_R11; /* restore clobbered regs after rval */\ + lwi r12, r1, PTO+PT_R12; \ + lwi r13, r1, PTO+PT_R13; /* restore SDA2 */ \ + lwi r14, r1, PTO+PT_PC; /* RESTORE_LINK PC, before IRQ/trap */\ + lwi r15, r1, PTO+PT_R15; /* restore LP */ \ + lwi r16, r1, PTO+PT_R16; \ + lwi r17, r1, PTO+PT_R17; \ + lwi r18, r1, PTO+PT_R18; /* restore asm scratch reg */ \ + lwi r19, r1, PTO+PT_R19; \ + lwi r20, r1, PTO+PT_R20; \ + lwi r21, r1, PTO+PT_R21; \ + lwi r22, r1, PTO+PT_R22; \ + lwi r23, r1, PTO+PT_R23; \ + lwi r24, r1, PTO+PT_R24; \ + lwi r25, r1, PTO+PT_R25; \ + lwi r26, r1, PTO+PT_R26; \ + lwi r27, r1, PTO+PT_R27; \ + lwi r28, r1, PTO+PT_R28; \ + lwi r29, r1, PTO+PT_R29; \ + lwi r30, r1, PTO+PT_R30; \ + lwi r31, r1, PTO+PT_R31; /* Restore cur task reg */ =20 #define RESTORE_REGS \ - lwi r11, r1, PT_MSR; \ + lwi r11, r1, PTO+PT_MSR; \ mts rmsr , r11; \ RESTORE_REGS_GP =20 #define RESTORE_REGS_RTBD \ - lwi r11, r1, PT_MSR; \ + lwi r11, r1, PTO+PT_MSR; \ andni r11, r11, MSR_EIP; /* clear EIP */ \ ori r11, r11, MSR_EE | MSR_BIP; /* set EE and BIP */ \ mts rmsr , r11; \ @@ -265,11 +265,11 @@ syscall_debug_table: lwi r1, r0, TOPHYS(PER_CPU(ENTRY_SP)); \ /* FIXME: I can add these two lines to one */ \ /* tophys(r1,r1); */ \ - /* addik r1, r1, -PT_SIZE; */ \ - addik r1, r1, CONFIG_KERNEL_BASE_ADDR - CONFIG_KERNEL_START - PT_SIZE; \ + /* addik r1, r1, -STATE_SAVE_SIZE; */ \ + addik r1, r1, CONFIG_KERNEL_BASE_ADDR - CONFIG_KERNEL_START - STATE_SAVE_= SIZE; \ SAVE_REGS \ brid 2f; \ - swi r1, r1, PT_MODE; \ + swi r1, r1, PTO+PT_MODE; \ 1: /* User-mode state save. */ \ lwi r1, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); /* get saved current */\ tophys(r1,r1); \ @@ -277,12 +277,13 @@ syscall_debug_table: /* MS these three instructions can be added to one */ \ /* addik r1, r1, THREAD_SIZE; */ \ /* tophys(r1,r1); */ \ - /* addik r1, r1, -PT_SIZE; */ \ - addik r1, r1, THREAD_SIZE + CONFIG_KERNEL_BASE_ADDR - CONFIG_KERNEL_START= - PT_SIZE; \ + /* addik r1, r1, -STATE_SAVE_SIZE; */ \ + addik r1, r1, THREAD_SIZE + CONFIG_KERNEL_BASE_ADDR \ + - CONFIG_KERNEL_START - STATE_SAVE_SIZE; \ SAVE_REGS \ lwi r11, r0, TOPHYS(PER_CPU(ENTRY_SP)); \ - swi r11, r1, PT_R1; /* Store user SP. */ \ - swi r0, r1, PT_MODE; /* Was in user-mode. */ \ + swi r11, r1, PTO+PT_R1; /* Store user SP. */ \ + swi r0, r1, PTO+PT_MODE; /* Was in user-mode. */ \ /* MS: I am clearing UMS even in case when I come from kernel space */ \ clear_ums; \ 2: lwi CURRENT_TASK, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); @@ -292,7 +293,7 @@ syscall_debug_table: .extern cpuinfo =20 C_ENTRY(mb_flush_dcache): - addik r1, r1, -PT_SIZE + addik r1, r1, -STATE_SAVE_SIZE SAVE_REGS =20 addik r3, r0, cpuinfo @@ -305,12 +306,12 @@ C_ENTRY(mb_flush_dcache): addk r9, r9, r8 =20 RESTORE_REGS - addik r1, r1, PT_SIZE + addik r1, r1, STATE_SAVE_SIZE rtsd r15, 8 nop =20 C_ENTRY(mb_invalidate_icache): - addik r1, r1, -PT_SIZE + addik r1, r1, -STATE_SAVE_SIZE SAVE_REGS =20 addik r3, r0, cpuinfo @@ -323,7 +324,7 @@ C_ENTRY(mb_invalidate_icache): addk r9, r9, r8 =20 RESTORE_REGS - addik r1, r1, PT_SIZE + addik r1, r1, STATE_SAVE_SIZE rtsd r15, 8 nop =20 @@ -350,18 +351,18 @@ C_ENTRY(_user_exception): addik r1, r1, THREAD_SIZE; tophys(r1,r1); =20 - addik r1, r1, -PT_SIZE; /* Make room on the stack. */ + addik r1, r1, -STATE_SAVE_SIZE; /* Make room on the stack. */ SAVE_REGS - swi r0, r1, PT_R3 - swi r0, r1, PT_R4 + swi r0, r1, PTO+PT_R3 + swi r0, r1, PTO+PT_R4 =20 - swi r0, r1, PT_MODE; /* Was in user-mode. */ + swi r0, r1, PTO+PT_MODE; /* Was in user-mode. */ lwi r11, r0, TOPHYS(PER_CPU(ENTRY_SP)); - swi r11, r1, PT_R1; /* Store user SP. */ + swi r11, r1, PTO+PT_R1; /* Store user SP. */ clear_ums; 2: lwi CURRENT_TASK, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); /* Save away the syscall number. */ - swi r12, r1, PT_R0; + swi r12, r1, PTO+PT_R0; tovirt(r1,r1) =20 /* where the trap should return need -8 to adjust for rtsd r15, 8*/ @@ -380,18 +381,18 @@ C_ENTRY(_user_exception): beqi r11, 4f =20 addik r3, r0, -ENOSYS - swi r3, r1, PT_R3 + swi r3, r1, PTO+PT_R3 brlid r15, do_syscall_trace_enter - addik r5, r1, PT_R0 + addik r5, r1, PTO+PT_R0 =20 # do_syscall_trace_enter returns the new syscall nr. addk r12, r0, r3 - lwi r5, r1, PT_R5; - lwi r6, r1, PT_R6; - lwi r7, r1, PT_R7; - lwi r8, r1, PT_R8; - lwi r9, r1, PT_R9; - lwi r10, r1, PT_R10; + lwi r5, r1, PTO+PT_R5; + lwi r6, r1, PTO+PT_R6; + lwi r7, r1, PTO+PT_R7; + lwi r8, r1, PTO+PT_R8; + lwi r9, r1, PTO+PT_R9; + lwi r10, r1, PTO+PT_R10; 4: /* Jump to the appropriate function for the system call number in r12 * (r12 is not preserved), or return an error if r12 is not valid. @@ -432,8 +433,8 @@ C_ENTRY(_user_exception): /* Entry point used to return from a syscall/trap */ /* We re-enable BIP bit before state restore */ C_ENTRY(ret_from_trap): - swi r3, r1, PT_R3 - swi r4, r1, PT_R4 + swi r3, r1, PTO+PT_R3 + swi r4, r1, PTO+PT_R4 /* * Entry point for returns that must not store r3/r4 back into pt_regs, * i.e. rt_sigreturn, which has already restored them from the signal @@ -441,7 +442,7 @@ C_ENTRY(ret_from_trap): * so it stays correct if the number of stores above ever changes. */ ret_from_trap_no_rval: - lwi r11, r1, PT_MODE; + lwi r11, r1, PTO+PT_MODE; /* See if returning to kernel mode, if so, skip resched &c. */ bnei r11, 2f; /* We're returning to user mode, so check for various conditions that @@ -453,7 +454,7 @@ ret_from_trap_no_rval: beqi r11, 1f =20 brlid r15, do_syscall_trace_leave - addik r5, r1, PT_R0 + addik r5, r1, PTO+PT_R0 1: /* We're returning to user mode, so check for various conditions that * trigger rescheduling. */ @@ -472,7 +473,7 @@ ret_from_trap_no_rval: andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME; beqi r11, 4f; /* Signals to handle, handle them */ =20 - addik r5, r1, 0; /* Arg 1: struct pt_regs *regs */ + addik r5, r1, PTO; /* Arg 1: struct pt_regs *regs */ bralid r15, do_notify_resume; /* Handle any signals */ add r6, r30, r0; /* Arg 2: int in_syscall */ add r30, r0, r0 /* no more restarts */ @@ -484,7 +485,11 @@ ret_from_trap_no_rval: VM_OFF; tophys(r1,r1); RESTORE_REGS_RTBD; - addik r1, r1, PT_SIZE /* Clean up stack space. */ + addik r1, r1, STATE_SAVE_SIZE /* Clean up stack space. */ + /* + * Deliberately PT_SIZE, not STATE_SAVE_SIZE: r1 is back at the stack + * top, so PTO cancels and the saved SP sits at PT_R1 - PT_SIZE. + */ lwi r1, r1, PT_R1 - PT_SIZE;/* Restore user stack pointer. */ bri 6f; =20 @@ -493,7 +498,7 @@ ret_from_trap_no_rval: VM_OFF; tophys(r1,r1); RESTORE_REGS_RTBD; - addik r1, r1, PT_SIZE /* Clean up stack space. */ + addik r1, r1, STATE_SAVE_SIZE /* Clean up stack space. */ tovirt(r1,r1); 6: TRAP_return: /* Make global symbol for debugging */ @@ -534,7 +539,7 @@ C_ENTRY(sys_rt_sigreturn_wrapper): */ addik r15, r0, ret_from_trap_no_rval - 8 brid sys_rt_sigreturn /* Do real work */ - addik r5, r1, 0; /* add user context as 1st arg */ + addik r5, r1, PTO; /* add user context as 1st arg */ =20 /* * HW EXCEPTION rutine start @@ -545,7 +550,7 @@ C_ENTRY(full_exception_trap): addik r17, r17, -4 SAVE_STATE /* Save registers */ /* PC, before IRQ/trap - this is one instruction above */ - swi r17, r1, PT_PC; + swi r17, r1, PTO+PT_PC; tovirt(r1,r1) /* FIXME this can be store directly in PT_ESR reg. * I tested it but there is a fault */ @@ -555,7 +560,7 @@ C_ENTRY(full_exception_trap): mfs r7, rfsr; /* save FSR */ mts rfsr, r0; /* Clear sticky fsr */ rted r0, full_exception - addik r5, r1, 0 /* parameter struct pt_regs * regs */ + addik r5, r1, PTO /* parameter struct pt_regs * regs */ =20 /* * Unaligned data trap. @@ -581,14 +586,14 @@ C_ENTRY(unaligned_data_trap): lwi r11, r0, TOPHYS(PER_CPU(ENTRY_SP)); SAVE_STATE /* Save registers.*/ /* PC, before IRQ/trap - this is one instruction above */ - swi r17, r1, PT_PC; + swi r17, r1, PTO+PT_PC; tovirt(r1,r1) /* where the trap should return need -8 to adjust for rtsd r15, 8 */ addik r15, r0, ret_from_exc-8 mfs r3, resr /* ESR */ mfs r4, rear /* EAR */ rtbd r0, _unaligned_data_exception - addik r7, r1, 0 /* parameter struct pt_regs * regs */ + addik r7, r1, PTO /* parameter struct pt_regs * regs */ =20 /* * Page fault traps. @@ -611,30 +616,30 @@ C_ENTRY(unaligned_data_trap): C_ENTRY(page_fault_data_trap): SAVE_STATE /* Save registers.*/ /* PC, before IRQ/trap - this is one instruction above */ - swi r17, r1, PT_PC; + swi r17, r1, PTO+PT_PC; tovirt(r1,r1) /* where the trap should return need -8 to adjust for rtsd r15, 8 */ addik r15, r0, ret_from_exc-8 mfs r6, rear /* parameter unsigned long address */ mfs r7, resr /* parameter unsigned long error_code */ rted r0, do_page_fault - addik r5, r1, 0 /* parameter struct pt_regs * regs */ + addik r5, r1, PTO /* parameter struct pt_regs * regs */ =20 C_ENTRY(page_fault_instr_trap): SAVE_STATE /* Save registers.*/ /* PC, before IRQ/trap - this is one instruction above */ - swi r17, r1, PT_PC; + swi r17, r1, PTO+PT_PC; tovirt(r1,r1) /* where the trap should return need -8 to adjust for rtsd r15, 8 */ addik r15, r0, ret_from_exc-8 mfs r6, rear /* parameter unsigned long address */ ori r7, r0, 0 /* parameter unsigned long error_code */ rted r0, do_page_fault - addik r5, r1, 0 /* parameter struct pt_regs * regs */ + addik r5, r1, PTO /* parameter struct pt_regs * regs */ =20 /* Entry point used to return from an exception. */ C_ENTRY(ret_from_exc): - lwi r11, r1, PT_MODE; + lwi r11, r1, PTO+PT_MODE; bnei r11, 2f; /* See if returning to kernel mode, */ /* ... if so, skip resched &c. */ =20 @@ -666,7 +671,7 @@ C_ENTRY(ret_from_exc): * complete register state. Here we save anything not saved by * the normal entry sequence, so that it may be safely restored * (in a possibly modified form) after do_notify_resume returns. */ - addik r5, r1, 0; /* Arg 1: struct pt_regs *regs */ + addik r5, r1, PTO; /* Arg 1: struct pt_regs *regs */ bralid r15, do_notify_resume; /* Handle any signals */ addi r6, r0, 0; /* Arg 2: int in_syscall */ bri 1b @@ -678,7 +683,7 @@ C_ENTRY(ret_from_exc): tophys(r1,r1); =20 RESTORE_REGS_RTBD; - addik r1, r1, PT_SIZE /* Clean up stack space. */ + addik r1, r1, STATE_SAVE_SIZE /* Clean up stack space. */ =20 lwi r1, r1, PT_R1 - PT_SIZE; /* Restore user stack pointer. */ bri 6f; @@ -687,7 +692,7 @@ C_ENTRY(ret_from_exc): VM_OFF; tophys(r1,r1); RESTORE_REGS_RTBD; - addik r1, r1, PT_SIZE /* Clean up stack space. */ + addik r1, r1, STATE_SAVE_SIZE /* Clean up stack space. */ =20 tovirt(r1,r1); 6: @@ -720,10 +725,10 @@ C_ENTRY(_interrupt): tophys(r1,r1); /* MS: I have in r1 physical address where stack is */ /* save registers */ /* MS: Make room on the stack -> activation record */ - addik r1, r1, -PT_SIZE; + addik r1, r1, -STATE_SAVE_SIZE; SAVE_REGS brid 2f; - swi r1, r1, PT_MODE; /* 0 - user mode, 1 - kernel mode */ + swi r1, r1, PTO+PT_MODE; /* 0 - user mode, 1 - kernel mode */ 1: /* User-mode state save. */ /* MS: get the saved current */ @@ -733,23 +738,23 @@ C_ENTRY(_interrupt): addik r1, r1, THREAD_SIZE; tophys(r1,r1); /* save registers */ - addik r1, r1, -PT_SIZE; + addik r1, r1, -STATE_SAVE_SIZE; SAVE_REGS /* calculate mode */ - swi r0, r1, PT_MODE; + swi r0, r1, PTO+PT_MODE; lwi r11, r0, TOPHYS(PER_CPU(ENTRY_SP)); - swi r11, r1, PT_R1; + swi r11, r1, PTO+PT_R1; clear_ums; 2: lwi CURRENT_TASK, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); tovirt(r1,r1) addik r15, r0, irq_call; irq_call:rtbd r0, do_IRQ; - addik r5, r1, 0; + addik r5, r1, PTO; =20 /* MS: we are in virtual mode */ ret_from_irq: - lwi r11, r1, PT_MODE; + lwi r11, r1, PTO+PT_MODE; bnei r11, 2f; =20 1: @@ -765,7 +770,7 @@ ret_from_irq: 5: andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME; beqid r11, no_intr_resched /* Handle a signal return; Pending signals should be in r18. */ - addik r5, r1, 0; /* Arg 1: struct pt_regs *regs */ + addik r5, r1, PTO; /* Arg 1: struct pt_regs *regs */ bralid r15, do_notify_resume; /* Handle any signals */ addi r6, r0, 0; /* Arg 2: int in_syscall */ bri 1b @@ -778,7 +783,7 @@ no_intr_resched: VM_OFF; tophys(r1,r1); RESTORE_REGS - addik r1, r1, PT_SIZE /* MS: Clean up stack space. */ + addik r1, r1, STATE_SAVE_SIZE /* MS: Clean up stack space. */ lwi r1, r1, PT_R1 - PT_SIZE; bri 6f; /* MS: Return to kernel state. */ @@ -801,7 +806,7 @@ restore: VM_OFF /* MS: turn off MMU */ tophys(r1,r1) RESTORE_REGS - addik r1, r1, PT_SIZE /* MS: Clean up stack space. */ + addik r1, r1, STATE_SAVE_SIZE /* MS: Clean up stack space. */ tovirt(r1,r1); 6: IRQ_return: /* MS: Make global symbol for debugging */ @@ -820,29 +825,29 @@ C_ENTRY(_xtmr_manager_reset): lwi r1, r0, xmb_manager_stackpointer =20 /* Restore MSR */ - lwi r2, r1, PT_MSR + lwi r2, r1, PTO+PT_MSR mts rmsr, r2 bri 4 =20 /* restore Special purpose registers */ - lwi r2, r1, PT_PID + lwi r2, r1, PTO+PT_PID mts rpid, r2 =20 - lwi r2, r1, PT_TLBI + lwi r2, r1, PTO+PT_TLBI mts rtlbx, r2 =20 - lwi r2, r1, PT_ZPR + lwi r2, r1, PTO+PT_ZPR mts rzpr, r2 =20 #if CONFIG_XILINX_MICROBLAZE0_USE_FPU - lwi r2, r1, PT_FSR + lwi r2, r1, PTO+PT_FSR mts rfsr, r2 #endif =20 /* restore all the tlb's */ addik r3, r0, TOPHYS(tlb_skip) - addik r6, r0, PT_TLBL0 - addik r7, r0, PT_TLBH0 + addik r6, r0, PTO+PT_TLBL0 + addik r7, r0, PTO+PT_TLBH0 restore_tlb: add r6, r6, r1 add r7, r7, r1 @@ -868,9 +873,9 @@ ret_from_reset: VM_OFF /* MS: Restore all regs */ RESTORE_REGS - lwi r14, r1, PT_R14 - lwi r16, r1, PT_PC - addik r1, r1, PT_SIZE + 36 + lwi r14, r1, PTO+PT_R14 + lwi r16, r1, PTO+PT_PC + addik r1, r1, STATE_SAVE_SIZE + 36 rtbd r16, 0 nop =20 @@ -885,11 +890,11 @@ C_ENTRY(_xmb_manager_break): * Reserve memory in the stack for context store/restore * (which includes memory for storing tlbs (max two tlbs)) */ - addik r1, r1, -PT_SIZE - 36 + addik r1, r1, -STATE_SAVE_SIZE - 36 swi r1, r0, xmb_manager_stackpointer SAVE_REGS - swi r14, r1, PT_R14 /* rewrite saved R14 value */ - swi r16, r1, PT_PC; /* PC and r16 are the same */ + swi r14, r1, PTO+PT_R14 /* rewrite saved R14 value */ + swi r16, r1, PTO+PT_PC; /* PC and r16 are the same */ =20 lwi r6, r0, TOPHYS(xmb_manager_baseaddr) lwi r7, r0, TOPHYS(xmb_manager_crval) @@ -903,25 +908,25 @@ C_ENTRY(_xmb_manager_break): =20 /* Save the special purpose registers */ mfs r2, rpid - swi r2, r1, PT_PID + swi r2, r1, PTO+PT_PID =20 mfs r2, rtlbx - swi r2, r1, PT_TLBI + swi r2, r1, PTO+PT_TLBI =20 mfs r2, rzpr - swi r2, r1, PT_ZPR + swi r2, r1, PTO+PT_ZPR =20 #if CONFIG_XILINX_MICROBLAZE0_USE_FPU mfs r2, rfsr - swi r2, r1, PT_FSR + swi r2, r1, PTO+PT_FSR #endif mfs r2, rmsr - swi r2, r1, PT_MSR + swi r2, r1, PTO+PT_MSR =20 /* Save all the tlb's */ addik r3, r0, TOPHYS(tlb_skip) - addik r6, r0, PT_TLBL0 - addik r7, r0, PT_TLBH0 + addik r6, r0, PTO+PT_TLBL0 + addik r7, r0, PTO+PT_TLBH0 save_tlb: add r6, r6, r1 add r7, r7, r1 @@ -978,28 +983,28 @@ C_ENTRY(_debug_exception): lwi r1, r0, TOPHYS(PER_CPU(ENTRY_SP)); /* Reload kernel stack-ptr*/ =20 /* BIP bit is set on entry, no interrupts can occur */ - addik r1, r1, CONFIG_KERNEL_BASE_ADDR - CONFIG_KERNEL_START - PT_SIZE; + addik r1, r1, CONFIG_KERNEL_BASE_ADDR - CONFIG_KERNEL_START - STATE_SAV= E_SIZE; SAVE_REGS; /* save all regs to pt_reg structure */ - swi r0, r1, PT_R0; /* R0 must be saved too */ - swi r14, r1, PT_R14 /* rewrite saved R14 value */ - swi r16, r1, PT_PC; /* PC and r16 are the same */ + swi r0, r1, PTO+PT_R0; /* R0 must be saved too */ + swi r14, r1, PTO+PT_R14 /* rewrite saved R14 value */ + swi r16, r1, PTO+PT_PC; /* PC and r16 are the same */ /* save special purpose registers to pt_regs */ mfs r11, rear; - swi r11, r1, PT_EAR; + swi r11, r1, PTO+PT_EAR; mfs r11, resr; - swi r11, r1, PT_ESR; + swi r11, r1, PTO+PT_ESR; mfs r11, rfsr; - swi r11, r1, PT_FSR; + swi r11, r1, PTO+PT_FSR; =20 /* stack pointer is in physical address at it is decrease - * by PT_SIZE but we need to get correct R1 value */ - addik r11, r1, CONFIG_KERNEL_START - CONFIG_KERNEL_BASE_ADDR + PT_SIZE; - swi r11, r1, PT_R1 + * by STATE_SAVE_SIZE but we need to get correct R1 value */ + addik r11, r1, CONFIG_KERNEL_START - CONFIG_KERNEL_BASE_ADDR + STATE_SA= VE_SIZE; + swi r11, r1, PTO+PT_R1 /* MS: r31 - current pointer isn't changed */ tovirt(r1,r1) #ifdef CONFIG_KGDB - addi r5, r1, 0 /* pass pt_reg address as the first arg */ + addi r5, r1, PTO /* pass pt_reg address as the first arg */ addik r15, r0, dbtrap_call; /* return address */ rtbd r0, microblaze_kgdb_break nop; @@ -1015,16 +1020,16 @@ C_ENTRY(_debug_exception): addik r1, r1, THREAD_SIZE; /* calculate kernel stack pointer */ tophys(r1,r1); =20 - addik r1, r1, -PT_SIZE; /* Make room on the stack. */ + addik r1, r1, -STATE_SAVE_SIZE; /* Make room on the stack. */ SAVE_REGS; - swi r16, r1, PT_PC; /* Save LP */ - swi r0, r1, PT_MODE; /* Was in user-mode. */ + swi r16, r1, PTO+PT_PC; /* Save LP */ + swi r0, r1, PTO+PT_MODE; /* Was in user-mode. */ lwi r11, r0, TOPHYS(PER_CPU(ENTRY_SP)); - swi r11, r1, PT_R1; /* Store user SP. */ + swi r11, r1, PTO+PT_R1; /* Store user SP. */ lwi CURRENT_TASK, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); tovirt(r1,r1) set_vms; - addik r5, r1, 0; + addik r5, r1, PTO; addik r15, r0, dbtrap_call; dbtrap_call: /* Return point for kernel/user entry + 8 because of rtsd r15= , 8 */ rtbd r0, sw_exception @@ -1032,7 +1037,7 @@ dbtrap_call: /* Return point for kernel/user entry + = 8 because of rtsd r15, 8 */ =20 /* MS: The first instruction for the second part of the gdb/kgdb */ set_bip; /* Ints masked for state restore */ - lwi r11, r1, PT_MODE; + lwi r11, r1, PTO+PT_MODE; bnei r11, 2f; /* MS: Return to user space - gdb */ 1: @@ -1051,7 +1056,7 @@ dbtrap_call: /* Return point for kernel/user entry + = 8 because of rtsd r15, 8 */ 5: andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME; beqi r11, 4f; /* Signals to handle, handle them */ =20 - addik r5, r1, 0; /* Arg 1: struct pt_regs *regs */ + addik r5, r1, PTO; /* Arg 1: struct pt_regs *regs */ bralid r15, do_notify_resume; /* Handle any signals */ addi r6, r0, 0; /* Arg 2: int in_syscall */ bri 1b @@ -1062,7 +1067,7 @@ dbtrap_call: /* Return point for kernel/user entry + = 8 because of rtsd r15, 8 */ tophys(r1,r1); /* MS: Restore all regs */ RESTORE_REGS_RTBD - addik r1, r1, PT_SIZE /* Clean up stack space */ + addik r1, r1, STATE_SAVE_SIZE /* Clean up stack space */ lwi r1, r1, PT_R1 - PT_SIZE; /* Restore user stack pointer */ DBTRAP_return_user: /* MS: Make global symbol for debugging */ rtbd r16, 0; /* MS: Instructions to return from a debug trap */ @@ -1073,9 +1078,9 @@ DBTRAP_return_user: /* MS: Make global symbol for deb= ugging */ tophys(r1,r1); /* MS: Restore all regs */ RESTORE_REGS_RTBD - lwi r14, r1, PT_R14; - lwi r16, r1, PT_PC; - addik r1, r1, PT_SIZE; /* MS: Clean up stack space */ + lwi r14, r1, PTO+PT_R14; + lwi r16, r1, PTO+PT_PC; + addik r1, r1, STATE_SAVE_SIZE; /* MS: Clean up stack space */ tovirt(r1,r1); DBTRAP_return_kernel: /* MS: Make global symbol for debugging */ rtbd r16, 0; /* MS: Instructions to return from a debug trap */ @@ -1173,7 +1178,7 @@ ENTRY(_switch_to) .ent xmb_inject_err .type xmb_inject_err, @function xmb_inject_err: - addik r1, r1, -PT_SIZE + addik r1, r1, -STATE_SAVE_SIZE SAVE_REGS =20 /* Switch to real mode */ @@ -1197,7 +1202,7 @@ xmb_inject_err: nop; 1: RESTORE_REGS - addik r1, r1, PT_SIZE + addik r1, r1, STATE_SAVE_SIZE rtsd r15, 8; nop; .end xmb_inject_err diff --git a/arch/microblaze/kernel/hw_exception_handler.S b/arch/microblaz= e/kernel/hw_exception_handler.S index 07ea23965f81..4693916be526 100644 --- a/arch/microblaze/kernel/hw_exception_handler.S +++ b/arch/microblaze/kernel/hw_exception_handler.S @@ -313,6 +313,11 @@ _MB_HW_ExceptionVectorTable: .align 4 .ent _hw_exception_handler _hw_exception_handler: + /* + * This handler saves into the static pt_pool_space buffer, not into a + * stack frame, so the plain PT_* offsets are right here -- do not add + * the PTO of entry.S's frames. + */ swi r1, r0, TOPHYS(pt_pool_space + PT_R1); /* GET_SP */ /* Save date to kernel memory. Here is the problem * when you came from user space */ diff --git a/arch/microblaze/kernel/process.c b/arch/microblaze/kernel/proc= ess.c index 6cbf642d7b80..090e1697ea7a 100644 --- a/arch/microblaze/kernel/process.c +++ b/arch/microblaze/kernel/process.c @@ -19,6 +19,7 @@ #include #include #include +#include =20 void show_regs(struct pt_regs *regs) { @@ -65,7 +66,7 @@ int copy_thread(struct task_struct *p, const struct kerne= l_clone_args *args) * the registers. That's OK for a brand new thread.*/ memset(childregs, 0, sizeof(struct pt_regs)); memset(&ti->cpu_context, 0, sizeof(struct cpu_context)); - ti->cpu_context.r1 =3D (unsigned long)childregs; + ti->cpu_context.r1 =3D (unsigned long)childregs - PTO; ti->cpu_context.r20 =3D (unsigned long)args->fn; ti->cpu_context.r19 =3D (unsigned long)args->fn_arg; childregs->pt_mode =3D 1; @@ -79,7 +80,7 @@ int copy_thread(struct task_struct *p, const struct kerne= l_clone_args *args) childregs->r1 =3D usp; =20 memset(&ti->cpu_context, 0, sizeof(struct cpu_context)); - ti->cpu_context.r1 =3D (unsigned long)childregs; + ti->cpu_context.r1 =3D (unsigned long)childregs - PTO; childregs->msr |=3D MSR_UMS; =20 /* we should consider the fact that childregs is a copy of the parent --=20 2.53.0 From nobody Mon Sep 28 12:34:31 2026 Received: from DU2PR03CU002.outbound.protection.outlook.com (mail-northeuropeazon11021140.outbound.protection.outlook.com [52.101.65.140]) (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 6B7E44C9557; Fri, 21 Aug 2026 15:18:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.65.140 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787325506; cv=fail; b=O4BhG+PyqI68zSBdrxclPQRy2OKJKbz88o4diVfEdR2WM5o10TzeNINEHJKW2nadZH/85kHijKX4K1NVkBorOjaNl4VNlpx9JaYs7SpSpCf683kvyk65LkOfQEoP/Li9L7LYNXMNuN/LZt0Rn2A9FM5iHt+aQjkMjs1ej8v3xf8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787325506; c=relaxed/simple; bh=zApENHU6d+7Fl+SzygJ4TF5KoC4NGlBRmpY8i1SFzyg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=ugrkC7raUHfn2hWd/dw3lXpFLFKNiNqwQo9GtF5JnJ0kCfbehphXx2NIgDHyRu5XQN37pwgnTb0csmZwGZG5Cx6qIBacJEXPhcQ+MdxW4u1O2U7LAv1X7FhdvDb/lLzm6F0RIhMqcQX43vrt4tRf1rXFfma0ci5iVL72RUWU/nc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=yacoub.de; spf=pass smtp.mailfrom=yacoub.de; dkim=pass (2048-bit key) header.d=yacoub.de header.i=@yacoub.de header.b=BwD6cDWg; arc=fail smtp.client-ip=52.101.65.140 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=yacoub.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=yacoub.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=yacoub.de header.i=@yacoub.de header.b="BwD6cDWg" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Y7NMPMZDdB6rsnSrHtvaGZ0pqTedAGpHXrrs4T4F7SH1OqczA+lP2NHxrd3OopkWxRz74nUIijqIkgcWRJuFN2E4kd0livI1yvhjlgTgC6yuzpknn7SeMBUJzPjp7sdimM98R3mqFt8bWAhGyq7CHWVyn434kKjEtuTY+jwyBVeZgUh8dfckmTiSyq7N675H5ubQjsyXUH0+5NRuYO/taUPLY4bWnXEjIuy3stUQhnubQQl6nsSzD84I+g+6MkPyeVKyA5fhm/sIUdvs5+RuvBFCqTlRfao5Qqk6t+E6qTX/KQXKlOhaoJsJRnmr83q/cabbe82xjukgWjp8RQzKdQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=RpQn8i3VWcUv3NJhxDN9d6ctE5fkDWt0THzoIl5sSdw=; b=PkKTi+e5eAghVDv7URzx8R2T+w2ETk2PkH+DBgdPe7AU/BBUINiQDmbyAdPHNpPqpkf09+qHQLz4asrL1GMIZLw5nSikBMpLsZpufKxn6jhSODld6D+lVdX3Uink8Tt8uRBdnr0ZFUGb8KDJ6O5Yb3XpUYoqZHVnd+bI87/r4vPJR8E5wkUD/82O75P42O8YvqOAokk285MEcVIXBOND+lC38dRRu+Ep9VZd/UINkErY9hYuSgG+gwBWkvkXZgmq4L3lfie6pQkKDMp7A87o0Z1wXbbSG4xbJQm8+rOcm6SYcv3FhMoPwlkzEfIQfxYk0Ve6Xf1ZpGq0BLeCv6Lp7A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=yacoub.de; dmarc=pass action=none header.from=yacoub.de; dkim=pass header.d=yacoub.de; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yacoub.de; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=RpQn8i3VWcUv3NJhxDN9d6ctE5fkDWt0THzoIl5sSdw=; b=BwD6cDWgwusVQZn0kY9AUKna5niSMtxXRb2qCfBN6SmAj52Vc4ZdP0Nre+QwIUgbXteVJImburZ8kAhPZ/bHguGdsrj3yQisyW5kv8loX9zXN22fHZyfWNcsU9BLnuydDqEbAKKOAKUKqrYYpiuyP0rcl+Bhgg1mYG0xSd0UK6CS/T6hD7k7ebn6Dgle0YhzMGmV4iUiZnx7YkGCoEk5qVWYQ+bxUSIRXMoDIH3CWNmpPBAhK3xDOqO4ZOTfu7N72PEz9OMGrnIYMG4PagnYGIS9uqLSW2DJjcNbQd4zxFWaIucnsf2cu032r7ChD1HKiHaCkekfBjicVPtrD59EOg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=yacoub.de; Received: from MRWPR04MB12069.eurprd04.prod.outlook.com (2603:10a6:501:99::13) by AM9PR04MB8068.eurprd04.prod.outlook.com (2603:10a6:20b:3b5::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.339.11; Fri, 21 Aug 2026 15:18:18 +0000 Received: from MRWPR04MB12069.eurprd04.prod.outlook.com ([fe80::37b9:4b72:7864:5809]) by MRWPR04MB12069.eurprd04.prod.outlook.com ([fe80::37b9:4b72:7864:5809%4]) with mapi id 15.21.0339.010; Fri, 21 Aug 2026 15:18:18 +0000 From: Ramin Moussavi To: Michal Simek , Michal Simek Cc: linux-kernel@vger.kernel.org, Arnd Bergmann , linux-arch@vger.kernel.org, Sam Price , Neal Frager , Waldemar Brodkorb , Michael Eager Subject: [PATCH v3 5/5] microblaze: preserve the MSR carry flags across signals Date: Fri, 21 Aug 2026 17:18:09 +0200 Message-ID: <20260821151809.1233057-6-ramin.moussavi@yacoub.de> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260821151809.1233057-1-ramin.moussavi@yacoub.de> References: <20260821151809.1233057-1-ramin.moussavi@yacoub.de> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: FR4P281CA0250.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:f5::8) To MRWPR04MB12069.eurprd04.prod.outlook.com (2603:10a6:501:99::13) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MRWPR04MB12069:EE_|AM9PR04MB8068:EE_ X-MS-Office365-Filtering-Correlation-Id: 2636bc06-90a0-4650-5458-08deff976de2 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|23010399003|376014|1800799024|3023799007|6133799003|10067099003|56012099006|11063799006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: eCafPgkIdilzpZSoGfSrBK+SsRFS1lcy7brbByWO8zHWzwD12EJ5DAU5skvvTqoPDpjcfLI7GfOBHUysEcarfOiDlbz4csGg6M53c3hQ+rjjbm+x1VHDVgMVpaPBbKPc0+mXCuilttjvLGtd0R2LkNnJ9XzOm1I/oBsUGlUiaoTZfXOKsoV8thDx889oinfFxqqFBo5X0NkqMZJchi4qzsuncN0ec9kLlIKV2ESO1QPuSjUU8zx3hzLxrCEalqiUzq4XZzd2UclF3ZcGSbhiW7V+SYN32BG1v3xAthtn+UnuMrfUQYHw5SoHqOZi6cjF8RRt0KmHVACOxuGdYpTkL1wBdrjcdAtoZZDpZ6QIG4ohddjy5TpyEEqogFZ/qm/qUk+ocqSzkYysnOajFNfWl9k1d0dLqtYnZziYDTCqwJOh8c7EzJBT2NxHIMpfssQZg4nt5HCO8xTigmrKJ7ruHhSLtk+QQXQXcs0SvxsvzNZs+5AEYsTIujNHh3TGMlUYL0GFxoP0BjWXRooW5MFwdRrkoBSQ+ltt15CUuUYOsyclwbEoccx/eanmj+uo1np4BslHthFf95wyuZsHYWIMrd1qkq/YRzlP7jSaeFOl43w2boQrXMb0WzLLjrrn7CAj6bBNPPM3D7gop0TiMgwj/wWcReAe1qSDdhSBs30rlFk= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MRWPR04MB12069.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(23010399003)(376014)(1800799024)(3023799007)(6133799003)(10067099003)(56012099006)(11063799006)(18002099003)(22082099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?hnly75ueNEOuHXwtUgNB85h2x9qcXsW1HTzNDPGnb14mwh1paLUAPTcPhscN?= =?us-ascii?Q?UXoQ32fu3TQv/Ye3ziKG78wckumbsaFAGsFkMYZ5BduMd9Tc5DBkDoInyI4k?= =?us-ascii?Q?F3//CU90weEYUfg4XX3hqrjG37ZXncJovqmes9I8BPLOLnrelPr75gxCXliV?= =?us-ascii?Q?qfpDxzHo9FwBUTTJV74uFrmmIA3ElL6j8kMWBcEQwU8CM0nr+TssLFDniDPs?= =?us-ascii?Q?vKnvGHyrznuqGNCPQlamCLsxvpCLSglXTIvUKs5df4XEE+lvl7tzDg71+tmB?= =?us-ascii?Q?WoyxGowIRzBxbMjEJp2AHWqcqsiiK5CJt5CMtpx2ata39/eaWSp61fm+2VGA?= =?us-ascii?Q?tdhVBQnFs5pr0e0yJDuYNV+wcWUe3AwVb+PTWxswTIuUEJuYKNBMkcjjCYxF?= =?us-ascii?Q?7iU0D0XMHUYyK9a0yivPJeL5vkx8M3rGv1I7AUlRkd5a7hPeK1EEzUgJ92vm?= =?us-ascii?Q?qMXHb8hyUoNfj8EVcLKY9LcztQ6/jcG0b5V0pxrk5xhen51sXNAchkFQUuR/?= =?us-ascii?Q?EdBiLvOxIactVH4oe14PAkNKyFVpMsXlOFw8YoY9ruYVmGYfG0S+HRMzcjTa?= =?us-ascii?Q?7TQ4bpDgZqZdBEx2nAI+0F/azgtx5P5R4dO4Ki0ci5uFbnCegoysl6eHls6s?= =?us-ascii?Q?Nd7KvRILN5SuGtonVGhyPgoZx/r3/APZq8hSqq9X+UAkUaFnd0ldh6GBq7Zf?= =?us-ascii?Q?d7jSvEtUSnyq5jdH27+WnXKyyTxDBv+OzBuB+PA6kjaWkaxhU5+8Jk1CXJqG?= =?us-ascii?Q?YU7yV9UYYinQVFmYmN5s+4hrRcc7SGFVCqg4TvN8Ml4lTiobjXJE0ONKcli1?= =?us-ascii?Q?cInTcZrb/8wgelXS/UYWSNpMV2pgmh9tCOr26VCoH2TYR5EVogBWYUDM+/m9?= =?us-ascii?Q?pIMYCTAimYaSu0MyK8r3xfCWTVZpzHgFrV/zbRvL4H5MDgbRO0pRj2WkHSMZ?= =?us-ascii?Q?I+vha0BivExwHImcGAsvsCh1WISHSbW0Lb2J23A2hgdHq027XXb9MiE8WuGj?= =?us-ascii?Q?RZ7FkPy60pI4HLvDjCuEHrQ5UO/e/NdpFC80zchhmmljtZcn1u0G1yl4f0Wi?= =?us-ascii?Q?LonGO7l5ww5b8JIkGwwzcZv6ZQy6sv56Pjuwj7/hMxLstTEm22ryVwPH7rbz?= =?us-ascii?Q?m2CaFw7dvULjR1L0lPcxM1jBcEaOJeTheA7jz0MeTnCmeZrKabCsmqkJ1zUZ?= =?us-ascii?Q?UQUNWxxVAG40gfIY3Ivc9Aw6zlEmzfP/04VTYrJ5m9ndfAOx/1Kf+/0myUwo?= =?us-ascii?Q?tl/yrmH6lNT69FVduGkcQYiPzHnhbjUIWYjLCwFGA+FMt10+E+bfqjKKIFRE?= =?us-ascii?Q?dYu0c8B3l96LKlTlKuayA9wxpfp+4UfPZAcfJQuqVAA6j70yQMc/h+CZsIwp?= =?us-ascii?Q?AWpuGa5xUBjKgkUk9vq144IQQrrTCJ/A4/DWVnuHgf5SFB9IYfsRkRYOTAJz?= =?us-ascii?Q?1xMg4zdJ7sQDcB16oXgmgPmyHAKll3OP/Whj/o1Cly24c+sgMz+K3r58CIAa?= =?us-ascii?Q?HuyfOOoY363F9yKu8AXOtALmyhIj3NlT14DTOHBkY91P5BcV624tgEulO+kx?= =?us-ascii?Q?/jV2kxCIcb6MpDLEdFSvmxC1kQbP2ujDwx+ORwyaw2xDily03HLSWu+XOWVO?= =?us-ascii?Q?3ya9xfnE7EihKoQWxzvTqolszFrJHvyQLLidZQyXUvt5+SH8FjYbf+HF01V4?= =?us-ascii?Q?Qygc+TIwF5mCle5JeCdoNbthbvNPQEyWW9zvhIIkNLqdhN7ffe+VIwCgRK0m?= =?us-ascii?Q?W6h8cdr46T1wXybVWXSTNTb33hgg18c=3D?= X-OriginatorOrg: yacoub.de X-MS-Exchange-CrossTenant-Network-Message-Id: 2636bc06-90a0-4650-5458-08deff976de2 X-MS-Exchange-CrossTenant-AuthSource: MRWPR04MB12069.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Aug 2026 15:18:18.2589 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 2e96c4fa-c0f0-4eed-b0b5-8f85f5e8376c X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 1KIa4XUbOWOozrO64zs0KUdY+vORNLv4IzYnRDNJLGHdYan0o7b4TAyk2KQY8uGXL/SbhzMPjqP8W/gv99rIBaF8y32Hn6+bqcBK2ZZJHu4= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM9PR04MB8068 Content-Type: text/plain; charset="utf-8" From: Sam Price setup_sigcontext() and restore_sigcontext() copy r0-r31, pc, ear, esr and fsr to and from the signal frame but never touch MSR. The interrupted MSR is therefore dropped from the signal context entirely: the handler's ucontext does not expose it, a handler cannot adjust the resumed arithmetic flags through uc_mcontext.regs.msr, and -- because restore_sigcontext() leaves regs->msr as whatever the rt_sigreturn trap left in it -- the interrupted context resumes with the carry produced by the syscall entry path (_user_exception does "addi r14, r14, 4", which writes carry), not with its own. Other architectures round-trip the user-visible flags through the signal frame (arm's cpsr, csky's carry, x86's eflags), so a handler can both read and adjust the resumed flags; purely privileged status registers such as riscv's sstatus are left out. MicroBlaze should do the same for the user-writable bits. Concretely, MSR[C] (carry) is lost across signal delivery. Code that keeps a live carry across a point where a signal can be delivered -- for example an lwx/swx compare-and-swap retry loop, between the swx and the carry test -- resumes with the handler's carry and mis-evaluates the result; the same failure class as the rt_sigreturn r3/r4 clobber, reached through a different register. Demonstrated under qemu-system-microblazeel (machine petalogix-s3adsp1800): a handler that sets MSR_C in uc_mcontext.regs.msr has no effect before this change (0 of 132 in-window signals propagated) and takes effect after (130 of 132). Save MSR in setup_sigcontext() so the handler's ucontext exposes it. The signal frame is user-writable, so restore_sigcontext() must not restore it verbatim: MicroBlaze packs the user-writable carry (MSR_C, MSR_CC) and the privileged control bits (MSR_UM, MSR_VM, MSR_IE, MSR_EE, ...) into the one register, and a verbatim restore would let userspace alter privileged return state -- rtbd derives the resumed mode from MSR_UMS/MSR_VMS. Restore only MSR_C | MSR_CC from the frame and keep the rest from the current regs->msr. This mirrors x86's restore_sigcontext(), which masks the restored EFLAGS to FIX_EFLAGS for the same reason; arches whose status register is purely privileged (e.g. riscv sstatus) simply do not restore it at all. Comment on the exposed MSR reworded: it is not read-only, restore_sigcontext() applies MSR_C|MSR_CC from the frame. Author's Signed-off-by kept; he agreed to comment and changelog cleanups. Fixes: 2148daa9c45f ("microblaze_v8: Signal support") Cc: stable@vger.kernel.org Signed-off-by: Sam Price Signed-off-by: Ramin Moussavi Tested-by: Waldemar Brodkorb --- arch/microblaze/kernel/signal.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/arch/microblaze/kernel/signal.c b/arch/microblaze/kernel/signa= l.c index 4956014a9937..6bbc16f98d5e 100644 --- a/arch/microblaze/kernel/signal.c +++ b/arch/microblaze/kernel/signal.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -81,6 +82,22 @@ static int restore_sigcontext(struct pt_regs *regs, COPY(pc); COPY(ear); COPY(esr); COPY(fsr); #undef COPY =20 + /* + * The frame is user-writable, so restore only the user-writable + * status flags (carry) and keep the kernel-controlled MSR bits + * (UMS/VMS/IE/EE/...) from regs->msr: rtbd derives the resumed mode + * from UMS/VMS, so a verbatim restore would hand userspace the + * privileged return state. Same idea as x86 masking the restored + * EFLAGS to FIX_EFLAGS. + */ + { + unsigned long msr; + + err |=3D __get_user(msr, &sc->regs.msr); + regs->msr =3D (regs->msr & ~(MSR_C | MSR_CC)) | + (msr & (MSR_C | MSR_CC)); + } + *rval_p =3D regs->r3; =20 return err; @@ -140,6 +157,7 @@ setup_sigcontext(struct sigcontext __user *sc, struct p= t_regs *regs, COPY(r26); COPY(r27); COPY(r28); COPY(r29); COPY(r30); COPY(r31); COPY(pc); COPY(ear); COPY(esr); COPY(fsr); + COPY(msr); /* restore_sigcontext() accepts only carry state */ #undef COPY =20 err |=3D __put_user(mask, &sc->oldmask); --=20 2.53.0