From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) by sourceware.org (Postfix) with ESMTPS id D46E63858D35 for ; Sun, 30 Jul 2023 19:09:18 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org D46E63858D35 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=oracle.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=oracle.com Received: from pps.filterd (m0333521.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 36UJ9Hbm005696 for ; Sun, 30 Jul 2023 19:09:17 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : subject : date : message-id : content-transfer-encoding : content-type : mime-version; s=corp-2023-03-30; bh=gaT477Nh9pl8PXjCzESE8koBHHVkcNIcwZI+NC4p5CI=; b=XFJGJqrMVbDCcE5YbbW91xFdu4uKrfyYlBoWEIfvmBcQ8E1bw7d7vejlR8o5hyeiyxUX QEfdI8M8QhcAHWa3yZIlOBSzm7TA5XgUWFiiIJkyok8a8sHsgw5WinovNuf9/bgm0jJx RgDYDZB3bD7nuYlYDOWdMPzbfwUMR2X8MrK6fWcThpczdqn0E+rhL3jkwQgNQVEs12xX 5h7TLo97g6eLW039hLqR9nZAlhFPgORJrgWbJ27jegufbVFL2729SCeqUy2bcWjF/L1f p1l++5WGTk3etfzEzcYSMsPGE14oXh9AE6CJ3sGuaUbBzPMjcKAYttrCZmLb5cD7jMAE bw== Received: from iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta03.appoci.oracle.com [130.35.103.27]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3s4spc1d6b-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Sun, 30 Jul 2023 19:09:16 +0000 Received: from pps.filterd (iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (8.17.1.19/8.17.1.19) with ESMTP id 36UFwsXW008693 for ; Sun, 30 Jul 2023 19:09:15 GMT Received: from nam10-bn7-obe.outbound.protection.outlook.com (mail-bn7nam10lp2106.outbound.protection.outlook.com [104.47.70.106]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 3s4s79yf5t-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Sun, 30 Jul 2023 19:09:15 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=hVZlmlNFyYFh3sP6IyQjf/4Iwwt5LCw4YU5oWFZUgD88tKshpocv5MhaVsCjhcHnVXxBlgPTPJQJp6/0xjn0T3kgFc/5AgiWCAKlM7GINXnIyMRq44wVUbW4NHk5EcKF3s9hP3tPQ32tuLa7Z7hu4XhPbfVnCDZ32ARZBOQwWbivv9dj6heEKnovML0Vvz0vt/D2XrEOzp2oSg/9oclw2XlYSudNwfXGNtjBoGlwe+kvpC6I1ZpOeWTQctwVKHNxg/MQS8yYts/hDpxjG4hDOnokaob9oL8FqG95P8dVhh7TORcRAHoYexNkoVxgyMSWrCDtBQ7vZEo57BTmsVqWmg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=gaT477Nh9pl8PXjCzESE8koBHHVkcNIcwZI+NC4p5CI=; b=kkOUjmzLSqpxKyf3VZYIrlZWmMW94HzgNHjQBcmYJXXKA9vY3LjPeGKJmE1drrWtxXvfXBjCjZTD8dwnlAxoxkeyi4Fo+M8pXBPmSpVAX326lbAcRORFY+gagJf8q7MxwjdK8yqPP9E5lQ4K+nSehTu7uc3bKGEbF+1TXCPWOLf3elvBKywx5xDMmlTYcuOTiM6YEMADmSyLBJlgE8zB8RYE7+e5QeKAjz+qTGBuri0MYYZb7C9r5PaJXEv25KYN2Sb2fL9001pCC2g0Pi1UaPd5zrwQUSe7BzFzkJL+VBRWnHoxCS0L4YgIYzLGrdvsqAvBnBEsMVo3/HVzvOZ2mw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=gaT477Nh9pl8PXjCzESE8koBHHVkcNIcwZI+NC4p5CI=; b=zVzgi9gKorH6T4XiVUQd1jGnn1jEv4XpxSAXg79TvrLLZNWgLuIE6smgeCuRg9ji5gb3TZW073CkZb3NvvEbL1HQ7Owc6G682hhSHxOHdTfhFTHzF/d+1ZwGCgUjeWpSweQtrsZLQcNXL5u7gZDFqoQ5GEfNSt8aHd177iqfO0I= Received: from DM6PR10MB2890.namprd10.prod.outlook.com (2603:10b6:5:71::31) by SN7PR10MB6450.namprd10.prod.outlook.com (2603:10b6:806:2a1::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6631.29; Sun, 30 Jul 2023 19:09:13 +0000 Received: from DM6PR10MB2890.namprd10.prod.outlook.com ([fe80::c495:8d34:80c7:d66f]) by DM6PR10MB2890.namprd10.prod.outlook.com ([fe80::c495:8d34:80c7:d66f%6]) with mapi id 15.20.6631.026; Sun, 30 Jul 2023 19:09:12 +0000 From: "Jose E. Marchesi" To: binutils@sourceware.org Subject: [COMMITTED] bpf: gas: add field overflow checking to the BPF assembler Date: Sun, 30 Jul 2023 21:09:07 +0200 Message-Id: <20230730190907.22720-1-jose.marchesi@oracle.com> X-Mailer: git-send-email 2.30.2 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: FR2P281CA0184.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:9f::16) To DM6PR10MB2890.namprd10.prod.outlook.com (2603:10b6:5:71::31) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM6PR10MB2890:EE_|SN7PR10MB6450:EE_ X-MS-Office365-Filtering-Correlation-Id: 5ab458f7-683c-41cf-efe5-08db91307576 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 1ZXKMxKBnMXBOF55D9M9wi3x2HOKDF8+zTODKve3wq139Srf7VWvzVfZBLkt7IyfjeK4jSsvjRxh39FnlOIRh6SZ+0j0cCA9/aX7CfIov6gloDCpDy9Oqnl8E1gK/fRatF1914lh2bYn5sg+MlSXLgLkAkbrPyxZWfvZnTNDmwR8CWu9TycO9uM+UyBFEUDu1zJbjah+8l1g6SWZQlHmO8kKDv2470j8HWwscTinqzW8Wrqu8j6DITXyeanlXfEZv0KCvqFbqGUHZfNK5JHBsG24HjiWwvRZEFN4NZU22/iZweZpu3WSxAo+fPPYUzLxUHBWsjf3hks9NbwvEA2+n5mzkpEi0S91ssvpkZxlpyzXfDaMBxTXKPwoyiyjccAL75Vgk7mFnV/2KXJAQX3yKt0Ztgv3kF2+0Vs4gaRc3XdK4+IwrHQlM3uBswVJC6ISJXDhVFXi0FZFIU12PAoH1JuGGer5U0PEVjOx+qiejsrNJ2QPNgcPNDAmdAjJXw18w/cmI7kakZ+Jr2HJAozyKomsco5ZC51G/6h6dWyu6eJm7ktniSn0etWwcO9EegwI X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM6PR10MB2890.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230028)(396003)(136003)(346002)(39860400002)(376002)(366004)(451199021)(186003)(6512007)(6666004)(6486002)(478600001)(6916009)(83380400001)(36756003)(86362001)(2906002)(30864003)(6506007)(66476007)(2616005)(1076003)(26005)(316002)(66946007)(38100700002)(66556008)(41300700001)(8936002)(8676002)(5660300002);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?W9aUFSrgHkKcMYyVS7JAQVwg9TMBWes+Fp63t7e2XDopywBTNR3TxscGnRUR?= =?us-ascii?Q?7EaQm2YlRxgxYNgobs5581XS9Naoq97PeY6oBaI4UOR+qZAxzKQokj0l8ZDZ?= =?us-ascii?Q?cUwXTyxSVacvK0klUX+PYRoAtBnJG0EEH2341PXJ+2T1Oz4Ozfv6xCKNiiMe?= =?us-ascii?Q?yNMSARFjRC2AMxs9XtX9TNbKvrOwz8RjWoLn4IaRYC2Mmc7cSjonJr3TxfUq?= =?us-ascii?Q?ZXdKnGS69Lb8FXw8wh3s7M/a5wu9MM726H7AzIrkIUKGnmtCFXXLH//uyO0j?= =?us-ascii?Q?5afC57UqgjJ6ZpeWUPbB1Frw5W4AwjTK4mVFPGdq2ufnpG9DO8eO5+vR7jGO?= =?us-ascii?Q?VxnpeT+9thiDA2cLWZqBP5iDfZTDnvgUkhzqMad0KEwwmuDaNZfjVFxQlXDZ?= =?us-ascii?Q?pfYLknjN7mMSDXBVfD2DPaNOcRnYmqgwBcZU7ANU3QUlu2+OBpJ7g+kttgzF?= =?us-ascii?Q?OriuXkFcPTMaZpHqFEa3958mqyx6waCorv6FSMusa+kEpOZE9GUhsxvlAj7E?= =?us-ascii?Q?VxkIg4s31Hzq0fkna/ql8ZHFy4sGQkYJ9UrGACbjmJup8FO6gXAG+wtMI2LV?= =?us-ascii?Q?Sq4r8zPAFdNx/zxiDlkokC+08lm3bCT9WJ0XQ2tGrCsXAeiJVfqTCYvOB6sa?= =?us-ascii?Q?SjAaSlobKOX/Psijos3adHeuPW+14zoCi39infSR2dVyklypzVwBZJAmoYdy?= =?us-ascii?Q?jTgqy8AAdHZord8f/HsROCjyD2NqwuIEuEbx2BqgdPmx7MTQaw4/fA7SXTb2?= =?us-ascii?Q?zb5P0M+8WmFcg1eLfweEtpN2VDZbzCP6EZGW7gZtmQnozWIN2KRLXdXPIHDT?= =?us-ascii?Q?Zg+6+KZSF/wmiDNeCf+oByxSTYk/DNKPobFJmRkb5oVNgGc2NileP5sjTv1F?= =?us-ascii?Q?IQAGl5arDRah3bo1FFq+7X1hCPYRoQHMvThhwGVfZm2CHC7xh4qDTZjYilCX?= =?us-ascii?Q?FUHepApdtwXo0De1VWTE0eC1AYV4pogw0xlxg5zIw/B/OIiY/DWlznIgcjux?= =?us-ascii?Q?LmsKcwjD5G6k538L4Y3ZUx9n889rOkxXAMqasPpqPrRmQb9WBFd8xPuf8LSm?= =?us-ascii?Q?hyqaKYxA9lFLTavSmjLvnlzCcAlLJHOUhOvXOclSeXjBBYE/pyFI5yVIUxi1?= =?us-ascii?Q?mVdQn6HSaZR2GbrvDcLzaxZD+/DFUHl7azFQA0vfnizXY/h82bQvEZ38npL2?= =?us-ascii?Q?bb/IByAfh1O8H/N0N512cqJZ+n7DFAP+O0bO0VD7cV5A32mhEKIAGZM4X6lr?= =?us-ascii?Q?+7uaOO7RFLoXPGEUp+aLf10YxoQjhdy7JsVKcXwnGd1TRbvbzVnVPWuoQ2ss?= =?us-ascii?Q?fICp3ZHj1VzdlJwtfui72cm+a8mLqOFzoz35VCu6lVq/H4GpKx5ZHwwZ1+2I?= =?us-ascii?Q?eH4DLDUTbhOpkE63atiLDzP3wX06VeL8R/a2mjf6JoafIuFcVw8z5vty9gYv?= =?us-ascii?Q?gNFpZY2iiYwS8gU3HD1ekyKjrdXze1q3Fqf4EjIGcs+F8MOlaUEBgkqGhEUp?= =?us-ascii?Q?KUk5BXW2J2DV3eTJhknPGQ3Z9pseHY+pwvSMBXT1qRAx4VFJXISup+6V4ZYr?= =?us-ascii?Q?gV1lzEcS6YFpaRpZHVjTp6oSdhSLzMbnqCgNzXZ4ZeOQBv2qjHXDs3GVSXfz?= =?us-ascii?Q?GQ=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: YJ5oY0AAzNkgs8gdMLLUXomLRTlW3uQSPk43vSQE4H24HmtfxwJdWZTFXlmEfm7lAuw3/kXGNBcNAws5+GGIWtxShq9ui8u9NloZYNkx0J4OHhogj9K2axkvN4Vq4b3iCcjd8USvybMyPvhI3rgEVOw8BYzrnj3JkbLv8K/KJCu/yH3hEoQYMPWodelavDD+A9JGAvL3i8BYcs2+YeQK9WK1gjSeeynZSIUlEvKpJ58RYxw0qO3xplHJTpJ8wsijCKRJ0yRZfXiUYf5WZthLKFIRUPZ9CAtf0fI0nQpi5YJbvo+T8nIv//eTRFda5/jvKJzOF1qPIaWC+KHm/naCgRngWPaTzuOeHblKi1sMGW/3Snjdn86J0DvN3uXEltLtKejVPli7eyU3s9UDu2y89Rhme2BVKL0Wytdmp7oQi4wi1MGXZdCiZwwZr0IoKhQextKBOXY6MbltvjMxtxW9QTwq8JneM1HxYdbyl07p6tiShxbvI3uh/wgpVxGJmDhnc6XFLhObAgQJq326qcY7Rk4XajsBCraxFMZB7KuMgAID2yoZcmM8Ri2SU39wqVQKQ7rKMbVxHKT0RTfJsVmIw5VLaRbVhny41DxLB72Y1EkrJF1JkqIVwnTi3z/DG3njBToT0K1dJlRFN6DVRbq3wmPiQyowSfjVoHGdalhsIKhnuy9sHZLp33fjZBl3PKtvQoDiyZOhh9iV6Z5iwtHKGZQCZokTvF/x6EJZ+aP57x435193EtdLUsteeWn4Gzut X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 5ab458f7-683c-41cf-efe5-08db91307576 X-MS-Exchange-CrossTenant-AuthSource: DM6PR10MB2890.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jul 2023 19:09:12.0599 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: fmtfFL1crHu9eYfRkLzu42Lp8eRo32sKONrpVBxy8+oCPVPNi6FNO4nX4EfdF8a8ALUh97AKlgWsGZspOho2I5h77mvjNFfpHMQiI4R1LfI= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN7PR10MB6450 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.254,Aquarius:18.0.957,Hydra:6.0.591,FMLib:17.11.176.26 definitions=2023-07-27_10,2023-07-26_01,2023-05-22_02 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 mlxlogscore=999 phishscore=0 mlxscore=0 adultscore=0 malwarescore=0 suspectscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2306200000 definitions=main-2307300178 X-Proofpoint-ORIG-GUID: R1AFrrVx9jK_wJZce5-1QVSTerNJg4rq X-Proofpoint-GUID: R1AFrrVx9jK_wJZce5-1QVSTerNJg4rq X-Spam-Status: No, score=-12.2 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H5,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: This patch makes the BPF assembler to throughfully check for overflow in immediates. This includes relaxed instructions. Tested in bpf-unknown-none. gas/ChangeLog: 2023-07-30 Jose E. Marchesi * config/tc-bpf.c (signed_overflow): Copy function from tc-aarch64.c. (encode_insn): Check for overflow in constant immediates. (add_relaxed_insn): Pass relax argument to encode_insn. (add_fixed_insn): Likewise. * testsuite/gas/bpf/disp16-overflow.d: New file. * testsuite/gas/bpf/disp16-overflow.s: Likewise. * testsuite/gas/bpf/disp16-overflow.l: Likewise. * testsuite/gas/bpf/disp32-overflow.d: Likewise. * testsuite/gas/bpf/disp32-overflow.s: Likewise. * testsuite/gas/bpf/disp32-overflow.l: Likewise. * testsuite/gas/bpf/imm32-overflow.d: Likewise. * testsuite/gas/bpf/imm32-overflow.s: Likewise. * testsuite/gas/bpf/imm32-overflow.l: Likewise. * testsuite/gas/bpf/offset16-overflow.d: Likewise. * testsuite/gas/bpf/offset16-overflow.s: Likewise. * testsuite/gas/bpf/offset16-overflow.l: Likewise. * testsuite/gas/bpf/disp16-overflow-relax.d: Likewise. * testsuite/gas/bpf/disp16-overflow-relax.l: Likewise. * testsuite/gas/bpf/disp16-overflow-relax.s: Likewise. * testsuite/gas/bpf/jump-relax-jump-be.d: New file. * testsuite/gas/bpf/bpf.exp: Run new tests. --- gas/ChangeLog | 25 ++++++++ gas/config/tc-bpf.c | 63 ++++++++++++++++--- gas/testsuite/gas/bpf/bpf.exp | 7 +++ gas/testsuite/gas/bpf/disp16-overflow-relax.d | 3 + gas/testsuite/gas/bpf/disp16-overflow-relax.l | 3 + gas/testsuite/gas/bpf/disp16-overflow-relax.s | 4 ++ gas/testsuite/gas/bpf/disp16-overflow.d | 3 + gas/testsuite/gas/bpf/disp16-overflow.l | 3 + gas/testsuite/gas/bpf/disp16-overflow.s | 4 ++ gas/testsuite/gas/bpf/disp32-overflow.d | 3 + gas/testsuite/gas/bpf/disp32-overflow.l | 3 + gas/testsuite/gas/bpf/disp32-overflow.s | 4 ++ gas/testsuite/gas/bpf/imm32-overflow.d | 3 + gas/testsuite/gas/bpf/imm32-overflow.l | 3 + gas/testsuite/gas/bpf/imm32-overflow.s | 4 ++ gas/testsuite/gas/bpf/jump-relax-jump-be.d | 25 ++++++++ gas/testsuite/gas/bpf/offset16-overflow.d | 3 + gas/testsuite/gas/bpf/offset16-overflow.l | 3 + gas/testsuite/gas/bpf/offset16-overflow.s | 4 ++ 19 files changed, 162 insertions(+), 8 deletions(-) create mode 100644 gas/testsuite/gas/bpf/disp16-overflow-relax.d create mode 100644 gas/testsuite/gas/bpf/disp16-overflow-relax.l create mode 100644 gas/testsuite/gas/bpf/disp16-overflow-relax.s create mode 100644 gas/testsuite/gas/bpf/disp16-overflow.d create mode 100644 gas/testsuite/gas/bpf/disp16-overflow.l create mode 100644 gas/testsuite/gas/bpf/disp16-overflow.s create mode 100644 gas/testsuite/gas/bpf/disp32-overflow.d create mode 100644 gas/testsuite/gas/bpf/disp32-overflow.l create mode 100644 gas/testsuite/gas/bpf/disp32-overflow.s create mode 100644 gas/testsuite/gas/bpf/imm32-overflow.d create mode 100644 gas/testsuite/gas/bpf/imm32-overflow.l create mode 100644 gas/testsuite/gas/bpf/imm32-overflow.s create mode 100644 gas/testsuite/gas/bpf/jump-relax-jump-be.d create mode 100644 gas/testsuite/gas/bpf/offset16-overflow.d create mode 100644 gas/testsuite/gas/bpf/offset16-overflow.l create mode 100644 gas/testsuite/gas/bpf/offset16-overflow.s diff --git a/gas/ChangeLog b/gas/ChangeLog index 1f3735d70af..ab139a9257b 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,28 @@ +2023-07-30 Jose E. Marchesi + + * config/tc-bpf.c (signed_overflow): Copy function from + tc-aarch64.c. + (encode_insn): Check for overflow in constant immediates. + (add_relaxed_insn): Pass relax argument to encode_insn. + (add_fixed_insn): Likewise. + * testsuite/gas/bpf/disp16-overflow.d: New file. + * testsuite/gas/bpf/disp16-overflow.s: Likewise. + * testsuite/gas/bpf/disp16-overflow.l: Likewise. + * testsuite/gas/bpf/disp32-overflow.d: Likewise. + * testsuite/gas/bpf/disp32-overflow.s: Likewise. + * testsuite/gas/bpf/disp32-overflow.l: Likewise. + * testsuite/gas/bpf/imm32-overflow.d: Likewise. + * testsuite/gas/bpf/imm32-overflow.s: Likewise. + * testsuite/gas/bpf/imm32-overflow.l: Likewise. + * testsuite/gas/bpf/offset16-overflow.d: Likewise. + * testsuite/gas/bpf/offset16-overflow.s: Likewise. + * testsuite/gas/bpf/offset16-overflow.l: Likewise. + * testsuite/gas/bpf/disp16-overflow-relax.d: Likewise. + * testsuite/gas/bpf/disp16-overflow-relax.l: Likewise. + * testsuite/gas/bpf/disp16-overflow-relax.s: Likewise. + * testsuite/gas/bpf/jump-relax-jump-be.d: New file. + * testsuite/gas/bpf/bpf.exp: Run new tests. + 2023-07-28 Jose E. Marchesi PR gas/30690 diff --git a/gas/config/tc-bpf.c b/gas/config/tc-bpf.c index 230e499aa1d..7e1bd5d40b8 100644 --- a/gas/config/tc-bpf.c +++ b/gas/config/tc-bpf.c @@ -272,6 +272,20 @@ md_section_align (segT segment, valueT size) return ((size + (1 << align) - 1) & -(1 << align)); } +/* Return non-zero if the indicated VALUE has overflowed the maximum + range expressible by an signed number with the indicated number of + BITS. */ + +static bool +signed_overflow (offsetT value, unsigned bits) +{ + offsetT lim; + if (bits >= sizeof (offsetT) * 8) + return false; + lim = (offsetT) 1 << (bits - 1); + return (value < -lim || value >= lim); +} + /* Functions concerning relocs. */ @@ -549,6 +563,11 @@ md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, disp_is_known = 1; } + /* The displacement should fit in a signed 32-bit number. */ + if (disp_is_known && signed_overflow (disp_to_target, 32)) + as_bad_where (fragp->fr_file, fragp->fr_line, + _("signed instruction operand out of range, shall fit in 32 bits")); + /* Now relax particular jump instructions. */ if (code == BPF_CODE_JA) { @@ -835,7 +854,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) immediates are encoded as zeroes. */ static void -encode_insn (struct bpf_insn *insn, char *bytes) +encode_insn (struct bpf_insn *insn, char *bytes, int relaxed) { uint8_t src, dst; @@ -889,16 +908,44 @@ encode_insn (struct bpf_insn *insn, char *bytes) /* Now the immediates that are known to be constant. */ if (insn->has_imm32 && insn->imm32.X_op == O_constant) - encode_int32 (insn->imm32.X_add_number, bytes + 4); + { + int64_t imm = insn->imm32.X_add_number; + + if (signed_overflow (imm, 32)) + as_bad (_("signed immediate out of range, shall fit in 32 bits")); + else + encode_int32 (insn->imm32.X_add_number, bytes + 4); + } if (insn->has_disp32 && insn->disp32.X_op == O_constant) - encode_int32 (insn->disp32.X_add_number, bytes + 4); + { + int64_t disp = insn->disp32.X_add_number; + + if (signed_overflow (disp, 32)) + as_bad (_("signed pc-relative offset out of range, shall fit in 32 bits")); + else + encode_int32 (insn->disp32.X_add_number, bytes + 4); + } if (insn->has_offset16 && insn->offset16.X_op == O_constant) - encode_int16 (insn->offset16.X_add_number, bytes + 2); + { + int64_t offset = insn->offset16.X_add_number; + + if (signed_overflow (offset, 16)) + as_bad (_("signed pc-relative offset out of range, shall fit in 16 bits")); + else + encode_int16 (insn->offset16.X_add_number, bytes + 2); + } if (insn->has_disp16 && insn->disp16.X_op == O_constant) - encode_int16 (insn->disp16.X_add_number, bytes + 2); + { + int64_t disp = insn->disp16.X_add_number; + + if (!relaxed && signed_overflow (disp, 16)) + as_bad (_("signed pc-relative offset out of range, shall fit in 16 bits")); + else + encode_int16 (insn->disp16.X_add_number, bytes + 2); + } if (insn->has_imm64 && insn->imm64.X_op == O_constant) { @@ -1105,7 +1152,7 @@ add_fixed_insn (struct bpf_insn *insn) /* First encode the known parts of the instruction, including opcodes and constant immediates, and write them to the frag. */ - encode_insn (insn, bytes); + encode_insn (insn, bytes, 0 /* relax */); for (i = 0; i < insn->size; ++i) md_number_to_chars (this_frag + i, (valueT) bytes[i], 1); @@ -1136,7 +1183,7 @@ add_relaxed_insn (struct bpf_insn *insn, expressionS *exp) /* First encode the known parts of the instruction, including opcodes and constant immediates, and write them to the frag. */ - encode_insn (insn, bytes); + encode_insn (insn, bytes, 1 /* relax */); for (i = 0; i < insn->size; ++i) md_number_to_chars (this_frag + i, (valueT) bytes[i], 1); @@ -1555,7 +1602,7 @@ md_assemble (char *str ATTRIBUTE_UNUSED) #undef PARSE_ERROR /* Generate the frags and fixups for the parsed instruction. */ - if (do_relax && insn.is_relaxable) + if (do_relax && isa_spec >= BPF_V4 && insn.is_relaxable) { expressionS *relaxable_exp = NULL; diff --git a/gas/testsuite/gas/bpf/bpf.exp b/gas/testsuite/gas/bpf/bpf.exp index 6e6a0003e17..80f5a1dbc2d 100644 --- a/gas/testsuite/gas/bpf/bpf.exp +++ b/gas/testsuite/gas/bpf/bpf.exp @@ -65,4 +65,11 @@ if {[istarget bpf*-*-*]} { run_dump_test jump-relax-ja-be run_dump_test jump-relax-jump-be + + # Overflow tests + run_dump_test offset16-overflow + run_dump_test disp16-overflow + run_dump_test disp16-overflow-relax + run_dump_test disp32-overflow + run_dump_test imm32-overflow } diff --git a/gas/testsuite/gas/bpf/disp16-overflow-relax.d b/gas/testsuite/gas/bpf/disp16-overflow-relax.d new file mode 100644 index 00000000000..051e2fa4e99 --- /dev/null +++ b/gas/testsuite/gas/bpf/disp16-overflow-relax.d @@ -0,0 +1,3 @@ +#as: -EL -misa-spec=v4 +#source: disp16-overflow-relax.s +#error_output: disp16-overflow-relax.l diff --git a/gas/testsuite/gas/bpf/disp16-overflow-relax.l b/gas/testsuite/gas/bpf/disp16-overflow-relax.l new file mode 100644 index 00000000000..ca572cbd0ff --- /dev/null +++ b/gas/testsuite/gas/bpf/disp16-overflow-relax.l @@ -0,0 +1,3 @@ +.*: Assembler messages: +.*:2: Error: signed instruction operand out of range, shall fit in 32 bits +.*:4: Error: signed instruction operand out of range, shall fit in 32 bits diff --git a/gas/testsuite/gas/bpf/disp16-overflow-relax.s b/gas/testsuite/gas/bpf/disp16-overflow-relax.s new file mode 100644 index 00000000000..3953992ad07 --- /dev/null +++ b/gas/testsuite/gas/bpf/disp16-overflow-relax.s @@ -0,0 +1,4 @@ + jeq %r1,%r2,2147483647 + jlt %r3,%r4,2147483648 ; Overflows. + jge %r5,10,-2147483648 + ja -2147483649 ; Overflows. diff --git a/gas/testsuite/gas/bpf/disp16-overflow.d b/gas/testsuite/gas/bpf/disp16-overflow.d new file mode 100644 index 00000000000..5a0094ff4e1 --- /dev/null +++ b/gas/testsuite/gas/bpf/disp16-overflow.d @@ -0,0 +1,3 @@ +#as: -EL -mno-relax +#source: disp16-overflow.s +#error_output: disp16-overflow.l diff --git a/gas/testsuite/gas/bpf/disp16-overflow.l b/gas/testsuite/gas/bpf/disp16-overflow.l new file mode 100644 index 00000000000..6404b1b2076 --- /dev/null +++ b/gas/testsuite/gas/bpf/disp16-overflow.l @@ -0,0 +1,3 @@ +.*: Assembler messages: +.*:2: Error: signed pc-relative offset out of range, shall fit in 16 bits +.*:4: Error: signed pc-relative offset out of range, shall fit in 16 bits diff --git a/gas/testsuite/gas/bpf/disp16-overflow.s b/gas/testsuite/gas/bpf/disp16-overflow.s new file mode 100644 index 00000000000..ab66753af7d --- /dev/null +++ b/gas/testsuite/gas/bpf/disp16-overflow.s @@ -0,0 +1,4 @@ + ja 32767 + jeq %r1,%r2,32768 ; Overflows + jlt %r3,%r4,-32768 + jge %r5,10,-32769 ; Overflows diff --git a/gas/testsuite/gas/bpf/disp32-overflow.d b/gas/testsuite/gas/bpf/disp32-overflow.d new file mode 100644 index 00000000000..09fa1892487 --- /dev/null +++ b/gas/testsuite/gas/bpf/disp32-overflow.d @@ -0,0 +1,3 @@ +#as: -EL +#source: disp32-overflow.s +#error_output: disp32-overflow.l diff --git a/gas/testsuite/gas/bpf/disp32-overflow.l b/gas/testsuite/gas/bpf/disp32-overflow.l new file mode 100644 index 00000000000..8a6b6479f07 --- /dev/null +++ b/gas/testsuite/gas/bpf/disp32-overflow.l @@ -0,0 +1,3 @@ +.*: Assembler messages: +.*:2: Error: signed pc-relative offset out of range, shall fit in 32 bits +.*:4: Error: signed pc-relative offset out of range, shall fit in 32 bits diff --git a/gas/testsuite/gas/bpf/disp32-overflow.s b/gas/testsuite/gas/bpf/disp32-overflow.s new file mode 100644 index 00000000000..03a0d97e6c6 --- /dev/null +++ b/gas/testsuite/gas/bpf/disp32-overflow.s @@ -0,0 +1,4 @@ + call -2147483648 + call -2147483649 ; This overflows. + call 2147483647 + call 2147483648 ; This overflows. diff --git a/gas/testsuite/gas/bpf/imm32-overflow.d b/gas/testsuite/gas/bpf/imm32-overflow.d new file mode 100644 index 00000000000..c8e35a93520 --- /dev/null +++ b/gas/testsuite/gas/bpf/imm32-overflow.d @@ -0,0 +1,3 @@ +#as: -EL +#source: imm32-overflow.s +#error_output: imm32-overflow.l diff --git a/gas/testsuite/gas/bpf/imm32-overflow.l b/gas/testsuite/gas/bpf/imm32-overflow.l new file mode 100644 index 00000000000..f6691c49cd5 --- /dev/null +++ b/gas/testsuite/gas/bpf/imm32-overflow.l @@ -0,0 +1,3 @@ +.*: Assembler messages: +.*:2: Error: signed immediate out of range, shall fit in 32 bits +.*:4: Error: signed immediate out of range, shall fit in 32 bits diff --git a/gas/testsuite/gas/bpf/imm32-overflow.s b/gas/testsuite/gas/bpf/imm32-overflow.s new file mode 100644 index 00000000000..5cb858cee05 --- /dev/null +++ b/gas/testsuite/gas/bpf/imm32-overflow.s @@ -0,0 +1,4 @@ + add %r1, 2147483647 + or %r2, 2147483648 ; This overflows. + xor %r3, -2147483648 + sub %r4, -2147483649 ; This overflows. diff --git a/gas/testsuite/gas/bpf/jump-relax-jump-be.d b/gas/testsuite/gas/bpf/jump-relax-jump-be.d new file mode 100644 index 00000000000..5626d568734 --- /dev/null +++ b/gas/testsuite/gas/bpf/jump-relax-jump-be.d @@ -0,0 +1,25 @@ +#as: -EB -mdialect=normal +#objdump: -dr -M dec +#source: jump-relax-jump.s +#name: Relaxation of conditional branch instructions, big-endian + +.*: +file format .*bpf.* + +Disassembly of section .text: + +0+ <.*>: + 0: 1d 12 80 00 00 00 00 00 jeq %r1,%r2,-32768 + 8: ad 12 7f ff 00 00 00 00 jlt %r1,%r2,32767 + 10: bd 12 ff fd 00 00 00 00 jle %r1,%r2,-3 + 18: 3d 12 00 01 00 00 00 00 jge %r1,%r2,1 + 20: 05 00 00 01 00 00 00 00 ja 1 + 28: 06 00 00 00 ff ff 7f ff jal -32769 + 30: 2d 12 00 01 00 00 00 00 jgt %r1,%r2,1 + 38: 05 00 00 01 00 00 00 00 ja 1 + 40: 06 00 00 00 00 00 80 00 jal 32768 + 48: 1d 12 00 01 00 00 00 00 jeq %r1,%r2,1 + 50: 05 00 00 01 00 00 00 00 ja 1 + 58: 06 00 00 00 00 00 80 01 jal 32769 + 60: 2d 12 00 01 00 00 00 00 jgt %r1,%r2,1 + 68: 05 00 00 01 00 00 00 00 ja 1 + 70: 06 00 00 00 00 00 80 01 jal 32769 diff --git a/gas/testsuite/gas/bpf/offset16-overflow.d b/gas/testsuite/gas/bpf/offset16-overflow.d new file mode 100644 index 00000000000..102edca6777 --- /dev/null +++ b/gas/testsuite/gas/bpf/offset16-overflow.d @@ -0,0 +1,3 @@ +#as: -EL +#source: offset16-overflow.s +#error_output: offset16-overflow.l diff --git a/gas/testsuite/gas/bpf/offset16-overflow.l b/gas/testsuite/gas/bpf/offset16-overflow.l new file mode 100644 index 00000000000..6404b1b2076 --- /dev/null +++ b/gas/testsuite/gas/bpf/offset16-overflow.l @@ -0,0 +1,3 @@ +.*: Assembler messages: +.*:2: Error: signed pc-relative offset out of range, shall fit in 16 bits +.*:4: Error: signed pc-relative offset out of range, shall fit in 16 bits diff --git a/gas/testsuite/gas/bpf/offset16-overflow.s b/gas/testsuite/gas/bpf/offset16-overflow.s new file mode 100644 index 00000000000..da9f633a337 --- /dev/null +++ b/gas/testsuite/gas/bpf/offset16-overflow.s @@ -0,0 +1,4 @@ + ldxh %r2, [%r1 + 32767] + ldxw %r2, [%r1 + 32768] ; This overflows + stxw [%r2 - 32768], %r1 + stxdw [%r2 - 32769], %r1 ; This overflows -- 2.30.2