From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id UWkZKIh7U2pdNQQAWB0awg (envelope-from ) for ; Sun, 12 Jul 2026 07:33:28 -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=AIqZwz0c; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 9E8D91E098; Sun, 12 Jul 2026 07:33:28 -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 [38.145.34.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 BBD961E070 for ; Sun, 12 Jul 2026 07:33:27 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 5A9764BA2E13 for ; Sun, 12 Jul 2026 11:33:27 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 5A9764BA2E13 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=AIqZwz0c Received: from sonic306-19.consmr.mail.ir2.yahoo.com (sonic306-19.consmr.mail.ir2.yahoo.com [77.238.176.205]) by sourceware.org (Postfix) with ESMTPS id AB4EC4BA2E05 for ; Sun, 12 Jul 2026 11:32:50 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org AB4EC4BA2E05 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 AB4EC4BA2E05 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=77.238.176.205 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1783855970; cv=none; b=GYgjPIyObPMSVX54uObaTfpc/qm77lgdCS6OHsIjoCQJavJ7KEjn3tlvcc2yv3vH+SXpAKOaA6goJne/6/+HeWgHcVS0OwJLiX66itdf9la5OZCfCEJK7KclPP5UlpXxj2tC/QVsICsp0T8s7L5p3bHmMXiglcRBhK/XOiTQgII= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1783855970; c=relaxed/simple; bh=MjDCZKF86sUwZTFY//c7zEhF7HnuybV3EgixXdZ0Zlk=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=uFdxX6RRiMDLBOD4J37BLmNkun9yJBL4m8FFE/45dNvAgj3Y/3vElXfm288Vi6RTn3HwA0zUhOj47fny8+UEATrT7+EiTDrmj/0vAVwKIgWErp9JEl866SO+qUnK6DkP/45Oup/FJr9OUFB7GU6OR23jXAADjj3r0mI2CnsPdxY= 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=AIqZwz0c DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org AB4EC4BA2E05 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.de; s=s2048; t=1783855964; bh=DDvACBrA6BVyDhuGVwdE3LWjxrnF/0FEnuIVbxQPOLk=; h=From:To:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=AIqZwz0cWolVytWOGc3FjtHhrlDLS4jB+ePgjpRdc+PV4anHqYdFdgHao3lp0nY4DQEyhERpGNaGIBznCq970QQlB3yqLbuc2EwfN3pRzc0WTl3tDjmvnoQlUzDDDBrIobKLRm26YLO0W/JhvMHg02Rp5HS6XXhryB4og/YFu71age68P6vQL56/RWGy8yTuCkXfqdsB3LlCcYoASikqUJ8RclW5dUQ2m7tq9CuK0f1B+HuOrcq0CIGAz+fdFBB4WAocoHR1FhCyOjPsZhszaz3ifjQ3mjZuSM4R8ppP3pbULle6hNvs+IVp2nYrhjFBK03IDFt8QcnFONOzCHLKTA== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1783855964; bh=LIMnYbu/iQMvtcvMqC7K7M+PFYyaKxL0aM5VrBvvqxe=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=Swft2V+84YGEu4eM/LQgbBmipZL/datBAQepLDJwTM3W3G9sGX/g3TphjO9h32PNQi7L+K31D934CE+HMl1q3yyRXP6oxnef2OzdfzzP+rcOZbQhR567t3lbkpYCoKJnNwZeGVsCokN92MwrSkm3LJNRy5HsVrElWlZ+VXfSLU8FlCQrSfCDgLfY0/WIwmUspWlv1QDUhipLZRx75gVHPx/AJjocjWbJwpYZTh5fxS+HF0MZGZkl9i+60OzY9+bxsCu9gVIO2Kvs1BKXXMIpxI/x37RxmnI36KqBhcqvX1HFTAq5929LZpBxCcBlco82ie0REtrynEU0coBRQWa8IQ== X-YMail-OSG: HiMHWmYVM1mSKfNPp2S.xp1AG6yEQgSONTTs3PUxhVaQx08TaDv8a_2_oiJaGcc ulF1wGChjl2RqTSovjwNlOj6cDV314akLbOdL7FeYv1GHrG6cJud9XKJ3kSQkGL19usuirRT.I1M A28BOMbvfzQhCRnKWOlOwl2PdXKayZTC5bBTa4Hhqoyy.ucfTCeesehroxefmW1BLqGN8wAQ3EoM nKLavc2EwemGQHNE0s9u88KSh8UXaJRBLILYoX9d.9RWgnBZRkNM1y0o0awtn_8xH3dZIRgDSMmb T6f1DF0GYpG5W4Wu4pNr74xHsyRG_RhL9UP8cYLshFwCF81artuBw2v_I53DqiwteYpMrB47EjgB wF8VZqZ52GvWUQTaoLasyj2u5vEtZ58rrcK2rM86sJaAt6frxKgVGtV9JpIQQkZNogAgUMnAiIsN w939wN4DWSTQoCoBpeRHfOP7ThXWoI_BlVGjTTNh_QeBTUCA5Iu0Fe5LeZDQ.S3Pt2bKp72QlIny 2Jbf3TKj1TznBZ_32PoDBLlcroFZbNBWjdAfcqQUIhLwjzDwp8Z1KGJudq6zzCZXuTORD0QJoV9w ybH_Sl2qZiCURE65geumy4JgtBiCL_NtIyqMi92hQqzz4cBxa46qQ1BE0y097yiiOcrJmyUSSSQd tNZ8Zc8CIeVDTrvm_FRosDnyqCVKkXp3YnyPqSW9tWSrGb7W7aaVuB678vjdUFOVqqmpeOi3ryI8 h_UI4IctJ5T13rTefRFvd9PASE14YC547Yq9_7N29TpXyhE3f76i8aSVgn7tCgKrRM7Afx_VHBC7 ikmrvwwvFvCmBoOPRcRrhhy2kiXYQx4AMUBcXWE0dnVBgVUw1rUtegpCK02EnKITqbE.WQqjFl16 wGnIsBoeuzCIaBUR0mGExGe93kJIFt7nb2J1HLBKaOs15148sUinumExbJMfbaBSdQO4tII9OhF2 N1dwE0hbNMyofG2AyiPaN74EahREYpqqD8FYNZ5gF4jQ_qfkMLubFRwYkA7_KT2r1ov.w_MI08LK m09yRbfm7bJ6QP4iMufb40fis0PdNCfx5nqxCjBYZcexid._ir4gogtYISzpB0PMQfEOHYeyuUg1 fDlML04ofoIfBhbjI404xeAEWQdi0yKjrRz.B9_jnkPDWXzpsmrRA0qJ_J1Wq3yti3e1taAxacCf .hOMqn2p6QWbNJ8K4z2qlqYNfNwS2iX1zcOyJkSjmomgyE_IwZyOqNEPozXSTiGiQNG2A9j.xX9j h0OGE0TZbGmvBjdFtLxbFZFu.PdQYi19.Jlo_gIql0N3dzLP1xJTKmUhQgGau8znQo46bR_Cs4dQ zSQeibkeqjKdhnPbIlbfwxJ_UPnNgZR4POfGKoDQdHpPSRcIl8cALbKYrn1MOuYV_7sWGWyZgVvF 8Lyzr9zrmumSws0Lm1wcAYFciONouLBhRMSKyE18l0mQqigi1R3NJzBEWDs6PfVH6KkfMdm4zXsx gW1Ph6Caex3RIXRnQpgOCv8mjinKZ5iAgVt9EdAWer3A_.1SGxfaMDY3KC.rrObpyj2UNQ2ztPdA Jbf.8unMqLBwojfZmww9Llflb3R.fivo7MAV.5S0jwxIPuLwnC83lECHE6i0JgF.BX3Bccq45hq6 OL85_67t5iw04FLP.MIPfdgJLb0W3WcVpoDt9yzsjPcS5fSRj_XxzMYKxv_fKLSoW24agKAgbGQt 21Srr76jj9o8CGxG7agDInOnobiVWT_j9M9P6FCPPOUnUnQwRWP86X_ilFUgZRdlk2f44RUKbBZk 8_2w.5eC5PmS36wK80N9ba5MLFnjZZLK7hrtV59IJMg7IDVjNKJE9y_1Rb6YDHFfcIEqnS1WHWwc uyxfdJ6JFMOU50y5DO5aKBXgvmGuB5SLhyEeIO77xujFss4ogxC9hYEVXtXJxoDV.nyqAJq6wQWX rENdAoFpbvvDKV34ImZuKc_7Sb2KJIE8h3jjIZIIJU3cjHHhL8f2wEza7OtsDFlriC748FhCCQnl Bx4uelLQC8jVI6LwGnc13ptyH24D2rXhKuXqz8ZX_bJM5etiDABE7pkpgbeYZrx3TqXy9rEKWKGW gWDo190gqXuxWoOQMrOVBt6vIXKkXa3vTvIZ.jU6mkCsOgJMCZp.d7SdlOAaa1doevnQJPEC9XcR 41ofqxcg7yY3o70RGXqnkrAjaUTonpALBspgUswZdizW.oxdNzUTf35SnJSGdiKi1MFoj_GXECcC 276N3BmzRe9uU3Sm5N3vamss- X-Sonic-MF: X-Sonic-ID: b1ae9a62-17dc-436a-931a-d94b2e219989 Received: from sonic.gate.mail.ne1.yahoo.com by sonic306.consmr.mail.ir2.yahoo.com with HTTP; Sun, 12 Jul 2026 11:32:44 +0000 Received: by hermes--production-ir2-7b48fcd765-7kk6w (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 8f842386f7843a8cccfcf644a1266621; Sun, 12 Jul 2026 11:32:39 +0000 (UTC) From: Hannes Domani To: gdb-patches@sourceware.org Subject: [PATCH 4/8] Windows gdb: Refactor getting pointer to register inside context Date: Sun, 12 Jul 2026 13:32:25 +0200 Message-ID: <20260712113229.3695246-4-ssbssa@yahoo.de> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260712113229.3695246-1-ssbssa@yahoo.de> References: <20260712113229.3695246-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 d52d82c422e..492f0f7cd14 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 45f3872add6..065c551298e 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