]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c
MdeModulePkg PeiCore: FvCount to be checked for the registered for shadow PEIM
[mirror_edk2.git] / MdeModulePkg / Core / Pei / Dispatcher / Dispatcher.c
index 2251b9b1b4ec152ceba38236d3d1c94242071157..0ac3fdde6a9a7440b6ccc570028ba23a0f2b078e 100644 (file)
@@ -1,7 +1,8 @@
 /** @file\r
   EFI PEI Core dispatch services\r
   \r
-Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>\r
+(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -14,11 +15,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include "PeiMain.h"\r
 \r
-///\r
-/// temporary memory is filled with this initial value during SEC phase\r
-///\r
-#define INIT_CAR_VALUE 0x5AA55AA5\r
-\r
 /**\r
 \r
   Discover all Peims and optional Apriori file in one FV. There is at most one\r
@@ -670,26 +666,39 @@ PeiCheckAndSwitchStack (
 \r
   if (Private->SwitchStackSignal) {\r
     //\r
-    // Before switch stack from temporary memory to permenent memory, calculate the heap and stack\r
-    // usage in temporary memory for debuging.\r
+    // Before switch stack from temporary memory to permanent memory, calculate the heap and stack\r
+    // usage in temporary memory for debugging.\r
     //\r
     DEBUG_CODE_BEGIN ();\r
-      UINT32  *StackPointer;\r
+      UINT32                *StackPointer;\r
+      EFI_PEI_HOB_POINTERS  Hob;\r
 \r
       for (StackPointer = (UINT32*)SecCoreData->StackBase;\r
            (StackPointer < (UINT32*)((UINTN)SecCoreData->StackBase + SecCoreData->StackSize)) \\r
-           && (*StackPointer == INIT_CAR_VALUE);\r
-           StackPointer ++);\r
+           && (*StackPointer == PcdGet32 (PcdInitValueInTempStack));\r
+           StackPointer ++) {\r
+      }\r
 \r
-      DEBUG ((EFI_D_INFO, "Temp Stack : BaseAddress=0x%p Length=0x%X\n", SecCoreData->StackBase, (UINT32)SecCoreData->StackSize));\r
-      DEBUG ((EFI_D_INFO, "Temp Heap  : BaseAddress=0x%p Length=0x%X\n", Private->HobList.Raw, (UINT32)((UINTN) Private->HobList.HandoffInformationTable->EfiFreeMemoryBottom - (UINTN) Private->HobList.Raw)));\r
-      DEBUG ((EFI_D_INFO, "Total temporary memory:    %d bytes.\n", (UINT32)SecCoreData->TemporaryRamSize));\r
-      DEBUG ((EFI_D_INFO, "  temporary memory stack ever used: %d bytes.\n",\r
+      DEBUG ((DEBUG_INFO, "Temp Stack : BaseAddress=0x%p Length=0x%X\n", SecCoreData->StackBase, (UINT32)SecCoreData->StackSize));\r
+      DEBUG ((DEBUG_INFO, "Temp Heap  : BaseAddress=0x%p Length=0x%X\n", SecCoreData->PeiTemporaryRamBase, (UINT32)SecCoreData->PeiTemporaryRamSize));\r
+      DEBUG ((DEBUG_INFO, "Total temporary memory:    %d bytes.\n", (UINT32)SecCoreData->TemporaryRamSize));\r
+      DEBUG ((DEBUG_INFO, "  temporary memory stack ever used:       %d bytes.\n",\r
              (UINT32)(SecCoreData->StackSize - ((UINTN) StackPointer - (UINTN)SecCoreData->StackBase))\r
             ));\r
-      DEBUG ((EFI_D_INFO, "  temporary memory heap used:       %d bytes.\n",\r
+      DEBUG ((DEBUG_INFO, "  temporary memory heap used for HobList: %d bytes.\n",\r
              (UINT32)((UINTN)Private->HobList.HandoffInformationTable->EfiFreeMemoryBottom - (UINTN)Private->HobList.Raw)\r
             ));\r
+      DEBUG ((DEBUG_INFO, "  temporary memory heap occupied by memory pages: %d bytes.\n",\r
+             (UINT32)(UINTN)(Private->HobList.HandoffInformationTable->EfiMemoryTop - Private->HobList.HandoffInformationTable->EfiFreeMemoryTop)\r
+            ));\r
+      for (Hob.Raw = Private->HobList.Raw; !END_OF_HOB_LIST(Hob); Hob.Raw = GET_NEXT_HOB(Hob)) {\r
+        if (GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_MEMORY_ALLOCATION) {\r
+          DEBUG ((DEBUG_INFO, "Memory Allocation 0x%08x 0x%0lx - 0x%0lx\n", \\r
+            Hob.MemoryAllocation->AllocDescriptor.MemoryType,               \\r
+            Hob.MemoryAllocation->AllocDescriptor.MemoryBaseAddress,        \\r
+            Hob.MemoryAllocation->AllocDescriptor.MemoryBaseAddress + Hob.MemoryAllocation->AllocDescriptor.MemoryLength - 1));\r
+        }\r
+      }\r
     DEBUG_CODE_END ();\r
 \r
     if (PcdGet64(PcdLoadModuleAtFixAddressEnable) != 0 && (Private->HobList.HandoffInformationTable->BootMode != BOOT_ON_S3_RESUME)) {\r
@@ -708,10 +717,10 @@ PeiCheckAndSwitchStack (
     //\r
     // Reserve the size of new stack at bottom of physical memory\r
     //\r
-    // The size of new stack in permenent memory must be the same size \r
+    // The size of new stack in permanent memory must be the same size\r
     // or larger than the size of old stack in temporary memory.\r
     // 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
+    // the size of old stack at bottom of permanent memory.\r
     //\r
     NewStackSize = RShiftU64 (Private->PhysicalMemoryLength, 1);\r
     NewStackSize = ALIGN_VALUE (NewStackSize, EFI_PAGE_SIZE);\r
@@ -788,7 +797,7 @@ PeiCheckAndSwitchStack (
 \r
       //\r
       // Temporary Ram Support PPI is provided by platform, it will copy \r
-      // temporary memory to permenent memory and do stack switching.\r
+      // temporary memory to permanent memory and do stack switching.\r
       // After invoking Temporary Ram Support PPI, the following code's \r
       // stack is in permanent memory.\r
       //\r
@@ -799,16 +808,28 @@ PeiCheckAndSwitchStack (
                                 TemporaryRamSize\r
                                 );\r
 \r
+      //\r
+      // Migrate memory pages allocated in pre-memory phase.\r
+      // It could not be called before calling TemporaryRamSupportPpi->TemporaryRamMigration()\r
+      // as the migrated memory pages may be overridden by TemporaryRamSupportPpi->TemporaryRamMigration().\r
+      //\r
+      MigrateMemoryPages (Private, TRUE);\r
+\r
       //\r
       // Entry PEI Phase 2\r
       //\r
       PeiCore (SecCoreData, NULL, Private);\r
     } else {\r
+      //\r
+      // Migrate memory pages allocated in pre-memory phase.\r
+      //\r
+      MigrateMemoryPages (Private, FALSE);\r
+\r
       //\r
       // Migrate the PEI Services Table pointer from temporary RAM to permanent RAM.\r
       //\r
       MigratePeiServicesTablePointer ();\r
-                \r
+\r
       //\r
       // Heap Offset\r
       //\r
@@ -836,7 +857,7 @@ PeiCheckAndSwitchStack (
       //\r
       HeapTemporaryRamSize = (UINTN) (Private->HobList.HandoffInformationTable->EfiFreeMemoryBottom - Private->HobList.HandoffInformationTable->EfiMemoryBottom);\r
       ASSERT (BaseOfNewHeap + HeapTemporaryRamSize <= Private->FreePhysicalMemoryTop);\r
-      CopyMem ((UINT8 *) (UINTN) BaseOfNewHeap, (UINT8 *) PeiTemporaryRamBase, HeapTemporaryRamSize);\r
+      CopyMem ((UINT8 *) (UINTN) BaseOfNewHeap, PeiTemporaryRamBase, HeapTemporaryRamSize);\r
 \r
       //\r
       // Migrate Stack\r
@@ -845,7 +866,6 @@ PeiCheckAndSwitchStack (
 \r
       //\r
       // Copy Hole Range Data\r
-      // Convert PPI from Hole. \r
       //\r
       if (HoleMemSize != 0) {\r
         //\r
@@ -950,15 +970,15 @@ PeiDispatcher (
   if ((Private->PeiMemoryInstalled) && (Private->HobList.HandoffInformationTable->BootMode != BOOT_ON_S3_RESUME || PcdGetBool (PcdShadowPeimOnS3Boot))) {\r
     //\r
     // Once real memory is available, shadow the RegisterForShadow modules. And meanwhile\r
-    // update the modules' status from PEIM_STATE_REGISITER_FOR_SHADOW to PEIM_STATE_DONE.\r
+    // update the modules' status from PEIM_STATE_REGISTER_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 <= SaveCurrentFvCount; Index1++) {\r
+    for (Index1 = 0; Index1 < Private->FvCount; Index1++) {\r
       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
+        if (Private->Fv[Index1].PeimState[Index2] == PEIM_STATE_REGISTER_FOR_SHADOW) {\r
           PeimFileHandle = Private->Fv[Index1].FvFileHandles[Index2];\r
           Private->CurrentFileHandle   = PeimFileHandle;\r
           Private->CurrentPeimFvCount  = Index1;\r
@@ -966,13 +986,13 @@ PeiDispatcher (
           Status = PeiLoadImage (\r
                     (CONST EFI_PEI_SERVICES **) &Private->Ps,\r
                     PeimFileHandle,\r
-                    PEIM_STATE_REGISITER_FOR_SHADOW,\r
+                    PEIM_STATE_REGISTER_FOR_SHADOW,\r
                     &EntryPoint,\r
                     &AuthenticationState\r
                     );\r
           if (Status == EFI_SUCCESS) {\r
             //\r
-            // PEIM_STATE_REGISITER_FOR_SHADOW move to PEIM_STATE_DONE\r
+            // PEIM_STATE_REGISTER_FOR_SHADOW move to PEIM_STATE_DONE\r
             //\r
             Private->Fv[Index1].PeimState[Index2]++;\r
             //\r
@@ -1110,6 +1130,13 @@ PeiDispatcher (
                   PeimEntryPoint = (EFI_PEIM_ENTRY_POINT2)(UINTN)EntryPoint;\r
                   PeimEntryPoint (PeimFileHandle, (const EFI_PEI_SERVICES **) PeiServices);\r
                   Private->PeimDispatchOnThisPass = TRUE;\r
+                } else {\r
+                  //\r
+                  // The related GuidedSectionExtraction PPI for the\r
+                  // signed PEIM image section may be installed in the rest\r
+                  // of this do-while loop, so need to make another pass.\r
+                  //\r
+                  Private->PeimNeedingDispatch = TRUE;\r
                 }\r
 \r
                 REPORT_STATUS_CODE_WITH_EXTENDED_DATA (\r
@@ -1138,10 +1165,10 @@ PeiDispatcher (
             //\r
             PeiCheckAndSwitchStack (SecCoreData, Private);\r
 \r
-            if ((Private->PeiMemoryInstalled) && (Private->Fv[FvCount].PeimState[PeimCount] == PEIM_STATE_REGISITER_FOR_SHADOW) &&   \\r
+            if ((Private->PeiMemoryInstalled) && (Private->Fv[FvCount].PeimState[PeimCount] == PEIM_STATE_REGISTER_FOR_SHADOW) &&   \\r
                 (Private->HobList.HandoffInformationTable->BootMode != BOOT_ON_S3_RESUME || PcdGetBool (PcdShadowPeimOnS3Boot))) {\r
               //\r
-              // If memory is availble we shadow images by default for performance reasons.\r
+              // If memory is available we shadow images by default for performance reasons.\r
               // 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
@@ -1152,7 +1179,7 @@ PeiDispatcher (
                 Status = PeiLoadImage (\r
                            PeiServices,\r
                            PeimFileHandle,\r
-                           PEIM_STATE_REGISITER_FOR_SHADOW,\r
+                           PEIM_STATE_REGISTER_FOR_SHADOW,\r
                            &EntryPoint,\r
                            &AuthenticationState\r
                            );\r
@@ -1165,7 +1192,7 @@ PeiDispatcher (
               //PERF_END (PeiServices, L"PEIM", PeimFileHandle, 0);\r
 \r
               //\r
-              // PEIM_STATE_REGISITER_FOR_SHADOW move to PEIM_STATE_DONE\r
+              // PEIM_STATE_REGISTER_FOR_SHADOW move to PEIM_STATE_DONE\r
               //\r
               Private->Fv[FvCount].PeimState[PeimCount]++;\r
 \r
@@ -1329,14 +1356,14 @@ PeiRegisterForShadow (
     return EFI_NOT_FOUND;\r
   }\r
 \r
-  if (Private->Fv[Private->CurrentPeimFvCount].PeimState[Private->CurrentPeimCount] >= PEIM_STATE_REGISITER_FOR_SHADOW) {\r
+  if (Private->Fv[Private->CurrentPeimFvCount].PeimState[Private->CurrentPeimCount] >= PEIM_STATE_REGISTER_FOR_SHADOW) {\r
     //\r
     // If the PEIM has already entered the PEIM_STATE_REGISTER_FOR_SHADOW or PEIM_STATE_DONE then it's already been started\r
     //\r
     return EFI_ALREADY_STARTED;\r
   }\r
 \r
-  Private->Fv[Private->CurrentPeimFvCount].PeimState[Private->CurrentPeimCount] = PEIM_STATE_REGISITER_FOR_SHADOW;\r
+  Private->Fv[Private->CurrentPeimFvCount].PeimState[Private->CurrentPeimCount] = PEIM_STATE_REGISTER_FOR_SHADOW;\r
 \r
   return EFI_SUCCESS;\r
 }\r