]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c
1) add gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxFvSupported and gEfiMdeModulePkgTo...
[mirror_edk2.git] / MdeModulePkg / Core / Pei / Dispatcher / Dispatcher.c
index b9780a2c7b46b75577bc90ea1848998111d78aa6..6923181475a549a9e235f8cbffab26b978e517d4 100644 (file)
@@ -55,15 +55,15 @@ Returns:
 {\r
   EFI_STATUS                          Status;\r
   EFI_PEI_FV_HANDLE                   FileHandle;\r
-  EFI_PEI_FV_HANDLE                   AprioriFileHandle;\r
+  EFI_PEI_FILE_HANDLE                 AprioriFileHandle;\r
   EFI_GUID                            *Apriori;\r
   UINTN                               Index;\r
   UINTN                               Index2;\r
   UINTN                               PeimIndex;\r
   UINTN                               PeimCount;\r
   EFI_GUID                            *Guid;\r
-  EFI_PEI_FV_HANDLE                   TempFileHandles[PEI_CORE_MAX_PEIM_PER_FV];\r
-  EFI_GUID                            FileGuid[PEI_CORE_MAX_PEIM_PER_FV];\r
+  EFI_PEI_FV_HANDLE                   TempFileHandles[FixedPcdGet32 (PcdPeiCoreMaxPeimPerFv)];\r
+  EFI_GUID                            FileGuid[FixedPcdGet32 (PcdPeiCoreMaxPeimPerFv)];\r
 \r
   //\r
   // Walk the FV and find all the PEIMs and the Apriori file.\r
@@ -84,7 +84,7 @@ Returns:
   //\r
   // Go ahead to scan this Fv, and cache FileHandles within it.\r
   //\r
-  for (PeimCount = 0; PeimCount < PEI_CORE_MAX_PEIM_PER_FV; PeimCount++) {\r
+  for (PeimCount = 0; PeimCount < FixedPcdGet32 (PcdPeiCoreMaxPeimPerFv); PeimCount++) {\r
     Status = PeiFindFileEx (\r
                 VolumeHandle, \r
                 NULL, \r
@@ -104,7 +104,7 @@ Returns:
     //\r
     // Read the Apriori file\r
     //\r
-    Status = PeiServicesFfsFindSectionData (EFI_SECTION_RAW, &AprioriFileHandle, (VOID **) &Apriori);\r
+    Status = PeiServicesFfsFindSectionData (EFI_SECTION_RAW, AprioriFileHandle, (VOID **) &Apriori);\r
     if (!EFI_ERROR (Status)) {\r
       //\r
       // Calculate the number of PEIMs in the A Priori list\r
@@ -228,6 +228,7 @@ Returns:
   BOOLEAN                             PeimNeedingDispatch;\r
   BOOLEAN                             PeimDispatchOnThisPass;\r
   UINTN                               SaveCurrentPeimCount;\r
+  UINTN                               SaveCurrentFvCount;\r
   EFI_PEI_FILE_HANDLE                 SaveCurrentFileHandle;\r
   VOID                                *TopOfStack;\r
   PEI_CORE_PARAMETERS                 PeiCoreParameters;\r
@@ -244,10 +245,11 @@ Returns:
     // update the modules' status from PEIM_STATE_REGISITER_FOR_SHADOW to PEIM_STATE_DONE.\r
     //\r
     SaveCurrentPeimCount  = Private->CurrentPeimCount;\r
+    SaveCurrentFvCount    = Private->CurrentPeimFvCount;\r
     SaveCurrentFileHandle =  Private->CurrentFileHandle;\r
 \r
-    for (Index1 = 0;Index1 <= Private->CurrentPeimFvCount; Index1++) {\r
-      for (Index2 = 0; (Index2 < PEI_CORE_MAX_PEIM_PER_FV) && (Private->Fv[Index1].FvFileHandles[Index2] != NULL); Index2++) {\r
+    for (Index1 = 0; Index1 <= SaveCurrentFvCount; Index1++) {\r
+      for (Index2 = 0; (Index2 < FixedPcdGet32 (PcdPeiCoreMaxPeimPerFv)) && (Private->Fv[Index1].FvFileHandles[Index2] != NULL); Index2++) {\r
         if (Private->Fv[Index1].PeimState[Index2] == PEIM_STATE_REGISITER_FOR_SHADOW) {\r
           PeimFileHandle = Private->Fv[Index1].FvFileHandles[Index2];  \r
           Status = PeiLoadImage (\r
@@ -261,8 +263,9 @@ Returns:
             // PEIM_STATE_REGISITER_FOR_SHADOW move to PEIM_STATE_DONE\r
             //\r
             Private->Fv[Index1].PeimState[Index2]++;\r
-            Private->CurrentFileHandle = PeimFileHandle;\r
-            Private->CurrentPeimCount  = Index2;        \r
+            Private->CurrentFileHandle   = PeimFileHandle;\r
+            Private->CurrentPeimFvCount  = Index1;        \r
+            Private->CurrentPeimCount    = Index2;        \r
             //\r
             // Call the PEIM entry point\r
             //\r
@@ -281,8 +284,9 @@ Returns:
         }\r
       }\r
     }\r
-    Private->CurrentFileHandle = SaveCurrentFileHandle;   \r
-    Private->CurrentPeimCount  = SaveCurrentPeimCount;    \r
+    Private->CurrentFileHandle  = SaveCurrentFileHandle;   \r
+    Private->CurrentPeimFvCount = SaveCurrentFvCount;    \r
+    Private->CurrentPeimCount   = SaveCurrentPeimCount;    \r
   }\r
 \r
   //\r
@@ -314,7 +318,7 @@ Returns:
       // Start to dispatch all modules within the current Fv.\r
       //\r
       for (PeimCount = Private->CurrentPeimCount; \r
-           (PeimCount < PEI_CORE_MAX_PEIM_PER_FV) && (Private->CurrentFvFileHandles[PeimCount] != NULL); \r
+           (PeimCount < FixedPcdGet32 (PcdPeiCoreMaxPeimPerFv)) && (Private->CurrentFvFileHandles[PeimCount] != NULL); \r
            PeimCount++) {\r
         Private->CurrentPeimCount  = PeimCount;\r
         PeimFileHandle = Private->CurrentFileHandle = Private->CurrentFvFileHandles[PeimCount];\r
@@ -391,7 +395,8 @@ Returns:
               // Migrate IDT from CAR into real memory, so after stack switches to\r
               // the new memory, the caller can get memory version PeiServiceTable. \r
               //\r
-              //MigrateIdtTable (PeiServices);              \r
+              MigrateIdtTable (PeiServices);\r
+\r
               //\r
               // Since we are at dispatch level, only the Core's private data \r
               // is preserved, nobody else should have any data on the stack. \r