From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id 4cS7MIF7U2pdNQQAWB0awg (envelope-from ) for ; Sun, 12 Jul 2026 07:33:21 -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=JZoDLgFw; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id C34561E098; Sun, 12 Jul 2026 07:33:21 -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 1F2871E070 for ; Sun, 12 Jul 2026 07:33:21 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id ADB154BA2E14 for ; Sun, 12 Jul 2026 11:33:20 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org ADB154BA2E14 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=JZoDLgFw Received: from sonic311-30.consmr.mail.ir2.yahoo.com (sonic311-30.consmr.mail.ir2.yahoo.com [77.238.176.162]) by sourceware.org (Postfix) with ESMTPS id B1A494BA2E0D for ; Sun, 12 Jul 2026 11:32:50 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org B1A494BA2E0D 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 B1A494BA2E0D Authentication-Results: sourceware.org; arc=none smtp.remote-ip=77.238.176.162 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1783855970; cv=none; b=GCcNsX1SwJC47vVJW7stTaQ0LA/zm7Hd6zArOSxZgOimu/OXsZqaeawigWwIQ6sfKYqpxDvn64JVjgK6+PJFoMf5+DgCaukDJumZOvVBrzh7Z11g1blHDnJ8Xi0YiGaVPB4l0e9Dwy7KHfd/nd4X0+kKWHS56DB5Ut1mhevsWrg= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1783855970; c=relaxed/simple; bh=TBuEPrqb7yoU9oJH9ZY9vhUEoaPT8tQJJmpAaz+/cI0=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=yEyOwFm4UaXeaKxnXRbIXQKeLos7f5+uOs7KWNz3bQb2eFEku+/+ygdbXt6GH/6x86NIbOS6pFOQnlBjw9pfTEweCUxfO99wij61RjOwTBr77S7bEJcJSAQWp3ZCSNgK6tlg2LjHX/hXzKGWHGpgj1EYAk2CNIlstJxlL5j8Vjg= 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=JZoDLgFw DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B1A494BA2E0D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.de; s=s2048; t=1783855966; bh=pP21bmlsnEiOHOEtt3F6rL65kKCiugjoBUZyZUpvFwY=; h=From:To:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=JZoDLgFwxLHn97Ihb0ffmUAE2NJcyfRNJvgU33whrRL/9utfxbpAoWlBhEzvOikGaPwlcUk6CiNRcaAeDK/yH686WVc+xKvnTHaypibXphg6N9iWM9Wy/fHF0F9/v312S0NACeMidPMrJZthOSFYYX/SYS7vqWkMlET/hrq+85HOm4Yhd0L3zH8NfmtsOiGNMb8bOf5x+WpHysBbyTK5ZgB98hqLRBVbK3bJN7390rLwnxd+knI4Daq+OnUMqmEdG1AJfMP4KCI3igBGy6LCS6/oDR83JvI6+kXAkeD6LvMlcSn3NW+19AWQjC69bLixZojdZsTuiEo+zxOYUSumKA== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1783855966; bh=jw93Nf2cbBHXa6KqOSZXvoaFyZYLvm0HqAnJ149g8Hu=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=f/2+J80I7k5pAAdfX83ZmjPA1rUheOtu+2BpHW1QOASkJ2Ep/nvSJQXUh1+VjMgiDsiDFegzZjx1f2jvpXcno6RZr0N2Mvqhdbh/BSkSIOk+0TRxp0/GmYoqqdrlL5AnND/CPUe5iUXMNjolPtjSxvj2+Oz4XoVnbIHIFGCtCyjjs4KvQJc7pkN4++q6fa+BrJL5DxlE8bQHr7vkVzXQmE+vt/laBNA/ycsAVHyCuYW2pT1HgplPk/KW/akeUsj3QNBp54HoPZraeO7O1KeBujJjQk2+t4Insny56vecF6Ubn0YGu+p+17/MQA7JNXucznPU27zJhmbZW5pVxCX2BQ== X-YMail-OSG: EMRg__AVM1l.S44plo6n1KvoSOInkfKSMYf9uenOYS1WrzM4jAS17VY..xGkBQV KqnhxVjwZG8wrD9mUp9MiUtHQ914rn5utDv8PabbIi207JbMT_Z589hIcm9uDnYIsGcdfYSTS7aI BGKiPO6VEBcTKuLOpede3XX0IzfZR0bNEllP6KvlvLnwM4F3qcakobzvvaG2Uklv6tPmDOKu_tbf m74FV34746pDnIZgwTqsFhcWT4iAoWkpFmt5JIQfHJbt_fNHvnSbfs2_WAHp0UfYgR1TqF8KHtLA 8rEiAY9XhN_7U7bpWha5xpEhejbQTbL1mP9NoyEF7FlA0h.wqMKxMVdoM58w7SxQSl4tWfDkzNzJ junfx1B5TQ9tbmDM3j8ZzncW28cit9_S3je3FdFI.TZxJ7r4Cdn6FR7tBKM_9HRJZUpg6aQx9QsM OmDSugR6QPQbdKkZ2iBRxFsHNRj2LSlL_c_5mlnAi79rr3elDV7CRFcsJN4TTIlSHMEB6vduH4QB URz8z2fdB8bBTwXDzxDFySmn9b6e4S9I9uiZhLDtZZGS6bdevqJNRVfs44NPufouofs5swGHou7r VbkoaT7jfM5UjtlIJfua1BaGYB0_qXdwrh297H3yv38VFgJ2G0BjUl9S1j0_JPhRTBdeFbyyogxJ h84WR2E3DoRlODrtq1aGc58Fise7JTNFs1xON_mES8zLZtKjH6YKM8dPeopQ43Qbn79GK_T_cOCw nnFxfcm8pL5g9WRU46WKGg3rE8AQOAI9ehRyPv_5n3arL0sb.BMJnCXZSTcQXqg0y5bqYaenhThq 6PTybEI.ubI0OXr780SKTf0Wx2KNKKqThqJP4FLv2xjQAUqfVV.AoTuDoClg8rc9816rn.TlcFZq rUChwOEMMZw0dJ1llTfjq8zyLYlpprHaYB5KqYAN7r_9PSVxq3PnDcjCZe4heqKqX.n8AFtLKwcB ymG79kGftwfZU_Rcrp7cknBOGAfwhbw8i6nefrbCifELBFq1c6bvxAGW4VUokS2p7yPcTiR.ooCJ mJ.qgN9NT4VKVjC9rDJRohUXLKWo8DkIfTLt7Q3wRREPDJZNdkd7W4MGyz9aUR01MZgOCO8mJkRz pRRblEXDZFTktBvF5ph4GjMZIL5w7GvNGwiTPySFTv8pbnL6Fr1yMByS7OBPFIqJIMJ7mU8o7__s aO2QomqGRAuxlV0ws2heLM0BNBpokR3zvjs4ORLahym6SjHK2NjEM9PftIcCMRdssrqmPkoQPhqd 2rIxdrLMbKZaSeImXg1mPsIZ_F5qpYGZ_0vgb6dq6Hig36JgfPvflKzT5IKwjvHN.qVV0QDT679A 3qAMugGOVK.OC807jIvzSwyFa8MAvIZO5uYEo3T3l9YkMvnWKnOFAFMOJGt.5CeStQK55tbT.hzF Acls36qRFO.6HuHTcyA4CC.EPucvux4FKLXPKDWvIrHDm_.tKVzlpS.0klufAkJPFSsBcYLeD9oS 1jre0Zt_g.p8ZAvZZOuE5qHFyyu7j8wpM3uT_M8zz4WvWVC38H..mqP4EkhGNityv6bUBviiRb00 ZlfBsoljfu7pwaQr48HP_ioNEBbWd1Of7AEuc4L7E8ytKtDqqukH12BoSzFaEmgbySACByhegRk3 R2udWe_uEeglXx7bIsGqAjnWsR9ljabPa1Acy2i4EI5WpcL2_XEoxbl1SDjRkvMZ_RSN.vupPn2o 1lZevTxyUF90UW_b3k9NJI0B2QW1shmdmtmyjTqrLNsP038l1lwvlt0w.WRazykpJXep8.OCmK0j rkOqUWhbYp1vmcUafhT5vRszVRoMR0Efpl_5kYGNEoaYaxXAoWdzSa_8y4uUErNbFO1yaXXDZrF8 MWw1J66sjp9toIvDRfhnxh5CU8Amnfl_vI.V0_4cxlDNBJ18Ffa1eTCDVBOHo5T07suBPvC1FZwt AqpfNSK8lyHGL97WBjU1RGk.XViDYBsIhMquIGc5VHd6D.TEtvQwStdKObMvE9lFKuD7lMBRMYoC fhF9uREVKoSHMCS__VKzx2tkeDYxda5RJ539DjxvaDgtLrkTL9Y_dc9w3IF13Dlp45Et7jwpImuG dJDcAVYkZ7XjjgCmykYJCnB9YWlC4THiDRjF3K1WP53j98MD2Q8Ixj7c5WDpQ.SPzfTRLKHbRMA0 UjbyCww0cB61VR1bmDpy8kCkep2o679Ox7bhEfAd29Rz8t56iwk7PdbzqvTujUPTV558RVQB.DcG vglqk.2mBHKEL8HP4oik43yQ- X-Sonic-MF: X-Sonic-ID: ebc2bf6f-73ee-4b76-a47d-16a9de911c81 Received: from sonic.gate.mail.ne1.yahoo.com by sonic311.consmr.mail.ir2.yahoo.com with HTTP; Sun, 12 Jul 2026 11:32:46 +0000 Received: by hermes--production-ir2-7b48fcd765-7kk6w (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 8f842386f7843a8cccfcf644a1266621; Sun, 12 Jul 2026 11:32:41 +0000 (UTC) From: Hannes Domani To: gdb-patches@sourceware.org Subject: [PATCH 8/8] Windows gdbserver: Implement XState (Intel AVX) support Date: Sun, 12 Jul 2026 13:32:29 +0200 Message-ID: <20260712113229.3695246-8-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 --- gdbserver/win32-i386-low.cc | 120 ++++++++++++++++++++++++++++++++++-- gdbserver/win32-low.cc | 15 +++-- 2 files changed, 124 insertions(+), 11 deletions(-) diff --git a/gdbserver/win32-i386-low.cc b/gdbserver/win32-i386-low.cc index b77f6adc6ed..212081e0170 100644 --- a/gdbserver/win32-i386-low.cc +++ b/gdbserver/win32-i386-low.cc @@ -253,6 +253,11 @@ i386_get_thread_context (windows_thread_info *th) | WindowsContext::floating | WindowsContext::debug | extended_registers); + if (xstate_features != 0) + { + context->ContextFlags |= CONTEXT_XSTATE_FLAG; + set_xstate_features_mask (context, xstate_features); + } BOOL ret = get_thread_context (th->h, context); if (!ret) @@ -267,6 +272,24 @@ i386_get_thread_context (windows_thread_info *th) error (_("GetThreadContext failure %ld\n"), (long) e); } + + DWORD64 features = 0; + if (xstate_features != 0 + && get_xstate_features_mask (context, &features)) + { + DWORD64 zeroed_features = xstate_features & ~features; + for (int f = X86_XSTATE_AVX_ID; f <= X86_XSTATE_CET_U_ID; f++) + { + DWORD64 flag = 1ULL << f; + if ((zeroed_features & flag) != 0) + { + DWORD size = 0; + void *loc = locate_xstate_feature (context, f, &size); + if (loc != nullptr && size > 0) + memset (loc, 0, size); + } + } + } }); } @@ -292,6 +315,17 @@ i386_prepare_to_resume (windows_thread_info *th) th->debug_registers_changed = false; } + + windows_process.with_context (th, [&] (auto *context) + { + DWORD debug_registers = WindowsContext::debug; + if (xstate_features != 0 + && (context->ContextFlags & ~debug_registers) != 0) + { + context->ContextFlags |= CONTEXT_XSTATE_FLAG; + set_xstate_features_mask (context, xstate_features); + } + }); } static void @@ -477,7 +511,7 @@ is_segment_register (int r) template static char * -get_context_reg_ptr (Context *context, int r) +get_context_reg_ptr (Context *context, int r, const target_desc *tdesc) { const int *mappings; int mappings_count; @@ -494,9 +528,80 @@ get_context_reg_ptr (Context *context, int r) mappings_count = sizeof (i386_mappings) / sizeof (i386_mappings[0]); } + bool amd64 = register_size (tdesc, 0) == 8; + int pkru_regnum, ymm0h_regnum, zmm0h_regnum, k0_regnum; + int xmm16_regnum, ymm16h_regnum, zmm16h_regnum; + const int num_pkeys_registers = 1; + const int num_xmm_registers = amd64 ? 16 : 8; + const int num_zmm_high_registers = amd64 ? 16 : 0; + const int num_avx512_k_registers = 8; + char *context_offset; if (r < mappings_count) context_offset = (char *) context + mappings[r]; + else if ((xstate_features & X86_XSTATE_PKRU) != 0 + && r >= (pkru_regnum = find_regno (tdesc, "pkru")) + && r < pkru_regnum + num_pkeys_registers) + { + context_offset = (char *) locate_xstate_feature + (context, X86_XSTATE_PKRU_ID, NULL); + context_offset += 8 * (r - pkru_regnum); + } + else if ((xstate_features & X86_XSTATE_ZMM_H) != 0 + && r >= (zmm0h_regnum = find_regno (tdesc, "zmm0h")) + && r < zmm0h_regnum + num_xmm_registers) + { + context_offset = (char *) locate_xstate_feature + (context, X86_XSTATE_ZMM_H_ID, NULL); + context_offset += 32 * (r - zmm0h_regnum); + } + else if ((xstate_features & X86_XSTATE_ZMM) != 0 + && num_zmm_high_registers != 0 + && r >= (zmm16h_regnum = find_regno (tdesc, "zmm16h")) + && r < zmm16h_regnum + num_zmm_high_registers) + { + context_offset = (char *) locate_xstate_feature + (context, X86_XSTATE_ZMM_ID, NULL); + context_offset += 32 + 64 * (r - zmm16h_regnum); + } + else if ((xstate_features & X86_XSTATE_K) != 0 + && r >= (k0_regnum = find_regno (tdesc, "k0")) + && r < k0_regnum + num_avx512_k_registers) + { + context_offset = (char *) locate_xstate_feature + (context, X86_XSTATE_K_ID, NULL); + context_offset += 8 * (r - k0_regnum); + } + else if ((xstate_features & X86_XSTATE_ZMM) != 0 + && num_zmm_high_registers != 0 + && r >= (ymm16h_regnum = find_regno (tdesc, "ymm16h")) + && r < ymm16h_regnum + num_zmm_high_registers) + { + context_offset = (char *) locate_xstate_feature + (context, X86_XSTATE_ZMM_ID, NULL); + context_offset += 16 + 64 * (r - ymm16h_regnum); + } + else if ((xstate_features & X86_XSTATE_ZMM) != 0 + && num_zmm_high_registers != 0 + && r >= (xmm16_regnum = find_regno (tdesc, "xmm16")) + && r < xmm16_regnum + num_zmm_high_registers) + { + context_offset = (char *) locate_xstate_feature + (context, X86_XSTATE_ZMM_ID, NULL); + context_offset += 64 * (r - xmm16_regnum); + } + else if ((xstate_features & X86_XSTATE_AVX) != 0 + && r >= (ymm0h_regnum = find_regno (tdesc, "ymm0h")) + && r < ymm0h_regnum + num_xmm_registers) + { + context_offset = (char *) locate_xstate_feature + (context, X86_XSTATE_AVX_ID, NULL); + context_offset += 16 * (r - ymm0h_regnum); + } + else if ((xstate_features & X86_XSTATE_CET_U) != 0 + && r == find_regno (tdesc, "pl3_ssp")) + context_offset = (char *) locate_xstate_feature + (context, X86_XSTATE_CET_U_ID, NULL); else gdb_assert_not_reached ("invalid register number %d", r); @@ -510,7 +615,7 @@ i386_fetch_inferior_register (struct regcache *regcache, { char *context_offset = windows_process.with_context (th, [&] (auto *context) { - return get_context_reg_ptr (context, r); + return get_context_reg_ptr (context, r, regcache->tdesc); }); /* GDB treats some registers as 32-bit, where they are in fact only @@ -538,7 +643,7 @@ i386_store_inferior_register (struct regcache *regcache, { char *context_offset = windows_process.with_context (th, [&] (auto *context) { - return get_context_reg_ptr (context, r); + return get_context_reg_ptr (context, r, regcache->tdesc); }); /* GDB treats some registers as 32-bit, where they are in fact only @@ -571,14 +676,17 @@ i386_arch_setup (void) { target_desc_up tdesc; + DWORD64 xcr0 = xstate_features; + if (xcr0 == 0) + xcr0 = X86_XSTATE_SSE_MASK; + #ifdef __x86_64__ - tdesc = amd64_create_target_description (X86_XSTATE_SSE_MASK, false, - false, false); + tdesc = amd64_create_target_description (xcr0, false, false, false); init_target_desc (tdesc.get (), amd64_expedite_regs, WINDOWS_OSABI); win32_tdesc = std::move (tdesc); #endif - tdesc = i386_create_target_description (X86_XSTATE_SSE_MASK, false, false); + tdesc = i386_create_target_description (xcr0, false, false); init_target_desc (tdesc.get (), i386_expedite_regs, WINDOWS_OSABI); #ifdef __x86_64__ wow64_win32_tdesc = std::move (tdesc); diff --git a/gdbserver/win32-low.cc b/gdbserver/win32-low.cc index 3d85faf0785..ea5b6f8900e 100644 --- a/gdbserver/win32-low.cc +++ b/gdbserver/win32-low.cc @@ -33,6 +33,7 @@ #include #include "gdbsupport/gdb_tilde_expand.h" #include "gdbsupport/common-inferior.h" +#include "tdesc.h" using namespace windows_nat; @@ -427,8 +428,9 @@ child_fetch_inferior_registers (struct regcache *regcache, int r) int regno; windows_thread_info *th = windows_process.find_thread (current_thread->id); win32_require_context (th); - if (r == -1 || r > NUM_REGS) - child_fetch_inferior_registers (regcache, NUM_REGS); + if (r == -1) + child_fetch_inferior_registers (regcache, + regcache->tdesc->reg_defs.size ()); else for (regno = 0; regno < r; regno++) (*the_low_target.fetch_inferior_register) (regcache, th, regno); @@ -442,8 +444,9 @@ child_store_inferior_registers (struct regcache *regcache, int r) int regno; windows_thread_info *th = windows_process.find_thread (current_thread->id); win32_require_context (th); - if (r == -1 || r == 0 || r > NUM_REGS) - child_store_inferior_registers (regcache, NUM_REGS); + if (r == -1) + child_store_inferior_registers (regcache, + regcache->tdesc->reg_defs.size ()); else for (regno = 0; regno < r; regno++) (*the_low_target.store_inferior_register) (regcache, th, regno); @@ -1350,7 +1353,9 @@ void initialize_low (void) { set_target_ops (&the_win32_target); - the_low_target.arch_setup (); initialize_loadable (); + /* Has to be done after initialize_loadable, because it uses the xstate + functions if available. */ + the_low_target.arch_setup (); } -- 2.54.0