From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id sekkN7fgtGqL3zsAWB0awg (envelope-from ) for ; Thu, 24 Sep 2026 04:35:03 -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=jUQ1yqc1; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id DC15E1E090; Thu, 24 Sep 2026 04:35:03 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-3.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,RCVD_IN_VALIDITY_CERTIFIED_BLOCKED, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED 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 676E91E033 for ; Thu, 24 Sep 2026 04:35:01 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id BA2274BB5891 for ; Thu, 24 Sep 2026 08:34:59 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org BA2274BB5891 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=jUQ1yqc1 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.18]) by sourceware.org (Postfix) with ESMTPS id 71CC44BB3BFD for ; Thu, 24 Sep 2026 08:34:13 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 71CC44BB3BFD 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 71CC44BB3BFD Authentication-Results: sourceware.org; arc=none smtp.remote-ip=192.198.163.18 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1790238854; cv=none; b=gRtHj4cU1FnmaV9r1nN9LPbNjwG9IVU2MzotXGCIhTUHFenVe5hVRy+XTCpwmbAtAO2mPSVKglUnLRul4qKC8UQO1HZNr3cciVLstInv9c7XNBkF2brnjK5KLaxMPQERGyKd1+L8jQa48wLKdAk9YPoMErblVQHUlOYb6B8bHiY= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1790238854; c=relaxed/simple; bh=Xp9n+niAedMO7b2Sn29XKBtU5Jn2+vfChcjo9Hd9E4w=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=AVtoC/XVxnutITKvhoEMqZVyyFpH4yxTkcl6cusRmd7k8w2owjj3a/8ajrEA0Gomgzmkpf19t/Pz/XK9KD5KE9h3yxPR2uo6D+GvTm6NhSuxSduxauu5Vc2wW103UvyGPYshN3oeOsrSz9gMSsdqKLnC1iln19cxQ09tAtPqTJc= 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=jUQ1yqc1 DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 71CC44BB3BFD DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1790238854; x=1821774854; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=Xp9n+niAedMO7b2Sn29XKBtU5Jn2+vfChcjo9Hd9E4w=; b=jUQ1yqc1TjtNP99Bv4b9U3jbfPReMI82ik/GrPJLr5UKhzdDCtZv28GD 2r2H7LHh+ojDpHZ4mV2v4V1ryJzD8bRNoEl96RPfo6ZGKiWHG9IgK+yMc TnjjmV8YxF/pYVsX0DRRQAvGoUcPPGJnOYQFxr8hhRNH8ehC6ajS7Cz8V WRmZbMfK3PSX8P1VxbojxNVwRZtaqR/aRo3S3NDpkT5+AiB8icSSt8Z+l /+nwN9lZNkGPE+HJdiiZGO6nBKEugR5ae8RpdpsiuH+tllmpbZd3U2wP8 0w3CvcVr/AwMNQWruIlhXXkgEvWdx7fgGLMd/sq9fXpKZM8k/N0sP2qjf w==; X-CSE-ConnectionGUID: ja6SkGhqS9KN/0PJeR4Qcw== X-CSE-MsgGUID: JD4pklFGScmTGNNYZp7Hmg== X-IronPort-AV: E=McAfee;i="6800,10657,11914"; a="90123819" X-IronPort-AV: E=Sophos;i="6.27,120,1787036400"; d="scan'208";a="90123819" Received: from orviesa005.jf.intel.com ([10.64.159.145]) by fmvoesa112.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Sep 2026 01:34:12 -0700 X-CSE-ConnectionGUID: hKzu5B+WRligmxaf/qmvQA== X-CSE-MsgGUID: yKKb3MUZQJmqWCjfNd5eQg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,120,1787036400"; d="scan'208";a="277709242" Received: from gkldtt-dev-004.igk.intel.com (HELO localhost) ([10.123.221.202]) by orviesa005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Sep 2026 01:34:10 -0700 From: Christina Joos To: gdb-patches@sourceware.org Cc: thiago.bauermann@linaro.org, tom@tromey.com, luis.machado.foss@gmail.com Subject: [PATCH v5 02/13] aarch64: Implement gdbarch function top_addr_empty_shadow_stack. Date: Thu, 24 Sep 2026 10:32:59 +0200 Message-ID: <20260924083311.1961530-3-christina.joos@intel.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260924083311.1961530-1-christina.joos@intel.com> References: <20260924083311.1961530-1-christina.joos@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 From: Thiago Jung Bauermann 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 Joos --- gdb/aarch64-linux-tdep.c | 51 ++-------------------------------------- gdb/aarch64-tdep.c | 31 ++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 51 deletions(-) diff --git a/gdb/aarch64-linux-tdep.c b/gdb/aarch64-linux-tdep.c index 235b35bcfb4..57e3c304469 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. */ @@ -3245,7 +3198,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..94893dd4bcf 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 is the value '0', not an + address. */ + return addr >= range.second - 8; +} + /* Implement the "push_dummy_call" gdbarch method. */ static CORE_ADDR @@ -4783,9 +4803,16 @@ 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); + } + + /* Implementing this hook is required to allow the unwinding of + the shadow stack pointer in shadow-stack.c:dwarf2_prev_ssp. */ + set_gdbarch_top_addr_empty_shadow_stack + (gdbarch, aarch64_top_addr_empty_shadow_stack); /* ABI */ set_gdbarch_short_bit (gdbarch, 16); -- 2.53.0 ________________________________________ Intel Deutschland GmbH Registered Address: Dornacher Strasse 1, 85622 Feldkirchen, Germany Tel: +49 (89) 99143-0 www.intel.de Managing Directors: Candice Moore, Jeffrey Schneiderman, Ramachandran Sitaraman Chairperson of the Supervisory Board: Sonja Pierer Registered Seat: Munich Commercial Register B: Amtsgericht Munich HRB 186928 This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). Any review or distribution by others is strictly prohibited. If you are not the intended recipient, please contact the sender and delete all copies.