From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp.polymtl.ca (smtp.polymtl.ca [132.207.4.11]) by sourceware.org (Postfix) with ESMTPS id BF7943858D1E for ; Thu, 12 Oct 2023 04:27:18 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org BF7943858D1E Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=polymtl.ca Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=polymtl.ca Received: from simark.ca (simark.ca [158.69.221.121]) (authenticated bits=0) by smtp.polymtl.ca (8.14.7/8.14.7) with ESMTP id 39C4R9Gd013369 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 12 Oct 2023 00:27:13 -0400 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp.polymtl.ca 39C4R9Gd013369 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=polymtl.ca; s=default; t=1697084834; bh=Fzw+a9dyT7IBdOQigg3yFrpUbAYpwFaqgptsoig+OBg=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=m+YTlruC4wOs64rY6uEczLVOKBCNna1VmVLm2EjRR6L8dXiOSAwKEKQLgARtUHj5N YTkqmiy+aSHYf5g8N/UeeAwhMoa5cqv2ubdSvOH67WUdp1tNVK63XKBmOedeNh7Yr2 jGniPaZGakU8U0AjHIhve5v/qfKCC+W/UfGcwboU= Received: from [10.0.0.11] (modemcable238.237-201-24.mc.videotron.ca [24.201.237.238]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPSA id D824B1E00F; Thu, 12 Oct 2023 00:27:08 -0400 (EDT) Message-ID: <44bfb99d-7c4a-4916-9812-21c7d84b5c7e@polymtl.ca> Date: Thu, 12 Oct 2023 00:27:08 -0400 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [RFC 02/13] i387-tdep: Add function to read XSAVE layout from NT_X86_CPUID Content-Language: en-US To: John Baldwin , gdb-patches@sourceware.org Cc: Willgerodt@smtp.polymtl.ca, Felix , George@smtp.polymtl.ca, Jini Susan References: <20231009183617.24862-1-jhb@FreeBSD.org> <20231009183617.24862-3-jhb@FreeBSD.org> From: Simon Marchi In-Reply-To: <20231009183617.24862-3-jhb@FreeBSD.org> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Poly-FromMTA: (simark.ca [158.69.221.121]) at Thu, 12 Oct 2023 04:27:09 +0000 X-Spam-Status: No, score=-3031.3 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_PASS,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 2023-10-09 14:36, John Baldwin wrote: > This can be used by x86 arches to determine the XSAVE layout instead > of guessing based on the XCR0 mask and XSAVE register note size. Just some nits below: > +typedef std::unordered_map cpuid_map; For new stuff I would suggest: using cpuid_map = std::unordered_map; > + > +static cpuid_map > +i387_parse_cpuid_from_core (bfd *bfd) > +{ > + asection *section = bfd_get_section_by_name (bfd, ".reg-x86-cpuid"); > + if (section == nullptr) > + return {}; > + > + size_t size = bfd_section_size (section); > + if (size == 0 || (size % (6 * 4)) != 0) That 4 could be `sizeof (uint32_t)`. And `6 * 4` appears below again, it could a constexpr value with a name like entry_size. > + return {}; > + > + char contents[size]; > + if (!bfd_get_section_contents (bfd, section, contents, 0, size)) > + { > + warning (_("Couldn't read `.reg-x86-cpuid' section in core file.")); > + return {}; > + } > + > + cpuid_map map; > + size_t index = 0; > + while (index < size) > + { > + uint32_t leaf = bfd_get_32 (bfd, contents + index); > + uint32_t count = bfd_get_32 (bfd, contents + index + 4); > + uint32_t eax = bfd_get_32 (bfd, contents + index + 8); > + uint32_t ebx = bfd_get_32 (bfd, contents + index + 12); > + uint32_t ecx = bfd_get_32 (bfd, contents + index + 16); > + uint32_t edx = bfd_get_32 (bfd, contents + index + 20); > + > + if (map.count (cpuid_key (leaf, count)) != 0) > + { > + warning (_("Duplicate cpuid leaf %#x,%#x"), leaf, count); > + return {}; > + } > + map.emplace (cpuid_key (leaf, count), > + cpuid_values (eax, ebx, ecx, edx)); This could be slightly more optimal using map::try_emplace (to avoid having two map lookups). Simon