From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id CYl2EQ9hTmpBcSwAWB0awg (envelope-from ) for ; Wed, 08 Jul 2026 10:39:11 -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=b+pXduPT; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 3DCA21E098; Wed, 08 Jul 2026 10:39:11 -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 [IPv6:2620:52:6:3111::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 824421E024 for ; Wed, 08 Jul 2026 10:39:10 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 2D22A4BA2E20 for ; Wed, 8 Jul 2026 14:39:10 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2D22A4BA2E20 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=b+pXduPT Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.15]) by sourceware.org (Postfix) with ESMTPS id A40004BA2E1F for ; Wed, 8 Jul 2026 14:37:21 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org A40004BA2E1F 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 A40004BA2E1F Authentication-Results: sourceware.org; arc=none smtp.remote-ip=198.175.65.15 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1783521441; cv=none; b=HBItZgv2edVsI27tzhS2yAuDCW11QALXzLVLBavxp1g+auBSJKhrbV1qHzABG3x7ulFVxZLjQG+GBMLymqcTB3WJZFw6mire12aYCA3DuStPyQQwBXHuNTPRga7VCO4blHf7i3F76VwYjKYXnHA2Sim3IGwydvpuZAMRBDpQPu0= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1783521441; c=relaxed/simple; bh=LT9UuvVVDkzg7XvoBEkkdrZ3Uj4M5nTCxLJ7N4i23aI=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=ZQs5r2NPq6RrN7A8ulHoKzXqTJIAU180uYXhjECJ3b185hCa8ZMt40etmmy2YUhGrHcH9w4oM33pbEvusnOqER6NIa/xSt+Y74xSJ1hMkKMsk9zlKdXzeFiLVWYSxfMPMsxGB9weSLGD8SSca2YHwzA4elZ+dJBPhdT4sYEXmnw= 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=b+pXduPT DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A40004BA2E1F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1783521442; x=1815057442; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=LT9UuvVVDkzg7XvoBEkkdrZ3Uj4M5nTCxLJ7N4i23aI=; b=b+pXduPTCLRFR7B0RZzVRSCKTblUc95mwqJ7yy3V9IFueFJA1Vnng/Gw rGok9s6FunhBnROhLahpIbCRVEwcY07V7E9PuoIcCjkuBY1uVlhGnLy3V eM7YZAGAxDWPkiBslMf/Vd7jdorkPdhAC8EwShqIirYlhI5KAuXEbyXSn w4/pAdAGAfaDAAkUI3Bfby79CePPKWxxm2caU2L6bjXi+P/sniB192klD vmrjHwFBdvsKs7S/uVN0teUa4KYpbJJr1kYLpd3tt8xJBbwZ4sCSJsTro J+d22xtuFFWM+bwuAFIkdH6ZlUi20cvnRJrRkz/zURodRCeYrlaCbgsPn Q==; X-CSE-ConnectionGUID: rlRJmkdQQzuvAFFhKMUtDg== X-CSE-MsgGUID: PjHyuzPYSmCyU2j+2d9jAA== X-IronPort-AV: E=McAfee;i="6800,10657,11841"; a="87867527" X-IronPort-AV: E=Sophos;i="6.25,153,1779174000"; d="scan'208";a="87867527" Received: from orviesa006.jf.intel.com ([10.64.159.146]) by orvoesa107.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Jul 2026 07:37:21 -0700 X-CSE-ConnectionGUID: I1sVyX7rSbSUMzlVWdWKOg== X-CSE-MsgGUID: MMxf/DJaQLeQZvfcGsZF/Q== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,153,1779174000"; d="scan'208";a="252560330" Received: from gkldtt-dev-004.igk.intel.com (HELO localhost) ([10.123.221.202]) by orviesa006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Jul 2026 07:37:20 -0700 From: Christina Schimpe To: gdb-patches@sourceware.org Cc: tom@tromey.com, thiago.bauermann@linaro.org Subject: [PATCH v4 02/13] aarch64: Implement gdbarch function top_addr_empty_shadow_stack. Date: Wed, 8 Jul 2026 14:36:28 +0000 Message-Id: <20260708143639.2214689-3-christina.schimpe@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260708143639.2214689-1-christina.schimpe@intel.com> References: <20260708143639.2214689-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