]> 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 6488880eab9ca3b670d2e75fbea9a40e9e5d96e2..fa2050cf023a1f748503e9eb4bb2433aca4e066b 100644 (file)
@@ -1,22 +1,14 @@
 /** @file\r
   x64-specifc functionality for DxeLoad.\r
 \r
-Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
 #include "DxeIpl.h"\r
 #include "X64/VirtualMemory.h"\r
 \r
-\r
-\r
 /**\r
    Transfers control to DxeCore.\r
 \r
@@ -30,17 +22,27 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 **/\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
   // Get Vector Hand-off Info PPI and build Guided HOB\r
@@ -52,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
@@ -76,23 +79,35 @@ 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
     // for the DxeIpl and the DxeCore are both X64.\r
     //\r
     ASSERT (PcdGetBool (PcdSetNxForStack) == FALSE);\r
+    ASSERT (PcdGetBool (PcdCpuStackGuard) == FALSE);\r
   }\r
-  \r
+\r
   //\r
   // End of PEI phase signal\r
   //\r
@@ -105,8 +120,8 @@ HandOffToDxeCore (
 \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
+  //\r
+  UpdateStackHob ((EFI_PHYSICAL_ADDRESS)(UINTN)BaseOfStack, STACK_SIZE);\r
 \r
   //\r
   // Transfer the control to the entry point of DxeCore.\r