]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/SecCore/SecMain.c
NetworkPkg: Move Network library header file from MdeModulePkg to NetworkPkg
[mirror_edk2.git] / UefiCpuPkg / SecCore / SecMain.c
index b24e190617764ed244344b21dc071303110225e3..f91444625780aa23cba4bcd8b8a15a32ac714ae1 100644 (file)
@@ -1,14 +1,8 @@
 /** @file\r
   C functions in SEC\r
 \r
-  Copyright (c) 2008 - 2018, 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
@@ -232,22 +226,61 @@ SecStartupPhase2(
   EFI_PEI_PPI_DESCRIPTOR      *AllSecPpiList;\r
   EFI_PEI_CORE_ENTRY_POINT    PeiCoreEntryPoint;\r
 \r
+  PeiCoreEntryPoint = NULL;\r
   SecCoreData   = (EFI_SEC_PEI_HAND_OFF *) Context;\r
   AllSecPpiList = (EFI_PEI_PPI_DESCRIPTOR *) SecCoreData->PeiTemporaryRamBase;\r
+\r
+  //\r
+  // Perform platform specific initialization before entering PeiCore.\r
+  //\r
+  PpiList = SecPlatformMain (SecCoreData);\r
   //\r
   // Find Pei Core entry point. It will report SEC and Pei Core debug information if remote debug\r
   // is enabled.\r
   //\r
-  FindAndReportEntryPoints ((EFI_FIRMWARE_VOLUME_HEADER *) SecCoreData->BootFirmwareVolumeBase, &PeiCoreEntryPoint);\r
-  if (PeiCoreEntryPoint == NULL)\r
-  {\r
-    CpuDeadLoop ();\r
+  if (PpiList != NULL) {\r
+    for (Index = 0;\r
+      (PpiList[Index].Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) != EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;\r
+      Index++) {\r
+      if (CompareGuid (PpiList[Index].Guid, &gEfiPeiCoreFvLocationPpiGuid) &&\r
+          (((EFI_PEI_CORE_FV_LOCATION_PPI *) PpiList[Index].Ppi)->PeiCoreFvLocation != 0)\r
+         ) {\r
+        //\r
+        // In this case, SecCore is in BFV but PeiCore is in another FV reported by PPI.\r
+        //\r
+        FindAndReportEntryPoints (\r
+          (EFI_FIRMWARE_VOLUME_HEADER *) SecCoreData->BootFirmwareVolumeBase,\r
+          (EFI_FIRMWARE_VOLUME_HEADER *) ((EFI_PEI_CORE_FV_LOCATION_PPI *) PpiList[Index].Ppi)->PeiCoreFvLocation,\r
+          &PeiCoreEntryPoint\r
+          );\r
+        if (PeiCoreEntryPoint != NULL) {\r
+          break;\r
+        } else {\r
+          //\r
+          // PeiCore not found\r
+          //\r
+          CpuDeadLoop ();\r
+        }\r
+      }\r
+    }\r
   }\r
-\r
   //\r
-  // Perform platform specific initialization before entering PeiCore.\r
+  // If EFI_PEI_CORE_FV_LOCATION_PPI not found, try to locate PeiCore from BFV.\r
   //\r
-  PpiList = SecPlatformMain (SecCoreData);\r
+  if (PeiCoreEntryPoint == NULL) {\r
+    //\r
+    // Both SecCore and PeiCore are in BFV.\r
+    //\r
+    FindAndReportEntryPoints (\r
+      (EFI_FIRMWARE_VOLUME_HEADER *) SecCoreData->BootFirmwareVolumeBase,\r
+      (EFI_FIRMWARE_VOLUME_HEADER *) SecCoreData->BootFirmwareVolumeBase,\r
+      &PeiCoreEntryPoint\r
+      );\r
+    if (PeiCoreEntryPoint == NULL) {\r
+      CpuDeadLoop ();\r
+    }\r
+  }\r
+\r
   if (PpiList != NULL) {\r
     //\r
     // Remove the terminal flag from the terminal PPI\r