From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id O2hdLKAOimhEBgAAWB0awg (envelope-from ) for ; Wed, 30 Jul 2025 08:22:56 -0400 Authentication-Results: simark.ca; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=jLHdIi+f; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id A38EA1E102; Wed, 30 Jul 2025 08:22:56 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-10.1 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, RCVD_IN_VALIDITY_RPBL,RCVD_IN_VALIDITY_SAFE autolearn=ham autolearn_force=no version=4.0.1 Received: from server2.sourceware.org (server2.sourceware.org [8.43.85.97]) (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 C21971E091 for ; Wed, 30 Jul 2025 08:22:55 -0400 (EDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 4A1BE3858CD9 for ; Wed, 30 Jul 2025 12:22:55 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4A1BE3858CD9 Authentication-Results: sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=jLHdIi+f Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTP id 34D7E3858D1E for ; Wed, 30 Jul 2025 12:22:22 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 34D7E3858D1E Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 34D7E3858D1E Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1753878142; cv=none; b=ZzntF2vsjUhca8WbMSe0yLKMomo04fc6ntjQBmMmImGDVuDnay8unCSi+UiOAxnCelIchjCsX495oAqWkdaf7Gq0uDTnLV5b8hlppxTv8WJaJ0UHtXkZBluBzGOlYM6NAOc1HBifxsG3flG9wII6X6c3qbsjqO4xCIXLMbqZbng= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1753878142; c=relaxed/simple; bh=l3uImHsCEvfWUomGN1IQC3sEPKgY2w1UKuA+hwVgXKs=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=RfEaBRBSzQfE9QLfftAco6CftQ+R5y4ZKgRDwLdRCSOggQ9LlRAwne8FKjlYPJqW1isu3B63JyJtL9jFfjdGZKlgMM/iYyoHC4VJ9nL/9iBkxOsyf0Dx8dJBQauDWYFVwe2ENV+jYGRpBfG9nb2lw0tameOSMH0Zu5hGoUrj2vE= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 34D7E3858D1E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1753878141; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=kmO8T+/VU1dVHuZtQL/gsmVE+fTY/i5vReqEYonj/i8=; b=jLHdIi+fzHt3xNGKny6+ynIHjFK9/RMq1zU9Am4/hqLcSxkD0pvhYu0xr4cCWIqvjO6PbD gIBYWamrO5gyfF79ZOyiOBBvBcKi6FNkTf0tVSjuS8G3/A1/ksw5AUQayaIdDiNh+513e/ zia3H13wOP31y6Xe1BpRt+LzlGmVV3o= Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-611-BOJfZ0WKOUSuhyU1CIXkvw-1; Wed, 30 Jul 2025 08:22:20 -0400 X-MC-Unique: BOJfZ0WKOUSuhyU1CIXkvw-1 X-Mimecast-MFC-AGG-ID: BOJfZ0WKOUSuhyU1CIXkvw_1753878140 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-45896cf24fbso3629095e9.2 for ; Wed, 30 Jul 2025 05:22:20 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753878139; x=1754482939; h=mime-version:message-id:date:references:in-reply-to:subject:cc:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=kmO8T+/VU1dVHuZtQL/gsmVE+fTY/i5vReqEYonj/i8=; b=b2a9E1y3Oe9brXXikveXqTAWQmA/7jj2CAUKiwKXLByvHLkdRFt/CiV8l7Ia3Tlfeg czHKIo2CKzJLOgnHCW+is9WIH7lDgL673MrlSiIh28IrQAIj9A5zInF7rzTFUVU7pPDJ qeDd4mrFGhu/N0NR8eifStv7HSIAmUlo9C1l1qSDFy7x542vbhOixpw3nyMBdZHlSl6w fjSN/EZC0zAzONcGROFN8cPS2RwkagRG2y60h7IOS1QrwXeZHjvICi2R44tJW+v/hPJ4 LZEc/7kcggqY6z47c3rzgACWlIR6WkItHUxoM/hz81Ki5gxrNYDzobPzJnkonBibBUS5 tyLw== X-Forwarded-Encrypted: i=1; AJvYcCXxbfDC5BIlMREm2BGj4NtCgaREZ0fsVh1tNqfU1UfbeoPgo4Uhux62tXBh1BQxJA/DnSSTh/kxUY5NRg==@sourceware.org X-Gm-Message-State: AOJu0YyLmSGecKKuwJq/lCIy5c0bN5nAE9yTGfb8Ss1H7KLo+bBD6GUw WVMkuQ1JrsHupIakQKm538nLIG2AsBOKxEzxYJqTPetocxnkOu0ZH2vyX/lGYEn5h1xRert+i9k uavaHnQfangc0k2cIE3nzi97Kw3UKXJe9JlueZAm6/FJdAEbGHPbgIxHJnAl0CYI= X-Gm-Gg: ASbGncug+jiNTqqfNaXh05PS0WP0gdAIT1TyIrDn0U4aWxxaU65WLTecV++RvNJU5m3 acAzE00r3KZ7IK3wIsyRPmhR8nv/42ODbBRVrPVlynokR0GxZFVyYXmg9ryG4JnR9mLBz/75Quy a0qhHm7fLj+Zf1Gh4ShI1e8yx6Pteb+zCoc51jdSQuvyz/r6HP0NyVfKOX5jiXU9Wdtl1hmNVXH OtJ6CrZheg+VtMZ6ZDlp4e7ihbow1t1fb4AW5nSlMOH1w1sE+8a2e4aXGKvLPoJJjlTZ4LVH8z8 Q4p8sBYAyZCe9gRlanWEZBxkHz3b+slKNbbC337cRnSBAWpd4q4Iah02gFiUKg== X-Received: by 2002:a05:600c:c04b:20b0:43d:46de:b0eb with SMTP id 5b1f17b1804b1-458936b4461mr18056555e9.12.1753878139348; Wed, 30 Jul 2025 05:22:19 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGzBMXSq5CSAY7gYdI24ttuePwAzzNesYNZUEkovwrpLVR4mRBfSis62obOuGSjBop8TUyfTg== X-Received: by 2002:a05:600c:c04b:20b0:43d:46de:b0eb with SMTP id 5b1f17b1804b1-458936b4461mr18056265e9.12.1753878138763; Wed, 30 Jul 2025 05:22:18 -0700 (PDT) Received: from localhost (120.81.93.209.dyn.plus.net. [209.93.81.120]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4589536a6d0sm27316825e9.4.2025.07.30.05.22.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Jul 2025 05:22:18 -0700 (PDT) From: Andrew Burgess To: Christina Schimpe , gdb-patches@sourceware.org Cc: thiago.bauermann@linaro.org, luis.machado@arm.com Subject: Re: [PATCH v5 11/12] gdb, gdbarch: Introduce gdbarch method to get the shadow stack pointer. In-Reply-To: <20250628082810.332526-12-christina.schimpe@intel.com> References: <20250628082810.332526-1-christina.schimpe@intel.com> <20250628082810.332526-12-christina.schimpe@intel.com> Date: Wed, 30 Jul 2025 13:22:17 +0100 Message-ID: <87cy9hdg1y.fsf@redhat.com> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: 9D5fA55xfDjLy8EYa1IrFaQ_ggQ1VitIPQVciMelQUA_1753878140 X-Mimecast-Originator: redhat.com Content-Type: text/plain 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 Christina Schimpe writes: > This patch is required by the following commit > "gdb: Enable displaced stepping with shadow stack on amd64 linux." > > Reviewed-by: Thiago Jung Bauermann > Reviewed-By: Luis Machado > --- > gdb/arch-utils.c | 10 ++++++++++ > gdb/arch-utils.h | 5 +++++ > gdb/gdbarch-gen.c | 22 ++++++++++++++++++++++ > gdb/gdbarch-gen.h | 12 +++++++++++- > gdb/gdbarch_components.py | 17 ++++++++++++++++- > 5 files changed, 64 insertions(+), 2 deletions(-) > > diff --git a/gdb/arch-utils.c b/gdb/arch-utils.c > index f320d3d7365..c396e9e3840 100644 > --- a/gdb/arch-utils.c > +++ b/gdb/arch-utils.c > @@ -1218,6 +1218,16 @@ default_gdbarch_return_value > readbuf, writebuf); > } > > +/* See arch-utils.h. */ > + > +std::optional > +default_get_shadow_stack_pointer (gdbarch *gdbarch, regcache *regcache, > + bool &shadow_stack_enabled) > +{ > + shadow_stack_enabled = false; > + return {}; > +} > + > obstack *gdbarch_obstack (gdbarch *arch) > { > return &arch->obstack; > diff --git a/gdb/arch-utils.h b/gdb/arch-utils.h > index 1509cb7441e..14a84b74733 100644 > --- a/gdb/arch-utils.h > +++ b/gdb/arch-utils.h > @@ -414,4 +414,9 @@ extern enum return_value_convention default_gdbarch_return_value > struct regcache *regcache, struct value **read_value, > const gdb_byte *writebuf); > > +/* Default implementation of gdbarch default_get_shadow_stack_pointer > + method. */ > +extern std::optional default_get_shadow_stack_pointer > + (gdbarch *gdbarch, regcache *regcache, bool &shadow_stack_enabled); > + > #endif /* GDB_ARCH_UTILS_H */ > diff --git a/gdb/gdbarch-gen.c b/gdb/gdbarch-gen.c > index a4b72793fd8..caeda3cefae 100644 > --- a/gdb/gdbarch-gen.c > +++ b/gdb/gdbarch-gen.c > @@ -263,6 +263,7 @@ struct gdbarch > gdbarch_use_target_description_from_corefile_notes_ftype *use_target_description_from_corefile_notes = default_use_target_description_from_corefile_notes; > gdbarch_core_parse_exec_context_ftype *core_parse_exec_context = default_core_parse_exec_context; > gdbarch_shadow_stack_push_ftype *shadow_stack_push = nullptr; > + gdbarch_get_shadow_stack_pointer_ftype *get_shadow_stack_pointer = default_get_shadow_stack_pointer; > }; > > /* Create a new ``struct gdbarch'' based on information provided by > @@ -537,6 +538,7 @@ verify_gdbarch (struct gdbarch *gdbarch) > /* Skip verify of use_target_description_from_corefile_notes, invalid_p == 0. */ > /* Skip verify of core_parse_exec_context, invalid_p == 0. */ > /* Skip verify of shadow_stack_push, has predicate. */ > + /* Skip verify of get_shadow_stack_pointer, invalid_p == 0. */ > if (!log.empty ()) > internal_error (_("verify_gdbarch: the following are invalid ...%s"), > log.c_str ()); > @@ -1414,6 +1416,9 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file) > gdb_printf (file, > "gdbarch_dump: shadow_stack_push = <%s>\n", > host_address_to_string (gdbarch->shadow_stack_push)); > + gdb_printf (file, > + "gdbarch_dump: get_shadow_stack_pointer = <%s>\n", > + host_address_to_string (gdbarch->get_shadow_stack_pointer)); > if (gdbarch->dump_tdep != NULL) > gdbarch->dump_tdep (gdbarch, file); > } > @@ -5583,3 +5588,20 @@ set_gdbarch_shadow_stack_push (struct gdbarch *gdbarch, > { > gdbarch->shadow_stack_push = shadow_stack_push; > } > + > +std::optional > +gdbarch_get_shadow_stack_pointer (struct gdbarch *gdbarch, regcache *regcache, bool &shadow_stack_enabled) > +{ > + gdb_assert (gdbarch != NULL); > + gdb_assert (gdbarch->get_shadow_stack_pointer != NULL); > + if (gdbarch_debug >= 2) > + gdb_printf (gdb_stdlog, "gdbarch_get_shadow_stack_pointer called\n"); > + return gdbarch->get_shadow_stack_pointer (gdbarch, regcache, shadow_stack_enabled); > +} > + > +void > +set_gdbarch_get_shadow_stack_pointer (struct gdbarch *gdbarch, > + gdbarch_get_shadow_stack_pointer_ftype get_shadow_stack_pointer) > +{ > + gdbarch->get_shadow_stack_pointer = get_shadow_stack_pointer; > +} > diff --git a/gdb/gdbarch-gen.h b/gdb/gdbarch-gen.h > index 71142332540..c36171b089e 100644 > --- a/gdb/gdbarch-gen.h > +++ b/gdb/gdbarch-gen.h > @@ -1807,7 +1807,8 @@ extern void set_gdbarch_core_parse_exec_context (struct gdbarch *gdbarch, gdbarc > technologies. For example, the Intel Control-Flow Enforcement Technology > (Intel CET) on x86 provides a shadow stack and indirect branch tracking. > To enable shadow stack support for inferior calls the shadow_stack_push > - gdbarch hook has to be provided. > + gdbarch hook has to be provided. The get_shadow_stack_pointer gdbarch > + hook has to be provided to enable displaced stepping. > > Push NEW_ADDR to the shadow stack and update the shadow stack pointer. */ > > @@ -1816,3 +1817,12 @@ extern bool gdbarch_shadow_stack_push_p (struct gdbarch *gdbarch); > typedef void (gdbarch_shadow_stack_push_ftype) (struct gdbarch *gdbarch, CORE_ADDR new_addr, regcache *regcache); > extern void gdbarch_shadow_stack_push (struct gdbarch *gdbarch, CORE_ADDR new_addr, regcache *regcache); > extern void set_gdbarch_shadow_stack_push (struct gdbarch *gdbarch, gdbarch_shadow_stack_push_ftype *shadow_stack_push); > + > +/* If possible, return the shadow stack pointer. On some architectures, the > + shadow stack pointer is available even if the feature is disabled. To > + return the feature's enablement state configure SHADOW_STACK_ENABLED. > + Set it to true in case the shadow stack is enabled. */ > + > +typedef std::optional (gdbarch_get_shadow_stack_pointer_ftype) (struct gdbarch *gdbarch, regcache *regcache, bool &shadow_stack_enabled); > +extern std::optional gdbarch_get_shadow_stack_pointer (struct gdbarch *gdbarch, regcache *regcache, bool &shadow_stack_enabled); > +extern void set_gdbarch_get_shadow_stack_pointer (struct gdbarch *gdbarch, gdbarch_get_shadow_stack_pointer_ftype *get_shadow_stack_pointer); > diff --git a/gdb/gdbarch_components.py b/gdb/gdbarch_components.py > index abc79588473..73459064170 100644 > --- a/gdb/gdbarch_components.py > +++ b/gdb/gdbarch_components.py > @@ -2855,7 +2855,8 @@ Some targets support special hardware-assisted control-flow protection > technologies. For example, the Intel Control-Flow Enforcement Technology > (Intel CET) on x86 provides a shadow stack and indirect branch tracking. > To enable shadow stack support for inferior calls the shadow_stack_push > -gdbarch hook has to be provided. > +gdbarch hook has to be provided. The get_shadow_stack_pointer gdbarch > +hook has to be provided to enable displaced stepping. I find the addition of this last sentence here a little strange. While it's a true statement, wouldn't this be better placed on the comment for get_shadow_stack_pointer? > > Push NEW_ADDR to the shadow stack and update the shadow stack pointer. > """, > @@ -2864,3 +2865,17 @@ Push NEW_ADDR to the shadow stack and update the shadow stack pointer. > params=[("CORE_ADDR", "new_addr"), ("regcache *", "regcache")], > predicate=True, > ) > + > +Method( > + comment=""" > +If possible, return the shadow stack pointer. On some architectures, the > +shadow stack pointer is available even if the feature is disabled. To > +return the feature's enablement state configure SHADOW_STACK_ENABLED. > +Set it to true in case the shadow stack is enabled. The wording "configure SHADOW_STACK_ENABLED" seems a little strange. Also, there's a bunch of important detail that this comment doesn't cover. Here's what I'd suggest, though it's possible this doesn't match the implementation (I haven't checked the next patch yet), but this does match default_get_shadow_stack_pointer. Feel free to take any of this that is useful: If possible, return the shadow stack pointer. On some architectures, the shadow stack pointer is available even if the feature is disabled. If the shadow stack feature is enabled then set SHADOW_STACK_ENABLED to true, otherwise set SHADOW_STACK_ENABLED to false. The SHADOW_STACK_ENABLED will always be set if this function returns a value. If the function doesn't return a value then the state of SHADOW_STACK_ENABLED is undefined. Thanks, Andrew > +""", > + type="std::optional", > + name="get_shadow_stack_pointer", > + params=[("regcache *", "regcache"), ("bool &", "shadow_stack_enabled")], > + predefault="default_get_shadow_stack_pointer", > + invalid=False, > +) > -- > 2.43.0