From patchwork Fri Dec 20 20:05:00 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Schimpe, Christina" X-Patchwork-Id: 103525 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 079603858406 for ; Fri, 20 Dec 2024 20:09:51 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 079603858406 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=W7JVfmhQ X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.10]) by sourceware.org (Postfix) with ESMTPS id BC9763858C35 for ; Fri, 20 Dec 2024 20:06:38 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org BC9763858C35 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 BC9763858C35 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=198.175.65.10 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1734725199; cv=none; b=kOFDBvLS6wujEzGq8wniCntlCO1fbfK/wu9dP+LqrJdsyYghfI7LxOmdkY+Cup7fVorJZe4ljzkmx+MpYhDsdkoNxFVdKPbSvfFlasr03K2b3+cKVhqO7WEoLLha3UnLziFat5fOfuY4ytf05lYcDnj0weS53sh8PDDJ/Fi8Y5w= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1734725199; c=relaxed/simple; bh=tyYS4vzrPHH7ifXLWJjmfmmkYyZ8Ev4c1qLsxsLrDq8=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=rJ15zEiOdhd/lZwjIyY552T9EwO+qjkzNNqevmPY1vXr4akao22ROa00x+1hQ0USqGaqcOg+PmvMvSWUhEw/8dOJr4CEZXq5qF6/h7tW/TcLQ5IE93tCMH7v2/bAqTa87ePr+WmgJy8CVzjzb6M+1V9gFq4By+DOFgHnhcwPJs4= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org BC9763858C35 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1734725199; x=1766261199; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=tyYS4vzrPHH7ifXLWJjmfmmkYyZ8Ev4c1qLsxsLrDq8=; b=W7JVfmhQhXkKRh6me//JDwOR3cXEAXjwKLBT2DpkFQaUfw3dQ77S5IbH 0lwUydjmg5BGlHtNpNCDXMEcWnGD0mvZXKcS2NPKNXEP+Y3e5/YHdTHLx wlST66NNv1vllqLltuLyuE1KvwCLFnE+FHGEwHAiqbX9tQT4gZK1sPQvh xMf/GCxUL8Ri47V6FPYLjtd2rfIk6QMIM48e3GahDFr+1jdAvE/vNySsG p9E4ULrjMAiOH2WiPPoJqeDgP/DHGNWv0c0iidXnQ8f9cXCJepwb6hWak b4ndAJzh+Qw2J4xdmCmgao2rlYrKHBYzQHBcq8Br/MzsrxiEu4zfs2n/I Q==; X-CSE-ConnectionGUID: qdp+hGj6Tp6quc9mek/wdw== X-CSE-MsgGUID: 7jU4PDr6SCGas6FTw8j6Mg== X-IronPort-AV: E=McAfee;i="6700,10204,11292"; a="52689162" X-IronPort-AV: E=Sophos;i="6.12,251,1728975600"; d="scan'208";a="52689162" Received: from fmviesa008.fm.intel.com ([10.60.135.148]) by orvoesa102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Dec 2024 12:06:38 -0800 X-CSE-ConnectionGUID: dsA7MUKnTiSA86uTXNAdKA== X-CSE-MsgGUID: grIxnOMuRVedfVVQnOBwpg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.12,251,1728975600"; d="scan'208";a="98809983" Received: from gkldtt-dev-004.igk.intel.com (HELO localhost) ([10.123.221.202]) by fmviesa008-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Dec 2024 12:06:37 -0800 From: "Schimpe, Christina" To: gdb-patches@sourceware.org Subject: [PATCH 11/12] gdb, gdbarch: Introduce gdbarch method to get the shadow stack pointer. Date: Fri, 20 Dec 2024 20:05:00 +0000 Message-Id: <20241220200501.324191-12-christina.schimpe@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20241220200501.324191-1-christina.schimpe@intel.com> References: <20241220200501.324191-1-christina.schimpe@intel.com> MIME-Version: 1.0 X-Spam-Status: No, score=-10.3 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org 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~patchwork=sourceware.org@sourceware.org This patch is required by the following commit. --- gdb/arch-utils.c | 8 ++++++++ gdb/arch-utils.h | 5 +++++ gdb/gdbarch-gen.c | 22 ++++++++++++++++++++++ gdb/gdbarch-gen.h | 6 ++++++ gdb/gdbarch_components.py | 10 ++++++++++ 5 files changed, 51 insertions(+) diff --git a/gdb/arch-utils.c b/gdb/arch-utils.c index a2ed2a2c011..3aedb3f2600 100644 --- a/gdb/arch-utils.c +++ b/gdb/arch-utils.c @@ -1218,6 +1218,14 @@ default_gdbarch_return_value readbuf, writebuf); } +/* See arch-utils.h. */ + +std::optional +default_get_shadow_stack_pointer (gdbarch *gdbarch) +{ + return {}; +} + obstack *gdbarch_obstack (gdbarch *arch) { return &arch->obstack; diff --git a/gdb/arch-utils.h b/gdb/arch-utils.h index b59e2ad70c2..471be9c282d 100644 --- a/gdb/arch-utils.h +++ b/gdb/arch-utils.h @@ -325,4 +325,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); + #endif /* GDB_ARCH_UTILS_H */ diff --git a/gdb/gdbarch-gen.c b/gdb/gdbarch-gen.c index c33c476dfdb..72638f01ad7 100644 --- a/gdb/gdbarch-gen.c +++ b/gdb/gdbarch-gen.c @@ -261,6 +261,7 @@ struct gdbarch gdbarch_read_core_file_mappings_ftype *read_core_file_mappings = default_read_core_file_mappings; gdbarch_use_target_description_from_corefile_notes_ftype *use_target_description_from_corefile_notes = default_use_target_description_from_corefile_notes; 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 @@ -533,6 +534,7 @@ verify_gdbarch (struct gdbarch *gdbarch) /* Skip verify of read_core_file_mappings, invalid_p == 0. */ /* Skip verify of use_target_description_from_corefile_notes, 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 ()); @@ -1404,6 +1406,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); } @@ -5539,3 +5544,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) +{ + 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); +} + +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 ff14a3666b9..ff511b4a9e0 100644 --- a/gdb/gdbarch-gen.h +++ b/gdb/gdbarch-gen.h @@ -1783,6 +1783,8 @@ extern void set_gdbarch_use_target_description_from_corefile_notes (struct gdbar technologies. For example, Intel's Control-flow Enforcement Technology (CET) provides a shadow stack and indirect branch tracking. To enable inferior calls the function shadow_stack_push has to be provided. + The method get_shadow_stack_pointer has to be provided to enable displaced + stepping. Push the address NEW_ADDR on the shadow stack and update the shadow stack pointer. */ @@ -1792,3 +1794,7 @@ extern bool gdbarch_shadow_stack_push_p (struct gdbarch *gdbarch); typedef void (gdbarch_shadow_stack_push_ftype) (struct gdbarch *gdbarch, CORE_ADDR new_addr); extern void gdbarch_shadow_stack_push (struct gdbarch *gdbarch, CORE_ADDR new_addr); extern void set_gdbarch_shadow_stack_push (struct gdbarch *gdbarch, gdbarch_shadow_stack_push_ftype *shadow_stack_push); + +typedef std::optional (gdbarch_get_shadow_stack_pointer_ftype) (struct gdbarch *gdbarch); +extern std::optional gdbarch_get_shadow_stack_pointer (struct gdbarch *gdbarch); +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 52f265e8e0e..df70cb082a4 100644 --- a/gdb/gdbarch_components.py +++ b/gdb/gdbarch_components.py @@ -2822,6 +2822,8 @@ Some targets support special hardware-assisted control-flow protection technologies. For example, Intel's Control-flow Enforcement Technology (CET) provides a shadow stack and indirect branch tracking. To enable inferior calls the function shadow_stack_push has to be provided. +The method get_shadow_stack_pointer has to be provided to enable displaced +stepping. Push the address NEW_ADDR on the shadow stack and update the shadow stack pointer. @@ -2831,3 +2833,11 @@ pointer. params=[("CORE_ADDR", "new_addr")], predicate=True, ) + +Method( + type="std::optional", + name="get_shadow_stack_pointer", + params=[], + predefault="default_get_shadow_stack_pointer", + invalid=False, +)