From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id mEO+KZWpX2hqXyMAWB0awg (envelope-from ) for ; Sat, 28 Jun 2025 04:36:37 -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=BgljbOl3; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id A87061E089; Sat, 28 Jun 2025 04:36:37 -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 263691E089 for ; Sat, 28 Jun 2025 04:36:37 -0400 (EDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id BE4D23856096 for ; Sat, 28 Jun 2025 08:36:36 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org BE4D23856096 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=BgljbOl3 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.19]) by sourceware.org (Postfix) with ESMTPS id A70A1385C6FF for ; Sat, 28 Jun 2025 08:29:15 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org A70A1385C6FF 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 A70A1385C6FF Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=192.198.163.19 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1751099355; cv=none; b=Lnl2sJW3zAI1kJXmqg8SZ+86iOpVdIJpmUOfZoIvQBlwQy3F8pcM7mN5OMcFYbFcX58Btn99n4RWjO07bXjC20BSQV9Y47BZNTYQgLHngGeJ6Oo69YZ9ln8hK4AzivWPKZvLMVJZV+VJvItrDHXlET7nq8Ux1aF+1tN2CII7LJQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1751099355; c=relaxed/simple; bh=B3A/awN3DmZWImVU4xe0CrXr12atCpihC6uL4klyvK0=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=pJkPr3E6HtgZtSnvQchkstnZpnwY50wliBg4E4nmS+b/45Y6akuH6gzPMFF1cKNPDxqNzRYF6mWjvymKWaq2hv9i2bDKw1nEa03ycpqBaGABgCgR0786h9Mgj0SDZsL9t29Wa7QQno6l0uZqHvQuzJly5PQ/ITfiRVX75ekux1c= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A70A1385C6FF DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1751099356; x=1782635356; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=B3A/awN3DmZWImVU4xe0CrXr12atCpihC6uL4klyvK0=; b=BgljbOl3WQlH0QsZEKBlRMuHOzK81ngySb07eGIqcuPWShYQRfsdGA1u 8bR48WS3TKe6c2t7fNdlmcNnfvKg9XNXoXA7pU4qs8tWScQ1X844ilLLp kvzgRDqMqyiL4NzfLnCBaUgTWjJAbHcD3dXe4Cz48ua1Sqg/vSAqmisCR 7VfXGVDBDkE2RRO30ZKa93spax3xkUl3GVZClCC3wyL/DqilVjvFMMykl JcYQe/yWVTXFVVbaLiqlVHaTuHrqZUb7CyMdIMtuzo6p9QQaNj6O7Sbjb KlMznshh71zi7uISAxrZZDLnUotc5Xf2s4TWw8OQyfFxUZ8Oo/3jEijiY g==; X-CSE-ConnectionGUID: gq3GBwcNT4qkDxYHw9YOiw== X-CSE-MsgGUID: sgsX342lTOGwT4pKYLgQeA== X-IronPort-AV: E=McAfee;i="6800,10657,11477"; a="52518184" X-IronPort-AV: E=Sophos;i="6.16,272,1744095600"; d="scan'208";a="52518184" Received: from orviesa004.jf.intel.com ([10.64.159.144]) by fmvoesa113.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jun 2025 01:29:15 -0700 X-CSE-ConnectionGUID: WLVO78nsQd2VtYQ/lBueFw== X-CSE-MsgGUID: yGqwelh1Taq3Tm++Ig+lbQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.16,272,1744095600"; d="scan'208";a="157538120" Received: from 0007e934a912.jf.intel.com (HELO localhost) ([10.165.58.208]) by orviesa004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jun 2025 01:29:15 -0700 From: Christina Schimpe To: gdb-patches@sourceware.org Cc: thiago.bauermann@linaro.org, luis.machado@arm.com Subject: [PATCH v5 11/12] gdb, gdbarch: Introduce gdbarch method to get the shadow stack pointer. Date: Sat, 28 Jun 2025 01:28:09 -0700 Message-ID: <20250628082810.332526-12-christina.schimpe@intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250628082810.332526-1-christina.schimpe@intel.com> References: <20250628082810.332526-1-christina.schimpe@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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 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. 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. +""", + 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