From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.baldwin.cx (bigwig.baldwin.cx [66.216.25.90]) by sourceware.org (Postfix) with ESMTPS id 38D10385043B for ; Sat, 18 Mar 2023 01:09:31 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 38D10385043B Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=FreeBSD.org Authentication-Results: sourceware.org; spf=fail smtp.mailfrom=FreeBSD.org Received: from ralph.baldwin.net (c-98-35-126-114.hsd1.ca.comcast.net [98.35.126.114]) by mail.baldwin.cx (Postfix) with ESMTPSA id D72091A84E4D for ; Fri, 17 Mar 2023 21:09:23 -0400 (EDT) From: John Baldwin To: gdb-patches@sourceware.org Subject: [PATCH v4 10/13] gdbserver: Add a function to set the XSAVE mask and size. Date: Fri, 17 Mar 2023 18:09:02 -0700 Message-Id: <20230318010905.14294-11-jhb@FreeBSD.org> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230318010905.14294-1-jhb@FreeBSD.org> References: <20230318010905.14294-1-jhb@FreeBSD.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.6.4 (mail.baldwin.cx [0.0.0.0]); Fri, 17 Mar 2023 21:09:24 -0400 (EDT) X-Virus-Scanned: clamav-milter 0.103.1 at mail.baldwin.cx X-Virus-Status: Clean X-Spam-Status: No, score=-12.3 required=5.0 tests=BAYES_00,FORGED_SPF_HELO,GIT_PATCH_0,KAM_DMARC_STATUS,KHOP_HELO_FCRDNS,SPF_HELO_PASS,SPF_SOFTFAIL,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Make x86_xcr0 private to i387-fp.cc and use i387_set_xsave_mask to set the value instead. Add a static global instance of x86_xsave_layout and initialize it in the new function as well to be used in a future commit to parse XSAVE extended state regions. Update the Linux port to use this function rather than setting x86_xcr0 directly. In the case that XML is not supported, don't bother setting x86_xcr0 to the default value but just omit the call to i387_set_xsave_mask as i387-fp.cc defaults to the SSE case used for non-XML. In addition, use x86_xsave_length to determine the size of the XSAVE register set via CPUID. --- gdbserver/configure.srv | 12 ++++++++---- gdbserver/i387-fp.cc | 15 +++++++++++++-- gdbserver/i387-fp.h | 2 +- gdbserver/linux-x86-low.cc | 10 ++++++---- 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/gdbserver/configure.srv b/gdbserver/configure.srv index f0101994529..72256f82871 100644 --- a/gdbserver/configure.srv +++ b/gdbserver/configure.srv @@ -102,7 +102,8 @@ case "${gdbserver_host}" in i[34567]86-*-linux*) srv_tgtobj="${srv_tgtobj} arch/i386.o" srv_tgtobj="${srv_tgtobj} $srv_linux_obj" srv_tgtobj="${srv_tgtobj} linux-x86-low.o x86-low.o" - srv_tgtobj="${srv_tgtobj} nat/x86-dregs.o i387-fp.o" + srv_tgtobj="${srv_tgtobj} nat/x86-dregs.o" + srv_tgtobj="${srv_tgtobj} nat/x86-xstate.o i387-fp.o" srv_tgtobj="${srv_tgtobj} linux-x86-tdesc.o" srv_tgtobj="${srv_tgtobj} nat/linux-btrace.o" srv_tgtobj="${srv_tgtobj} nat/x86-linux.o" @@ -362,7 +363,8 @@ case "${gdbserver_host}" in srv_linux_thread_db=yes ;; x86_64-*-linux*) srv_tgtobj="$srv_linux_obj linux-x86-low.o x86-low.o" - srv_tgtobj="${srv_tgtobj} nat/x86-dregs.o i387-fp.o" + srv_tgtobj="${srv_tgtobj} nat/x86-dregs.o" + srv_tgtobj="${srv_tgtobj} nat/x86-xstate.o i387-fp.o" srv_tgtobj="${srv_tgtobj} arch/i386.o arch/amd64.o" srv_tgtobj="${srv_tgtobj} linux-x86-tdesc.o" srv_tgtobj="${srv_tgtobj} nat/linux-btrace.o" @@ -377,14 +379,16 @@ case "${gdbserver_host}" in ipa_obj="${ipa_obj} arch/amd64-ipa.o" ;; x86_64-*-mingw*) srv_regobj="" - srv_tgtobj="x86-low.o nat/x86-dregs.o i387-fp.o" + srv_tgtobj="x86-low.o nat/x86-dregs.o" + srv_tgtobj="${srv_tgtobj} nat/x86-xstate.o i387-fp.o" srv_tgtobj="${srv_tgtobj} win32-low.o win32-i386-low.o" srv_tgtobj="${srv_tgtobj} nat/windows-nat.o" srv_tgtobj="${srv_tgtobj} arch/amd64.o arch/i386.o" srv_mingw=yes ;; x86_64-*-cygwin*) srv_regobj="" - srv_tgtobj="x86-low.o nat/x86-dregs.o i387-fp.o" + srv_tgtobj="x86-low.o nat/x86-dregs.o" + srv_tgtobj="${srv_tgtobj} nat/x86-xstate.o i387-fp.o" srv_tgtobj="${srv_tgtobj} win32-low.o win32-i386-low.o" srv_tgtobj="${srv_tgtobj} nat/windows-nat.o" srv_tgtobj="${srv_tgtobj} arch/amd64.o arch/i386.o" diff --git a/gdbserver/i387-fp.cc b/gdbserver/i387-fp.cc index 12cb614e5d8..9bb9f497a01 100644 --- a/gdbserver/i387-fp.cc +++ b/gdbserver/i387-fp.cc @@ -19,12 +19,18 @@ #include "server.h" #include "i387-fp.h" #include "gdbsupport/x86-xstate.h" +#include "nat/x86-xstate.h" + +/* Default to SSE. */ +static unsigned long long x86_xcr0 = X86_XSTATE_SSE_MASK; static const int num_mpx_bnd_registers = 4; static const int num_mpx_cfg_registers = 2; static const int num_avx512_k_registers = 8; static const int num_pkeys_registers = 1; +static x86_xsave_layout xsave_layout; + /* Note: These functions preserve the reserved bits in control registers. However, gdbserver promptly throws away that information. */ @@ -974,5 +980,10 @@ i387_xsave_to_cache (struct regcache *regcache, const void *buf) } } -/* Default to SSE. */ -unsigned long long x86_xcr0 = X86_XSTATE_SSE_MASK; +/* Set the XSAVE mask and fetch the XSAVE layout via CPUID. */ +void +i387_set_xsave_mask (uint64_t xcr0, int len) +{ + x86_xcr0 = xcr0; + x86_fetch_xsave_layout (xcr0, len, xsave_layout); +} diff --git a/gdbserver/i387-fp.h b/gdbserver/i387-fp.h index f536a2be15a..87f046e9b85 100644 --- a/gdbserver/i387-fp.h +++ b/gdbserver/i387-fp.h @@ -28,6 +28,6 @@ void i387_fxsave_to_cache (struct regcache *regcache, const void *buf); void i387_cache_to_xsave (struct regcache *regcache, void *buf); void i387_xsave_to_cache (struct regcache *regcache, const void *buf); -extern unsigned long long x86_xcr0; +void i387_set_xsave_mask (uint64_t xcr0, int len); #endif /* GDBSERVER_I387_FP_H */ diff --git a/gdbserver/linux-x86-low.cc b/gdbserver/linux-x86-low.cc index 4a538b107be..1483e2a66d7 100644 --- a/gdbserver/linux-x86-low.cc +++ b/gdbserver/linux-x86-low.cc @@ -25,6 +25,7 @@ #include "i387-fp.h" #include "x86-low.h" #include "gdbsupport/x86-xstate.h" +#include "nat/x86-xstate.h" #include "nat/gdb_ptrace.h" #ifdef __x86_64__ @@ -873,6 +874,7 @@ x86_linux_read_description (void) int xcr0_features; int tid; static uint64_t xcr0; + static int xsave_len; struct regset_info *regset; tid = lwpid_of (current_thread); @@ -907,8 +909,6 @@ x86_linux_read_description (void) if (!use_xml) { - x86_xcr0 = X86_XSTATE_SSE_MASK; - /* Don't use XML. */ #ifdef __x86_64__ if (machine == EM_X86_64) @@ -938,11 +938,13 @@ x86_linux_read_description (void) xcr0 = xstateregs[(I386_LINUX_XSAVE_XCR0_OFFSET / sizeof (uint64_t))]; + xsave_len = x86_xsave_length (); + /* Use PTRACE_GETREGSET if it is available. */ for (regset = x86_regsets; regset->fill_function != NULL; regset++) if (regset->get_request == PTRACE_GETREGSET) - regset->size = X86_XSTATE_SIZE (xcr0); + regset->size = xsave_len; else if (regset->type != GENERAL_REGS) regset->size = 0; } @@ -953,7 +955,7 @@ x86_linux_read_description (void) && (xcr0 & X86_XSTATE_ALL_MASK)); if (xcr0_features) - x86_xcr0 = xcr0; + i387_set_xsave_mask (xcr0, xsave_len); if (machine == EM_X86_64) { -- 2.39.1