On 10/17/23 13:28, Gerd Hoffmann wrote: > 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 <kra...@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 aa4eb11181f6..c0a847583330 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; > }
Commit 170d4ce8e90abb1eff03852940a69c9d17f8afe5 (via #4954). Laszlo -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#110029): https://edk2.groups.io/g/devel/message/110029 Mute This Topic: https://groups.io/mt/102015439/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/leave/9847357/21656/1706620634/xyzzy [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-