]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Fix two issues in PeiCore.
authorLiming Gao <liming.gao@intel.com>
Tue, 17 Dec 2013 06:21:33 +0000 (06:21 +0000)
committerlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 17 Dec 2013 06:21:33 +0000 (06:21 +0000)
1. HOB address is not 8 byte alignment.
2. FV with the max supported PEIM can't be dispatched.

Signed-off-by: Liming Gao <liming.gao@intel.com>
Reviewed-by: Star Zeng <star.zeng@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14993 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c

index 96381cd8c0281d3c73faf25287938686afae54cb..b5e2a824553f22253938542817db1c10cabd7e94 100644 (file)
@@ -49,7 +49,7 @@ DiscoverPeimsAndOrderWithApriori (
   UINTN                               PeimIndex;\r
   UINTN                               PeimCount;\r
   EFI_GUID                            *Guid;\r
   UINTN                               PeimIndex;\r
   UINTN                               PeimCount;\r
   EFI_GUID                            *Guid;\r
-  EFI_PEI_FILE_HANDLE                 TempFileHandles[FixedPcdGet32 (PcdPeiCoreMaxPeimPerFv)];\r
+  EFI_PEI_FILE_HANDLE                 TempFileHandles[FixedPcdGet32 (PcdPeiCoreMaxPeimPerFv) + 1];\r
   EFI_GUID                            FileGuid[FixedPcdGet32 (PcdPeiCoreMaxPeimPerFv)];\r
   EFI_PEI_FIRMWARE_VOLUME_PPI         *FvPpi;\r
   EFI_FV_FILE_INFO                    FileInfo;\r
   EFI_GUID                            FileGuid[FixedPcdGet32 (PcdPeiCoreMaxPeimPerFv)];\r
   EFI_PEI_FIRMWARE_VOLUME_PPI         *FvPpi;\r
   EFI_FV_FILE_INFO                    FileInfo;\r
@@ -75,20 +75,21 @@ DiscoverPeimsAndOrderWithApriori (
   //\r
   // Go ahead to scan this Fv, and cache FileHandles within it.\r
   //\r
   //\r
   // Go ahead to scan this Fv, and cache FileHandles within it.\r
   //\r
-  for (PeimCount = 0; PeimCount < FixedPcdGet32 (PcdPeiCoreMaxPeimPerFv); PeimCount++) {\r
+  Status = EFI_NOT_FOUND;\r
+  for (PeimCount = 0; PeimCount <= FixedPcdGet32 (PcdPeiCoreMaxPeimPerFv); PeimCount++) {\r
     Status = FvPpi->FindFileByType (FvPpi, PEI_CORE_INTERNAL_FFS_FILE_DISPATCH_TYPE, CoreFileHandle->FvHandle, &FileHandle);\r
     Status = FvPpi->FindFileByType (FvPpi, PEI_CORE_INTERNAL_FFS_FILE_DISPATCH_TYPE, CoreFileHandle->FvHandle, &FileHandle);\r
-    if (Status != EFI_SUCCESS) {\r
+    if (Status != EFI_SUCCESS || PeimCount == FixedPcdGet32 (PcdPeiCoreMaxPeimPerFv)) {\r
       break;\r
     }\r
 \r
     Private->CurrentFvFileHandles[PeimCount] = FileHandle;\r
   }\r
       break;\r
     }\r
 \r
     Private->CurrentFvFileHandles[PeimCount] = FileHandle;\r
   }\r
-  \r
+\r
   //\r
   // Check whether the count of Peims exceeds the max support PEIMs in a FV image\r
   // If more Peims are required in a FV image, PcdPeiCoreMaxPeimPerFv can be set to a larger value in DSC file.\r
   //\r
   //\r
   // Check whether the count of Peims exceeds the max support PEIMs in a FV image\r
   // If more Peims are required in a FV image, PcdPeiCoreMaxPeimPerFv can be set to a larger value in DSC file.\r
   //\r
-  ASSERT (PeimCount < FixedPcdGet32 (PcdPeiCoreMaxPeimPerFv));\r
+  ASSERT ((Status != EFI_SUCCESS) || (PeimCount < FixedPcdGet32 (PcdPeiCoreMaxPeimPerFv)));\r
 \r
   //\r
   // Get Apriori File handle\r
 \r
   //\r
   // Get Apriori File handle\r
@@ -1001,7 +1002,10 @@ PeiDispatcher (
                 HoleMemBase   = TopOfNewStack;\r
                 HoleMemSize   = TemporaryRamSize - PeiTemporaryRamSize - TemporaryStackSize;\r
                 if (HoleMemSize != 0) {\r
                 HoleMemBase   = TopOfNewStack;\r
                 HoleMemSize   = TemporaryRamSize - PeiTemporaryRamSize - TemporaryStackSize;\r
                 if (HoleMemSize != 0) {\r
-                  BaseOfNewHeap = BaseOfNewHeap + HoleMemSize;\r
+                  //\r
+                  // Make sure HOB List start address is 8 byte alignment.\r
+                  //\r
+                  BaseOfNewHeap = ALIGN_VALUE (BaseOfNewHeap + HoleMemSize, 8);\r
                 }\r
                 if (BaseOfNewHeap >= (UINTN)SecCoreData->PeiTemporaryRamBase) {\r
                   Private->HeapOffsetPositive = TRUE;\r
                 }\r
                 if (BaseOfNewHeap >= (UINTN)SecCoreData->PeiTemporaryRamBase) {\r
                   Private->HeapOffsetPositive = TRUE;\r