Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: "Joos, Christina" <christina.joos@intel.com>
To: "gdb-patches@sourceware.org" <gdb-patches@sourceware.org>
Cc: "thiago.bauermann@linaro.org" <thiago.bauermann@linaro.org>
Subject: RE: [PATCH v3 02/12] aarch64: Implement gdbarch function top_addr_empty_shadow_stack.
Date: Mon, 3 Aug 2026 15:17:31 +0000	[thread overview]
Message-ID: <SN7PR11MB76389EB76E21C87BF4931AA889D52@SN7PR11MB7638.namprd11.prod.outlook.com> (raw)
In-Reply-To: <20260706123133.1990441-3-christina.schimpe@intel.com>

Hi Thiago, 

I noticed that I missed to adapt the author of this patch to your name. This was not intended. 😊
I will do that with the next version of this series once I received more feedback (together with an update of my last name for the Co-Author).

Christina


> -----Original Message-----
> From: Christina Schimpe <christina.schimpe@intel.com>
> Sent: Montag, 6. Juli 2026 14:31
> 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.
> 
> 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 <christina.schimpe@intel.com>
> ---
>  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 <cmath>
> @@ -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<CORE_ADDR, CORE_ADDR> 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<CORE_ADDR, CORE_ADDR> 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
> 

________________________________________
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.

  reply	other threads:[~2026-08-03 15:24 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-06 12:31 [PATCH v3 00/12] Add new command to print the shadow stack backtrace Christina Schimpe
2026-07-06 12:31 ` [PATCH v3 01/12] gdb: Generalize handling of the shadow stack pointer Christina Schimpe
2026-07-06 12:31 ` [PATCH v3 02/12] aarch64: Implement gdbarch function top_addr_empty_shadow_stack Christina Schimpe
2026-08-03 15:17   ` Joos, Christina [this message]
2026-08-03 18:17     ` Thiago Jung Bauermann
2026-08-04  8:02       ` Joos, Christina
2026-07-06 12:31 ` [PATCH v3 03/12] gdb: Add get_main_func_start_pc to refactor frame.c:inside_main_func Christina Schimpe
2026-07-06 12:31 ` [PATCH v3 04/12] gdb: Refactor 'stack.c:print_frame' Christina Schimpe
2026-07-06 12:31 ` [PATCH v3 05/12] gdb: Introduce 'stack.c:print_pc' function without frame argument Christina Schimpe
2026-07-06 12:31 ` [PATCH v3 06/12] gdb: Refactor 'find_symbol_funname' and 'info_frame_command_core' in stack.c Christina Schimpe
2026-07-06 12:31 ` [PATCH v3 07/12] gdb: Refactor 'stack.c:print_frame_info' Christina Schimpe
2026-07-06 12:31 ` [PATCH v3 08/12] gdb: Add command option 'bt -shadow' to print the shadow stack backtrace Christina Schimpe
2026-07-08  9:13   ` Schimpe, Christina
2026-07-06 12:31 ` [PATCH v3 09/12] gdb: Implement the hook 'is_no_return_shadow_stack_address' for amd64 linux Christina Schimpe
2026-07-06 12:31 ` [PATCH v3 10/12] gdb: Enable inferior calls in the shadow stack backtrace Christina Schimpe
2026-07-06 12:31 ` [PATCH v3 11/12] gdb: Enable signal trampolines " Christina Schimpe
2026-07-06 12:31 ` [PATCH v3 12/12] gdb, mi: Add -shadow-stack-list-frames command Christina Schimpe

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=SN7PR11MB76389EB76E21C87BF4931AA889D52@SN7PR11MB7638.namprd11.prod.outlook.com \
    --to=christina.joos@intel.com \
    --cc=gdb-patches@sourceware.org \
    --cc=thiago.bauermann@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox