From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id MSEGKx2aZ2o+eTAAWB0awg (envelope-from ) for ; Mon, 27 Jul 2026 13:49:17 -0400 Authentication-Results: simark.ca; dkim=pass (2048-bit key; unprotected) header.d=yahoo.de header.i=@yahoo.de header.a=rsa-sha256 header.s=s2048 header.b=U1vvFS1f; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id ACB551E09E; Mon, 27 Jul 2026 13:49:17 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-5.4 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham autolearn_force=no version=4.0.1 Received: from vm01.sourceware.org (vm01.sourceware.org [IPv6:2620:52:6:3111::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 076BB1E033 for ; Mon, 27 Jul 2026 13:49:17 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A22024B9DB6B for ; Mon, 27 Jul 2026 17:49:16 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A22024B9DB6B Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=yahoo.de header.i=@yahoo.de header.a=rsa-sha256 header.s=s2048 header.b=U1vvFS1f Received: from sonic312-26.consmr.mail.ir2.yahoo.com (sonic312-26.consmr.mail.ir2.yahoo.com [77.238.178.97]) by sourceware.org (Postfix) with ESMTPS id 0069F4B99F64 for ; Mon, 27 Jul 2026 17:46:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 0069F4B99F64 Authentication-Results: sourceware.org; dmarc=pass (p=reject dis=none) header.from=yahoo.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=yahoo.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 0069F4B99F64 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=77.238.178.97 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1785174391; cv=none; b=MaMjFGCaywRnCTYN00trjhNHnIAP6wNQzqIHCgi0qHD65l/86FYpfRBq5KuFazDioG5/1fOoDc0kdBzR58SeIEIxZQ+uK1KY+wjmGSXa7iKcaVePndtkWX+vd2Try/+4KF24GE4mKGQaVh8ldtPA++qn1oKSpEBxkPre2yJ8Lxw= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1785174391; c=relaxed/simple; bh=RjlMZWoj+NXZbuzGxJ9hIEyocFAlMU1f90opMVZ4cwk=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=qhtLq6eyUOMHCVeqq2AbEaiVMm+aqRlqFW1T8+xVGC9+wrirkzc3gByBojxym0//bk6g01OY73SC4Shg8sZuNhOWT/Z+lcOeMOh/NW2M8BDwOVnky98dgjsnOq+uGJVjteEotB/K6A+5Hcxo0xGdqRpkKDW5O6zAN6LGnKRHWrc= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=yahoo.de header.i=@yahoo.de header.a=rsa-sha256 header.s=s2048 header.b=U1vvFS1f DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0069F4B99F64 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.de; s=s2048; t=1785174389; bh=ybsyvR0Vdp+TZU1IIqm4dNQbHL9Q9UYoMDfDX/2cc5k=; h=From:To:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=U1vvFS1f5RGCxDq1DJYcavO+BmAY89vfUVVGlq3NZ17GDy0cABTZA4uKNQV77mDTSR+rY7jWzxDAUbKXptS3ZuRkl2yIxboToZy8778yE0z+1K/mLImszc8FjA2iIw1iwbN0paxScx7adhGR7WsuEvj4YJoVLAKQHJSbFKeBs+0cRkFyEXOpbAxGbp0tLWFPZcU/SJMYt5PBuzE7djt27o4T+UndCKdK0YIMC/i090Ui6xW0mFEh9TTf3FzHuIq5UpnN7jLa/xWnJUI7ysTPmn2tRCk1+wkgTuAhtlKPbcZdj9XgjwZkPGLXr88RbfuGORM6Y0HdPfYo+2JIcppl9g== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1785174389; bh=zXpeTASQ3N831gwrB1Z/5MIz/c46o83GWFaCDxlTNSN=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=hi3K4qT11uw8iHA42UKav6RsNqFmnGOosv5A6N0dFhvloGBpMU4Axq5p4EiFtQfkXt8x7nqQnSIyMm5RD1gEGFEwpIKXtNHZhOWxtghMovUbVaqBGh3NAAWBp+MLhzBsQwQgLWEqW/zZTUzaupkIV9xl1NYMjM3TqibRxK8Z1vCxocOwKw0Iazm/AnuIuQlyHd33SoAtLiHnANzOhOlet1ymjJT+NwkvQQtr6dUm+k3N+obHc+1Q4xxUFH5fKA1GBKxyQ65Dm4HOYxDBDLSgH7Fe+catCEv1zeDnwqPHxiUNI2dYTl65B72xygFwMfmHyK78b0T8e9xyetSFu06vPw== X-YMail-OSG: 9xmXsJMVM1kYo3V64NgAjW8dTPTNURL5RF8xtitJWBEcojHzuj573SsFzVxxRM4 BNEu_XxdKLZcDVfKujpV9wTw4kOY8Xdn_tj6Hwv51jVLkIkQct2.GuIRMOpdRIjeoh3BfmvSC4S7 AsS4csq5oUm.F7ax8N0sf4ReKqtD36QUbW_geiDHjMlJT2sfwKzdzMZ4uNMYUum6hzf1jxssx2ZK 65D3gPHQSl6.cNBKqBDenngSFTpJoefQisyUA42oS.PQXGXX9hHgYGX89JdYxeIC_rxFDxpfnO_O RQKHCv_bjPkDruErUN_fw1er22ud3nQj.GO.mUYII92memxYcv9C_xI6VLZhuwXgZPJ8UeAEeZFt 7TkzMwBiLkg0uGEv6MyX4opKJZWCauycgNi61EG8stzk6Mw92G0PLpn0khCBKq1EHCx0paBTqQt. M7OsZ3cQ0_ONafnmVe78QrOK_FAr9CtQIzeqUvNDoLJXWFp5Laz1lwh1wfO_t7xWrjRfA1C6Gcn7 e8ivL1uBQjKgApnDrF3vrqwHfpOn5Ty3tmAOPEJAMvlUr2UEwnEk06xgTkhRK5JaiMhfc0mtTfAc CCjPRgVPk8ZBu45_dLQB7Cm_o.sYMcgGV6pTuAYZ0dvipYVY.EC_kp46da5L0ZFVD0_eCZdW7gAv tgGkc3gzPVs9IerQuB.rhyk_g0Y6pL77OYJSehxiGjKQeLxXQpwU7qJuKV8I5LcwZxY16voyFt.F Oi9DPULS4WebvTYk_V7ZMVbh555aaKPyKwkO10DzhwnlP6zhUxjtLQUVyZ2Jfnl.Jm7YiqTwTGWJ 0gSiFW0ZlSjCmjbvjMys4azinOkr5l4ebL4qYcIX7doxTENuKO5du0Fd2Wkxur5MtEHHWwX8qcva 9bTZ6a64rPXEVCCPTlGLQ2TrUfBha_IJm6Quu.3Yc8PNBYVQMmKilgA3r3FgXpDbGH_Iq2DbL6FU Mnq2JJpWvHkd8TF9pGdc3Geg3rfRb.Q7FCDIzNeeYwrweNxcWLzJo0zuT1hI5Xk2lsHsXwSTw0Zb CatXc01WvDuKpMmLON49F6RAouLeinS7ENjDqThYrdbnfFxyVEZjMrWMKyci4_jOTE96aMN4tJjR lV32NgIyrDv42dLJU59iDSbWnZqiI1GP7dntDg.JMWlG0V16p6eD9cUyOvPq7zA2LlweRQPu8RNU R4ABlEKMIzUERWdHU2DdnIY4iEtaRJWaC_KxOk2slheGkj2stbD4G8_bbhVL9OanzmVKxZsXpNwv bI2lquDFM0I5jlex8ZtViw6fzMCNBiXY2eooF_STz_qh_eUI.rSVD7y2ga.DMeARax2KAA2Qu37h sWUUGTWBu4JYxHNwLBCWTNlk2D1Lhn4hWW7wma5fIT9y7gWbBnhMrDDRip.ugiGjTmvjJpBTjl1A 5N1BkrVFA1UZdV2Qhs.FTrTMNMzfpj5dhbwpZTnkkfbe.N_okIfdpj2pbKv.JR9f9IERLkvsaK_I uqKa999UD0kXh7sOfbiq1eQlw526kHtqE4nbrZkvbxNm5KyBrPkvHJWfgKJ0uoo09uhu3aH3g5j7 IHmNC91rUsickj1ShfKJZ5f_SyxiWR4SxpdHQATXm6votOvIMbLv9cGYZ9iyHyt.zTkUfsvAfZcL kM7Oq9OJfIhEoQ72BNlgKNIUcgffhUoBYyWAR543LlA00iwUkQVn5CachhoXxNfo5axl9fJrh23t w2ZxIL88BqopRnIMqwOW1qBLaEwwhoSixPtBye2_fk1NgPbMPn6R5egg6TRdlrL7g1aZ69Y967mP _.lMIwlxDFDfkrXPQCEZbqTenTHZkE9Ov9zlykH4CVQX9jOsrUjirL_LLxhHEzIck7X1DGERMus5 LFraMmhQzVWFtoqNIRA2GXXncgi.UR88Eawy4v9LOVR0yQXnxCOddJn9lhvTFpT5NxnJrsel7wwP nn2uwxY3lRFyy1XehVUNEafnR6cS78KECEMKP.IicBPaWB4l_OFeGL_Cf.RgWSKGt0sLqVcZT_M6 HDPPh2Qb4GrKpo.j5KeY9FNjWSl6odqYpGcMnb5X9G881__T8orjY4UwNMg_EnJsSG9dJvBE.1fk TP3ZHAwhJJl3zuINr3v45mPh7_Bos1Y4xXaT_Tu.YsY92NONomUUhI1UIvilEkKeZVNKJAjpsPgX 4IJ5IOQLTIGlmX.Hoh2Y9zkFaE0F4aIQ3pDnTU7ttLhbtQ36yzv6yP65szp8QZXOfg1D7yTZ7b15 H5STsv0v9SsFTr6oLPV_sQV8- X-Sonic-MF: X-Sonic-ID: 17328ad9-6b67-431b-bd39-93d48e3c5d57 Received: from sonic.gate.mail.ne1.yahoo.com by sonic312.consmr.mail.ir2.yahoo.com with HTTP; Mon, 27 Jul 2026 17:46:29 +0000 Received: by hermes--production-ir2-676cb4d88b-rslc6 (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 0669d8fa15a3c4ff66838ce4fae4c373; Mon, 27 Jul 2026 17:46:25 +0000 (UTC) From: Hannes Domani To: gdb-patches@sourceware.org Subject: [PATCH v2 4/8] Windows gdb: Refactor getting pointer to register inside context Date: Mon, 27 Jul 2026 19:42:28 +0200 Message-ID: <20260727174619.1089041-4-ssbssa@yahoo.de> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260727174619.1089041-1-ssbssa@yahoo.de> References: <20260727174619.1089041-1-ssbssa@yahoo.de> 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 These get_context_reg_ptr helper functions will be extended for XState registers later. --- gdb/amd64-windows-nat.c | 3 ++ gdb/i386-windows-nat.c | 3 ++ gdb/windows-nat.h | 6 +++ gdb/x86-windows-nat.c | 75 ++++++++++++++++++++++--------------- gdbserver/win32-i386-low.cc | 46 +++++++++++++++-------- 5 files changed, 87 insertions(+), 46 deletions(-) diff --git a/gdb/amd64-windows-nat.c b/gdb/amd64-windows-nat.c index cca606b5200..9d83a5f8334 100644 --- a/gdb/amd64-windows-nat.c +++ b/gdb/amd64-windows-nat.c @@ -86,6 +86,9 @@ const int amd64_mappings[] = }; #undef context_offset +const int amd64_mappings_count + = sizeof (amd64_mappings) / sizeof (amd64_mappings[0]); + /* segment_register_p_ftype implementation for amd64. */ int diff --git a/gdb/i386-windows-nat.c b/gdb/i386-windows-nat.c index 991f301cad1..151b778036c 100644 --- a/gdb/i386-windows-nat.c +++ b/gdb/i386-windows-nat.c @@ -74,6 +74,9 @@ const int i386_mappings[] = #undef context_offset #undef CONTEXT +const int i386_mappings_count + = sizeof (i386_mappings) / sizeof (i386_mappings[0]); + /* segment_register_p_ftype implementation for x86. */ int diff --git a/gdb/windows-nat.h b/gdb/windows-nat.h index d6977ff4c85..69be069e419 100644 --- a/gdb/windows-nat.h +++ b/gdb/windows-nat.h @@ -392,12 +392,18 @@ int i386_windows_segment_register_p (int regnum); /* context register offsets for x86. */ extern const int i386_mappings[]; +/* number of context register offests for x86. */ +extern const int i386_mappings_count; + #ifdef __x86_64__ /* segment_register_p_ftype implementation for amd64. */ int amd64_windows_segment_register_p (int regnum); /* context register offsets for amd64. */ extern const int amd64_mappings[]; + +/* number of context register offests for amd64. */ +extern const int amd64_mappings_count; #endif /* Creates an iterator that works like all_matching_threads_iterator, diff --git a/gdb/x86-windows-nat.c b/gdb/x86-windows-nat.c index b3ad8594020..3af5ef4dae0 100644 --- a/gdb/x86-windows-nat.c +++ b/gdb/x86-windows-nat.c @@ -223,31 +223,53 @@ x86_windows_nat_target::thread_context_step (windows_thread_info *th, }); } -/* See windows-nat.h. */ +/* Get pointer to register R inside CONTEXT. */ -void -x86_windows_nat_target::fetch_one_register (struct regcache *regcache, - windows_thread_info *th, int r) +template +static char * +get_context_reg_ptr (Context *context, int r) { - gdb_assert (r >= 0); - - char *context_ptr = x86_windows_process.with_context (th, [] (auto *context) - { - return (char *) context; - }); - const int *mappings; + int mappings_count; #ifdef __x86_64__ if (!x86_windows_process.wow64_process) - mappings = amd64_mappings; + { + mappings = amd64_mappings; + mappings_count = amd64_mappings_count; + } else #endif - mappings = i386_mappings; + { + mappings = i386_mappings; + mappings_count = i386_mappings_count; + } + + char *context_offset; + if (r < mappings_count) + context_offset = (char *) context + mappings[r]; + else + gdb_assert_not_reached ("invalid register number %d", r); + + return context_offset; +} + +/* See windows-nat.h. */ + +void +x86_windows_nat_target::fetch_one_register (struct regcache *regcache, + windows_thread_info *th, int r) +{ + gdb_assert (r >= 0); - char *context_offset = context_ptr + mappings[r]; struct gdbarch *gdbarch = regcache->arch (); i386_gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + char *context_offset + = x86_windows_process.with_context (th, [&] (auto *context) + { + return get_context_reg_ptr (context, r); + }); + gdb_assert (!gdbarch_read_pc_p (gdbarch)); gdb_assert (gdbarch_pc_regnum (gdbarch) >= 0); gdb_assert (!gdbarch_write_pc_p (gdbarch)); @@ -304,23 +326,16 @@ x86_windows_nat_target::store_one_register (const struct regcache *regcache, { gdb_assert (r >= 0); - char *context_ptr = x86_windows_process.with_context (th, [] (auto *context) + struct gdbarch *gdbarch = regcache->arch (); + i386_gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + char *context_offset + = x86_windows_process.with_context (th, [&] (auto *context) { gdb_assert (context->ContextFlags != 0); - return (char *) context; + return get_context_reg_ptr (context, r); }); - const int *mappings; -#ifdef __x86_64__ - if (!x86_windows_process.wow64_process) - mappings = amd64_mappings; - else -#endif - mappings = i386_mappings; - - struct gdbarch *gdbarch = regcache->arch (); - i386_gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); - /* GDB treats some registers as 32-bit, where they are in fact only 16 bits long. These cases must be handled specially to avoid overwriting other registers in the context. */ @@ -329,7 +344,7 @@ x86_windows_nat_target::store_one_register (const struct regcache *regcache, { gdb_byte bytes[4]; regcache->raw_collect (r, bytes); - memcpy (context_ptr + mappings[r], bytes, 2); + memcpy (context_offset, bytes, 2); } else if (r == I387_FOP_REGNUM (tdep)) { @@ -338,10 +353,10 @@ x86_windows_nat_target::store_one_register (const struct regcache *regcache, /* The value of FOP occupies the top two bytes in the context, so write the two low-order bytes from the cache into the appropriate spot. */ - memcpy (context_ptr + mappings[r] + 2, bytes, 2); + memcpy (context_offset + 2, bytes, 2); } else - regcache->raw_collect (r, context_ptr + mappings[r]); + regcache->raw_collect (r, context_offset); } /* See windows-nat.h. */ diff --git a/gdbserver/win32-i386-low.cc b/gdbserver/win32-i386-low.cc index 1aacd302074..b77f6adc6ed 100644 --- a/gdbserver/win32-i386-low.cc +++ b/gdbserver/win32-i386-low.cc @@ -473,22 +473,44 @@ is_segment_register (int r) return r >= I386_CS_REGNUM && r <= I386_GS_REGNUM; } -/* Fetch register from gdbserver regcache data. */ -static void -i386_fetch_inferior_register (struct regcache *regcache, - windows_thread_info *th, int r) +/* Get pointer to register R inside CONTEXT. */ + +template +static char * +get_context_reg_ptr (Context *context, int r) { const int *mappings; + int mappings_count; #ifdef __x86_64__ if (!windows_process.wow64_process) - mappings = amd64_mappings; + { + mappings = amd64_mappings; + mappings_count = sizeof (amd64_mappings) / sizeof (amd64_mappings[0]); + } else #endif - mappings = i386_mappings; + { + mappings = i386_mappings; + mappings_count = sizeof (i386_mappings) / sizeof (i386_mappings[0]); + } + + char *context_offset; + if (r < mappings_count) + context_offset = (char *) context + mappings[r]; + else + gdb_assert_not_reached ("invalid register number %d", r); + + return context_offset; +} +/* Fetch register from gdbserver regcache data. */ +static void +i386_fetch_inferior_register (struct regcache *regcache, + windows_thread_info *th, int r) +{ char *context_offset = windows_process.with_context (th, [&] (auto *context) { - return (char *) context + mappings[r]; + return get_context_reg_ptr (context, r); }); /* GDB treats some registers as 32-bit, where they are in fact only @@ -514,17 +536,9 @@ static void i386_store_inferior_register (struct regcache *regcache, windows_thread_info *th, int r) { - const int *mappings; -#ifdef __x86_64__ - if (!windows_process.wow64_process) - mappings = amd64_mappings; - else -#endif - mappings = i386_mappings; - char *context_offset = windows_process.with_context (th, [&] (auto *context) { - return (char *) context + mappings[r]; + return get_context_reg_ptr (context, r); }); /* GDB treats some registers as 32-bit, where they are in fact only -- 2.54.0