From 35c6cfd69232e8eb271a48c9c0b2ad4ffe05978e Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Wed, 11 Oct 2023 10:20:41 +0200 Subject: [PATCH 23/23] 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. Quoting a comment for CPUID_EXTENDED_TOPOLOGY in GetProcessorLocationByApicId(): // 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. Add a similar check for CPUID_V2_EXTENDED_TOPOLOGY to GetProcessorLocation2ByApicId(). Without this fix OVMF triggers an ASSERT when running in a kvm guest on latest (12th gen) intel processors. Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2241388 Signed-off-by: Gerd Hoffmann --- UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c b/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c index b27fbd71b620..716e60352645 100644 --- a/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c +++ b/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c @@ -1431,6 +1431,7 @@ GetProcessorLocation2ByApicId ( ) { CPUID_EXTENDED_TOPOLOGY_EAX ExtendedTopologyEax; + CPUID_EXTENDED_TOPOLOGY_EBX ExtendedTopologyEbx; CPUID_EXTENDED_TOPOLOGY_ECX ExtendedTopologyEcx; UINT32 MaxStandardCpuIdIndex; UINT32 Index; @@ -1447,6 +1448,11 @@ GetProcessorLocation2ByApicId ( // AsmCpuid (CPUID_SIGNATURE, &MaxStandardCpuIdIndex, NULL, NULL, NULL); if (MaxStandardCpuIdIndex < CPUID_V2_EXTENDED_TOPOLOGY) { + ExtendedTopologyEbx.Uint32 = 0; + } else { + AsmCpuidEx (CPUID_V2_EXTENDED_TOPOLOGY, 0, NULL, &ExtendedTopologyEbx.Uint32, NULL, NULL); + } + if (ExtendedTopologyEbx.Uint32 == 0) { if (Die != NULL) { *Die = 0; } -- 2.41.0