From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id efqKIAqaZ2o+eTAAWB0awg (envelope-from ) for ; Mon, 27 Jul 2026 13:48:58 -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=CU4e07cT; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 80E401E033; Mon, 27 Jul 2026 13:48:58 -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 9C3C61E033 for ; Mon, 27 Jul 2026 13:48:57 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 7F2474BA9000 for ; Mon, 27 Jul 2026 17:48:56 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 7F2474BA9000 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=CU4e07cT Received: from sonic302-21.consmr.mail.ir2.yahoo.com (sonic302-21.consmr.mail.ir2.yahoo.com [87.248.110.84]) by sourceware.org (Postfix) with ESMTPS id 720E54BA901F for ; Mon, 27 Jul 2026 17:46:31 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 720E54BA901F 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 720E54BA901F Authentication-Results: sourceware.org; arc=none smtp.remote-ip=87.248.110.84 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1785174391; cv=none; b=iNc7qhwyklM+MTujrAJ357jBTh7LpgVRGC6G1uzXQ+iSQF4JztIm67ZMup4pRExR4qCrRSDux6os5enz2u/aJynIU6IeoifN++0ys+FN5S/6FQ0VDvOtGaOtBZ8Ad8Nf20/Qpep+fMeI3+6HvqzIAugFlEN/qWs+XwREl5Cc+ww= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1785174391; c=relaxed/simple; bh=YX5/3zgp8jLEdmQHTBw3vXTFIxGKwP0wJY9Eq/eEQrw=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=b7Qn1Ln0IduC3HstuP6b78rh8CIAhu9wmMry6Psdqvc8Z7pZi60lE6lE4L1F5WMPaWL4RV6zL36JbodrwqZdqxawc5rXgCWVyWWWI5/HjFJGrCECalNeKNVjBoxq5UY4kLxTx9uPQpjvR8CViAe3WZZWk8SmLEcPth5TOEkLsoc= 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=CU4e07cT DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 720E54BA901F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.de; s=s2048; t=1785174390; bh=PfPrTbMbRG7H1XzmUD5wnPj4rgmB3mDhaD8igPOnF4E=; h=From:To:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=CU4e07cTo/e7WXGyxKnLWh0NqENU62OjOmD5WQ1Cc6qfDZNYbulDcHcr1nZIBjbjFKGGhamF/ZAFeR9VFieu8gcfdckBJMaeqCGvwUvAQUbzxBGxSyfrX7LHcLwfHhFTCVxj9GOhzzWSx5D3253vBU/YBdoqlIwTdt3xsOx+Yag0cregQAfhk+gBSbgSg8pLK0JgjctnMIJtDHplNptvj681TW9p0sgyE2WmQ6YRLvs4HPGjGQKtT/D56L7XQ2vGbaXWVcvzc5IuFgwVa2JDe1MnN+IU96RugBPE/Bs5xT+oPMmldBra5aofWlWCAd1pi27HywyQ1m+P6o1LhAxwXA== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1785174390; bh=IFW+vngDIBtaWsAAHPRthkqI63sNWmPdjMhSlePIaUO=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=tulUgF7rS2J85i9OhALzJZnAqBofY0VIsHlP+meOfz1jaV/sfh4VGva2gV/dGWqEOET8aDoVmDFs0x4KF7GfOVMUpVX8nLHiB6DendpQ9p8rey5Y76c3bEIcmbdxpUFbUnxFH2/FZVHYkBEe2v+0W0uGykRdDx8Hch8s1LN9HasDpqthDFKkpviNKUMuqYjYqj6QlGNqG7QaMXtKTRPPdVhT1Pz7aLV9dpNITJd5dHKYCBsAq5bUVMT2ztM2hY2HY3g8TxkD5ecSA4NmGejOLFG+H5rp2IeogHBLZ4nSWfkf4gSHU3LLTkX5HsxGRFGxlBqR32KQp/LFoNhWpDOKnw== X-YMail-OSG: ynX5VoUVM1kwU8AiiJjtD8eIGWl5tpkEQRG.eqGocvY_vluerVFv57c.G2yrGtp rQ5zOXDtlpjgmHuHnFlO5U9ccfQLBxdiwO3p6m4ZOypdV5Annrx7lQpf69J8LTRVrTfQVVdeTnJI TjnaUAFGfrQgvWjBobsKWOQ7dEUlPEld.yviigtdQnydnjrGriHZpJ2E7S_f1b7chrCNaiL9gOaB KsDzq1YftUxg6uqgU.stPpDRBLCjRt0tdr51hPm3Q191.pXRPB9ANhfUifkyGSQizskArWuVQecT ojfnd_4seBmzxK4lUhWYG1ozPbKokiBI6f2kJvEYZ7g5SK.ZJvsc.ORga_YsI.bXowD30CKlzLRX TBzD8aY3Sa6ErqFqVodzC0fl.FISWbkYBf2JK2Tt9Vo7VyeGM4U9Txhdv4_XmKgYuW8fQIEBnZv2 w0Z2DitltR3Wl2BI1WN_qfB4EjaFIfZc.7O7w5m97Jbic3C8Sir5PR1mUbefRaw6M6yi2Abo8wZN FmQHoVwUPY_zgM7KHLMMmelOMtD8TIrKXUVIAnmdoAgwqUxi5d3bO6u6k_DP.f0c3dKQENGyUh_g qMbB12VuvAXWKaN9Cwo7.rt1iUswPKt4FR0e9zGa7YIh3goU3kuepH_eMVn1VhMZlmXJsKCwnSQ2 Q2YqRaacZXZAn2U1Qv.GaigAreulgmfYAQFGsVokKdHO3pT.0Z6P9A7fXpMesjJPLCNiAhO2bJM_ XsHIXPHP1T7mSJq2R3EKVycSTnoIetv.Nqxo5rtkCZkkSVEfREt4pCbPjA3FMz6fyxtp2V.8kEky CMt_nU0C6NjvtvQYFi53HCbFn.gaeHnoicjlweRIodVZ_no_4yRTbJqcuWt7SeIzEK7QMUG26rvk PROeO5dRpqF8iBDv5j7WR8tn.UUuvoCzNCRw0oyEpplYU.jAdXh22V2j1fRA3El8Y6pgYRyvQ.9J zukP1ZUKz04v_rbz4V0LM1D7mKjCLK8vUmJt4oEfagCcZYQyFDj7_zP7XZp.U06O1Q_0LpDxyeYy Pl6xYnGOQkYYiAdX_vyAqFirGd82Kl1GZrYhRz2O6EQcVHhC6QcpeBhMijhWHDD167vaQSrRER2H dMhcaM.F01bPzcGISuWrSFhad6yC3LvS4w7dRUdd2J28.SLfRyRZGh6bPn2y_ZAc9z.lAy7NyoOU vdvQKlFXQxxYvzvemQNGarq62lieHNVEKEvuJTWWRrhSySWpfpyJGZ4c_IqaTgLqoQkbmF_L61vD N_393m4TOJaMzCk_uSJYuHWrtwPk1CcIzL5Plnkhr9QCla5fSs_YOaGLdpbrNoffnbjHidHnk9J7 w7uQyFyehtBWhAf08R2I.XBvVPisxwZTZ1BjMLu7lQMKXAbSt6jUSP5KDYlKxDeSFau9cVt2gJcC oEJuQU_o2dXMrMawqabFRQJwRokud3Re7qSIug8kCl0FkkJ3SChBp1hPqkTsGB_cw.6lgWibsGFm mjfrpGFW89kcH8VOinmNHavIinm4mTS3SdnUOj.588W47HRaHx5EdTaTzpb7fXiWjwijoNYnoRMR mK0qxC7yncC5VVsX4ryvxOI5o7a_wTpI9R_kbW3dEuYBj2k3Y6t5O0K1tLyWoNxM1FhpdI.oMi_2 B2HDnu7.pfriRub.ZQZkBCe8r3VesbRXVCxSNvEyXJOWxAi.0lMFNmVh2Ui_nN1y9Lfm0h0y.B8I ste2hZU4cZ.wgQSziUGlwwVY8jx6R98gOzSQKvnhclpSv9G5mz4xza49wT96yIrhTiD_rx1aWTbO BMANkd21S3pr3GZ.jtnwiHM50fRrKkxH.MkLTniJNaKvR.UuuK_paYicC_HuhposQk9nGZjfqU1V vb.OrDshdflnpBT9XgLG_E0QCzCS4sthUnmMxAgsVrtERaqL1rmJmavCQGO7h0ziiBL42dvRs3BB 2uORcsA.P6uCnQSUkb7dgXFXjdMIiHJDIQIj_JsfIegsOYQOJT8paHSu97E5HVCC5LIZoQRhaGQu OA9IUdqxeVNLzsQ.vfjdC3zVeL93ZyzjtfTIkbko_W9ikOJJqnpt53b0LrIH.8Pn8X6MF9B4DV.I m2LGKsIHLa4Yr_L3087D_ynLUgI5ptDzvKIuQYW2A7z0e_sFPugvqFH70pmX4vkNNy0SzqoEryLE uMXcQTmAlJMABBPQ5bMhw1s93ziQvvvCUDgVPNjrk2GRUOuocUqvCEDxAEJ20Olp9FRFxZc80bLy coDNvMduG5qsaHzAO6zTwz6VUzQ-- X-Sonic-MF: X-Sonic-ID: fc0cb90c-9f21-4033-8cba-13c36cc07c11 Received: from sonic.gate.mail.ne1.yahoo.com by sonic302.consmr.mail.ir2.yahoo.com with HTTP; Mon, 27 Jul 2026 17:46:30 +0000 Received: by hermes--production-ir2-676cb4d88b-rslc6 (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 0669d8fa15a3c4ff66838ce4fae4c373; Mon, 27 Jul 2026 17:46:28 +0000 (UTC) From: Hannes Domani To: gdb-patches@sourceware.org Subject: [PATCH v2 8/8] Windows gdbserver: Implement XState (Intel AVX) support Date: Mon, 27 Jul 2026 19:42:32 +0200 Message-ID: <20260727174619.1089041-8-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 Equivalent support as previous patch for Intel AVX registers. --- v2: - Remove PKRU support - Fixed context offset of $pl3_ssp --- gdbserver/win32-i386-low.cc | 114 ++++++++++++++++++++++++++++++++++-- gdbserver/win32-low.cc | 15 +++-- 2 files changed, 118 insertions(+), 11 deletions(-) diff --git a/gdbserver/win32-i386-low.cc b/gdbserver/win32-i386-low.cc index b77f6adc6ed..da1aa6fed5d 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,74 @@ 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 ymm0h_regnum, zmm0h_regnum, k0_regnum; + int xmm16_regnum, ymm16h_regnum, zmm16h_regnum; + 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_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); + context_offset += 8; + } else gdb_assert_not_reached ("invalid register number %d", r); @@ -510,7 +609,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 +637,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 +670,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