From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id AYaoA7+ZZ2rTeDAAWB0awg (envelope-from ) for ; Mon, 27 Jul 2026 13:47:43 -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=FRl+xOoZ; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 0A2651E09E; Mon, 27 Jul 2026 13:47:43 -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 5CF291E033 for ; Mon, 27 Jul 2026 13:47:42 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 29C084BA903E for ; Mon, 27 Jul 2026 17:47:41 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 29C084BA903E 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=FRl+xOoZ Received: from sonic313-21.consmr.mail.ir2.yahoo.com (sonic313-21.consmr.mail.ir2.yahoo.com [77.238.179.188]) by sourceware.org (Postfix) with ESMTPS id 16B1C4BAE7FC for ; Mon, 27 Jul 2026 17:46:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 16B1C4BAE7FC 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 16B1C4BAE7FC Authentication-Results: sourceware.org; arc=none smtp.remote-ip=77.238.179.188 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1785174389; cv=none; b=lHsMv307Io4q7cZ8Riwixc7Yd1KOEJBVJcPZzs1yc1S/5cEVPOiKLCcR94OV3MLVb1QTF9ioGHSOy8fBlwHO1PRWx8hcDzp50iow5/PA8VweUsZY0GIpLIcZJGDjCbqntQhqJCYYlFDZy03OwvKex9WvhDlDG3sgK/MQ5+cK5qA= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1785174389; c=relaxed/simple; bh=oG/RiLHRe2J+Xzx9iNG+etzs8nBzWarKAFbrQzKUI3Q=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=I/RsUOCOrBi7Mk4RA0yki+9gW5RYvR7XNFT6T96gjqN7pRrh6cwdIcDIgBzn/Xnq9VJUwxFsJ/E9TgDina9Bs3DGGLBBQ3TCa8CeUVejQJ2SCOjBv/j8y30y7CL26tr+UgcdOrBxp289FJ4m2kYXDzFCOOFWq9aFkhpPgBL1ZXk= 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=FRl+xOoZ DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 16B1C4BAE7FC DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.de; s=s2048; t=1785174388; bh=djuMJHb4+xvIDnKW19bZOuWhDBFWgOBD6BtBe9LFK/k=; h=From:To:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=FRl+xOoZwOIr4Szj5XTa7q1S+WbL2o40wjovMQwlo1Myoz9CyX/a7GQgaY2MwK5TsrGS9P3Q6P7khyDMdB9PCtfGpXeQZE7Zj8SWZQC2+MtsotdT9iaObdyG8WmkB9TP9SN89hcfVYo2g7rAnLS9iMmpbOj+1618SDp8rC2aT04Ws44gxMr+toZq/YT8lcUcAPgmaPPNkez16RYwOLBFdt7JypaE2uYs/EKFUlgzDW02YLEpVf1BRYOPwwM7RCfvEqEdM4MoBudROv1xMWgJrsSHIUPlF1b4RWzdd0ek2zAr2bECzJJRb300Uk7aQGvKLIW/ymG+cYIyEhJkhBKuuw== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1785174388; bh=38KRSvASZ2FT/araXdVxcXKjIMZqPvYqytKT+HtmDP4=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=qKmJuouN4Stas2WjtmZFL7VZUGlDPShgIulL+EcP+w/1KvagU6xhzLObdRL0Q1TTKwqn8OxJDrcrDCBQZkEzTnnB9l4ZHObutmja3BEKNTFqvbRsVgRbq9RByxFekVsPs1/YCx9XseYHzlLXLN/eR6ehYsDG/0pjUKb4OVXxe2EUOqD+VyjlMzNYeItYv2uOdGZ5Ypx9dqUepifKl0sOYxKExmDxiMENvcbg6zVkDBKC0AGkYU9CGL6K/laSPqS+hgW6XT3bHGNHAiPizmoSPURER3HvFBq+yLr2gURGH5hIHO1WcOz1zguVNe2P91zfNGk1IyCITSObnXYQvGhOKA== X-YMail-OSG: wPDG8n8VM1ma.l_4Bx_aS7AC5pdnT3PbWdo_JJzYSiP62NJ4wPmzhskp8UTHc9J p17aNcKHA3lR0w3XEyoOMQ2Tm_wV94pEjbl3h57UiXJ5Uby5BWNUqO13CxnQ2bKwoeWs4JaOOgTZ P0MYyGwtV8Exz0hQm.V5Ui.trhBTdk3aDmrplhPn5aAoErON5SmUD.20IYK6bXgLQG84Lxgg0Hap eb.ai5JHBX9sxeOvYx3GJrbSSFcACL__DSrssOFyDczhnyW7wU0QN.9tQTWKbOKmMk1BbpbpC0B5 N3jH9MQGKo6_ZbWhVkqSqqIkHThUujUAXbZ9ShM2HEjV3NAac4VlbCtRw9MAJprGOLOIKXk1iize GDaj.CvcTwqJgvCMHf.FunIqQWYbgwLslY21LQzLVjBu5FGlclRBVFJHxYO8RRXO0DE4vif_Qi14 SsMznswPRNKgDPOJMzssYJRmZvNM.6uxMe9Vcfs6PG7HpO6vtauVjTP6BgWhHuqVk_CcldE3xy8X 1GErO_Dt5iozpyuM..c1EYU9FzCk._rDhFfkE4G2awGaTpKyKfrWa8TzPWmLUVolcWGwVf0sSA7u DSbI8t3DfmCALzy8GZSdCcySCOfV1qauH6uADUO.jTvMidzI06fKtAhyyNTKQCAzhxGzYruLPvaP j89LrsEyfndvzl909gsuj7AKTIScAXY_3aSfvawrbx8KOjIfEQQunofTEZEarWaYSITAm99gxpKJ 29shBv.Dld_h67FitSe3SMvWAQzPxn7.Fz2lodXwzrOmVhF5Z3hzeoMxzUKgACq2Nds.L5Gzq7rB caMpF6zNsJVogHTwvx8UFiBAHP7wFJCbBCOVLxS4wi6esGhGqiP7uim6qTmL8aC2GqWTSZbG_ZwK TzQHB9bHbIjXDoQFLNnSMQS0trEIAGQ6OuGMtEcuM7.15DzWOTCCuwwRjzVfaLzfF9Ni1P_yvu8j wuQ02bvWpC.5NyPvGdBqDZSUUo7q8wAFE.2PCxT8eNwMQz_JZorXECnqXloVfzAM.G2d2zU_Uhma JivpVSgm_8eqEIT1aqryXhw1jbNS2yUdeTL6wK8Sny5vAnlvkfIk5b4jROeIFImFc9dIEWkBrCWd UtaSZsM.XSXBxX5kEBtUzj0mWhpmre3lQNASnKWJLXqE1fRqzBn6aKRiXk4MO7z_oJN1esILGik7 8StjCUQ8KLzEnHpmqtSv.unFeMSWz4x3ttiLntJkQG7B20ozGIuQkR4TPNkuu4cIreFALn7E3Ky5 5tNPR2oX0Zli5WCbzO5SRRnFRnRLkzIxVlkO2Xn2VZw_T9kHuyJHC6T5E4MCcNoKD7s2m6YjEnLm zrPoij3laNwcGN_Cii1SJQ.7SraAjvH2kIHpnkbFNgkKi0V8H7YLyH1oOeZC2R_UNNoL3TkNYWEB KSMwBJOdbJAPlRzqQGxWifveJmbk7mRnjSCgPeazHzLkXP.GgGXQIE5.NEy175q5_wn88kVlbmij rstq_BSy7xoVkkOFyLMFILSCR3uFm78q84s8ELuXGWIQPweSqkP.iUnESfSZMgHolXDfGxMPMBsA wWQ5l_oMcUsiA.J5odvnCAGg0TDwaV9fyRyvvP1D6OBbjs2X1gOgwU2Zg53yltOmupqCIbWyN9GA YEo2IZUuH1K9C3gPhEmrCgx_h62uPSBMooUPDqn9cpOd.0yDoIQFSR0rUcomS8eDVbr1yLbmKGCd sh3mhx_CUDWh5mNNXccBUHitvUV33oRyXj4.uBupLF8u9aEob26xUfwLLZ38L7MC5WNHwk1VGj9M l4x5_jLr0xzWBjFkif8JsbDcrwYZf40lBAmbCVJAt7TPBZ8yyBPIP6kJAULlqU_hWGyy8m6Mhj_U FDmp.hI1L3dfkt73FwU19mFx6M4C3buRedIVNhs.erwnlZGgp4XUitt8miabKjcPsvSP2T_Y.48S AipMwGXsYKx5YcglwoUXvhMDPh7CXxSLuWUUjKIlgiC.scMsdylnMBXoY2iCq31wBUJewc3uYSws 6y4EfwrXkv1ALyhUVB.P1EQLx74FlLDlk6sh.vJI7PAR20mFKFj8WJvSK19QG7dUAlHgiibhSrj3 e.6DSSPvR9hvJkxPnlR2aW5bseDo7YFzA0fT0bnAoqOVN2vRdTLS2W3T5nAGwuMYlNaTdx_eYj9o sTLPPi8tShkd1MTq0vCJYPNxOyrt86hHRh93sZJmStN1YxEPF816.q6R5CjakIRtdZ8XIIElzn.6 nVrWKEyuAUaOrmBWuDLljjQ-- X-Sonic-MF: X-Sonic-ID: e4b86870-daf5-472e-bd1b-ac0bb143341a Received: from sonic.gate.mail.ne1.yahoo.com by sonic313.consmr.mail.ir2.yahoo.com with HTTP; Mon, 27 Jul 2026 17:46:28 +0000 Received: by hermes--production-ir2-676cb4d88b-rslc6 (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 0669d8fa15a3c4ff66838ce4fae4c373; Mon, 27 Jul 2026 17:46:27 +0000 (UTC) From: Hannes Domani To: gdb-patches@sourceware.org Subject: [PATCH v2 7/8] Windows gdb: Implement XState (Intel AVX) support Date: Mon, 27 Jul 2026 19:42:31 +0200 Message-ID: <20260727174619.1089041-7-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 This adds support for the Intel AVX and AVX-512 registers on Windows. It enables accessing registers $ymm0 - $ymm31, $zmm0 - $zmm31, and $k0 - $k7 where they are available. It also enables reading the shadow stack pointer register $pl3_ssp (for executables marked compatible with CET shadow stack [1]), but modifying it seems to be restricted restricted by windows. After this patch the tests gdb.arch/i386-avx.exp and gdb.arch/i386-avx512.exp pass on windows. [1] https://learn.microsoft.com/en-us/cpp/build/reference/cetcompat --- v2: - Extended commit message and NEWS entry - Remove PKRU support - Fixed context offset of $pl3_ssp --- gdb/NEWS | 6 +++ gdb/x86-windows-nat.c | 108 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 111 insertions(+), 3 deletions(-) diff --git a/gdb/NEWS b/gdb/NEWS index 8f40ca5cb11..71ff5508d6d 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -116,6 +116,12 @@ intent to remove it in a future release. The s390 64-bit target (s390x-*) remains supported. +* Support for Intel AVX registers on Windows. + Support displaying and modifying Intel AVX registers $ymm0 - $ymm31. + Support displaying and modifying Intel AVX-512 registers $zmm0 - $zmm31 + and $k0 - $k7. + Support displaying the shadow stack pointer register $pl3_ssp. + * Configure changes ** --with-babeltrace has been removed. The babeltrace library was diff --git a/gdb/x86-windows-nat.c b/gdb/x86-windows-nat.c index 3af5ef4dae0..270f9eae8e7 100644 --- a/gdb/x86-windows-nat.c +++ b/gdb/x86-windows-nat.c @@ -27,6 +27,9 @@ #include "i386-tdep.h" #include "i387-tdep.h" +#ifdef __x86_64__ +#include "amd64-tdep.h" +#endif using namespace windows_nat; @@ -70,6 +73,8 @@ struct x86_windows_nat_target final : public x86_nat_target windows_thread_info *th, int r) override; bool is_sw_breakpoint (const EXCEPTION_RECORD *er) const override; + + const struct target_desc *read_description () override; }; /* The current process. */ @@ -109,7 +114,31 @@ x86_windows_per_inferior::fill_thread_context (windows_thread_info *th) if (context->ContextFlags == 0) { context->ContextFlags = WindowsContext::all; + if (xstate_features != 0) + { + context->ContextFlags |= CONTEXT_XSTATE_FLAG; + set_xstate_features_mask (context, xstate_features); + } CHECK (get_thread_context (th->h, context)); + + if (xstate_features != 0) + { + DWORD64 features = 0; + CHECK (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); + } + } + } } }); } @@ -198,6 +227,14 @@ x86_windows_nat_target::thread_context_continue (windows_thread_info *th, if (GetExitCodeThread (th->h, &ec) && ec == STILL_ACTIVE) { + 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); + } + BOOL status = set_thread_context (th->h, context); if (!killed) @@ -227,7 +264,7 @@ x86_windows_nat_target::thread_context_step (windows_thread_info *th, template static char * -get_context_reg_ptr (Context *context, int r) +get_context_reg_ptr (Context *context, int r, i386_gdbarch_tdep *tdep) { const int *mappings; int mappings_count; @@ -247,6 +284,54 @@ get_context_reg_ptr (Context *context, int r) char *context_offset; if (r < mappings_count) context_offset = (char *) context + mappings[r]; + else if (I387_ZMM0H_REGNUM (tdep) > 0 && r >= I387_ZMM0H_REGNUM (tdep) + && r < I387_ZMM16H_REGNUM (tdep) && r < I387_ZMMENDH_REGNUM (tdep)) + { + context_offset = (char *) locate_xstate_feature + (context, X86_XSTATE_ZMM_H_ID, NULL); + context_offset += 32 * (r - I387_ZMM0H_REGNUM (tdep)); + } + else if (I387_ZMM0H_REGNUM (tdep) > 0 && r >= I387_ZMM16H_REGNUM (tdep) + && r < I387_ZMMENDH_REGNUM (tdep)) + { + context_offset = (char *) locate_xstate_feature + (context, X86_XSTATE_ZMM_ID, NULL); + context_offset += 32 + 64 * (r - I387_ZMM16H_REGNUM (tdep)); + } + else if (I387_K0_REGNUM (tdep) > 0 && r >= I387_K0_REGNUM (tdep) + && r < I387_KEND_REGNUM (tdep)) + { + context_offset = (char *) locate_xstate_feature + (context, X86_XSTATE_K_ID, NULL); + context_offset += 8 * (r - I387_K0_REGNUM (tdep)); + } + else if (I387_YMM16H_REGNUM (tdep) > 0 && r >= I387_YMM16H_REGNUM (tdep) + && r < I387_YMMH_AVX512_END_REGNUM (tdep)) + { + context_offset = (char *) locate_xstate_feature + (context, X86_XSTATE_ZMM_ID, NULL); + context_offset += 16 + 64 * (r - I387_YMM16H_REGNUM (tdep)); + } + else if (I387_XMM16_REGNUM (tdep) > 0 && r >= I387_XMM16_REGNUM (tdep) + && r < I387_XMM_AVX512_END_REGNUM (tdep)) + { + context_offset = (char *) locate_xstate_feature + (context, X86_XSTATE_ZMM_ID, NULL); + context_offset += 64 * (r - I387_XMM16_REGNUM (tdep)); + } + else if (I387_YMM0H_REGNUM (tdep) > 0 && r >= I387_YMM0H_REGNUM (tdep) + && r < I387_YMMENDH_REGNUM (tdep)) + { + context_offset = (char *) locate_xstate_feature + (context, X86_XSTATE_AVX_ID, NULL); + context_offset += 16 * (r - I387_YMM0H_REGNUM (tdep)); + } + else if (tdep->ssp_regnum > 0 && r == tdep->ssp_regnum) + { + 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); @@ -267,7 +352,7 @@ x86_windows_nat_target::fetch_one_register (struct regcache *regcache, char *context_offset = x86_windows_process.with_context (th, [&] (auto *context) { - return get_context_reg_ptr (context, r); + return get_context_reg_ptr (context, r, tdep); }); gdb_assert (!gdbarch_read_pc_p (gdbarch)); @@ -333,7 +418,7 @@ x86_windows_nat_target::store_one_register (const struct regcache *regcache, = x86_windows_process.with_context (th, [&] (auto *context) { gdb_assert (context->ContextFlags != 0); - return get_context_reg_ptr (context, r); + return get_context_reg_ptr (context, r, tdep); }); /* GDB treats some registers as 32-bit, where they are in fact only @@ -368,6 +453,23 @@ x86_windows_nat_target::is_sw_breakpoint (const EXCEPTION_RECORD *er) const || er->ExceptionCode == STATUS_WX86_BREAKPOINT); } +const struct target_desc * +x86_windows_nat_target::read_description () +{ + if (inferior_ptid == null_ptid) + return this->beneath ()->read_description (); + + if (xstate_features == 0) + return nullptr; + +#ifdef __x86_64__ + if (!x86_windows_process.wow64_process) + return amd64_target_description (xstate_features, false); + else +#endif + return i386_target_description (xstate_features, false); +} + /* Hardware watchpoint support, adapted from go32-nat.c code. */ /* Pass the address ADDR to the inferior in the I'th debug register. -- 2.54.0