From patchwork Fri Nov 5 08:52:18 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrea Corallo X-Patchwork-Id: 47094 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 7581A3857C5E for ; Fri, 5 Nov 2021 08:53:06 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 7581A3857C5E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1636102386; bh=quMQTfd7HBIYlOT1iGsR9Dp27LHkhucusrEMI7a3WkE=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc:From; b=L4hGYHxcGcPCJfCfa5NAp86GM54qUkgjfrDsN2AK0veGareJ4dT//4zGmePyzGBX9 X8SHo6q3GtClPh6sqlmL6I/Clo6/GwxZcEVg9KEzYWXbcrDENp2aJGK+mx1B8HkoWE Q3dXIPtDlwK5pXL7n2Mhyh9GldOLAuB9lirYjlo8= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-eopbgr80077.outbound.protection.outlook.com [40.107.8.77]) by sourceware.org (Postfix) with ESMTPS id 747163858D35 for ; Fri, 5 Nov 2021 08:52:33 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 747163858D35 Received: from AM6PR02CA0020.eurprd02.prod.outlook.com (2603:10a6:20b:6e::33) by AM6PR08MB4455.eurprd08.prod.outlook.com (2603:10a6:20b:70::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4669.13; Fri, 5 Nov 2021 08:52:31 +0000 Received: from AM5EUR03FT063.eop-EUR03.prod.protection.outlook.com (2603:10a6:20b:6e:cafe::69) by AM6PR02CA0020.outlook.office365.com (2603:10a6:20b:6e::33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4669.10 via Frontend Transport; Fri, 5 Nov 2021 08:52:31 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by AM5EUR03FT063.mail.protection.outlook.com (10.152.16.226) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4649.14 via Frontend Transport; Fri, 5 Nov 2021 08:52:30 +0000 Received: ("Tessian outbound 7129402754f2:v108"); Fri, 05 Nov 2021 08:52:30 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: ea1cbd8dab6e13fb X-CR-MTA-TID: 64aa7808 Received: from e4c31f964a85.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 01129E79-D078-44DB-A30D-BCF8237AAFA4.1; Fri, 05 Nov 2021 08:52:22 +0000 Received: from EUR04-HE1-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id e4c31f964a85.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Fri, 05 Nov 2021 08:52:22 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=SCgye0zdQAZjVtyESSE3G9Jx5eJ9iatjXyh5WWhvznSMfPvi6EPMAQvVonErjev288L3ApmuZfeMnCXiS9Nbuv7QeqyBvAOSOcFAhxqzaodk8OZVEJh7bpB4h2g/hlcj8LrZozNbM4dXGxlvwTRo0ULx0OBWprizuy9ucNN814GUfZfKKs50xD+TmoAmrERroqFaubv2uCHgXBzxk/IDx1kUHKBtThJvmOObqeRNwAfKjfGGRz2Y541Z5gC/W657bayHOrATIOjShYY9eqi7NiguQJbtH0djPvbzPZMyHMZbZt19F0qdGdVKOjtkhzXDEqJVRq8HHH/G187GPCl0QQ== 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=quMQTfd7HBIYlOT1iGsR9Dp27LHkhucusrEMI7a3WkE=; b=bRBHjc3SC6u/kvKCnVWhhL2meQDqfqeLZCpNNzpeYr31QR+dTrSdcd6EqwdTLo1xCRJh1Xn5w6wnw7iH5BZh1tLzxUQKr6Bcyk5PNilkkwYxzZP+SLbIIYOgcidhBEeK7hoJ4snqYmByM9EeSCj6B4WmSWTM/uFwgZw3TiRJfnvGGBMpGbJjYAwkcPp3VayFBPJcV/mtTcVKcZTpI1Jev/ZpMgx5S9xZKSqrMAqeDGDLJ3qCNNkz4uMelABCXjCZMz7r22CKg+X/kD56IpEAolNjXPG8DA4HQwiM6KsKDJHXohEEKoCWFfU5K961WVSRB++D6oJ7dG2rEcj1ZhQ+TA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 40.67.248.234) smtp.rcpttodomain=gcc.gnu.org smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=none (message not signed); arc=none Received: from DB6PR0802CA0047.eurprd08.prod.outlook.com (2603:10a6:4:a3::33) by AM8PR08MB5650.eurprd08.prod.outlook.com (2603:10a6:20b:1d3::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4669.13; Fri, 5 Nov 2021 08:52:20 +0000 Received: from DB5EUR03FT055.eop-EUR03.prod.protection.outlook.com (2603:10a6:4:a3:cafe::ed) by DB6PR0802CA0047.outlook.office365.com (2603:10a6:4:a3::33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4669.10 via Frontend Transport; Fri, 5 Nov 2021 08:52:20 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 40.67.248.234) smtp.mailfrom=arm.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 40.67.248.234 as permitted sender) receiver=protection.outlook.com; client-ip=40.67.248.234; helo=nebula.arm.com; Received: from nebula.arm.com (40.67.248.234) by DB5EUR03FT055.mail.protection.outlook.com (10.152.21.30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.4649.14 via Frontend Transport; Fri, 5 Nov 2021 08:52:20 +0000 Received: from AZ-NEU-EX04.Arm.com (10.251.24.32) by AZ-NEU-EX04.Arm.com (10.251.24.32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.14; Fri, 5 Nov 2021 08:52:25 +0000 Received: from e124257 (10.34.101.64) by mail.arm.com (10.251.24.32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.14 via Frontend Transport; Fri, 5 Nov 2021 08:52:25 +0000 To: Subject: [PATCH] [1/2] arm: Implement cortex-M return signing address codegen Date: Fri, 5 Nov 2021 09:52:18 +0100 Message-ID: MIME-Version: 1.0 X-EOPAttributedMessage: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 659e5a5d-1bbf-461e-6346-08d9a03999cb X-MS-TrafficTypeDiagnostic: AM8PR08MB5650:|AM6PR08MB4455: X-Microsoft-Antispam-PRVS: x-checkrecipientrouted: true NoDisclaimer: true X-MS-Oob-TLC-OOBClassifiers: OLM:8273;OLM:8273; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: f2Au+3URcCX2hEufbhRaCCqhBP2rJM2fjv6/uCCganO/N3J8tUBg3CCiIA39/DlkATLaNWxenHqnNTp/RaocyLey4f6bVqGVLegBnjyZSLwazdPakHF0Vugh2Cy67FMsk9F9wMdP7zHNzBOc3ccZcjUClMx8H5m1Lr/qn6sJeDB4e0T6LaXAHMZpxwbKJLWyYt783Bq8KZhPDVADGAN7gr/o90F+CwRIkB+uZYhWsCvNBQtZSLny6GxBSielN9DCTfg5B1mruocbzr0DzaBcKfZKGQriE4bzqIx5NeXGdtETZ7ehCE1/CPQyM3gBD0yFV10RV09IIloqT+2XDqYhXVEdhn8ENNZDCXAtvYoZNT579SKInRnmJWB2rN2u5BC/3L6t8PpdHphcyNZ3a1+lHqnEbdZAGky7Hxo4okWDPOZShpAuOFwVvpSWIsq3JrmpzRvbvNcB+gN8r+0guWVBU7RXgVVnaMPrwSL48c2z8HOo71aZc/+3rvSAjANdyw2gb+VoE2ENT8L4K1etH7rEXT208UsfiWUwVL5yzy7K6hr8WYgcN7+V/x8rSWFAb/THQbURvJRDCr4wpMbPom4vcExMfBdnv9vptehvJhyQV+1uNO87mmD2ZG5a57ZpuFAnn1nQdwCLK7yHzaW/7N2P217OZbPSROwurimADAknIVhf7Zp/Ra5HF1qy8KVgVXYlzlwLrJU8OYArbjSBU+cw8h3LR6GS9hIY3bt6J1JFr5DUCcvpoKxO5gCQUGCs2glb6k3lYdockNPK30VePyJaj5bQxrqoB/s1PyvhiiXExW1dkh9LiajQuNU4RJgvTGYqF88XClkkcGvpOEJIcoteTN8ckpAMHNAXtYl+5SdSDco= X-Forefront-Antispam-Report-Untrusted: CIP:40.67.248.234; CTRY:IE; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:nebula.arm.com; PTR:InfoDomainNonexistent; CAT:NONE; SFS:(4636009)(46966006)(36840700001)(82310400003)(26005)(336012)(186003)(6916009)(6666004)(44832011)(8676002)(70586007)(2906002)(33964004)(70206006)(36860700001)(4326008)(47076005)(86362001)(8936002)(356005)(316002)(5660300002)(36756003)(81166007)(235185007)(83380400001)(508600001)(426003)(2616005)(54906003)(36900700001); DIR:OUT; SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM8PR08MB5650 X-MS-Exchange-Transport-CrossTenantHeadersStripped: AM5EUR03FT063.eop-EUR03.prod.protection.outlook.com X-MS-Office365-Filtering-Correlation-Id-Prvs: 113a55f4-382a-443d-6baf-08d9a03993b1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: CpLcp4FVBAQ9q8R/jKjiHBWcchSCcLj0t0YUN51ZavPLcOgtI9+dXKD8fczwWJ9+m4OOYwc5zzvNG/JlXuUuxtN4D7MM/4wPQK+pfJ7syAjrIO1S0iSV66nrWBuAO9/wy1GYKQp+GQ5v8U/051CDG4QFQQ03HLqHgNe8HoK9asukwveXcU6S6J6oZ1sy9RJRAIrHzD/O82xW7A3WpKIdQFYJh0pXDa/u6XjNHd++NeADkz/HtwLbHFGP0jphNHqJoUC5HWYnf90bHi/EkWIIHsiuje82rivKncwwHfHYCCZu8HlhfarwOeaZ4FEuIL58tk2Ya+xoSaOnxuAAoeRCRhGhV9mOpZrCF0EF4t225rkJT5hLoLoRZKZE0PkNhMGPepxIbGn9rvXH6kCCVToo7sSfpldcPEKR667XvYayO+t8am3ugSejBaf8htKmSOug0Eq96OdcfldueDu7pNnXAmF6YHZQzy//BDOiH5Flx+yTGsLCwB48xQsO+naUu+cph9VJ8H2f9TTe0rJSEtrzFz6iZKs2WyqXDw/+T1VSL4GEIg0YDqnolmmMvDwex3vjahAKBVn+DWUBi6MfOd9uH0J1lgJ4biKYks8tBBn9t5FZlaSv4+ll3TSjImVBwtQAjlXaaGbX07VK39t6A6gkp6kXgkLoRUj2kJIgKENgBbhpAmZvC2eYDKbS7bv07r2ttPxYYDBnCKbuF1Mg0YIqRRA5lBx0XEfZcgCOiBdMQ2OVQm1+DMUPNDhld2OPeKiuxD3lpQtK/+mS9nEUGurjM8kvnGWzPTzYQJxYTY8goKQrzogngrNCZgsR7ENsGGLTvsw/PZlxOCHnpxh4NHk3+Q== X-Forefront-Antispam-Report: CIP:63.35.35.123; CTRY:IE; LANG:en; SCL:1; SRV:; IPV:CAL; SFV:NSPM; H:64aa7808-outbound-1.mta.getcheckrecipient.com; PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com; CAT:NONE; SFS:(4636009)(46966006)(36840700001)(5660300002)(2906002)(235185007)(6916009)(70206006)(33964004)(70586007)(44832011)(2616005)(83380400001)(47076005)(81166007)(36756003)(6666004)(54906003)(8676002)(186003)(508600001)(8936002)(82310400003)(336012)(26005)(36860700001)(426003)(4326008)(316002)(86362001); DIR:OUT; SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Nov 2021 08:52:30.2635 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 659e5a5d-1bbf-461e-6346-08d9a03999cb X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d; Ip=[63.35.35.123]; Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-AuthSource: AM5EUR03FT063.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM6PR08MB4455 X-Spam-Status: No, score=-13.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_PASS, TXREP, UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Andrea Corallo via Gcc-patches From: Andrea Corallo Reply-To: Andrea Corallo Cc: nd , Richard Earnshaw Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" Hi all, this patch enables address return signature and verification based on Armv8.1-M Pointer Authentication [1]. To sign the return address, we use the PAC R12, LR, SP instruction upon function entry. This is signing LR using SP and storing the result in R12. R12 will be pushed into the stack. During function epilogue R12 will be popped and AUT R12, LR, SP will be used to verify that the content of LR is still valid before return. Here an example of PAC instrumented function prologue and epilogue: pac r12, lr, sp push {r3, r7, lr} push {r12} sub sp, sp, #4 [...] function body add sp, sp, #4 pop {r12} pop {r3, r7, lr} aut r12, lr, sp bx lr The patch also takes care of generating a PACBTI instruction in place of the sequence BTI+PAC when Branch Target Identification is enabled contextually. These two patches apply on top of Tejas series posted here [2]. Regressioned and arm-linux-gnu aarch64-linux-gnu bootstraped. Best Regards Andrea [1] [2] From 605970bdef506d749bbe9650ee469f41b1d7377f Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Fri, 24 Sep 2021 14:50:29 +0200 Subject: [PATCH 1/2] [PATCH] [1/2] arm: Implement cortex-M return signing address codegen gcc/Changelog 2021-11-03 Andrea Corallo * config/arm/arm.c: (arm_compute_frame_layout) (arm_expand_prologue, thumb2_expand_return, arm_expand_epilogue) (arm_conditional_register_usage): Update for pac codegen. (arm_pac_enabled_for_curr_function_p): New function. * config/arm/arm.md (pac_ip_lr_sp, pacbti_ip_lr_sp, aut_ip_lr_sp): Add new patterns. * config/arm/unspecs.md (UNSPEC_PAC_IP_LR_SP) (UNSPEC_PACBTI_IP_LR_SP, UNSPEC_AUT_IP_LR_SP): Add unspecs. gcc/testsuite/Changelog 2021-11-03 Andrea Corallo * gcc.target/arm/pac-1.c : New test case. * gcc.target/arm/pac-2.c : Likewise. * gcc.target/arm/pac-3.c : Likewise. * gcc.target/arm/pac-4.c : Likewise. * gcc.target/arm/pac-5.c : Likewise. --- gcc/config/arm/arm.c | 85 ++++++++++++++++++++++++---- gcc/config/arm/arm.md | 20 +++++++ gcc/config/arm/unspecs.md | 3 + gcc/testsuite/gcc.target/arm/pac-1.c | 25 ++++++++ gcc/testsuite/gcc.target/arm/pac-2.c | 25 ++++++++ gcc/testsuite/gcc.target/arm/pac-3.c | 25 ++++++++ gcc/testsuite/gcc.target/arm/pac-4.c | 25 ++++++++ gcc/testsuite/gcc.target/arm/pac-5.c | 26 +++++++++ 8 files changed, 224 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/gcc.target/arm/pac-1.c create mode 100644 gcc/testsuite/gcc.target/arm/pac-2.c create mode 100644 gcc/testsuite/gcc.target/arm/pac-3.c create mode 100644 gcc/testsuite/gcc.target/arm/pac-4.c create mode 100644 gcc/testsuite/gcc.target/arm/pac-5.c diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index a87bcb298f9..2889a471fa5 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -302,6 +302,7 @@ static bool arm_vectorize_vec_perm_const (machine_mode, rtx, rtx, rtx, const vec_perm_indices &); static bool aarch_macro_fusion_pair_p (rtx_insn*, rtx_insn*); +static bool arm_pac_enabled_for_curr_function_p (void); static int arm_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost, tree vectype, @@ -22696,6 +22697,10 @@ arm_compute_frame_layout (void) nonecure entry functions with VSTR/VLDR. */ if (TARGET_HAVE_FPCXT_CMSE && IS_CMSE_ENTRY (func_type)) saved += 4; + + /* Allocate space for saving R12 */ + if (arm_pac_enabled_for_curr_function_p ()) + saved += 4; } else /* TARGET_THUMB1 */ { @@ -23288,11 +23293,12 @@ arm_expand_prologue (void) /* The static chain register is the same as the IP register. If it is clobbered when creating the frame, we need to save and restore it. */ clobber_ip = IS_NESTED (func_type) - && ((TARGET_APCS_FRAME && frame_pointer_needed && TARGET_ARM) - || ((flag_stack_check == STATIC_BUILTIN_STACK_CHECK - || flag_stack_clash_protection) - && !df_regs_ever_live_p (LR_REGNUM) - && arm_r3_live_at_start_p ())); + && (((TARGET_APCS_FRAME && frame_pointer_needed && TARGET_ARM) + || ((flag_stack_check == STATIC_BUILTIN_STACK_CHECK + || flag_stack_clash_protection) + && !df_regs_ever_live_p (LR_REGNUM) + && arm_r3_live_at_start_p ())) + || (arm_pac_enabled_for_curr_function_p ())); /* Find somewhere to store IP whilst the frame is being created. We try the following places in order: @@ -23368,6 +23374,14 @@ arm_expand_prologue (void) } } + if (arm_pac_enabled_for_curr_function_p ()) + { + if (aarch_bti_enabled ()) + emit_insn (gen_pacbti_ip_lr_sp ()); + else + emit_insn (gen_pac_ip_lr_sp ()); + } + if (TARGET_APCS_FRAME && frame_pointer_needed && TARGET_ARM) { if (IS_INTERRUPT (func_type)) @@ -23490,6 +23504,9 @@ arm_expand_prologue (void) if (! IS_VOLATILE (func_type)) saved_regs += arm_save_coproc_regs (); + if (arm_pac_enabled_for_curr_function_p ()) + emit_multi_reg_push (1 << IP_REGNUM, 1 << IP_REGNUM); + if (frame_pointer_needed && TARGET_ARM) { /* Create the new frame pointer. */ @@ -27150,7 +27167,8 @@ thumb2_expand_return (bool simple_return) to assert it for now to ensure that future code changes do not silently change this behavior. */ gcc_assert (!IS_CMSE_ENTRY (arm_current_func_type ())); - if (num_regs == 1) + if (num_regs == 1 + && !(arm_pac_enabled_for_curr_function_p ())) { rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (2)); rtx reg = gen_rtx_REG (SImode, PC_REGNUM); @@ -27165,13 +27183,34 @@ thumb2_expand_return (bool simple_return) } else { - saved_regs_mask &= ~ (1 << LR_REGNUM); - saved_regs_mask |= (1 << PC_REGNUM); - arm_emit_multi_reg_pop (saved_regs_mask); + if (arm_pac_enabled_for_curr_function_p ()) + { + emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, + GEN_INT (4))); + arm_emit_multi_reg_pop (1 << IP_REGNUM); + saved_regs_mask &= ~ (1 << PC_REGNUM); + arm_emit_multi_reg_pop (saved_regs_mask); + emit_insn (gen_aut_ip_lr_sp ()); + emit_jump_insn (simple_return_rtx); + } + else + { + saved_regs_mask &= ~ (1 << LR_REGNUM); + saved_regs_mask |= (1 << PC_REGNUM); + arm_emit_multi_reg_pop (saved_regs_mask); + } } } else { + if (arm_pac_enabled_for_curr_function_p ()) + { + emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, + GEN_INT (4))); + arm_emit_multi_reg_pop (1 << IP_REGNUM); + emit_insn (gen_aut_ip_lr_sp ()); + } + if (IS_CMSE_ENTRY (arm_current_func_type ())) cmse_nonsecure_entry_clear_before_return (); emit_jump_insn (simple_return_rtx); @@ -27469,6 +27508,9 @@ arm_expand_epilogue (bool really_return) /* In Thumb-2 mode, the frame pointer points to the last saved register. */ amount = offsets->locals_base - offsets->saved_regs; + if (arm_pac_enabled_for_curr_function_p ()) + amount += 4; + if (amount) { insn = emit_insn (gen_addsi3 (hard_frame_pointer_rtx, @@ -27497,6 +27539,10 @@ arm_expand_epilogue (bool really_return) /* Pop off outgoing args and local frame to adjust stack pointer to last saved register. */ amount = offsets->outgoing_args - offsets->saved_regs; + + if (arm_pac_enabled_for_curr_function_p ()) + amount += 4; + if (amount) { rtx_insn *tmp; @@ -27562,6 +27608,9 @@ arm_expand_epilogue (bool really_return) stack_pointer_rtx, stack_pointer_rtx); } + if (arm_pac_enabled_for_curr_function_p ()) + arm_emit_multi_reg_pop (1 << IP_REGNUM); + if (saved_regs_mask) { rtx insn; @@ -27574,7 +27623,8 @@ arm_expand_epilogue (bool really_return) && really_return && crtl->args.pretend_args_size == 0 && saved_regs_mask & (1 << LR_REGNUM) - && !crtl->calls_eh_return) + && !crtl->calls_eh_return + && !arm_pac_enabled_for_curr_function_p ()) { saved_regs_mask &= ~(1 << LR_REGNUM); saved_regs_mask |= (1 << PC_REGNUM); @@ -27688,6 +27738,9 @@ arm_expand_epilogue (bool really_return) } } + if (arm_pac_enabled_for_curr_function_p ()) + emit_insn (gen_aut_ip_lr_sp ()); + if (!really_return) return; @@ -30393,6 +30446,9 @@ arm_conditional_register_usage (void) global_regs[ARM_HARD_FRAME_POINTER_REGNUM] = 1; } + if (TARGET_HAVE_PACBTI) + call_used_regs[IP_REGNUM] = 1; + /* The Q and GE bits are only accessed via special ACLE patterns. */ CLEAR_HARD_REG_BIT (operand_reg_set, APSRQ_REGNUM); CLEAR_HARD_REG_BIT (operand_reg_set, APSRGE_REGNUM); @@ -32822,6 +32878,15 @@ arm_fusion_enabled_p (tune_params::fuse_ops op) return current_tune->fusible_ops & op; } +/* Return TRUE if return address signing mechanism is enabled. */ +static bool +arm_pac_enabled_for_curr_function_p (void) +{ + return aarch_ra_sign_scope == AARCH_FUNCTION_ALL + || (aarch_ra_sign_scope == AARCH_FUNCTION_NON_LEAF + && !crtl->is_leaf); +} + /* Implement TARGET_SCHED_CAN_SPECULATE_INSN. Return true if INSN can be scheduled for speculative execution. Reject the long-running division and square-root instructions. */ diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md index 4adc976b8b6..132135d244d 100644 --- a/gcc/config/arm/arm.md +++ b/gcc/config/arm/arm.md @@ -12823,6 +12823,26 @@ (set_attr "length" "8")] ) +(define_insn "pac_ip_lr_sp" + [(set (reg:DI IP_REGNUM) + (unspec:DI [(reg:DI SP_REGNUM) (reg:DI LR_REGNUM)] + UNSPEC_PAC_IP_LR_SP))] + "" + "pac\tr12, lr, sp") + +(define_insn "pacbti_ip_lr_sp" + [(set (reg:DI IP_REGNUM) + (unspec:DI [(reg:DI SP_REGNUM) (reg:DI LR_REGNUM)] + UNSPEC_PACBTI_IP_LR_SP))] + "" + "pacbti\tr12, lr, sp") + +(define_insn "aut_ip_lr_sp" + [(unspec:DI [(reg:DI IP_REGNUM) (reg:DI SP_REGNUM) (reg:DI LR_REGNUM)] + UNSPEC_AUT_IP_LR_SP)] + "" + "aut\tr12, lr, sp") + ;; Vector bits common to IWMMXT, Neon and MVE (include "vec-common.md") ;; Load the Intel Wireless Multimedia Extension patterns diff --git a/gcc/config/arm/unspecs.md b/gcc/config/arm/unspecs.md index ad1c6edd005..d60d0ceb87c 100644 --- a/gcc/config/arm/unspecs.md +++ b/gcc/config/arm/unspecs.md @@ -159,6 +159,9 @@ UNSPEC_VCDE ; Custom Datapath Extension instruction. UNSPEC_VCDEA ; Custom Datapath Extension instruction. UNSPEC_DLS ; Used for DLS (Do Loop Start), Armv8.1-M Mainline instruction + UNSPEC_PAC_IP_LR_SP ; Represents PAC signing LR + UNSPEC_PACBTI_IP_LR_SP ; Represents PAC signing LR + valid landing pad + UNSPEC_AUT_IP_LR_SP ; Represents PAC verifying LR ]) diff --git a/gcc/testsuite/gcc.target/arm/pac-1.c b/gcc/testsuite/gcc.target/arm/pac-1.c new file mode 100644 index 00000000000..8979a554e63 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pac-1.c @@ -0,0 +1,25 @@ +/* Testing return address signing. */ +/* { dg-do run } */ +/* { dg-options "-march=armv8.1-m.main -mbranch-protection=pac-ret+leaf -mthumb --save-temps -O0" } */ + +#include + +int +__attribute__((noinline)) +foo1 (int a, int b) +{ + return a + b; +} + +int +main (void) +{ + if (foo1 (1, 2) != 3) + abort (); + + return 0; +} + +/* { dg-final { scan-assembler-times "pac\tr12, lr, sp" 2 } } */ +/* { dg-final { scan-assembler-times "aut\tr12, lr, sp" 2 } } */ +/* { dg-final { scan-assembler-not "bti" } } */ diff --git a/gcc/testsuite/gcc.target/arm/pac-2.c b/gcc/testsuite/gcc.target/arm/pac-2.c new file mode 100644 index 00000000000..678294af67d --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pac-2.c @@ -0,0 +1,25 @@ +/* Testing return address signing. */ +/* { dg-do run } */ +/* { dg-options "-march=armv8.1-m.main -mbranch-protection=pac-ret -mthumb --save-temps -O0" } */ + +#include + +int +__attribute__((noinline)) +foo1 (int a, int b) +{ + return a + b; +} + +int +main (void) +{ + if (foo1 (1, 2) != 3) + abort (); + + return 0; +} + +/* { dg-final { scan-assembler "pac\tr12, lr, sp" } } */ +/* { dg-final { scan-assembler "aut\tr12, lr, sp" } } */ +/* { dg-final { scan-assembler-not "bti" } } */ diff --git a/gcc/testsuite/gcc.target/arm/pac-3.c b/gcc/testsuite/gcc.target/arm/pac-3.c new file mode 100644 index 00000000000..e67ee910683 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pac-3.c @@ -0,0 +1,25 @@ +/* Testing return address signing. */ +/* { dg-do run } */ +/* { dg-options "-march=armv8.1-m.main -mbranch-protection=bti+pac-ret+leaf -mthumb --save-temps -O2" } */ + +#include + +int +__attribute__((noinline)) +foo1 (int a, int b) +{ + return a + b; +} + +int +main (void) +{ + if (foo1 (1, 2) != 3) + abort (); + + return 0; +} + +/* { dg-final { scan-assembler-times "pacbti\tr12, lr, sp" 2 } } */ +/* { dg-final { scan-assembler-times "aut\tr12, lr, sp" 2 } } */ +/* { dg-final { scan-assembler-not "\tbti\t" } } */ diff --git a/gcc/testsuite/gcc.target/arm/pac-4.c b/gcc/testsuite/gcc.target/arm/pac-4.c new file mode 100644 index 00000000000..404457313a0 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pac-4.c @@ -0,0 +1,25 @@ +/* Testing return address signing. */ +/* { dg-do run } */ +/* { dg-options "-march=armv8.1-m.main+pacbti -mthumb --save-temps -O2" } */ + +#include + +int +__attribute__((noinline)) +foo1 (int a, int b) +{ + return a + b; +} + +int +main (void) +{ + if (foo1 (1, 2) != 3) + abort (); + + return 0; +} + +/* { dg-final { scan-assembler-not "\tbti\t" } } */ +/* { dg-final { scan-assembler-not "\tpac\t" } } */ +/* { dg-final { scan-assembler-not "\tpacbti\t" } } */ diff --git a/gcc/testsuite/gcc.target/arm/pac-5.c b/gcc/testsuite/gcc.target/arm/pac-5.c new file mode 100644 index 00000000000..d2d996b921a --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pac-5.c @@ -0,0 +1,26 @@ +/* Testing return address signing. */ +/* { dg-do run } */ +/* { dg-options "-march=armv8.1-m.main -mbranch-protection=pac-ret+leaf -mthumb --save-temps -O0" } */ + +#include + +int +__attribute__((noinline)) +foo1 (int a, int b) +{ + int square (int z) { return z * z; } + return square (a) + square (b); +} + +int +main (void) +{ + if (foo1 (1, 2) != 5) + abort (); + + return 0; +} + +/* { dg-final { scan-assembler-times "pac\tr12, lr, sp" 3 } } */ +/* { dg-final { scan-assembler-times "aut\tr12, lr, sp" 3 } } */ +/* { dg-final { scan-assembler-not "bti" } } */