From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id GEtlKIeZcWL8GAQAWB0awg (envelope-from ) for ; Tue, 03 May 2022 17:07:19 -0400 Received: by simark.ca (Postfix, from userid 112) id A2BEF1E048; Tue, 3 May 2022 17:07:19 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,MAILING_LIST_MULTI, RDNS_DYNAMIC,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 Received: from sourceware.org (ip-8-43-85-97.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 3574B1E00E for ; Tue, 3 May 2022 17:07:19 -0400 (EDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id E56833857C49 for ; Tue, 3 May 2022 21:07:18 +0000 (GMT) Received: from mail.baldwin.cx (bigwig.baldwin.cx [66.216.25.90]) by sourceware.org (Postfix) with ESMTPS id AA9863858C52 for ; Tue, 3 May 2022 21:06:11 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org AA9863858C52 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.com (ralph.baldwin.cx [66.234.199.215]) by mail.baldwin.cx (Postfix) with ESMTPSA id 9E1651A84E31; Tue, 3 May 2022 17:06:10 -0400 (EDT) From: John Baldwin To: gdb-patches@sourceware.org Subject: [PATCH v3 04/13] x86 nat: Add helper functions to save the XSAVE layout for the host. Date: Tue, 3 May 2022 14:05:06 -0700 Message-Id: <20220503210515.30739-5-jhb@FreeBSD.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220503210515.30739-1-jhb@FreeBSD.org> References: <20220503210515.30739-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]); Tue, 03 May 2022 17:06:11 -0400 (EDT) X-Virus-Scanned: clamav-milter 0.103.1 at mail.baldwin.cx X-Virus-Status: Clean X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "George, Jini Susan" Errors-To: gdb-patches-bounces+public-inbox=simark.ca@sourceware.org Sender: "Gdb-patches" x86_xsave_length returns the total length of the XSAVE state area standard format as queried from CPUID. x86_fetch_xsave_layout uses CPUID to query the offsets of XSAVE extended regions from the running host. The total length of the XSAVE state area can either be supplied the caller if known (e.g. from FreeBSD's PT_GETXSTATEINFO) or it can be queried from the running host using x86_xsave_length. --- gdb/nat/x86-xstate.c | 65 ++++++++++++++++++++++++++++++++++++++++++++ gdb/nat/x86-xstate.h | 35 ++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 gdb/nat/x86-xstate.c create mode 100644 gdb/nat/x86-xstate.h diff --git a/gdb/nat/x86-xstate.c b/gdb/nat/x86-xstate.c new file mode 100644 index 00000000000..f9d59096a44 --- /dev/null +++ b/gdb/nat/x86-xstate.c @@ -0,0 +1,65 @@ +/* x86 XSAVE extended state functions. + + Copyright (C) 2022 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include "gdbsupport/common-defs.h" +#include "gdbsupport/x86-xstate.h" +#include "nat/x86-cpuid.h" +#include "nat/x86-xstate.h" + +/* Fetch the offset of a specific XSAVE extended region. */ + +static int +xsave_feature_offset (uint64_t xcr0, int feature) +{ + uint32_t ebx; + + if ((xcr0 & (1ULL << feature)) == 0) + return 0; + + if (!x86_cpuid_count (0xd, feature, nullptr, &ebx, nullptr, nullptr)) + return 0; + return ebx; +} + +/* See x86-xstate.h. */ + +int +x86_xsave_length () +{ + uint32_t ecx; + + if (!x86_cpuid_count (0xd, 0, nullptr, nullptr, &ecx, nullptr)) + return 0; + return ecx; +} + +/* See x86-xstate.h. */ + +void +x86_fetch_xsave_layout (uint64_t xcr0, int len, x86_xsave_layout &layout) +{ + layout.sizeof_xsave = len; + layout.avx_offset = xsave_feature_offset(xcr0, X86_XSTATE_AVX_ID); + layout.bndregs_offset = xsave_feature_offset(xcr0, X86_XSTATE_BNDREGS_ID); + layout.bndcfg_offset = xsave_feature_offset(xcr0, X86_XSTATE_BNDCFG_ID); + layout.k_offset = xsave_feature_offset(xcr0, X86_XSTATE_K_ID); + layout.zmm_h_offset = xsave_feature_offset(xcr0, X86_XSTATE_ZMM_H_ID); + layout.zmm_offset = xsave_feature_offset(xcr0, X86_XSTATE_ZMM_ID); + layout.pkru_offset = xsave_feature_offset(xcr0, X86_XSTATE_PKRU_ID); +} diff --git a/gdb/nat/x86-xstate.h b/gdb/nat/x86-xstate.h new file mode 100644 index 00000000000..bcc1449eda9 --- /dev/null +++ b/gdb/nat/x86-xstate.h @@ -0,0 +1,35 @@ +/* x86 XSAVE extended state functions. + + Copyright (C) 2022 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef NAT_X86_XSTATE_H +#define NAT_X86_XSTATE_H + +#include "gdbsupport/x86-xstate.h" + +/* Return the size of the XSAVE extended state fetched via CPUID. */ + +int x86_xsave_length (); + +/* Save the size and offsets of the XSAVE extended regions for the + running host in LAYOUT. Offsets of each of the enabled regions in + XCR0 are fetched via CPUID. */ + +void x86_fetch_xsave_layout (uint64_t xcr0, int len, x86_xsave_layout &layout); + +#endif /* NAT_X86_XSTATE_H */ -- 2.34.1