]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdeModulePkg / Core / DxeIplPeim / X64 / DxeLoadFunc.c
index 2867610bff4d8bc37211ea4892b716246d77e3a3..fa2050cf023a1f748503e9eb4bb2433aca4e066b 100644 (file)
@@ -9,8 +9,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 #include "DxeIpl.h"\r
 #include "X64/VirtualMemory.h"\r
 \r
-\r
-\r
 /**\r
    Transfers control to DxeCore.\r
 \r
@@ -24,20 +22,26 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 **/\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
@@ -50,13 +54,14 @@ HandOffToDxeCore (
              (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
@@ -74,15 +79,26 @@ HandOffToDxeCore (
   // 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
@@ -105,7 +121,7 @@ HandOffToDxeCore (
   //\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