]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/SecCore/FindPeiCore.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / UefiCpuPkg / SecCore / FindPeiCore.c
index bb9c434d1e5372d46c14f81ba044f1d3e0a95d7a..97adb68138896b41541cc89b224ef59f0944c9b5 100644 (file)
@@ -1,14 +1,8 @@
 /** @file\r
   Locate the entry point for the PEI Core\r
 \r
-  Copyright (c) 2008 - 2011, 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) 2008 - 2019, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
 /**\r
   Find core image base.\r
 \r
-  @param   BootFirmwareVolumePtr    Point to the boot firmware volume.\r
-  @param   SecCoreImageBase         The base address of the SEC core image.\r
-  @param   PeiCoreImageBase         The base address of the PEI core image.\r
+  @param   FirmwareVolumePtr        Point to the firmware volume for finding core image.\r
+  @param   FileType                 The FileType for searching, either SecCore or PeiCore.\r
+  @param   CoreImageBase            The base address of the core image.\r
 \r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
 FindImageBase (\r
-  IN  EFI_FIRMWARE_VOLUME_HEADER       *BootFirmwareVolumePtr,\r
-  OUT EFI_PHYSICAL_ADDRESS             *SecCoreImageBase,\r
-  OUT EFI_PHYSICAL_ADDRESS             *PeiCoreImageBase\r
+  IN  EFI_FIRMWARE_VOLUME_HEADER  *FirmwareVolumePtr,\r
+  IN  EFI_FV_FILETYPE             FileType,\r
+  OUT EFI_PHYSICAL_ADDRESS        *CoreImageBase\r
   )\r
 {\r
-  EFI_PHYSICAL_ADDRESS        CurrentAddress;\r
-  EFI_PHYSICAL_ADDRESS        EndOfFirmwareVolume;\r
-  EFI_FFS_FILE_HEADER         *File;\r
-  UINT32                      Size;\r
-  EFI_PHYSICAL_ADDRESS        EndOfFile;\r
-  EFI_COMMON_SECTION_HEADER   *Section;\r
-  EFI_PHYSICAL_ADDRESS        EndOfSection;\r
+  EFI_PHYSICAL_ADDRESS       CurrentAddress;\r
+  EFI_PHYSICAL_ADDRESS       EndOfFirmwareVolume;\r
+  EFI_FFS_FILE_HEADER        *File;\r
+  UINT32                     Size;\r
+  EFI_PHYSICAL_ADDRESS       EndOfFile;\r
+  EFI_COMMON_SECTION_HEADER  *Section;\r
+  EFI_PHYSICAL_ADDRESS       EndOfSection;\r
 \r
-  *SecCoreImageBase = 0;\r
-  *PeiCoreImageBase = 0;\r
+  *CoreImageBase = 0;\r
 \r
-  CurrentAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) BootFirmwareVolumePtr;\r
-  EndOfFirmwareVolume = CurrentAddress + BootFirmwareVolumePtr->FvLength;\r
+  CurrentAddress      = (EFI_PHYSICAL_ADDRESS)(UINTN)FirmwareVolumePtr;\r
+  EndOfFirmwareVolume = CurrentAddress + FirmwareVolumePtr->FvLength;\r
 \r
   //\r
   // Loop through the FFS files in the Boot Firmware Volume\r
   //\r
-  for (EndOfFile = CurrentAddress + BootFirmwareVolumePtr->HeaderLength; ; ) {\r
-\r
+  for (EndOfFile = CurrentAddress + FirmwareVolumePtr->HeaderLength; ; ) {\r
     CurrentAddress = (EndOfFile + 7) & 0xfffffffffffffff8ULL;\r
     if (CurrentAddress > EndOfFirmwareVolume) {\r
       return EFI_NOT_FOUND;\r
     }\r
 \r
-    File = (EFI_FFS_FILE_HEADER*)(UINTN) CurrentAddress;\r
+    File = (EFI_FFS_FILE_HEADER *)(UINTN)CurrentAddress;\r
     if (IS_FFS_FILE2 (File)) {\r
       Size = FFS_FILE2_SIZE (File);\r
       if (Size <= 0x00FFFFFF) {\r
@@ -75,10 +67,9 @@ FindImageBase (
     }\r
 \r
     //\r
-    // Look for SEC Core / PEI Core files\r
+    // Look for particular Core file (either SEC Core or PEI Core)\r
     //\r
-    if (File->Type != EFI_FV_FILETYPE_SECURITY_CORE &&\r
-        File->Type != EFI_FV_FILETYPE_PEI_CORE) {\r
+    if (File->Type != FileType) {\r
       continue;\r
     }\r
 \r
@@ -86,13 +77,14 @@ FindImageBase (
     // Loop through the FFS file sections within the FFS file\r
     //\r
     if (IS_FFS_FILE2 (File)) {\r
-      EndOfSection = (EFI_PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) File + sizeof (EFI_FFS_FILE_HEADER2));\r
+      EndOfSection = (EFI_PHYSICAL_ADDRESS)(UINTN)((UINT8 *)File + sizeof (EFI_FFS_FILE_HEADER2));\r
     } else {\r
-      EndOfSection = (EFI_PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) File + sizeof (EFI_FFS_FILE_HEADER));\r
+      EndOfSection = (EFI_PHYSICAL_ADDRESS)(UINTN)((UINT8 *)File + sizeof (EFI_FFS_FILE_HEADER));\r
     }\r
-    for (;;) {\r
+\r
+    for ( ; ;) {\r
       CurrentAddress = (EndOfSection + 3) & 0xfffffffffffffffcULL;\r
-      Section = (EFI_COMMON_SECTION_HEADER*)(UINTN) CurrentAddress;\r
+      Section        = (EFI_COMMON_SECTION_HEADER *)(UINTN)CurrentAddress;\r
 \r
       if (IS_SECTION2 (Section)) {\r
         Size = SECTION2_SIZE (Section);\r
@@ -114,28 +106,23 @@ FindImageBase (
       //\r
       // Look for executable sections\r
       //\r
-      if (Section->Type == EFI_SECTION_PE32 || Section->Type == EFI_SECTION_TE) {\r
-        if (File->Type == EFI_FV_FILETYPE_SECURITY_CORE) {\r
-          if (IS_SECTION2 (Section)) {\r
-            *SecCoreImageBase = (PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER2));\r
-          } else {\r
-            *SecCoreImageBase = (PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER));\r
-          }\r
-        } else {\r
+      if ((Section->Type == EFI_SECTION_PE32) || (Section->Type == EFI_SECTION_TE)) {\r
+        if (File->Type == FileType) {\r
           if (IS_SECTION2 (Section)) {\r
-            *PeiCoreImageBase = (PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER2));\r
+            *CoreImageBase = (PHYSICAL_ADDRESS)(UINTN)((UINT8 *)Section + sizeof (EFI_COMMON_SECTION_HEADER2));\r
           } else {\r
-            *PeiCoreImageBase = (PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER));\r
+            *CoreImageBase = (PHYSICAL_ADDRESS)(UINTN)((UINT8 *)Section + sizeof (EFI_COMMON_SECTION_HEADER));\r
           }\r
         }\r
+\r
         break;\r
       }\r
     }\r
 \r
     //\r
-    // Both SEC Core and PEI Core images found\r
+    // Either SEC Core or PEI Core images found\r
     //\r
-    if (*SecCoreImageBase != 0 && *PeiCoreImageBase != 0) {\r
+    if (*CoreImageBase != 0) {\r
       return EFI_SUCCESS;\r
     }\r
   }\r
@@ -147,47 +134,55 @@ FindImageBase (
   It also find SEC and PEI Core file debug information. It will report them if\r
   remote debug is enabled.\r
 \r
-  @param   BootFirmwareVolumePtr    Point to the boot firmware volume.\r
+  @param   SecCoreFirmwareVolumePtr Point to the firmware volume for finding SecCore.\r
+  @param   PeiCoreFirmwareVolumePtr Point to the firmware volume for finding PeiCore.\r
   @param   PeiCoreEntryPoint        The entry point of the PEI core.\r
 \r
 **/\r
 VOID\r
 EFIAPI\r
 FindAndReportEntryPoints (\r
-  IN  EFI_FIRMWARE_VOLUME_HEADER       *BootFirmwareVolumePtr,\r
-  OUT EFI_PEI_CORE_ENTRY_POINT         *PeiCoreEntryPoint\r
+  IN  EFI_FIRMWARE_VOLUME_HEADER  *SecCoreFirmwareVolumePtr,\r
+  IN  EFI_FIRMWARE_VOLUME_HEADER  *PeiCoreFirmwareVolumePtr,\r
+  OUT EFI_PEI_CORE_ENTRY_POINT    *PeiCoreEntryPoint\r
   )\r
 {\r
-  EFI_STATUS                       Status;\r
-  EFI_PHYSICAL_ADDRESS             SecCoreImageBase;\r
-  EFI_PHYSICAL_ADDRESS             PeiCoreImageBase;\r
-  PE_COFF_LOADER_IMAGE_CONTEXT     ImageContext;\r
+  EFI_STATUS                    Status;\r
+  EFI_PHYSICAL_ADDRESS          SecCoreImageBase;\r
+  EFI_PHYSICAL_ADDRESS          PeiCoreImageBase;\r
+  PE_COFF_LOADER_IMAGE_CONTEXT  ImageContext;\r
 \r
   //\r
-  // Find SEC Core and PEI Core image base\r
+  // Find SEC Core image base\r
   //\r
-  Status = FindImageBase (BootFirmwareVolumePtr, &SecCoreImageBase, &PeiCoreImageBase);\r
+  Status = FindImageBase (SecCoreFirmwareVolumePtr, EFI_FV_FILETYPE_SECURITY_CORE, &SecCoreImageBase);\r
   ASSERT_EFI_ERROR (Status);\r
 \r
-  ZeroMem ((VOID *) &ImageContext, sizeof (PE_COFF_LOADER_IMAGE_CONTEXT));\r
+  ZeroMem ((VOID *)&ImageContext, sizeof (PE_COFF_LOADER_IMAGE_CONTEXT));\r
   //\r
   // Report SEC Core debug information when remote debug is enabled\r
   //\r
   ImageContext.ImageAddress = SecCoreImageBase;\r
-  ImageContext.PdbPointer = PeCoffLoaderGetPdbPointer ((VOID*) (UINTN) ImageContext.ImageAddress);\r
+  ImageContext.PdbPointer   = PeCoffLoaderGetPdbPointer ((VOID *)(UINTN)ImageContext.ImageAddress);\r
   PeCoffLoaderRelocateImageExtraAction (&ImageContext);\r
 \r
+  //\r
+  // Find PEI Core image base\r
+  //\r
+  Status = FindImageBase (PeiCoreFirmwareVolumePtr, EFI_FV_FILETYPE_PEI_CORE, &PeiCoreImageBase);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
   //\r
   // Report PEI Core debug information when remote debug is enabled\r
   //\r
   ImageContext.ImageAddress = PeiCoreImageBase;\r
-  ImageContext.PdbPointer = PeCoffLoaderGetPdbPointer ((VOID*) (UINTN) ImageContext.ImageAddress);\r
+  ImageContext.PdbPointer   = PeCoffLoaderGetPdbPointer ((VOID *)(UINTN)ImageContext.ImageAddress);\r
   PeCoffLoaderRelocateImageExtraAction (&ImageContext);\r
 \r
   //\r
   // Find PEI Core entry point\r
   //\r
-  Status = PeCoffLoaderGetEntryPoint ((VOID *) (UINTN) PeiCoreImageBase, (VOID**) PeiCoreEntryPoint);\r
+  Status = PeCoffLoaderGetEntryPoint ((VOID *)(UINTN)PeiCoreImageBase, (VOID **)PeiCoreEntryPoint);\r
   if (EFI_ERROR (Status)) {\r
     *PeiCoreEntryPoint = 0;\r
   }\r