#include "DxeIpl.h"\r
#include "X64/VirtualMemory.h"\r
\r
-\r
-\r
/**\r
Transfers control to DxeCore.\r
\r
**/\r
VOID\r
HandOffToDxeCore (\r
- IN EFI_PHYSICAL_ADDRESS DxeCoreEntryPoint,\r
- IN EFI_PEI_HOB_POINTERS HobList\r
+ IN EFI_PHYSICAL_ADDRESS DxeCoreEntryPoint,\r
+ IN EFI_PEI_HOB_POINTERS HobList\r
)\r
{\r
- VOID *BaseOfStack;\r
- VOID *TopOfStack;\r
- EFI_STATUS Status;\r
- UINTN PageTables;\r
- UINT32 Index;\r
- EFI_VECTOR_HANDOFF_INFO *VectorInfo;\r
- EFI_PEI_VECTOR_HANDOFF_INFO_PPI *VectorHandoffInfoPpi;\r
+ VOID *BaseOfStack;\r
+ VOID *TopOfStack;\r
+ EFI_STATUS Status;\r
+ UINTN PageTables;\r
+ UINT32 Index;\r
+ EFI_VECTOR_HANDOFF_INFO *VectorInfo;\r
+ EFI_PEI_VECTOR_HANDOFF_INFO_PPI *VectorHandoffInfoPpi;\r
+ VOID *GhcbBase;\r
+ UINTN GhcbSize;\r
\r
+ //\r
+ // Clear page 0 and mark it as allocated if NULL pointer detection is enabled.\r
+ //\r
if (IsNullDetectionEnabled ()) {\r
ClearFirst4KPage (HobList.Raw);\r
+ BuildMemoryAllocationHob (0, EFI_PAGES_TO_SIZE (1), EfiBootServicesData);\r
}\r
\r
//\r
(VOID **)&VectorHandoffInfoPpi\r
);\r
if (Status == EFI_SUCCESS) {\r
- DEBUG ((EFI_D_INFO, "Vector Hand-off Info PPI is gotten, GUIDed HOB is created!\n"));\r
+ DEBUG ((DEBUG_INFO, "Vector Hand-off Info PPI is gotten, GUIDed HOB is created!\n"));\r
VectorInfo = VectorHandoffInfoPpi->Info;\r
- Index = 1;\r
+ Index = 1;\r
while (VectorInfo->Attribute != EFI_VECTOR_HANDOFF_LAST_ENTRY) {\r
- VectorInfo ++;\r
- Index ++;\r
+ VectorInfo++;\r
+ Index++;\r
}\r
+\r
BuildGuidDataHob (\r
&gEfiVectorHandoffInfoPpiGuid,\r
VectorHandoffInfoPpi->Info,\r
// Compute the top of the stack we were allocated. Pre-allocate a UINTN\r
// for safety.\r
//\r
- TopOfStack = (VOID *) ((UINTN) BaseOfStack + EFI_SIZE_TO_PAGES (STACK_SIZE) * EFI_PAGE_SIZE - CPU_STACK_ALIGNMENT);\r
+ TopOfStack = (VOID *)((UINTN)BaseOfStack + EFI_SIZE_TO_PAGES (STACK_SIZE) * EFI_PAGE_SIZE - CPU_STACK_ALIGNMENT);\r
TopOfStack = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT);\r
\r
+ //\r
+ // Get the address and size of the GHCB pages\r
+ //\r
+ GhcbBase = (VOID *)PcdGet64 (PcdGhcbBase);\r
+ GhcbSize = PcdGet64 (PcdGhcbSize);\r
+\r
PageTables = 0;\r
if (FeaturePcdGet (PcdDxeIplBuildPageTables)) {\r
//\r
// Create page table and save PageMapLevel4 to CR3\r
//\r
- PageTables = CreateIdentityMappingPageTables ((EFI_PHYSICAL_ADDRESS) (UINTN) BaseOfStack, STACK_SIZE);\r
+ PageTables = CreateIdentityMappingPageTables (\r
+ (EFI_PHYSICAL_ADDRESS)(UINTN)BaseOfStack,\r
+ STACK_SIZE,\r
+ (EFI_PHYSICAL_ADDRESS)(UINTN)GhcbBase,\r
+ GhcbSize\r
+ );\r
} else {\r
//\r
// Set NX for stack feature also require PcdDxeIplBuildPageTables be TRUE\r
//\r
// Update the contents of BSP stack HOB to reflect the real stack info passed to DxeCore.\r
//\r
- UpdateStackHob ((EFI_PHYSICAL_ADDRESS)(UINTN) BaseOfStack, STACK_SIZE);\r
+ UpdateStackHob ((EFI_PHYSICAL_ADDRESS)(UINTN)BaseOfStack, STACK_SIZE);\r
\r
//\r
// Transfer the control to the entry point of DxeCore.\r