]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c
MdeModulePkg PeiCore: Add PCD to specify PEIM Shadow
[mirror_edk2.git] / MdeModulePkg / Core / Pei / Dispatcher / Dispatcher.c
index 3a85502dbe5ff2c3c32f9c2ca43226a444711944..46e990d75df06532803d16ace2822e2861e55af2 100644 (file)
@@ -697,6 +697,9 @@ PeiDispatcher (
       for (Index2 = 0; (Index2 < PcdGet32 (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
+          Private->CurrentFileHandle   = PeimFileHandle;\r
+          Private->CurrentPeimFvCount  = Index1;\r
+          Private->CurrentPeimCount    = Index2;\r
           Status = PeiLoadImage (\r
                     (CONST EFI_PEI_SERVICES **) &Private->Ps,\r
                     PeimFileHandle,\r
@@ -709,9 +712,6 @@ PeiDispatcher (
             // PEIM_STATE_REGISITER_FOR_SHADOW move to PEIM_STATE_DONE\r
             //\r
             Private->Fv[Index1].PeimState[Index2]++;\r
-            Private->CurrentFileHandle   = PeimFileHandle;\r
-            Private->CurrentPeimFvCount  = Index1;\r
-            Private->CurrentPeimCount    = Index2;\r
             //\r
             // Call the PEIM entry point\r
             //\r
@@ -1108,6 +1108,21 @@ PeiDispatcher (
               // We call the entry point a 2nd time so the module knows it's shadowed.\r
               //\r
               //PERF_START (PeiServices, L"PEIM", PeimFileHandle, 0);\r
+              if ((Private->HobList.HandoffInformationTable->BootMode != BOOT_ON_S3_RESUME) && !PcdGetBool (PcdShadowPeimOnBoot)) {\r
+                //\r
+                // Load PEIM into Memory for Register for shadow PEIM.\r
+                //\r
+                Status = PeiLoadImage (\r
+                           PeiServices,\r
+                           PeimFileHandle,\r
+                           PEIM_STATE_REGISITER_FOR_SHADOW,\r
+                           &EntryPoint,\r
+                           &AuthenticationState\r
+                           );\r
+                if (Status == EFI_SUCCESS) {\r
+                  PeimEntryPoint = (EFI_PEIM_ENTRY_POINT2)(UINTN)EntryPoint;\r
+                }\r
+              }\r
               ASSERT (PeimEntryPoint != NULL);\r
               PeimEntryPoint (PeimFileHandle, (const EFI_PEI_SERVICES **) PeiServices);\r
               //PERF_END (PeiServices, L"PEIM", PeimFileHandle, 0);\r