]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c
1) Update SetPeiServicesTablePointer's prototype add CONST modifier.
[mirror_edk2.git] / MdeModulePkg / Core / Pei / Dispatcher / Dispatcher.c
index 1ea443f6ef8b25c229edbf1126299f341d677023..54b145b8f06146b7448eba13ec88e561f10a5549 100644 (file)
@@ -231,9 +231,6 @@ ShadowPeiCore(
                          the BFV location.\r
   @param Private         Pointer to the private data passed in from caller\r
 \r
-  @retval EFI_SUCCESS   - Successfully dispatched PEIM.\r
-  @retval EFI_NOT_FOUND - The dispatch failed.\r
-\r
 **/\r
 VOID\r
 PeiDispatcher (\r
@@ -335,10 +332,22 @@ PeiDispatcher (
   // satisfied, this dipatcher should run only once.\r
   //\r
   do {\r
-\r
+    //\r
+    // In case that reenter PeiCore happens, the last pass record is still available.   \r
+    //\r
+    if (!Private->PeimDispatcherReenter) {\r
+      Private->PeimNeedingDispatch      = FALSE;\r
+      Private->PeimDispatchOnThisPass   = FALSE;\r
+    } else {\r
+      Private->PeimDispatcherReenter    = FALSE;\r
+    }\r
+    \r
     for (FvCount = Private->CurrentPeimFvCount; FvCount < Private->FvCount; FvCount++) {\r
       Private->CurrentPeimFvCount = FvCount;\r
-      VolumeHandle = Private->Fv[FvCount].FvHeader;\r
+      //\r
+      // Get this Fv Handle by PeiService FvFindNextVolume.\r
+      //\r
+      PeiFvFindNextVolume ((CONST EFI_PEI_SERVICES **) PeiServices, FvCount, &VolumeHandle);\r
 \r
       if (Private->CurrentPeimCount == 0) {\r
         //\r
@@ -451,7 +460,7 @@ PeiDispatcher (
               //\r
               // Reserve the size of new stack at bottom of physical memory\r
               //\r
-              OldPeiStackSize = Private->StackSize;\r
+              OldPeiStackSize = (UINT64) SecCoreData->StackSize;\r
               NewPeiStackSize = (RShiftU64 (Private->PhysicalMemoryLength, 1) + EFI_PAGE_MASK) & ~EFI_PAGE_MASK;\r
               if (FixedPcdGet32(PcdPeiCoreMaxPeiStackSize) > (UINT32) NewPeiStackSize) {\r
                 Private->StackSize = NewPeiStackSize;\r
@@ -465,10 +474,8 @@ PeiDispatcher (
               // But if new stack is smaller than the size of old stack, we also reserve\r
               // the size of old stack at bottom of permenent memory.\r
               //\r
-              StackGap = 0;\r
-              if (Private->StackSize > OldPeiStackSize) {\r
-                StackGap = Private->StackSize - OldPeiStackSize;\r
-              }\r
+              ASSERT (Private->StackSize >= OldPeiStackSize);\r
+              StackGap = Private->StackSize - OldPeiStackSize;\r
 \r
               //\r
               // Update HandOffHob for new installed permenent memory\r
@@ -581,6 +588,11 @@ PeiDispatcher (
               //\r
               PrivateInMem->PeiMemoryInstalled     = TRUE;\r
 \r
+              //\r
+              // Indicate that PeiCore reenter\r
+              //\r
+              PrivateInMem->PeimDispatcherReenter  = TRUE;\r
+              \r
               //\r
               // Shadow PEI Core. When permanent memory is avaiable, shadow\r
               // PEI Core and PEIMs to get high performance.\r
@@ -689,8 +701,7 @@ InitializeDispatcherData (
   )\r
 {\r
   if (OldCoreData == NULL) {\r
-    PrivateData->PeimNeedingDispatch    = FALSE;\r
-    PrivateData->PeimDispatchOnThisPass = FALSE;\r
+    PrivateData->PeimDispatcherReenter = FALSE;\r
     PeiInitializeFv (PrivateData, SecCoreData);\r
   }\r
 \r
@@ -788,135 +799,3 @@ PeiRegisterForShadow (
   return EFI_SUCCESS;\r
 }\r
 \r
-/**\r
-  Get Fv image from the FV type file, then install FV INFO ppi, Build FV hob.\r
-\r
-  @param PeiServices          An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.\r
-  @param FvFileHandle         File handle of a Fv type file.\r
-  @param AuthenticationState  Pointer to attestation authentication state of image.\r
-\r
-\r
-  @retval EFI_NOT_FOUND         FV image can't be found.\r
-  @retval EFI_SUCCESS           Successfully to process it.\r
-  @retval EFI_OUT_OF_RESOURCES  Can not allocate page when aligning FV image\r
-  @retval Others                Can not find EFI_SECTION_FIRMWARE_VOLUME_IMAGE section\r
-  \r
-**/\r
-EFI_STATUS\r
-ProcessFvFile (\r
-  IN  EFI_PEI_SERVICES      **PeiServices,\r
-  IN  EFI_PEI_FILE_HANDLE   FvFileHandle,\r
-  OUT UINT32                *AuthenticationState\r
-  )\r
-{\r
-  EFI_STATUS            Status;\r
-  EFI_PEI_FV_HANDLE     FvImageHandle;\r
-  EFI_FV_INFO           FvImageInfo;\r
-  UINT32                FvAlignment;\r
-  VOID                  *FvBuffer;\r
-  EFI_PEI_HOB_POINTERS  HobPtr;\r
-\r
-  FvBuffer             = NULL;\r
-  *AuthenticationState = 0;\r
-\r
-  //\r
-  // Check if this EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE file has already\r
-  // been extracted.\r
-  //\r
-  HobPtr.Raw = GetHobList ();\r
-  while ((HobPtr.Raw = GetNextHob (EFI_HOB_TYPE_FV2, HobPtr.Raw)) != NULL) {\r
-    if (CompareGuid (&(((EFI_FFS_FILE_HEADER *)FvFileHandle)->Name), &HobPtr.FirmwareVolume2->FileName)) {\r
-      //\r
-      // this FILE has been dispatched, it will not be dispatched again.\r
-      //\r
-      return EFI_SUCCESS;\r
-    }\r
-    HobPtr.Raw = GET_NEXT_HOB (HobPtr);\r
-  }\r
-\r
-  //\r
-  // Find FvImage in FvFile\r
-  //\r
-  Status = PeiFfsFindSectionData (\r
-             (CONST EFI_PEI_SERVICES **) PeiServices,\r
-             EFI_SECTION_FIRMWARE_VOLUME_IMAGE,\r
-             FvFileHandle,\r
-             (VOID **)&FvImageHandle\r
-             );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-  \r
-  //\r
-  // Collect FvImage Info.\r
-  //\r
-  Status = PeiFfsGetVolumeInfo (FvImageHandle, &FvImageInfo);\r
-  ASSERT_EFI_ERROR (Status);\r
-  \r
-  //\r
-  // FvAlignment must be more than 8 bytes required by FvHeader structure.\r
-  //\r
-  FvAlignment = 1 << ((FvImageInfo.FvAttributes & EFI_FVB2_ALIGNMENT) >> 16);\r
-  if (FvAlignment < 8) {\r
-    FvAlignment = 8;\r
-  }\r
-  \r
-  //\r
-  // Check FvImage\r
-  //\r
-  if ((UINTN) FvImageInfo.FvStart % FvAlignment != 0) {\r
-    FvBuffer = AllocateAlignedPages (EFI_SIZE_TO_PAGES ((UINT32) FvImageInfo.FvSize), FvAlignment);\r
-    if (FvBuffer == NULL) {\r
-      return EFI_OUT_OF_RESOURCES;\r
-    }\r
-    CopyMem (FvBuffer, FvImageInfo.FvStart, (UINTN) FvImageInfo.FvSize);\r
-    //\r
-    // Update FvImageInfo after reload FvImage to new aligned memory\r
-    //\r
-    PeiFfsGetVolumeInfo ((EFI_PEI_FV_HANDLE) FvBuffer, &FvImageInfo);\r
-  }\r
-\r
-  //\r
-  // Install FvPpi and Build FvHob\r
-  //\r
-  PiLibInstallFvInfoPpi (\r
-    NULL,\r
-    FvImageInfo.FvStart,\r
-    (UINT32) FvImageInfo.FvSize,\r
-    &(FvImageInfo.FvName),\r
-    &(((EFI_FFS_FILE_HEADER*)FvFileHandle)->Name)\r
-    );\r
-\r
-  //\r
-  // Inform the extracted FvImage to Fv HOB consumer phase, i.e. DXE phase\r
-  // based on its parent Fvimage is informed or not.\r
-  // If FvHob of its parent fvimage is built, the extracted FvImage will be built also. \r
-  // Or, the extracted FvImage will not be built.\r
-  //\r
-  HobPtr.Raw = GetHobList ();\r
-  while ((HobPtr.Raw = GetNextHob (EFI_HOB_TYPE_FV, HobPtr.Raw)) != NULL) {\r
-    if (((EFI_PHYSICAL_ADDRESS) (UINTN)FvFileHandle > HobPtr.FirmwareVolume->BaseAddress) && \r
-        ((EFI_PHYSICAL_ADDRESS) (UINTN)FvFileHandle < HobPtr.FirmwareVolume->BaseAddress + HobPtr.FirmwareVolume->Length)) {\r
-      BuildFvHob (\r
-        (EFI_PHYSICAL_ADDRESS) (UINTN) FvImageInfo.FvStart,\r
-        FvImageInfo.FvSize\r
-      );\r
-      break;\r
-    }\r
-    HobPtr.Raw = GET_NEXT_HOB (HobPtr);\r
-  }\r
-\r
-  //\r
-  // Makes the encapsulated volume show up in DXE phase to skip processing of\r
-  // encapsulated file again.\r
-  //\r
-  BuildFv2Hob (\r
-    (EFI_PHYSICAL_ADDRESS) (UINTN) FvImageInfo.FvStart,\r
-    FvImageInfo.FvSize,\r
-    &FvImageInfo.FvName,\r
-    &(((EFI_FFS_FILE_HEADER *)FvFileHandle)->Name)\r
-    );\r
-\r
-  return EFI_SUCCESS;\r
-}\r