Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Factory:Staging:A
ovmf
ovmf-UefiCpuPkg-BaseXApicX2ApicLib-fix-CPUID_V2...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File ovmf-UefiCpuPkg-BaseXApicX2ApicLib-fix-CPUID_V2_EXTENDED_.patch of Package ovmf
From 170d4ce8e90abb1eff03852940a69c9d17f8afe5 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann <kraxel@redhat.com> Date: Tue, 17 Oct 2023 13:28:07 +0200 Subject: [PATCH] UefiCpuPkg/BaseXApicX2ApicLib: fix CPUID_V2_EXTENDED_TOPOLOGY detection Checking the max cpuid leaf is not enough to figure whenever CPUID_V2_EXTENDED_TOPOLOGY is supported. Intel SDM says: Software must detect the presence of CPUID leaf 1FH by verifying (a) the highest leaf index supported by CPUID is >= 1FH, and (b) CPUID.1FH:EBX[15:0] reports a non-zero value. The same is true for CPUID leaf 0BH. This patch adds the EBX check to GetProcessorLocation2ByApicId(). The patch also fixes the existing check in GetProcessorLocationByApicId() to be in line with the spec by looking at bits 15:0. The comments are updated with a quote from the Intel SDM. Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2241388 Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Message-Id: <20231017112807.1244254-1-kraxel@redhat.com> Reviewed-by: Laszlo Ersek <lersek@redhat.com> --- .../BaseXApicX2ApicLib/BaseXApicX2ApicLib.c | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c b/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c index aa4eb11181..c0a8475833 100644 --- a/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c +++ b/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c @@ -1294,11 +1294,12 @@ GetProcessorLocationByApicId ( NULL ); // - // If CPUID.(EAX=0BH, ECX=0H):EBX returns zero and maximum input value for - // basic CPUID information is greater than 0BH, then CPUID.0BH leaf is not - // supported on that processor. + // Quoting Intel SDM: + // Software must detect the presence of CPUID leaf 0BH by + // verifying (a) the highest leaf index supported by CPUID is >= + // 0BH, and (b) CPUID.0BH:EBX[15:0] reports a non-zero value. // - if (ExtendedTopologyEbx.Uint32 != 0) { + if (ExtendedTopologyEbx.Bits.LogicalProcessors != 0) { TopologyLeafSupported = TRUE; // @@ -1424,6 +1425,7 @@ GetProcessorLocation2ByApicId ( ) { CPUID_EXTENDED_TOPOLOGY_EAX ExtendedTopologyEax; + CPUID_EXTENDED_TOPOLOGY_EBX ExtendedTopologyEbx; CPUID_EXTENDED_TOPOLOGY_ECX ExtendedTopologyEcx; UINT32 MaxStandardCpuIdIndex; UINT32 Index; @@ -1436,10 +1438,19 @@ GetProcessorLocation2ByApicId ( } // - // Get max index of CPUID + // Quoting Intel SDM: + // Software must detect the presence of CPUID leaf 1FH by verifying + // (a) the highest leaf index supported by CPUID is >= 1FH, and (b) + // CPUID.1FH:EBX[15:0] reports a non-zero value. // AsmCpuid (CPUID_SIGNATURE, &MaxStandardCpuIdIndex, NULL, NULL, NULL); if (MaxStandardCpuIdIndex < CPUID_V2_EXTENDED_TOPOLOGY) { + ExtendedTopologyEbx.Bits.LogicalProcessors = 0; + } else { + AsmCpuidEx (CPUID_V2_EXTENDED_TOPOLOGY, 0, NULL, &ExtendedTopologyEbx.Uint32, NULL, NULL); + } + + if (ExtendedTopologyEbx.Bits.LogicalProcessors == 0) { if (Die != NULL) { *Die = 0; } -- 2.35.3
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor