@param Size Size of the given physical memory.\r
@param StackBase Base address of stack.\r
@param StackSize Size of stack.\r
+ @param GhcbBase Base address of GHCB pages.\r
+ @param GhcbSize Size of GHCB area.\r
\r
@retval TRUE Page table should be split.\r
@retval FALSE Page table should not be split.\r
IN EFI_PHYSICAL_ADDRESS Address,\r
IN UINTN Size,\r
IN EFI_PHYSICAL_ADDRESS StackBase,\r
- IN UINTN StackSize\r
+ IN UINTN StackSize,\r
+ IN EFI_PHYSICAL_ADDRESS GhcbBase,\r
+ IN UINTN GhcbSize\r
)\r
{\r
if (IsNullDetectionEnabled () && Address == 0) {\r
}\r
}\r
\r
+ if (GhcbBase != 0) {\r
+ if ((Address < GhcbBase + GhcbSize) && ((Address + Size) > GhcbBase)) {\r
+ return TRUE;\r
+ }\r
+ }\r
+\r
return FALSE;\r
}\r
/**\r
@param[in, out] PageEntry2M Pointer to 2M page entry.\r
@param[in] StackBase Stack base address.\r
@param[in] StackSize Stack size.\r
+ @param[in] GhcbBase GHCB page area base address.\r
+ @param[in] GhcbSize GHCB page area size.\r
\r
**/\r
VOID\r
IN EFI_PHYSICAL_ADDRESS PhysicalAddress,\r
IN OUT UINT64 *PageEntry2M,\r
IN EFI_PHYSICAL_ADDRESS StackBase,\r
- IN UINTN StackSize\r
+ IN UINTN StackSize,\r
+ IN EFI_PHYSICAL_ADDRESS GhcbBase,\r
+ IN UINTN GhcbSize\r
)\r
{\r
EFI_PHYSICAL_ADDRESS PhysicalAddress4K;\r
//\r
// Fill in the Page Table entries\r
//\r
- PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | AddressEncMask;\r
+ PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;\r
+\r
+ //\r
+ // The GHCB range consists of two pages per CPU, the GHCB and a\r
+ // per-CPU variable page. The GHCB page needs to be mapped as an\r
+ // unencrypted page while the per-CPU variable page needs to be\r
+ // mapped encrypted. These pages alternate in assignment.\r
+ //\r
+ if ((GhcbBase == 0)\r
+ || (PhysicalAddress4K < GhcbBase)\r
+ || (PhysicalAddress4K >= GhcbBase + GhcbSize)\r
+ || (((PhysicalAddress4K - GhcbBase) & SIZE_4KB) != 0)) {\r
+ PageTableEntry->Uint64 |= AddressEncMask;\r
+ }\r
PageTableEntry->Bits.ReadWrite = 1;\r
\r
if ((IsNullDetectionEnabled () && PhysicalAddress4K == 0) ||\r
@param[in, out] PageEntry1G Pointer to 1G page entry.\r
@param[in] StackBase Stack base address.\r
@param[in] StackSize Stack size.\r
+ @param[in] GhcbBase GHCB page area base address.\r
+ @param[in] GhcbSize GHCB page area size.\r
\r
**/\r
VOID\r
IN EFI_PHYSICAL_ADDRESS PhysicalAddress,\r
IN OUT UINT64 *PageEntry1G,\r
IN EFI_PHYSICAL_ADDRESS StackBase,\r
- IN UINTN StackSize\r
+ IN UINTN StackSize,\r
+ IN EFI_PHYSICAL_ADDRESS GhcbBase,\r
+ IN UINTN GhcbSize\r
)\r
{\r
EFI_PHYSICAL_ADDRESS PhysicalAddress2M;\r
\r
PhysicalAddress2M = PhysicalAddress;\r
for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries < 512; IndexOfPageDirectoryEntries++, PageDirectoryEntry++, PhysicalAddress2M += SIZE_2MB) {\r
- if (ToSplitPageTable (PhysicalAddress2M, SIZE_2MB, StackBase, StackSize)) {\r
+ if (ToSplitPageTable (PhysicalAddress2M, SIZE_2MB, StackBase, StackSize, GhcbBase, GhcbSize)) {\r
//\r
// Need to split this 2M page that covers NULL or stack range.\r
//\r
- Split2MPageTo4K (PhysicalAddress2M, (UINT64 *) PageDirectoryEntry, StackBase, StackSize);\r
+ Split2MPageTo4K (PhysicalAddress2M, (UINT64 *) PageDirectoryEntry, StackBase, StackSize, GhcbBase, GhcbSize);\r
} else {\r
//\r
// Fill in the Page Directory entries\r
\r
@param[in] StackBase Stack base address.\r
@param[in] StackSize Stack size.\r
+ @param[in] GhcbBase GHCB base address.\r
+ @param[in] GhcbSize GHCB size.\r
\r
@return The address of 4 level page map.\r
\r
UINTN\r
CreateIdentityMappingPageTables (\r
IN EFI_PHYSICAL_ADDRESS StackBase,\r
- IN UINTN StackSize\r
+ IN UINTN StackSize,\r
+ IN EFI_PHYSICAL_ADDRESS GhcbBase,\r
+ IN UINTN GhcbSize\r
)\r
{\r
UINT32 RegEax;\r
PageDirectory1GEntry = (VOID *) PageDirectoryPointerEntry;\r
\r
for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries < 512; IndexOfPageDirectoryEntries++, PageDirectory1GEntry++, PageAddress += SIZE_1GB) {\r
- if (ToSplitPageTable (PageAddress, SIZE_1GB, StackBase, StackSize)) {\r
- Split1GPageTo2M (PageAddress, (UINT64 *) PageDirectory1GEntry, StackBase, StackSize);\r
+ if (ToSplitPageTable (PageAddress, SIZE_1GB, StackBase, StackSize, GhcbBase, GhcbSize)) {\r
+ Split1GPageTo2M (PageAddress, (UINT64 *) PageDirectory1GEntry, StackBase, StackSize, GhcbBase, GhcbSize);\r
} else {\r
//\r
// Fill in the Page Directory entries\r
PageDirectoryPointerEntry->Bits.Present = 1;\r
\r
for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries < 512; IndexOfPageDirectoryEntries++, PageDirectoryEntry++, PageAddress += SIZE_2MB) {\r
- if (ToSplitPageTable (PageAddress, SIZE_2MB, StackBase, StackSize)) {\r
+ if (ToSplitPageTable (PageAddress, SIZE_2MB, StackBase, StackSize, GhcbBase, GhcbSize)) {\r
//\r
// Need to split this 2M page that covers NULL or stack range.\r
//\r
- Split2MPageTo4K (PageAddress, (UINT64 *) PageDirectoryEntry, StackBase, StackSize);\r
+ Split2MPageTo4K (PageAddress, (UINT64 *) PageDirectoryEntry, StackBase, StackSize, GhcbBase, GhcbSize);\r
} else {\r
//\r
// Fill in the Page Directory entries\r