]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c
Enabling EFI_PEI_FIRMWARE_VOLUME_PPI introduced by PI1.2.
[mirror_edk2.git] / MdeModulePkg / Core / Pei / Dispatcher / Dispatcher.c
index f64003db38d925c0a2ed8b8ebbcddb53d3f46203..067096c5954b4600a1ea9ecfc19875f463d03a14 100644 (file)
@@ -30,14 +30,14 @@ typedef struct {
   Apriori file in one FV.\r
 \r
 \r
-  @param Private         - Pointer to the private data passed in from caller\r
-  @param VolumeHandle    - Fv handle.\r
+  @param Private          Pointer to the private data passed in from caller\r
+  @param CoreFileHandle   The instance of PEI_CORE_FV_HANDLE.\r
 \r
 **/\r
 VOID\r
 DiscoverPeimsAndOrderWithApriori (\r
   IN  PEI_CORE_INSTANCE    *Private,\r
-  IN  EFI_PEI_FV_HANDLE    VolumeHandle\r
+  IN  PEI_CORE_FV_HANDLE   *CoreFileHandle\r
   )\r
 {\r
   EFI_STATUS                          Status;\r
@@ -51,7 +51,11 @@ DiscoverPeimsAndOrderWithApriori (
   EFI_GUID                            *Guid;\r
   EFI_PEI_FV_HANDLE                   TempFileHandles[FixedPcdGet32 (PcdPeiCoreMaxPeimPerFv)];\r
   EFI_GUID                            FileGuid[FixedPcdGet32 (PcdPeiCoreMaxPeimPerFv)];\r
-\r
+  EFI_PEI_FIRMWARE_VOLUME_PPI         *FvPpi;\r
+  EFI_FV_FILE_INFO                    FileInfo;\r
+  \r
+  FvPpi = CoreFileHandle->FvPpi;\r
+  \r
   //\r
   // Walk the FV and find all the PEIMs and the Apriori file.\r
   //\r
@@ -72,13 +76,7 @@ DiscoverPeimsAndOrderWithApriori (
   // Go ahead to scan this Fv, and cache FileHandles within it.\r
   //\r
   for (PeimCount = 0; PeimCount < FixedPcdGet32 (PcdPeiCoreMaxPeimPerFv); PeimCount++) {\r
-    Status = PeiFindFileEx (\r
-                VolumeHandle,\r
-                NULL,\r
-                PEI_CORE_INTERNAL_FFS_FILE_DISPATCH_TYPE,\r
-                &FileHandle,\r
-                &AprioriFileHandle\r
-                );\r
+    Status = FvPpi->FindFileByType (FvPpi, PEI_CORE_INTERNAL_FFS_FILE_DISPATCH_TYPE, CoreFileHandle->FvHandle, &FileHandle);\r
     if (Status != EFI_SUCCESS) {\r
       break;\r
     }\r
@@ -92,17 +90,23 @@ DiscoverPeimsAndOrderWithApriori (
   //\r
   ASSERT (PeimCount < FixedPcdGet32 (PcdPeiCoreMaxPeimPerFv));\r
 \r
+  //\r
+  // Get Apriori File handle\r
+  //\r
   Private->AprioriCount = 0;\r
-  if (AprioriFileHandle != NULL) {\r
+  Status = FvPpi->FindFileByName (FvPpi, &gPeiAprioriFileNameGuid, &CoreFileHandle->FvHandle, &AprioriFileHandle);\r
+  if (!EFI_ERROR(Status) && AprioriFileHandle != NULL) {\r
     //\r
     // Read the Apriori file\r
     //\r
-    Status = PeiServicesFfsFindSectionData (EFI_SECTION_RAW, AprioriFileHandle, (VOID **) &Apriori);\r
+    Status = FvPpi->FindSectionByType (FvPpi, EFI_SECTION_RAW, AprioriFileHandle, (VOID **) &Apriori);\r
     if (!EFI_ERROR (Status)) {\r
       //\r
       // Calculate the number of PEIMs in the A Priori list\r
       //\r
-      Private->AprioriCount = *(UINT32 *)(((EFI_FFS_FILE_HEADER *)AprioriFileHandle)->Size) & 0x00FFFFFF;\r
+      Status = FvPpi->GetFileInfo (FvPpi, AprioriFileHandle, &FileInfo);\r
+      ASSERT_EFI_ERROR (Status);\r
+      Private->AprioriCount = FileInfo.BufferSize & 0x00FFFFFF;\r
       Private->AprioriCount -= sizeof (EFI_FFS_FILE_HEADER) - sizeof (EFI_COMMON_SECTION_HEADER);\r
       Private->AprioriCount /= sizeof (EFI_GUID);\r
 \r
@@ -112,7 +116,8 @@ DiscoverPeimsAndOrderWithApriori (
         // Make an array of file name guids that matches the FileHandle array so we can convert\r
         // quickly from file name to file handle\r
         //\r
-        CopyMem (&FileGuid[Index], &((EFI_FFS_FILE_HEADER *)Private->CurrentFvFileHandles[Index])->Name,sizeof(EFI_GUID));\r
+        Status = FvPpi->GetFileInfo (FvPpi, Private->CurrentFvFileHandles[Index], &FileInfo);\r
+        CopyMem (&FileGuid[Index], &FileInfo.FileName, sizeof(EFI_GUID));\r
       }\r
 \r
       //\r
@@ -202,13 +207,12 @@ ShadowPeiCore(
   //\r
   // Find the PEI Core in the BFV\r
   //\r
-  Status = PeiFindFileEx (\r
-             (EFI_PEI_FV_HANDLE)PrivateInMem->Fv[0].FvHeader,\r
-             NULL,\r
-             EFI_FV_FILETYPE_PEI_CORE,\r
-             &PeiCoreFileHandle,\r
-             NULL\r
-             );\r
+  Status = PrivateInMem->Fv[0].FvPpi->FindFileByType (\r
+                                        PrivateInMem->Fv[0].FvPpi,\r
+                                        EFI_FV_FILETYPE_PEI_CORE,\r
+                                        PrivateInMem->Fv[0].FvHandle,\r
+                                        &PeiCoreFileHandle\r
+                                        );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   //\r
@@ -248,7 +252,6 @@ PeiDispatcher (
   UINT32                              Index1;\r
   UINT32                              Index2;\r
   CONST EFI_PEI_SERVICES              **PeiServices;\r
-  EFI_PEI_FV_HANDLE                   VolumeHandle;\r
   EFI_PEI_FILE_HANDLE                 PeimFileHandle;\r
   UINTN                               FvCount;\r
   UINTN                               PeimCount;\r
@@ -272,7 +275,7 @@ PeiDispatcher (
   EFI_FV_FILE_INFO                    FvFileInfo;\r
   UINTN                               OldCheckingTop;\r
   UINTN                               OldCheckingBottom;\r
-\r
+  PEI_CORE_FV_HANDLE                  *CoreFvHandle;\r
 \r
   PeiServices = (CONST EFI_PEI_SERVICES **) &Private->PS;\r
   PeimEntryPoint = NULL;\r
@@ -349,11 +352,17 @@ PeiDispatcher (
     }\r
     \r
     for (FvCount = Private->CurrentPeimFvCount; FvCount < Private->FvCount; FvCount++) {\r
-      Private->CurrentPeimFvCount = FvCount;\r
+      CoreFvHandle = FindNextCoreFvHandle (Private, FvCount);\r
+      ASSERT (CoreFvHandle != NULL);\r
+      \r
       //\r
-      // Get this Fv Handle by PeiService FvFindNextVolume.\r
+      // If the FV has corresponding EFI_PEI_FIRMWARE_VOLUME_PPI instance, then dispatch it.\r
       //\r
-      PeiFvFindNextVolume (PeiServices, FvCount, &VolumeHandle);\r
+      if (CoreFvHandle->FvPpi == NULL) {\r
+        continue;\r
+      }\r
+      \r
+      Private->CurrentPeimFvCount = FvCount;\r
 \r
       if (Private->CurrentPeimCount == 0) {\r
         //\r
@@ -361,7 +370,7 @@ PeiDispatcher (
         // reorder all PEIMs to ensure the PEIMs in Apriori file to get\r
         // dispatch at first.\r
         //\r
-        DiscoverPeimsAndOrderWithApriori (Private, VolumeHandle);\r
+        DiscoverPeimsAndOrderWithApriori (Private, CoreFvHandle);\r
       }\r
 \r
       //\r
@@ -377,13 +386,14 @@ PeiDispatcher (
           if (!DepexSatisfied (Private, PeimFileHandle, PeimCount)) {\r
             Private->PeimNeedingDispatch = TRUE;\r
           } else {\r
-            Status = PeiFfsGetFileInfo (PeimFileHandle, &FvFileInfo);\r
+            Status = CoreFvHandle->FvPpi->GetFileInfo (CoreFvHandle->FvPpi, PeimFileHandle, &FvFileInfo);\r
             ASSERT_EFI_ERROR (Status);\r
             if (FvFileInfo.FileType == EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE) {\r
               //\r
               // For Fv type file, Produce new FV PPI and FV hob\r
               //\r
-              Status = ProcessFvFile (PeiServices, VolumeHandle, PeimFileHandle, &AuthenticationState);\r
+              Status = ProcessFvFile (&Private->Fv[FvCount], PeimFileHandle);\r
+              AuthenticationState = 0;\r
             } else {\r
               //\r
               // For PEIM driver, Load its entry point\r
@@ -412,7 +422,7 @@ PeiDispatcher (
                 sizeof (ExtendedData)\r
                 );\r
 \r
-              Status = VerifyPeim (Private, VolumeHandle, PeimFileHandle);\r
+              Status = VerifyPeim (Private, CoreFvHandle->FvHandle, PeimFileHandle);\r
               if (Status != EFI_SECURITY_VIOLATION && (AuthenticationState == 0)) {\r
                 //\r
                 // PEIM_STATE_NOT_DISPATCHED move to PEIM_STATE_DISPATCHED\r
@@ -807,3 +817,4 @@ PeiRegisterForShadow (
   return EFI_SUCCESS;\r
 }\r
 \r
+\r