From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx2.freebsd.org (mx2.freebsd.org [96.47.72.81]) by sourceware.org (Postfix) with ESMTPS id 105A43858C3A for ; Mon, 14 Aug 2023 17:52:48 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 105A43858C3A Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=FreeBSD.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [96.47.72.80]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits)) (Client CN "mx1.freebsd.org", Issuer "R3" (verified OK)) by mx2.freebsd.org (Postfix) with ESMTPS id 4RPhnW6kPhz3P40; Mon, 14 Aug 2023 17:52:47 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from smtp.freebsd.org (smtp.freebsd.org [96.47.72.83]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "smtp.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4RPhnW5nXJz4D7Q; Mon, 14 Aug 2023 17:52:47 +0000 (UTC) (envelope-from jhb@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1692035567; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=INYOVTM/nwQLdmF/0fYUduW7GkrnYZqXNtKVeXoq4xs=; b=YGuJeNtzkrfdcgneoOWm9wQ5Cb1yNDAAZ4NDarreIDD0Xq+tgqlMHdkLPZBaGLBlRCXX8M ViAyXP8wzYf3ot3EXC1i2gBKnt7fp7armgoNEg4kZ6fui865zRgRX1ZOJtvTlDco6H3s3E A3PbpMrkrKIZymZjq2M6xgGffblrSBLs+0+Aq4ivMekpLuYskIC9DnXixQ9st6tlOwA9Su 1k9s5b5G/U0FnLZ+XGv2dNHRQn2JoywIsrEP3Vj72hQ2XxgoYXOpEPmSyyi/Elp5AkSjiJ zu9SlTZB7xqKUwo/7pjsFJhssCY775Y3APbrlS5uSwIUWKyz0qfH4sYHR3cW2Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1692035567; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=INYOVTM/nwQLdmF/0fYUduW7GkrnYZqXNtKVeXoq4xs=; b=Clc+9y0GyfN8jA2zTOzL4ccm5bZu8y/KmCo9yRu4y/D8eycySR7jVjh3uQxKEtFR/lZxxv 8kU99zScPaYwb23f8w4ofqw2kZpwpMmbvp1l1zh1DGlV+fvE9R1+Vc5EmG3M/sooZgy1qK x8UPULX8liNdL3vY+TV74xluFKbSPA++vECOGxoR1GHk2VZYVErJBb4hDnJhT3I4ob4t9I zWvHqFuPlfVOhzqXNjVzPHoc2FzN8lJzI4rWxaq7WwcORGivz/RcgGJBceJODNIaNd5s+I EKc1tXyVK34BXxPgiqhHCsKOPsKFzN29q1xIJPptb9P5+vVaiXR7Z7Tdo/0nCA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1692035567; a=rsa-sha256; cv=none; b=bBergh2+NPoJVJ9gDMk1eiIuB9KBft31J2yknDNuKGr+4Tkfq9j1HZHAOp4THFe7gATqTi iEzeJz4IkGjFn1WTpTCHypOVZQtsafuDV8T0t3lWluDOD2z7j2ncDT5DqOx7iaRnVoB4bp fa7VU3Xjy4N7hBit83vMOQ/6R09v/6kejBBJxMubvTa+1Z/h6RHdc1tkI2uwaCpYBtSFYi wEaP67Y53xLUM5QvK5lmY2VPED6DbxYduH26xUVK5WODnFUzOILnec5lJggeyNu061UdKA jc0xPgz2zRoAJxvTH0nmJzz/q0kNS8EIa0ftaNEXmPMSjn3pWVKSsZHr1FRdwA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from [IPV6:2601:648:8683:a9e0:d463:68d9:bed3:b37f] (unknown [IPv6:2601:648:8683:a9e0:d463:68d9:bed3:b37f]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (Client did not present a certificate) (Authenticated sender: jhb) by smtp.freebsd.org (Postfix) with ESMTPSA id 4RPhnW35jLz1SQf; Mon, 14 Aug 2023 17:52:47 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Message-ID: Date: Mon, 14 Aug 2023 10:52:46 -0700 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 Thunderbird/102.14.0 Subject: Re: [PATCH v6a 08/15] gdb: Update x86 Linux architectures to support XSAVE layouts. Content-Language: en-US From: John Baldwin To: gdb-patches@sourceware.org, Simon Marchi References: <20230714155151.21723-1-jhb@FreeBSD.org> <20230714155151.21723-9-jhb@FreeBSD.org> In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-12.5 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,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: On 7/28/23 2:29 PM, John Baldwin wrote: > Refactor i386_linux_core_read_xcr0 to fetch and return a corresponding > x86_xsave_layout as well as xcr0 using the size of an existing > NT_X86_XSTATE core dump to determine the offsets via > i387_guess_xsave_layout. Use this to add an implementation of > gdbarch_core_xfer_x86_xsave_layout. > > Use tdep->xsave_layout.sizeof_xsave as the size of the XSTATE register > set. > --- > gdb/amd64-linux-tdep.c | 13 +++++++-- > gdb/i386-linux-tdep.c | 66 +++++++++++++++++++++++------------------- > gdb/i386-linux-tdep.h | 25 +++++++++------- > 3 files changed, 61 insertions(+), 43 deletions(-) > > diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c > index cbbac1a0c64..e2fdf5fb6c8 100644 > --- a/gdb/amd64-linux-tdep.c > +++ b/gdb/amd64-linux-tdep.c > @@ -1616,7 +1616,10 @@ amd64_linux_core_read_description (struct gdbarch *gdbarch, > bfd *abfd) > { > /* Linux/x86-64. */ > - uint64_t xcr0 = i386_linux_core_read_xcr0 (abfd); > + x86_xsave_layout layout; > + uint64_t xcr0 = i386_linux_core_read_xsave_info (abfd, layout); > + if (xcr0 == 0) > + xcr0 = X86_XSTATE_SSE_MASK; > > return amd64_linux_read_description (xcr0 & X86_XSTATE_ALL_MASK, > gdbarch_ptr_bit (gdbarch) == 32); > @@ -1661,8 +1664,10 @@ amd64_linux_iterate_over_regset_sections (struct gdbarch *gdbarch, > > cb (".reg", 27 * 8, 27 * 8, &i386_gregset, NULL, cb_data); > cb (".reg2", 512, 512, &amd64_fpregset, NULL, cb_data); > - cb (".reg-xstate", X86_XSTATE_SIZE (tdep->xcr0), X86_XSTATE_SIZE (tdep->xcr0), > - &amd64_linux_xstateregset, "XSAVE extended state", cb_data); > + if (tdep->xsave_layout.sizeof_xsave != 0) > + cb (".reg-xstate", tdep->xsave_layout.sizeof_xsave, > + tdep->xsave_layout.sizeof_xsave, &amd64_linux_xstateregset, > + "XSAVE extended state", cb_data); > } > > /* The instruction sequences used in x86_64 machines for a > @@ -1804,6 +1809,8 @@ amd64_linux_init_abi_common(struct gdbarch_info info, struct gdbarch *gdbarch, > tdep->sc_num_regs = ARRAY_SIZE (amd64_linux_sc_reg_offset); > > tdep->xsave_xcr0_offset = I386_LINUX_XSAVE_XCR0_OFFSET; > + set_gdbarch_core_read_x86_xsave_layout > + (gdbarch, i386_linux_core_read_x86_xsave_layout); > > /* Add the %orig_rax register used for syscall restarting. */ > set_gdbarch_write_pc (gdbarch, amd64_linux_write_pc); > diff --git a/gdb/i386-linux-tdep.c b/gdb/i386-linux-tdep.c > index 554c1455a5f..7ff7c155e2c 100644 > --- a/gdb/i386-linux-tdep.c > +++ b/gdb/i386-linux-tdep.c > @@ -638,45 +638,48 @@ static int i386_linux_sc_reg_offset[] = > 0 * 4 /* %gs */ > }; > > -/* Get XSAVE extended state xcr0 from core dump. */ > +/* See i386-linux-tdep.h. */ > > uint64_t > -i386_linux_core_read_xcr0 (bfd *abfd) > +i386_linux_core_read_xsave_info (bfd *abfd, x86_xsave_layout &layout) > { > asection *xstate = bfd_get_section_by_name (abfd, ".reg-xstate"); > - uint64_t xcr0; > + if (xstate == nullptr) > + return 0; > > - if (xstate) > + /* Check extended state size. */ > + size_t size = bfd_section_size (xstate); > + if (size < X86_XSTATE_AVX_SIZE) > + return 0; > + > + char contents[8]; > + if (! bfd_get_section_contents (abfd, xstate, contents, > + I386_LINUX_XSAVE_XCR0_OFFSET, 8)) > { > - size_t size = bfd_section_size (xstate); > - > - /* Check extended state size. */ > - if (size < X86_XSTATE_AVX_SIZE) > - xcr0 = X86_XSTATE_SSE_MASK; > - else > - { > - char contents[8]; > - > - if (! bfd_get_section_contents (abfd, xstate, contents, > - I386_LINUX_XSAVE_XCR0_OFFSET, > - 8)) > - { > - warning (_("Couldn't read `xcr0' bytes from " > - "`.reg-xstate' section in core file.")); > - return 0; > - } > - > - xcr0 = bfd_get_64 (abfd, contents); > - } > + warning (_("Couldn't read `xcr0' bytes from " > + "`.reg-xstate' section in core file.")); > + return 0; > } > - else > - xcr0 = 0; > + > + uint64_t xcr0 = bfd_get_64 (abfd, contents); > + > + if (!i387_guess_xsave_layout (xcr0, size, layout)) > + return 0; > > return xcr0; > } > > /* See i386-linux-tdep.h. */ > > +bool > +i386_linux_core_read_x86_xsave_layout (struct gdbarch *gdbarch, > + x86_xsave_layout &layout) > +{ > + return i386_linux_core_read_xsave_info (core_bfd, layout) != 0; > +} > + > +/* See i386-linux-tdep.h. */ > + > const struct target_desc * > i386_linux_read_description (uint64_t xcr0) > { > @@ -708,7 +711,8 @@ i386_linux_core_read_description (struct gdbarch *gdbarch, > bfd *abfd) > { > /* Linux/i386. */ > - uint64_t xcr0 = i386_linux_core_read_xcr0 (abfd); > + x86_xsave_layout layout; > + uint64_t xcr0 = i386_linux_core_read_xsave_info (abfd, layout); > const struct target_desc *tdesc = i386_linux_read_description (xcr0); > > if (tdesc != NULL) > @@ -767,9 +771,9 @@ i386_linux_iterate_over_regset_sections (struct gdbarch *gdbarch, > > cb (".reg", 68, 68, &i386_gregset, NULL, cb_data); > > - if (tdep->xcr0 & X86_XSTATE_AVX) > - cb (".reg-xstate", X86_XSTATE_SIZE (tdep->xcr0), > - X86_XSTATE_SIZE (tdep->xcr0), &i386_linux_xstateregset, > + if (tdep->xsave_layout.sizeof_xsave != 0) > + cb (".reg-xstate", tdep->xsave_layout.sizeof_xsave, > + tdep->xsave_layout.sizeof_xsave, &i386_linux_xstateregset, > "XSAVE extended state", cb_data); > else if (tdep->xcr0 & X86_XSTATE_SSE) > cb (".reg-xfp", 512, 512, &i386_fpregset, "extended floating-point", > @@ -872,6 +876,8 @@ i386_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) > tdep->sc_num_regs = ARRAY_SIZE (i386_linux_sc_reg_offset); > > tdep->xsave_xcr0_offset = I386_LINUX_XSAVE_XCR0_OFFSET; > + set_gdbarch_core_read_x86_xsave_layout > + (gdbarch, i386_linux_core_read_x86_xsave_layout); > > set_gdbarch_process_record (gdbarch, i386_process_record); > set_gdbarch_process_record_signal (gdbarch, i386_linux_record_signal); > diff --git a/gdb/i386-linux-tdep.h b/gdb/i386-linux-tdep.h > index c0fd1f7f300..bd8e328b7fe 100644 > --- a/gdb/i386-linux-tdep.h > +++ b/gdb/i386-linux-tdep.h > @@ -20,6 +20,8 @@ > #ifndef I386_LINUX_TDEP_H > #define I386_LINUX_TDEP_H > > +#include "gdbsupport/x86-xstate.h" > + > /* The Linux kernel pretends there is an additional "orig_eax" > register. Since GDB needs access to that register to be able to > properly restart system calls when necessary (see > @@ -34,8 +36,18 @@ > /* Total number of registers for GNU/Linux. */ > #define I386_LINUX_NUM_REGS (I386_LINUX_ORIG_EAX_REGNUM + 1) > > -/* Get XSAVE extended state xcr0 from core dump. */ > -extern uint64_t i386_linux_core_read_xcr0 (bfd *abfd); > +/* Read the XSAVE extended state xcr0 value from the ABFD core file. > + If it appears to be valid, return it and fill LAYOUT with values > + inferred from that value. > + > + Otherwise, return 0 to indicate no state was found and leave LAYOUT > + untouched. */ > +extern uint64_t i386_linux_core_read_xsave_info (bfd *abfd, > + x86_xsave_layout &layout); > + > +/* Implement the core_read_x86_xsave_layout gdbarch method. */ > +extern bool i386_linux_core_read_x86_xsave_layout (struct gdbarch *gdbarch, > + x86_xsave_layout &layout); > > /* Handle and display information related to the MPX bound violation > to the user. */ > @@ -52,14 +64,7 @@ extern const struct target_desc *i386_linux_read_description (uint64_t xcr0); > fxsave_bytes[0..463] > sw_usable_bytes[464..511] > xstate_hdr_bytes[512..575] > - avx_bytes[576..831] > - mpx_bytes [960..1032] > - avx512_k_regs[1088..1152] > - avx512_zmmh_regs0-7[1153..1407] > - avx512_zmmh_regs8-15[1408..1663] > - avx512_zmm_regs16-31[1664..2687] > - pkru[2688..2752] > - future_state etc > + extended state regions (AVX, MPX, AVX512, PKRU, etc.) > }; > > Same memory layout will be used for the coredump NT_X86_XSTATE Ping? -- John Baldwin