]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c
Use two PCDs to replace _DISABLE_UNUSED_HII_PROTOCOLS_ macro.
[mirror_edk2.git] / MdeModulePkg / Core / Pei / Dispatcher / Dispatcher.c
index cf9ea5d173fe1a78ddb813cc405f3a2d3f014fcd..f5ce4dee613a3a883f7719459a51a287c659792b 100644 (file)
@@ -1,4 +1,4 @@
-/*++\r
+/** @file\r
 \r
 Copyright (c) 2006, Intel Corporation\r
 All rights reserved. This program and the accompanying materials\r
@@ -19,10 +19,15 @@ Abstract:
 \r
 Revision History\r
 \r
---*/\r
+**/\r
 \r
 #include <PeiMain.h>\r
 \r
+//\r
+//CAR is filled with this initial value during SEC phase\r
+//\r
+#define INIT_CAR_VALUE 0x5AA55AA5\r
+\r
 typedef struct {\r
   EFI_STATUS_CODE_DATA  DataHeader;\r
   EFI_HANDLE            Handle;\r
@@ -253,7 +258,6 @@ Returns:
   UINT32                              Index2;\r
   EFI_PEI_SERVICES                    **PeiServices;\r
   EFI_PEI_FV_HANDLE                   VolumeHandle;\r
-  //EFI_PHYSICAL_ADDRESS                PeiCoreFileHandle;\r
   EFI_PEI_FILE_HANDLE                 PeimFileHandle;\r
   UINTN                               FvCount;\r
   UINTN                               PeimCount;\r
@@ -270,7 +274,8 @@ Returns:
   TEMPORARY_RAM_SUPPORT_PPI           *TemporaryRamSupportPpi;\r
   EFI_HOB_HANDOFF_INFO_TABLE          *OldHandOffTable;\r
   EFI_HOB_HANDOFF_INFO_TABLE          *NewHandOffTable;\r
-  INTN                                Offset;\r
+  INTN                                StackOffset;\r
+  INTN                                HeapOffset;\r
   PEI_CORE_INSTANCE                   *PrivateInMem;\r
   UINT64                              NewPeiStackSize;\r
   UINT64                              OldPeiStackSize;\r
@@ -437,7 +442,28 @@ Returns:
             }\r
 \r
             if (Private->SwitchStackSignal) {\r
-\r
+              //\r
+              // Before switch stack from CAR to permenent memory, caculate the heap and stack\r
+              // usage in temporary memory for debuging.\r
+              //\r
+              DEBUG_CODE_BEGIN ();\r
+                UINT32  *StackPointer;\r
+                \r
+                for (StackPointer = (UINT32*)SecCoreData->StackBase;\r
+                     (StackPointer < (UINT32*)((UINTN)SecCoreData->StackBase + SecCoreData->StackSize)) \\r
+                     && (*StackPointer == INIT_CAR_VALUE);\r
+                     StackPointer ++);\r
+                     \r
+                DEBUG ((EFI_D_INFO, "Total Cache as RAM:    %d bytes.\n", SecCoreData->TemporaryRamSize));\r
+                DEBUG ((EFI_D_INFO, "  CAR stack ever used: %d bytes.\n",\r
+                       (SecCoreData->StackSize - ((UINTN) StackPointer - (UINTN)SecCoreData->StackBase))\r
+                      ));\r
+                DEBUG ((EFI_D_INFO, "  CAR heap used:       %d bytes.\n",\r
+                       ((UINTN) Private->HobList.HandoffInformationTable->EfiFreeMemoryBottom -\r
+                       (UINTN) Private->HobList.Raw)\r
+                      ));\r
+              DEBUG_CODE_END ();\r
+              \r
               //\r
               // Reserve the size of new stack at bottom of physical memory\r
               //\r
@@ -472,9 +498,13 @@ Returns:
               // CAUTION: The new base is computed accounding to gap of new stack.\r
               //\r
               NewPermenentMemoryBase = Private->PhysicalMemoryBegin + StackGap;\r
-              Offset                 = (UINTN) NewPermenentMemoryBase - (UINTN) SecCoreData->TemporaryRamBase;\r
-              NewHandOffTable        = (EFI_HOB_HANDOFF_INFO_TABLE *)((UINTN)OldHandOffTable + Offset);\r
-              PrivateInMem           = (PEI_CORE_INSTANCE *)((UINTN) (VOID*) Private + Offset);\r
+              StackOffset            = (UINTN) NewPermenentMemoryBase - (UINTN) SecCoreData->StackBase;\r
+              HeapOffset             = (INTN) ((UINTN) Private->PhysicalMemoryBegin + Private->StackSize - \\r
+                                               (UINTN) SecCoreData->PeiTemporaryRamBase);\r
+              DEBUG ((EFI_D_INFO, "Heap Offset = 0x%X Stack Offset = 0x%X\n", HeapOffset, StackOffset));\r
+              \r
+              NewHandOffTable        = (EFI_HOB_HANDOFF_INFO_TABLE *)((UINTN)OldHandOffTable + HeapOffset);\r
+              PrivateInMem           = (PEI_CORE_INSTANCE *)((UINTN) (VOID*) Private + StackOffset);\r
 \r
               //\r
               // TemporaryRamSupportPpi is produced by platform's SEC\r
@@ -497,11 +527,11 @@ Returns:
                                           );\r
 \r
               } else {\r
-                CopyMem (\r
-                  (VOID*)(UINTN) NewPermenentMemoryBase,\r
-                  SecCoreData->TemporaryRamBase,\r
-                  SecCoreData->TemporaryRamSize\r
-                  );\r
+                //\r
+                // In IA32/x64/Itanium architecture, we need platform provide\r
+                // TEMPORAY_RAM_MIGRATION_PPI.\r
+                //\r
+                ASSERT (FALSE);\r
               }\r
 \r
 \r
