Today's logic is to only enable 5-level paging when CPU supports it
and the maximum physical address size > 48.
The patch changes to get the maximum physical address size firstly
from CpuInfo HOB then CPUID result. It aligns to the behavior of
existing code that builds the page table.

Signed-off-by: Ray Ni <ray...@intel.com>
Cc: Eric Dong <eric.d...@intel.com>
Cc: Laszlo Ersek <ler...@redhat.com>
---
 UefiCpuPkg/PiSmmCpuDxeSmm/X64/PageTbl.c | 39 ++++++++-----------------
 1 file changed, 12 insertions(+), 27 deletions(-)

diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/PageTbl.c 
b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/PageTbl.c
index b8e95bf6ed..54c17522ff 100644
--- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/PageTbl.c
+++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/PageTbl.c
@@ -63,45 +63,25 @@ Is1GPageSupport (
 }
 
 /**
-  The routine returns TRUE when CPU supports it (CPUID[7,0].ECX.BIT[16] is 
set) and
-  the max physical address bits is bigger than 48. Because 4-level paging can 
support
-  to address physical address up to 2^48 - 1, there is no need to enable 
5-level paging
-  with max physical address bits <= 48.
+  The routine returns TRUE when CPU supports 5-level paging. 
(CPUID[7,0].ECX.BIT[16] is set).
 
-  @retval TRUE  5-level paging enabling is needed.
-  @retval FALSE 5-level paging enabling is not needed.
+  @retval TRUE  5-level paging is supported.
+  @retval FALSE 5-level paging is not supported.
 **/
 BOOLEAN
-Is5LevelPagingNeeded (
+Is5LevelPagingSupported (
   VOID
   )
 {
-  CPUID_VIR_PHY_ADDRESS_SIZE_EAX              VirPhyAddressSize;
   CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_ECX ExtFeatureEcx;
-  UINT32                                      MaxExtendedFunctionId;
 
-  AsmCpuid (CPUID_EXTENDED_FUNCTION, &MaxExtendedFunctionId, NULL, NULL, NULL);
-  if (MaxExtendedFunctionId >= CPUID_VIR_PHY_ADDRESS_SIZE) {
-    AsmCpuid (CPUID_VIR_PHY_ADDRESS_SIZE, &VirPhyAddressSize.Uint32, NULL, 
NULL, NULL);
-  } else {
-    VirPhyAddressSize.Bits.PhysicalAddressBits = 36;
-  }
   AsmCpuidEx (
     CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS,
     CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_SUB_LEAF_INFO,
     NULL, NULL, &ExtFeatureEcx.Uint32, NULL
     );
-  DEBUG ((
-    DEBUG_INFO, "PhysicalAddressBits = %d, 5LPageTable = %d.\n",
-    VirPhyAddressSize.Bits.PhysicalAddressBits, 
ExtFeatureEcx.Bits.FiveLevelPage
-    ));
-
-  if (VirPhyAddressSize.Bits.PhysicalAddressBits > 4 * 9 + 12) {
-    ASSERT (ExtFeatureEcx.Bits.FiveLevelPage == 1);
-    return TRUE;
-  } else {
-    return FALSE;
-  }
+
+  return (BOOLEAN) (ExtFeatureEcx.Bits.FiveLevelPage == 1);
 }
 
 /**
@@ -351,8 +331,13 @@ SmmInitPageTable (
 
   mCpuSmmRestrictedMemoryAccess = PcdGetBool (PcdCpuSmmRestrictedMemoryAccess);
   m1GPageTableSupport           = Is1GPageSupport ();
-  m5LevelPagingNeeded           = Is5LevelPagingNeeded ();
   mPhysicalAddressBits          = GetPhysicalAddressBits ();
+  //
+  // Enable 5 level paging when CPU supports it and the max physical address 
bits is bigger than 48.
+  // Because 4-level paging can support  to address physical address up to 
2^48 - 1, there is no need
+  //  to enable 5-level paging  with max physical address bits <= 48.
+  //
+  m5LevelPagingNeeded           = Is5LevelPagingSupported () && 
(mPhysicalAddressBits > 48);
   PatchInstructionX86 (gPatch5LevelPagingNeeded, m5LevelPagingNeeded, 1);
   DEBUG ((DEBUG_INFO, "5LevelPaging Needed             - %d\n", 
m5LevelPagingNeeded));
   DEBUG ((DEBUG_INFO, "1GPageTable Support             - %d\n", 
m1GPageTableSupport));
-- 
2.21.0.windows.1


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#48059): https://edk2.groups.io/g/devel/message/48059
Mute This Topic: https://groups.io/mt/34293643/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to