2) IA-32 Intel(R) Architecture Software Developer's Manual Volume 2:Instruction Set Reference, Intel\r
3) IA-32 Intel(R) Architecture Software Developer's Manual Volume 3:System Programmer's Guide, Intel\r
\r
-Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.<BR>\r
Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>\r
\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
IN UINTN GhcbSize\r
)\r
{\r
- UINT32 RegEax;\r
- CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_ECX EcxFlags;\r
- UINT32 RegEdx;\r
- UINT8 PhysicalAddressBits;\r
- EFI_PHYSICAL_ADDRESS PageAddress;\r
- UINTN IndexOfPml5Entries;\r
- UINTN IndexOfPml4Entries;\r
- UINTN IndexOfPdpEntries;\r
- UINTN IndexOfPageDirectoryEntries;\r
- UINT32 NumberOfPml5EntriesNeeded;\r
- UINT32 NumberOfPml4EntriesNeeded;\r
- UINT32 NumberOfPdpEntriesNeeded;\r
- PAGE_MAP_AND_DIRECTORY_POINTER *PageMapLevel5Entry;\r
- PAGE_MAP_AND_DIRECTORY_POINTER *PageMapLevel4Entry;\r
- PAGE_MAP_AND_DIRECTORY_POINTER *PageMap;\r
- PAGE_MAP_AND_DIRECTORY_POINTER *PageDirectoryPointerEntry;\r
- PAGE_TABLE_ENTRY *PageDirectoryEntry;\r
- UINTN TotalPagesNum;\r
- UINTN BigPageAddress;\r
- VOID *Hob;\r
- BOOLEAN Page5LevelSupport;\r
- BOOLEAN Page1GSupport;\r
- PAGE_TABLE_1G_ENTRY *PageDirectory1GEntry;\r
- UINT64 AddressEncMask;\r
- IA32_CR4 Cr4;\r
+ UINT32 RegEax;\r
+ UINT32 RegEdx;\r
+ UINT8 PhysicalAddressBits;\r
+ EFI_PHYSICAL_ADDRESS PageAddress;\r
+ UINTN IndexOfPml5Entries;\r
+ UINTN IndexOfPml4Entries;\r
+ UINTN IndexOfPdpEntries;\r
+ UINTN IndexOfPageDirectoryEntries;\r
+ UINT32 NumberOfPml5EntriesNeeded;\r
+ UINT32 NumberOfPml4EntriesNeeded;\r
+ UINT32 NumberOfPdpEntriesNeeded;\r
+ PAGE_MAP_AND_DIRECTORY_POINTER *PageMapLevel5Entry;\r
+ PAGE_MAP_AND_DIRECTORY_POINTER *PageMapLevel4Entry;\r
+ PAGE_MAP_AND_DIRECTORY_POINTER *PageMap;\r
+ PAGE_MAP_AND_DIRECTORY_POINTER *PageDirectoryPointerEntry;\r
+ PAGE_TABLE_ENTRY *PageDirectoryEntry;\r
+ UINTN TotalPagesNum;\r
+ UINTN BigPageAddress;\r
+ VOID *Hob;\r
+ BOOLEAN Enable5LevelPaging;\r
+ BOOLEAN Page1GSupport;\r
+ PAGE_TABLE_1G_ENTRY *PageDirectory1GEntry;\r
+ UINT64 AddressEncMask;\r
+ IA32_CR4 Cr4;\r
\r
//\r
// Set PageMapLevel5Entry to suppress incorrect compiler/analyzer warnings\r
}\r
}\r
\r
- Page5LevelSupport = FALSE;\r
- if (PcdGetBool (PcdUse5LevelPageTable)) {\r
- AsmCpuidEx (\r
- CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS,\r
- CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_SUB_LEAF_INFO,\r
- NULL,\r
- &EcxFlags.Uint32,\r
- NULL,\r
- NULL\r
- );\r
- if (EcxFlags.Bits.FiveLevelPage != 0) {\r
- Page5LevelSupport = TRUE;\r
- }\r
- }\r
+ //\r
+ // Check CR4.LA57[bit12] to determin whether 5-Level Paging is enabled.\r
+ // Because this code runs at both IA-32e (64bit) mode and legacy protected (32bit) mode,\r
+ // below logic inherits the 5-level paging setting from bootloader in IA-32e mode\r
+ // and uses 4-level paging in legacy protected mode.\r
+ //\r
+ Cr4.UintN = AsmReadCr4 ();\r
+ Enable5LevelPaging = (BOOLEAN)(Cr4.Bits.LA57 == 1);\r
\r
- DEBUG ((DEBUG_INFO, "AddressBits=%u 5LevelPaging=%u 1GPage=%u\n", PhysicalAddressBits, Page5LevelSupport, Page1GSupport));\r
+ DEBUG ((DEBUG_INFO, "PayloadEntry: AddressBits=%u 5LevelPaging=%u 1GPage=%u\n", PhysicalAddressBits, Enable5LevelPaging, Page1GSupport));\r
\r
//\r
// IA-32e paging translates 48-bit linear addresses to 52-bit physical addresses\r
// due to either unsupported by HW, or disabled by PCD.\r
//\r
ASSERT (PhysicalAddressBits <= 52);\r
- if (!Page5LevelSupport && (PhysicalAddressBits > 48)) {\r
+ if (!Enable5LevelPaging && (PhysicalAddressBits > 48)) {\r
PhysicalAddressBits = 48;\r
}\r
\r
//\r
// Substract the one page occupied by PML5 entries if 5-Level Paging is disabled.\r
//\r
- if (!Page5LevelSupport) {\r
+ if (!Enable5LevelPaging) {\r
TotalPagesNum--;\r
}\r
\r
// By architecture only one PageMapLevel4 exists - so lets allocate storage for it.\r
//\r
PageMap = (VOID *)BigPageAddress;\r
- if (Page5LevelSupport) {\r
+ if (Enable5LevelPaging) {\r
//\r
// By architecture only one PageMapLevel5 exists - so lets allocate storage for it.\r
//\r
PageMapLevel4Entry = (VOID *)BigPageAddress;\r
BigPageAddress += SIZE_4KB;\r
\r
- if (Page5LevelSupport) {\r
+ if (Enable5LevelPaging) {\r
//\r
// Make a PML5 Entry\r
//\r
ZeroMem (PageMapLevel4Entry, (512 - IndexOfPml4Entries) * sizeof (PAGE_MAP_AND_DIRECTORY_POINTER));\r
}\r
\r
- if (Page5LevelSupport) {\r
- Cr4.UintN = AsmReadCr4 ();\r
- Cr4.Bits.LA57 = 1;\r
- AsmWriteCr4 (Cr4.UintN);\r
+ if (Enable5LevelPaging) {\r
//\r
// For the PML5 entries we are not using fill in a null entry.\r
//\r