@@ -511,7 +541,7 @@ Returns:
               //\r
               PrivateInMem->PS          = &PrivateInMem->ServiceTableShadow;\r
               PrivateInMem->CpuIo       = &PrivateInMem->ServiceTableShadow.CpuIo;\r
-              PrivateInMem->HobList.Raw = (VOID*) ((UINTN) PrivateInMem->HobList.Raw + Offset);\r
+              PrivateInMem->HobList.Raw = (VOID*) ((UINTN) PrivateInMem->HobList.Raw + HeapOffset);\r
               PrivateInMem->StackBase   = (EFI_PHYSICAL_ADDRESS)(((UINTN)PrivateInMem->PhysicalMemoryBegin + EFI_PAGE_MASK) & ~EFI_PAGE_MASK);\r
 \r
               PeiServices = &PrivateInMem->PS;\r
@@ -525,7 +555,7 @@ Returns:
               // Update HandOffHob for new installed permenent memory\r
               //\r
               NewHandOffTable->EfiEndOfHobList =\r
-                (EFI_PHYSICAL_ADDRESS)(VOID*)((UINTN) NewHandOffTable->EfiEndOfHobList + Offset);\r
+                (EFI_PHYSICAL_ADDRESS)((UINTN) NewHandOffTable->EfiEndOfHobList + HeapOffset);\r
               NewHandOffTable->EfiMemoryTop        = PrivateInMem->PhysicalMemoryBegin +\r
                                                      PrivateInMem->PhysicalMemoryLength;\r
               NewHandOffTable->EfiMemoryBottom     = PrivateInMem->PhysicalMemoryBegin;\r
@@ -553,41 +583,14 @@ Returns:
               PrivateInMem->PeiMemoryInstalled     = TRUE;\r
 \r
               //\r
-              // Make sure we don't retry the same PEIM that added memory\r
+              // Restart scan of all PEIMs on next pass\r
               //\r
-              PrivateInMem->CurrentPeimCount++;\r
+              PrivateInMem->CurrentPeimCount = 0;\r
 \r
               //\r
               // Shadow PEI Core. When permanent memory is avaiable, shadow\r
               // PEI Core and PEIMs to get high performance.\r
               //\r
-              //PeiCoreFileHandle = 0;\r
-              //\r
-              // Find the PEI Core in the BFV\r
-              //\r
-              //Status = PeiFindFileEx (\r
-              //          (EFI_PEI_FV_HANDLE)PrivateInMem->Fv[0].FvHeader,\r
-              //          NULL,\r
-               //         EFI_FV_FILETYPE_PEI_CORE,\r
-              //          (EFI_PEI_FILE_HANDLE*)&PeiCoreFileHandle,\r
-              //          NULL\r
-              //          );\r
-              //ASSERT_EFI_ERROR (Status);\r
-\r
-              //\r
-              // Shadow PEI Core into memory so it will run faster\r
-              //\r
-              //Status = PeiLoadImage (\r
-              //           PeiServices,\r
-              //           *((EFI_PEI_FILE_HANDLE*)&PeiCoreFileHandle),\r
-              //           &EntryPoint,\r
-               //          &AuthenticationState\r
-               //          );\r
-              //ASSERT_EFI_ERROR (Status);\r
-\r
-              //PrivateInMem->ShadowedPeiCore = (VOID*) ((UINTN) EntryPoint +\r
-              //                                         (UINTN) PeiCore    -\r
-              //                                         (UINTN) _ModuleEntryPoint);\r
               PrivateInMem->ShadowedPeiCore = ShadowPeiCore (\r
                                                 PeiServices,\r
                                                 PrivateInMem\r
@@ -603,12 +606,6 @@ Returns:
               //\r
               PeiCore (SecCoreData, NULL, PrivateInMem);\r
 \r
-              //((PEI_CORE_ENTRY_POINT) (UINTN) PrivateInMem->ShadowedPeiCore) (\r
-              //                                        SecCoreData,\r
-              //                                        NULL,\r
-              //                                        PrivateInMem\r
-              //                                        );\r
-\r
               //\r
               // Code should not come here\r
               //\r