From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id 2dPwIfnzkmrKshAAWB0awg (envelope-from ) for ; Sat, 29 Aug 2026 11:00:09 -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=IGSbEMFa; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 86F231E166; Sat, 29 Aug 2026 11:00:09 -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 AD62F1E033 for ; Sat, 29 Aug 2026 11:00:08 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id CC5634B9DB6E for ; Sat, 29 Aug 2026 15:00:07 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org CC5634B9DB6E 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=IGSbEMFa 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 45A384BA2E37 for ; Sat, 29 Aug 2026 14:59:04 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 45A384BA2E37 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 45A384BA2E37 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=1788015544; cv=none; b=Uv92CaOTX/Ty4VO11HsSdsJxTRePOKgFqdgm/gqyf9oHTvy3bT6SiierBFcnp+Y1PEFzXiVltWkK+axIU9mPk/2PqnlZUUV4MrCtuekso3fEo2ed+w0ptYTxBSV2WIkhU239nLS9bu0ZHO7QPxzPTCQRO1HdsWmvZsA/wGjIAgM= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1788015544; c=relaxed/simple; bh=KzSFIzDMiBZu1U2ZsuJA1amaOBWCVndSElaOp+nzxeg=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=J86aFU5rR9UMfP+1hqj6KvDGikwzK2hxO08ZDrX30MwoxjUpm22y1RD/3LfFC2CyjkLjtcYyZdJ0PJNgQQPxSeoKqWytOCT8J2oryakLp0nOhNMPkxhXvzgWIJGgMjOkt1bPQ3FrLHoMz46qf88w3YXWThePpGOSq1kXSVxUOmw= 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=IGSbEMFa DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 45A384BA2E37 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.de; s=s2048; t=1788015543; bh=L7IF5p/MD3R10w5Uj8Te4W2LgWeyLTjgz/OBHbWg7ro=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=IGSbEMFaW885lOXKOf9bDNGvsbUe9vlZF2RJM014N5BzhZLru7aV3kbK4OvcnKTFVpwXCVj5elQ6nvZnBBlenqGWkmrF5/PVzwg1NoASMbwt2ktVyiNzmfkLTBN5nw7mOObR4Q/PisxYq5TSrVcwW9umwswnKU4HGDyn/2JGoYVWB/oNwQPev7JfOd7uSqSKWDspB9vfSWJQnmfSeRtWGr/qCJNY5qQTatdV8cPSb2KdsnjCv/xctGR5y49C/hO2e5gwBY+O1T8JoBk8w7AuwyCYBGgWgXkYLLwIrbIlAv0Yl6zTzdYXsk1WeU8Tv7BVR4iEOQrZlAkauGU/Hh/NlQ== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1788015543; bh=rd4sbo3yauXFMDE7uJCpc/85VygChZV49PCo6NHbFN3=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=FS0p/R9s0m+YH5rGCwEUfqZzcHcf7ZFqy402uJ90DsI0vQozAIeXm8oQF332GnG1fxILKqYV21YnDjaEWdCVI5e266R450UmJL81mAjsZa44hVVc6r4l2VWXL3LbzxtcQyrGDr1Qwsqh9ogQVnHKhczHw/mEb0D6omuS4C49/El9mH70uOTuEN1qZlgJnBYh/VOZE4sdGZPwEcN9H+rbU3z1KhRuQWIJeUb0Ep9ZrTGHrl7AFN/7o6j99M2B2iAj2fzniIsCAAs3LnJTu5ETjch5Uf33C6dNsi0GnkgDbJotyuts7yyK3eu2oLePfUQT0BSoqRsuXen0K4IuUqfpgQ== X-YMail-OSG: xE3QJGgVM1l.mROiS0QqVcyuDIppecOJgdnJjZ2gnDJrAlB5TSR6pkUPTVlyp66 lcQfmpJ8s2B5RjOQ1kUe5UoUHqjzSrdrtfJJt3zdJrQns.j0rgblnL0XzMh7zYbSjqApUMOiNQEv lvdJvYvi2XiCYAjYaVE_vFCJfp3u7tNxfMt7yZLMkHtzhzxK8HSVHAp.2AubnMxRqnFVDVj3ZwqO qHzdp7omjk4s8O3jX_dVCGaj9U_Dt00VFMR6HtoFZFb29y4zOUyjeF0s9dwge.vgoZkEePNpumDt inh96iazLguQLRqnAq3iNWmaop35blN4ookN9diIqH1wephbFLPEY7rdrDy_8_Ba4Uwm2iT58a5w pUqvst5ibZR9phpeYL4fqwdzvmXoivvLJdyjj5iEOGvaVAant_TE.cY7zm5CQ.lN8OqxH5XLdBzC 5LreS0UEPBvrsPt1B5nYUEZ1YqOMbXVf4kdPA5JOoA4JpUc5Sot.CDjDOw93GH5TQMU0_SUUVBw4 Dd97e7LWyXBdQsFxFLMWADb4ssO5_hUkiO3oBRYZMX09wzzgmVxeZyCg.BCAJw3nHdhJ6JHhtV_D gmBHU3G1IGBVCyMX_HJJks_RyQESF0PEHHiGRDiZYSnh3iwyTMtlCNqkaDOl1S72gz4Nm.nxXJ8J Msnfpm7Cd_t84.Q18Xj2jwm9r2WbuWV2Jm82YFMWxRx7Pg_6nbZaetQvwBFhjBQOCZVP5LAsBxbp zFCMuGgouS65j9zPzfEkb0Y7sjuPqiBQVe1AlOKbKSjhD5.aXel7W_mFZ5j22tInrzDehRqwBqxn NPH__N1d8jTaOLRdrZ_XR9hzcfQaAMsVFppx6GoHlmQbJMtrU7gvONqsIZrlFGgB_1fIxS.a_4uD 8DDl0Xj7_l0XhppV1ciZPTg737olx.jGXqbHSGFa26mzkiIvQS6nzPBUXQFM0Rz3SKc1XkakDYOc OnUU3mASeWlq64xg03gHnR9mx.XBlkXZcY2EgNkdR_57Qrk_T3hJWNTJRMw1mZEHqDDYXuTbAqES 7Wzt.MdhX59Ml6_6hJ1zVj14WIPd9hHMDQD0OS.pV2P5R6LlShuNgaZkiCyNX0wyl39ZBN7dYJzC KXe_dC_DYz2GYvfKbBZ.KYda.UusxUaWkSN7ww_dMnbHOfMVENM3GdLhduhyv3wCd0u1ykkgE9p8 2w.8iWrEqUfWHE1p0C.3mcMtjzn310Z5fs_mc6M0DbgWryZ3Tajsh_nHsFGfk8QMurf.a.sRYWcN z5XvjdsQh.GJE0heCqg5RJ22qKghDlCOjVcLWF9VMv5_...9jJ0o9HrFx6fWGNWwKAKvrErkNWM3 vNgdrukfXJLSHZTktbkAPiaiXXWeOf_Sc.VRsM9QLxFii2E7.FiRKME5COOY9IL2p7UfHnKISqie UfG3SflTFXYFu8FixMj8rpx1z8DtvaiEcRWTu3fdbrG9Z6qMfP7ScwyRdLGpj0Lj1iyRTrARCcyc sY67B_MPjnMPFf_8wHLAuwWyRTc0peOPjTse7zALgJrbGYg6_GVAmkaTsDP1G6ZEEPxwPlYjF7IB p6qD_0WaZpI.2fxNB.4bhPNjRXSpKoVGxRlye099GLvfZSBe.e07VBLVvfkIqJlyBpN0mJ3uj.ZP 8z_20_bO88mmBsCpJKWD83UYrKCM45vcnFtdF0jE6lTFZRtJu6nOojjP7tmiJd1ZGpOKAXXhZQHG eSGltfk6VBmjZihsqkEFVyeeBYWHPdKbDIx_qQpJXwu0k1lTzA0TyDf5vb4F7tvSimMAXo2fd2.L aMzgFixf8vG.g0xiyyDHwjckFNTYCdGJsS1nH37NgWuxi9d3DzGiKy04HralAvCutzOBty_OLh3G CuuhwB6OCx0tf_pqRT9.QK0dYhA1j8r76TlON2hNAJHLKOlpFVhyDm.sAo1pxpZMK_nxMBcfndKz oywbUqZKOrSxnVOGKW74UTaqXPmetk5BaUKja4kM_cnLiG8a7n.3_ox2T3IbvwOuUGOhxEcd9CEJ YOn3Uf41SXt2M4Yxxbz1e X-Sonic-MF: X-Sonic-ID: 827bde4a-9943-4333-b0af-9b5560c0871d Received: from sonic.gate.mail.ne1.yahoo.com by mail-asdoutdeli-p-cin-euwe4-prod-sonicconsumer-svc-101 with HTTP; Sat, 29 Aug 2026 14:59:03 +0000 Received: from dip114.lsn.ir2.yahoo.com ([87.248.99.123]) by hello (SMTP) with SMTP ID 13fd5a24ca42336c08dbbc03a4401a1b; Sat, 29 Aug 2026 14:59:00 +0000 (UTC) From: Hannes Domani To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH v3 4/8] Windows gdb: Refactor getting pointer to register inside context Date: Sat, 29 Aug 2026 16:49:01 +0200 Message-ID: <20260829145823.1034821-4-ssbssa@yahoo.de> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260829145823.1034821-1-ssbssa@yahoo.de> References: <20260829145823.1034821-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 --- 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