From patchwork Tue Jul 16 08:08:23 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jethro Beekman X-Patchwork-Id: 93960 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 EEA8A385840A for ; Tue, 16 Jul 2024 08:09:17 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from daxilon.jbeekman.nl (jbeekman.nl [149.210.172.151]) by sourceware.org (Postfix) with ESMTPS id 84D083858D28 for ; Tue, 16 Jul 2024 08:08:26 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 84D083858D28 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=jbeekman.nl Authentication-Results: sourceware.org; spf=none smtp.mailfrom=jbeekman.nl ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 84D083858D28 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=149.210.172.151 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1721117308; cv=none; b=oYHA6ScQw+Ypo11EjflpPuDzotcdQj9iwAO5KouqLye90JzaGiXkglhBn7wdJusmH5vdLYdqA4tBPCdxS0Ie3rCiLl3xAHDNV57aIiE2w/NjA4JuE/arwWMQWyWW6hc8vsTJzo/4LiuIK8lY/CsxIMxLHo3EYF+kGJLXWOLLM+g= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1721117308; c=relaxed/simple; bh=SaTdeTMoDMD5uQxUSVt2rT+q9+qtB4QAkN7drZ0QlbE=; h=DKIM-Signature:Message-ID:Date:MIME-Version:From:To:Subject; b=lHedPjzWo90JaExB3FSyL8Vu5Ez1vmABlc/CB5XVZJh5rA6Ch18aQhJnOGGr+sWo0BPx+2JBcAk+uZKt81rdEAks8IJu3WV8W4W02ZnNczt0ktqbgNAmqVpZhagWkqaoBzmXaTv+/ndupZRvngRA5HiX+Dz12WQDyHwnTsHVPXU= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=jbeekman.nl ; s=main; h=Subject:Content-Transfer-Encoding:Content-Type:To:From: MIME-Version:Date:Message-ID:Sender:Reply-To:Cc:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:In-Reply-To:References:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=KKQl45ML4EGOBVHt03OZwM7vqivyCt1/wHIpuQBY94Q=; b=a+zvBQcvzA1FeceWLoLP3QVy4/ HtN6I80qzbXwuCUc1gLcQlPUUaOD+0OtfSsJuhRAPFbkkl2TlypKQGjHZ7OdplLqaqludADVi6PZa sIMRSYLP8OEMEGwJvPbMnFdA6TUCzKPKjD1etROFIDpeHbDcRc0tFIwbUgsG3undjaGKzQM8mohKg A7jYZ2yhDn4HevCH/9e0TpPcslFKlTLOjFN6OkDxe3F11GQXRuxGFeXI+917uPcJdKrDOUxwZ/GWS aaJwLyQ8xS47jrae6US+lAcBYYARoC+Ba4boIlaj+7qncOJofQgpiWKQwAvTSp5ONcYDXoYL6n3AH nMMDXm4w==; Received: from 44-80-99-95.ftth.glasoperator.nl ([95.99.80.44] helo=[192.168.3.200]) by daxilon.jbeekman.nl with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.93) (envelope-from ) id 1sTdEV-005fnY-91 for gdb-patches@sourceware.org; Tue, 16 Jul 2024 10:08:24 +0200 Message-ID: <2b95f92d-33cd-4c92-9abf-ffb7a61bcf65@jbeekman.nl> Date: Tue, 16 Jul 2024 10:08:23 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird From: Jethro Beekman Content-Language: en-US To: gdb-patches@sourceware.org X-SA-Exim-Connect-IP: 95.99.80.44 X-SA-Exim-Mail-From: jethro@jbeekman.nl X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 Subject: [PATCH RESEND] Fix AArch64 prologue analysis for functions using Shadow Call Stack X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~patchwork=sourceware.org@sourceware.org When code is compiled with Shadow Call Stack (SCS) enabled, the compiler inserts instructions to manage the SCS in the prologue. Update the AArch64 prologue analysis to account for such instructions. See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102768 --- gdb/aarch64-tdep.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c index e4bca6c6632..15542af3488 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -574,6 +574,16 @@ aarch64_analyze_prologue (struct gdbarch *gdbarch, cache->saved_regs[regnum].set_value (ra_state_val); } } + else if (inst.opcode->iclass == ldst_imm9 + && inst.operands[0].type == AARCH64_OPND_Rt + && inst.operands[0].addr.base_regno == AARCH64_LR_REGNUM + && inst.operands[1].type == AARCH64_OPND_ADDR_SIMM9 + && inst.operands[1].addr.base_regno == 18 /* platform register */ + && inst.operands[1].addr.postind + && strcmp ("str", inst.opcode->name) == 0) + { + /* ShadowCallStack - ignore for prologue analysis. */ + } else { aarch64_debug_printf ("prologue analysis gave up addr=%s" @@ -947,6 +957,44 @@ aarch64_analyze_prologue_test (void) && cache.saved_regs[i].realreg () == i); } } + + /* Test a prologue with ShadowCallStack. */ + { + static const uint32_t insns[] = { + 0xf800865e, /* str x30, [x18], #8 */ + 0xa9af7bfd, /* stp x29, x30, [sp,#-272]! */ + 0x910003fd, /* mov x29, sp */ + 0x97ffffe6, /* bl 0x400580 */ + }; + instruction_reader_test reader (insns); + + trad_frame_reset_saved_regs (gdbarch, cache.saved_regs); + CORE_ADDR end = aarch64_analyze_prologue (gdbarch, 0, 128, &cache, reader); + SELF_CHECK (end == 4 * 3); + + SELF_CHECK (cache.framereg == AARCH64_FP_REGNUM); + SELF_CHECK (cache.framesize == 272); + + for (int i = 0; i < AARCH64_X_REGISTER_COUNT; i++) + { + if (i == AARCH64_FP_REGNUM) + SELF_CHECK (cache.saved_regs[i].addr () == -272); + else if (i == AARCH64_LR_REGNUM) + SELF_CHECK (cache.saved_regs[i].addr () == -264); + else + SELF_CHECK (cache.saved_regs[i].is_realreg () + && cache.saved_regs[i].realreg () == i); + } + + for (int i = 0; i < AARCH64_D_REGISTER_COUNT; i++) + { + int num_regs = gdbarch_num_regs (gdbarch); + int regnum = i + num_regs + AARCH64_D0_REGNUM; + + SELF_CHECK (cache.saved_regs[regnum].is_realreg () + && cache.saved_regs[regnum].realreg () == regnum); + } + } } } // namespace selftests #endif /* GDB_SELF_TEST */