From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id qaXQE22gS2rgwCkAWB0awg (envelope-from ) for ; Mon, 06 Jul 2026 08:32:45 -0400 Authentication-Results: simark.ca; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=EgjBXZr5; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 4DA9E1E098; Mon, 06 Jul 2026 08:32:45 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-6.4 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham autolearn_force=no version=4.0.1 Received: from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id C3FBA1E070 for ; Mon, 06 Jul 2026 08:32:44 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 5D8834BA2E1C for ; Mon, 6 Jul 2026 12:32:44 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 5D8834BA2E1C Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=EgjBXZr5 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.17]) by sourceware.org (Postfix) with ESMTPS id 0A7F74BA2E08 for ; Mon, 6 Jul 2026 12:31:52 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 0A7F74BA2E08 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=intel.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 0A7F74BA2E08 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=198.175.65.17 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1783341113; cv=none; b=vGOdh9A1aETHLS5A4neVnAGGw1uXSjYgpPCWQPZWhjBnlhftagWWSoQzMGm9/wcr/GhdVW/Cp5ml+DmshPSuAwY/SLmxGi9pgNd9WVfq69y1DE9Uz4DR2TvUt/JjQt6eA9IR+PD0A4D6n8aYdzgbFebEe3JdYffU52hr7URVk24= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1783341113; c=relaxed/simple; bh=LT9UuvVVDkzg7XvoBEkkdrZ3Uj4M5nTCxLJ7N4i23aI=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=Q18i0+iVjziGr/usD0MDWBlVsAmVos5qWP32qPQklT2k1VmQE4S9jBBvMLnRRBlQTnindcsui7meFxkXT9SBXGgHAkgOgfcYX4MKsMxnCgeq1arxm0sorzzrV/8i1/yixLmiaUvwQospmlrue77AUxHfLFRjzsW3wI0L3uncPGs= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=EgjBXZr5 DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0A7F74BA2E08 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1783341113; x=1814877113; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=LT9UuvVVDkzg7XvoBEkkdrZ3Uj4M5nTCxLJ7N4i23aI=; b=EgjBXZr5o/NiDbc5mIiaSPUMoo3OfZcJ7MhK2VfqAkP2UlzY8NavalQT vl8Ei7EZ8SZBV4aipTsRQ+NzxMH5d4ApRtzwEBVbwpbSctggrkfzJESUX A0gj3ZAPlbAsbRd4ubhKbM2EiNhGdboSOq1cU+YvF0/9I2uzVBgFQZxDj lZ2GBmsxxDlWhNWY9Q7mdEEGvWyU2JX1pbliLdaiOaoYOr1K5nSAVRK8p SA52U8/2wSYEB9Qe7Re4Vy8rCWCRG3E4w/P6nxC0FK+2KLe/1LLal50rd 5PVEV27pe8SaZhnt8SDZoP7kcX7E/eY23ywFsleFRIgLphKEpAXt2w1OK w==; X-CSE-ConnectionGUID: c+Fe13uBSJ+4IT21Ha9sxg== X-CSE-MsgGUID: xDN0x4JvQAauyAzEpKG5mg== X-IronPort-AV: E=McAfee;i="6800,10657,11838"; a="84001632" X-IronPort-AV: E=Sophos;i="6.25,149,1779174000"; d="scan'208";a="84001632" Received: from orviesa003.jf.intel.com ([10.64.159.143]) by orvoesa109.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Jul 2026 05:31:52 -0700 X-CSE-ConnectionGUID: gzUHTxIMRLWHmiNWdBtcLA== X-CSE-MsgGUID: RCLlmK1USeu75OB7Kvoptw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,149,1779174000"; d="scan'208";a="257285164" Received: from gkldtt-dev-004.igk.intel.com (HELO localhost) ([10.123.221.202]) by ORVIESA003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Jul 2026 05:31:51 -0700 From: Christina Schimpe To: gdb-patches@sourceware.org Cc: tom@tromey.com, thiago.bauermann@linaro.org Subject: [PATCH v3 02/12] aarch64: Implement gdbarch function top_addr_empty_shadow_stack. Date: Mon, 6 Jul 2026 12:31:23 +0000 Message-Id: <20260706123133.1990441-3-christina.schimpe@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260706123133.1990441-1-christina.schimpe@intel.com> References: <20260706123133.1990441-1-christina.schimpe@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 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~public-inbox=simark.ca@sourceware.org With the implementation of that gdbarch function we can remove the arch specific function aarch64_linux_dwarf2_prev_gcspr and use the generalized function dwarf2_prev_ssp instead. Co-Authored-By: Christina Schimpe --- gdb/aarch64-linux-tdep.c | 51 ++-------------------------------------- gdb/aarch64-tdep.c | 28 ++++++++++++++++++++-- 2 files changed, 28 insertions(+), 51 deletions(-) diff --git a/gdb/aarch64-linux-tdep.c b/gdb/aarch64-linux-tdep.c index f11eccc1bc1..b5959057972 100644 --- a/gdb/aarch64-linux-tdep.c +++ b/gdb/aarch64-linux-tdep.c @@ -66,6 +66,7 @@ #include "elf/common.h" #include "elf/aarch64.h" #include "arch/aarch64-insn.h" +#include "shadow-stack.h" /* For std::pow */ #include @@ -2617,54 +2618,6 @@ aarch64_linux_get_shadow_stack_pointer (gdbarch *gdbarch, regcache *regcache, return gcspr; } -/* Implement Guarded Control Stack Pointer Register unwinding. For each - previous GCS pointer check if its address is still in the GCS memory - range. If it's outside the range set the returned value to unavailable, - otherwise return a value containing the new GCS pointer. */ - -static value * -aarch64_linux_dwarf2_prev_gcspr (const frame_info_ptr &this_frame, - void **this_cache, int regnum) -{ - value *v = frame_unwind_got_register (this_frame, regnum, regnum); - gdb_assert (v != nullptr); - - gdbarch *gdbarch = get_frame_arch (this_frame); - - if (v->entirely_available () && !v->optimized_out ()) - { - int size = register_size (gdbarch, regnum); - bfd_endian byte_order = gdbarch_byte_order (gdbarch); - CORE_ADDR gcspr = extract_unsigned_integer (v->contents_all ().data (), - size, byte_order); - - /* Starting with v6.13, the Linux kernel supports Guarded Control - Stack. Using /proc/PID/smaps we can only check if the current - GCSPR points to GCS memory. Only if this is the case a valid - previous GCS pointer can be calculated. */ - std::pair range; - if (linux_address_in_shadow_stack_mem_range (gcspr, &range)) - { - /* The GCS grows downwards. To compute the previous GCS pointer, - we need to increment the GCSPR. */ - CORE_ADDR new_gcspr = gcspr + 8; - - /* If NEW_GCSPR still points within the current GCS memory range - we consider it to be valid. */ - if (new_gcspr < range.second) - return frame_unwind_got_address (this_frame, regnum, new_gcspr); - } - } - - /* Return a value which is marked as unavailable in case we could not - calculate a valid previous GCS pointer. */ - value *retval - = value::allocate_register (get_next_frame_sentinel_okay (this_frame), - regnum, register_type (gdbarch, regnum)); - retval->mark_bytes_unavailable (0, retval->type ()->length ()); - return retval; -} - /* AArch64 Linux implementation of the report_signal_info gdbarch hook. Displays information about possible memory tag violations. */ @@ -3243,7 +3196,7 @@ aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { set_gdbarch_get_shadow_stack_pointer (gdbarch, aarch64_linux_get_shadow_stack_pointer); - tdep->fn_prev_gcspr = aarch64_linux_dwarf2_prev_gcspr; + tdep->fn_prev_gcspr = dwarf2_prev_ssp; } } diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c index 848cee3043c..d789b8569d2 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -1908,6 +1908,26 @@ aarch64_pop_gcs_entry (regcache *regs) regcache_cooked_write_unsigned (regs, tdep->gcs_reg_base, gcs_addr + 8); } +/* Implement the "top_addr_empty_shadow_stack" gdbarch method. */ + +static bool +aarch64_top_addr_empty_shadow_stack + (const CORE_ADDR addr, + const std::pair range) +{ + gdb_assert (addr >= range.first); + + /* For AArch64, addr must be strictly less than the upper address in the + range, but other architectures allow it to be equal to the upper + address when the stack is empty so GDB core works with those addresses + and can send them our way. */ + gdb_assert (addr <= range.second); + + /* The GCS grows down, and the oldest entry isn't an address. + Just the value '0'. */ + return addr >= range.second - 8; +} + /* Implement the "push_dummy_call" gdbarch method. */ static CORE_ADDR @@ -4783,9 +4803,13 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) /* Register a hook for converting a memory tag to a string. */ set_gdbarch_memtag_to_string (gdbarch, aarch64_memtag_to_string); - /* AArch64's shadow stack pointer is the GCSPR. */ if (tdep->has_gcs ()) - set_gdbarch_ssp_regnum (gdbarch, tdep->gcs_reg_base); + { + /* AArch64's shadow stack pointer is the GCSPR. */ + set_gdbarch_ssp_regnum (gdbarch, tdep->gcs_reg_base); + set_gdbarch_top_addr_empty_shadow_stack + (gdbarch, aarch64_top_addr_empty_shadow_stack); + } /* ABI */ set_gdbarch_short_bit (gdbarch, 16); -- 2.34.1 Intel Deutschland GmbH Registered Address: Dornacher Strasse 1, 85622 Feldkirchen, Germany Tel: +49 89 991 430, www.intel.de Managing Directors: Harry Demas, Jeffrey Schneiderman, Yin Chong Sorrell Chairperson of the Supervisory Board: Nicole Lau Registered Seat: Munich Commercial Register: Amtsgericht Muenchen HRB 186928