From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id Qda4OvknvWpG7h4AWB0awg (envelope-from ) for ; Wed, 30 Sep 2026 11:17:14 -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=FPFz6H4J; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id E6D221E051; Wed, 30 Sep 2026 11:17:13 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-2.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,RCVD_IN_VALIDITY_CERTIFIED_BLOCKED, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED 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 C4C671E01F for ; Wed, 30 Sep 2026 11:17:12 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 613974BB3BD5 for ; Wed, 30 Sep 2026 15:17:12 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 613974BB3BD5 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=FPFz6H4J Received: from sonic.asd.mail.yahoo.com (sonic-euwe4-0022.asd.mail.yahoo.com [34.2.86.21]) by sourceware.org (Postfix) with ESMTPS id 69D054BB3BDA for ; Wed, 30 Sep 2026 15:14:24 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 69D054BB3BDA 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 69D054BB3BDA Authentication-Results: sourceware.org; arc=none smtp.remote-ip=34.2.86.21 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1790781264; cv=none; b=pS9fkD0no9wZeUzxRhWiqbDTMogkyXuahjGD28TBLU31qrDPmd7G9oVXSWUxpFCm45Pk33aBJ3oKKVPEvQFdXvF33SNjC1Jpk+nF/HL55+7FMAoJs9h7zeTDf2WTJzVQp53plxpj3HzUMstwKGV3YkL9WfHv5WiFsTwqP+LkFoY= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1790781264; c=relaxed/simple; bh=swOIY624384QqVYxr6OZ4u7kADoqFSvGQXD6L71hQiI=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=NWNHGBgIeDhOVuK/GaupsKu14SLVJp3VDY6A3p1TYmtoH37QiHEXy3DZvdbASGAMmKIO8WAgaOoBqmZky78Z5LPoibkP203/NQ8e0E4NhUhIgUelq8xsLkuQOK6ZQeGQgTsfr5KnIeqrvsjn6uazei8Aerh9GYEN+3D2UXmjK4E= 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=FPFz6H4J DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 69D054BB3BDA DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.de; s=s2048; t=1790781259; bh=U5v4fzu4tTtYI+kfYM52LKxB2PzgAh93Ycxdzo62z/0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=FPFz6H4J7mxXErym/BZaCfPeIV4Ey3uGncQSUnQdKt19MNwsBBVNQgrLgXf2hu0nYJt+6/6Wmo+7Zt5POMidFjpxiTMbuWlpZlsZ21F6uQxUFH+3mpQexAs5vZsyK4BkwzDzvhwdm++G8ZwFSjuWyaZLdwP5oEcdk/GEEqtnVm4zSn1aBDtEZ8klLAXrbGWSa4LOOnzjR9XLJz/7X3GGlfzpIUFynVuWkicPcNLi12eLALDIjZxirXoS3So4fmHoe4nlxrLVNYbHvvK4Uzdm7LMviUqGChSmPgGiAbBFz3D0rdrGhoxJo/A4DVoR+BKLr2nfLS70uI9H1fVSA4QEhw== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1790781259; bh=1H84g7OcqKI6I+U4Y8guHkJ8rBxe1GKYD3wOMLpj3z7=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=fghpcx+v3JCfnjsfE7U+Wp3ClUggUM6W/I4R+ivOBw2ChqDUDTjSH7CzLpX5D54GA7SULabdLQMnw5zU8AuDmGLDvn2pPdyIrFcsGheQXnhwqUg99iQqOqzeUZQj3y90A+a0JZzrS4B7KLb+tJL+wd71RKJySOvQ9caxt5kxH4QNm5VfBs7UiGFL120ZYGlptlJ4vExO2htAqO+psUVGCq1FwUjBi1MP1g5HYe51T8Tgi1JAeWXS1KyfWSdiVOhc0NW0K5ELlCeYcXJYFuFbdNV14n0WR7ox2NCQ4UfskOzdyVAv0SFJyAZQtDZQ7xgkolkU1RSjGX6HveQ/wVk6QA== X-YMail-OSG: RohqK5EVM1lNSlayqdvREak8pbJW_3tnNABY8Ia4aGocvJx248VcI9BkxQKA_is GvbUGmrjioKkOnTNUx9mTW081HdUF.CWiRCNeGcgdz6zxcQr.GXUB8PycJ_rKvk.jRB58Az4moJi DRigAi2v69CwI0pbOh6yVP4Fx8SMNEDUauPdyXnXM1p.ohSnE1zrklSS0mX9KgHgFiu8wigCl1Qt 1lgf9uJLcSrq6M3eqJ73fxP.3VIhnba1tkWgjz4YDdahP95Z6Pkqd3u96G5H_iudQGKqaEMaIhJf atYOibHopoUIA4idr5kJ8sa.FONapczH8eMZEl7g9n8hoBcAsr3fXDHQO2Ejw6nVllCpXO5Azq6W v2EEqvxUxeCo7SXb3s2tvlzI9TqaserjzCPjUG_Tan1.BvN6uQdk8c13gNTzGLHwJDO0HRZMQRq8 XPW2vxa4RoUdmVfrzex5xW8pvMp1ztr_lpQvL0nvGValTGgdt_Zvjz8plEsXiQ9R5jWBrxvjBH_5 qj00d3N5PnZyS88BVQCFAtNwp.Mr_zy.qvyK4sByqicJH4xivrlurDPSYyVNZQB5PLRrLuj2alRm ZcmB4HRUUPiIDEgaBes.P5LTqQDXbNW1vlb3lTtgG9HxusOlsA83Z82rbQLmebkdPAo0Fsn1VfbV 0NPhNmbI6YGYoZqada9agcqjPG5cLqzv_his2Sqir8FROUoK.uCbKSrbBtDwccKktkE2pFPDuC19 AF4G1Sb7nA.kovVYHZXSnZb1sly_Zi2vvP71iAeDaI9Kwy1t1ZLfzWYdyGmd1ZKf3Vmcx93N7CQL 5LCKmFPQFsn_rFo8hiQoPHOMSkY1nq4WWp.O6AchbaSKpR4CxvDoPLm5y4pbFSf9iqnbbSeAFeyH 1Qz6PsZI8Kl.roYgpMWaqm7jDt8eXF7cEyrb3Y3mFMYDCBMQC4zGOFL4WYPpGVFG7COQVkrO1Ukl ybuw4S7k0jNF08PU9WKaR.oE50v2bml3sBfZITLh4VHGmwb3uxhYlKb74_Bw16NQuTH3PZil3rGG V3I8tvi9djdVIoaeItZxtHyxMeBA9bCQ2PTotJ7BDx5WI4ixX.Hc5BtEzPYhAR1mc9c687.3CrKG eXUnQCQk.C8.ypSv7BtvNMbyUQAsfWt9PZmGiOE80Ukxq.ZxTlHBISZlPhctVW7pzkQ.hYcuZyFk RscaBoZ6octRDmei7egXr2295wvQbL0.n5qopXE4PEgNzcb14HUW8CZJG74SqU6CXRx8sySyE9qj FIbk44siBqeNyEyShNXn.YIWKKkDcozCigJTt4wiubXdw7cd3kaKdK82rkz4zSLLC5GXY5smoQ0w kqJqDX4rZqG8qYb19Ky_b7a5VbSr9mosyrmlkD5Bl.QBypJ9hNMzWVIrLFEDiwKTsS5cCEKDKmAx NDilQP5_khUvzuYDFJpIj5zswWTRC3ayd0LOuhvRNLXhECdkrwdfVAHwKmuidMVX5iEE7Il788If GZ1c6wywF4cIJQqvoK1urfAzWq662xgf2Oy9wGQl4Uji1y3LAk0X3Dz8E9kWaeVpM6cRu3l_QbCO IoaoVMDLPonZmqqjM7bnPe_O_uJq0p7eYmhrQWUH.johnLoF3pr14KFcCFQ3Bp0.dl4_YjBGdHpi K05R.2HQxZA5sC.eBk2tmrvlUYOAu4.ZxNOe_yBfnm1DXFlSdcvslQB5AYiFR.7P0Yq_.2iEc1LN wqwoNV_cZ9B7RKyd4v179qAAXXRuwqgHqzmITCCr2Buze3MnbRKlpL2bQlJ_gkqq45odlh_ca3bs HyBscgHywwxcvfkCoEDnHsMnxCLNV3YURC5wVJLBRflkIIPhsP0uduFLyvKfGBZfIVlrEu5HkOLO QUpKfPXCtok4pdEt8bYKHGffjeeI8z6Zm1zov05vHdj_bicJ1JGuwMYsIPf7_1B2dztMsu9SJDsR zMwiYclg3Xerde.6Sab8d3gANKHCpvTnXODTIxhTukaW6evtzMO4jsZKypeGmtCcIDGyugo.aGGE zR0FA59Uje13fWgtkbvUy X-Sonic-MF: X-Sonic-ID: 6335beac-59df-469d-a5d2-cf667d116d3f Received: from sonic.gate.mail.ne1.yahoo.com by mail-asdoutdeli-p-cin-euwe4-prod-sonicconsumer-svc-101 with HTTP; Wed, 30 Sep 2026 15:14:19 +0000 Received: from dip115.lsn.ir2.yahoo.com ([87.248.99.124]) by hello (SMTP) with SMTP ID 15744020acab95e3749a115a097d285b; Wed, 30 Sep 2026 15:14:15 +0000 (UTC) From: Hannes Domani To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH v4 4/9] Windows gdb: Refactor getting pointer to register inside context Date: Wed, 30 Sep 2026 17:11:38 +0200 Message-ID: <20260930151403.774660-4-ssbssa@yahoo.de> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260930151403.774660-1-ssbssa@yahoo.de> References: <20260930151403.774660-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. Approved-By: Tom Tromey --- v3: no changes v4: no changes --- 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 e0e147856fb..2fb2e3abf2e 100644 --- a/gdb/windows-nat.h +++ b/gdb/windows-nat.h @@ -393,12 +393,18 @@ int i386_windows_segment_register_p (int regnum); /* context register offsets for x86. */ extern const int i386_mappings[]; +/* number of context register offsets 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 offsets 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.55.0