]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Pei/Ppi/Ppi.c
MdeModulePkg: Apply uncrustify changes
[mirror_edk2.git] / MdeModulePkg / Core / Pei / Ppi / Ppi.c
index c33dfdf8aa5f3201fc9f16afb30d7eda64095ec4..0e85264ddb9390145aea3d73e98d7dec87e0bd58 100644 (file)
@@ -1,14 +1,8 @@
 /** @file\r
   EFI PEI Core PPI services\r
 \r
-Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<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
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -27,19 +21,20 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 **/\r
 VOID\r
 ConvertPointer (\r
-  IN OUT VOID              **Pointer,\r
-  IN UINTN                 TempBottom,\r
-  IN UINTN                 TempTop,\r
-  IN UINTN                 Offset,\r
-  IN BOOLEAN               OffsetPositive\r
+  IN OUT VOID  **Pointer,\r
+  IN UINTN     TempBottom,\r
+  IN UINTN     TempTop,\r
+  IN UINTN     Offset,\r
+  IN BOOLEAN   OffsetPositive\r
   )\r
 {\r
-  if (((UINTN) *Pointer < TempTop) &&\r
-    ((UINTN) *Pointer >= TempBottom)) {\r
+  if (((UINTN)*Pointer < TempTop) &&\r
+      ((UINTN)*Pointer >= TempBottom))\r
+  {\r
     if (OffsetPositive) {\r
-      *Pointer = (VOID *) ((UINTN) *Pointer + Offset);\r
+      *Pointer = (VOID *)((UINTN)*Pointer + Offset);\r
     } else {\r
-      *Pointer = (VOID *) ((UINTN) *Pointer - Offset);\r
+      *Pointer = (VOID *)((UINTN)*Pointer - Offset);\r
     }\r
   }\r
 }\r
@@ -61,7 +56,7 @@ ConvertPointerInRanges (
   IN OUT VOID                    **Pointer\r
   )\r
 {\r
-  UINT8                 IndexHole;\r
+  UINT8  IndexHole;\r
 \r
   if (PrivateData->MemoryPages.Size != 0) {\r
     //\r
@@ -102,7 +97,7 @@ ConvertPointerInRanges (
   //\r
   // Convert PPI pointer in old TempRam Hole\r
   //\r
-  for (IndexHole = 0; IndexHole < HOLE_MAX_NUMBER; IndexHole ++) {\r
+  for (IndexHole = 0; IndexHole < HOLE_MAX_NUMBER; IndexHole++) {\r
     if (PrivateData->HoleData[IndexHole].Size == 0) {\r
       continue;\r
     }\r
@@ -145,12 +140,12 @@ ConvertSinglePpiPointer (
   // 2. Convert the pointer to the GUID in the PPI or NOTIFY descriptor\r
   //    from the old TempRam to the relocated physical memory.\r
   //\r
-  ConvertPointerInRanges (SecCoreData, PrivateData, (VOID **) &PpiPointer->Ppi->Guid);\r
+  ConvertPointerInRanges (SecCoreData, PrivateData, (VOID **)&PpiPointer->Ppi->Guid);\r
   //\r
   // 3. Convert the pointer to the PPI interface structure in the PPI descriptor\r
   //    from the old TempRam to the relocated physical memory.\r
   //\r
-  ConvertPointerInRanges (SecCoreData, PrivateData, (VOID **) &PpiPointer->Ppi->Ppi);\r
+  ConvertPointerInRanges (SecCoreData, PrivateData, (VOID **)&PpiPointer->Ppi->Ppi);\r
 }\r
 \r
 /**\r
@@ -168,7 +163,7 @@ ConvertPpiPointers (
   IN PEI_CORE_INSTANCE           *PrivateData\r
   )\r
 {\r
-  UINT8                 Index;\r
+  UINT8  Index;\r
 \r
   //\r
   // Convert normal PPIs.\r
@@ -204,6 +199,234 @@ ConvertPpiPointers (
   }\r
 }\r
 \r
+/**\r
+\r
+  Migrate Notify Pointers inside an FV from temporary memory to permanent memory.\r
+\r
+  @param PrivateData      Pointer to PeiCore's private data structure.\r
+  @param OrgFvHandle      Address of FV Handle in temporary memory.\r
+  @param FvHandle         Address of FV Handle in permanent memory.\r
+  @param FvSize           Size of the FV.\r
+\r
+**/\r
+VOID\r
+ConvertPpiPointersFv (\r
+  IN  PEI_CORE_INSTANCE  *PrivateData,\r
+  IN  UINTN              OrgFvHandle,\r
+  IN  UINTN              FvHandle,\r
+  IN  UINTN              FvSize\r
+  )\r
+{\r
+  UINT8                             Index;\r
+  UINTN                             Offset;\r
+  BOOLEAN                           OffsetPositive;\r
+  EFI_PEI_FIRMWARE_VOLUME_INFO_PPI  *FvInfoPpi;\r
+  UINT8                             GuidIndex;\r
+  EFI_GUID                          *Guid;\r
+  EFI_GUID                          *GuidCheckList[2];\r
+\r
+  GuidCheckList[0] = &gEfiPeiFirmwareVolumeInfoPpiGuid;\r
+  GuidCheckList[1] = &gEfiPeiFirmwareVolumeInfo2PpiGuid;\r
+\r
+  if (FvHandle > OrgFvHandle) {\r
+    OffsetPositive = TRUE;\r
+    Offset         = FvHandle - OrgFvHandle;\r
+  } else {\r
+    OffsetPositive = FALSE;\r
+    Offset         = OrgFvHandle - FvHandle;\r
+  }\r
+\r
+  DEBUG ((DEBUG_VERBOSE, "Converting PPI pointers in FV.\n"));\r
+  DEBUG ((\r
+    DEBUG_VERBOSE,\r
+    "  OrgFvHandle at 0x%08x. FvHandle at 0x%08x. FvSize = 0x%x\n",\r
+    (UINTN)OrgFvHandle,\r
+    (UINTN)FvHandle,\r
+    FvSize\r
+    ));\r
+  DEBUG ((\r
+    DEBUG_VERBOSE,\r
+    "    OrgFvHandle range: 0x%08x - 0x%08x\n",\r
+    OrgFvHandle,\r
+    OrgFvHandle + FvSize\r
+    ));\r
+\r
+  for (Index = 0; Index < PrivateData->PpiData.CallbackNotifyList.CurrentCount; Index++) {\r
+    ConvertPointer (\r
+      (VOID **)&PrivateData->PpiData.CallbackNotifyList.NotifyPtrs[Index].Raw,\r
+      OrgFvHandle,\r
+      OrgFvHandle + FvSize,\r
+      Offset,\r
+      OffsetPositive\r
+      );\r
+    ConvertPointer (\r
+      (VOID **)&PrivateData->PpiData.CallbackNotifyList.NotifyPtrs[Index].Notify->Guid,\r
+      OrgFvHandle,\r
+      OrgFvHandle + FvSize,\r
+      Offset,\r
+      OffsetPositive\r
+      );\r
+    ConvertPointer (\r
+      (VOID **)&PrivateData->PpiData.CallbackNotifyList.NotifyPtrs[Index].Notify->Notify,\r
+      OrgFvHandle,\r
+      OrgFvHandle + FvSize,\r
+      Offset,\r
+      OffsetPositive\r
+      );\r
+  }\r
+\r
+  for (Index = 0; Index < PrivateData->PpiData.DispatchNotifyList.CurrentCount; Index++) {\r
+    ConvertPointer (\r
+      (VOID **)&PrivateData->PpiData.DispatchNotifyList.NotifyPtrs[Index].Raw,\r
+      OrgFvHandle,\r
+      OrgFvHandle + FvSize,\r
+      Offset,\r
+      OffsetPositive\r
+      );\r
+    ConvertPointer (\r
+      (VOID **)&PrivateData->PpiData.DispatchNotifyList.NotifyPtrs[Index].Notify->Guid,\r
+      OrgFvHandle,\r
+      OrgFvHandle + FvSize,\r
+      Offset,\r
+      OffsetPositive\r
+      );\r
+    ConvertPointer (\r
+      (VOID **)&PrivateData->PpiData.DispatchNotifyList.NotifyPtrs[Index].Notify->Notify,\r
+      OrgFvHandle,\r
+      OrgFvHandle + FvSize,\r
+      Offset,\r
+      OffsetPositive\r
+      );\r
+  }\r
+\r
+  for (Index = 0; Index < PrivateData->PpiData.PpiList.CurrentCount; Index++) {\r
+    ConvertPointer (\r
+      (VOID **)&PrivateData->PpiData.PpiList.PpiPtrs[Index].Raw,\r
+      OrgFvHandle,\r
+      OrgFvHandle + FvSize,\r
+      Offset,\r
+      OffsetPositive\r
+      );\r
+    ConvertPointer (\r
+      (VOID **)&PrivateData->PpiData.PpiList.PpiPtrs[Index].Ppi->Guid,\r
+      OrgFvHandle,\r
+      OrgFvHandle + FvSize,\r
+      Offset,\r
+      OffsetPositive\r
+      );\r
+    ConvertPointer (\r
+      (VOID **)&PrivateData->PpiData.PpiList.PpiPtrs[Index].Ppi->Ppi,\r
+      OrgFvHandle,\r
+      OrgFvHandle + FvSize,\r
+      Offset,\r
+      OffsetPositive\r
+      );\r
+\r
+    Guid = PrivateData->PpiData.PpiList.PpiPtrs[Index].Ppi->Guid;\r
+    for (GuidIndex = 0; GuidIndex < ARRAY_SIZE (GuidCheckList); ++GuidIndex) {\r
+      //\r
+      // Don't use CompareGuid function here for performance reasons.\r
+      // Instead we compare the GUID as INT32 at a time and branch\r
+      // on the first failed comparison.\r
+      //\r
+      if ((((INT32 *)Guid)[0] == ((INT32 *)GuidCheckList[GuidIndex])[0]) &&\r
+          (((INT32 *)Guid)[1] == ((INT32 *)GuidCheckList[GuidIndex])[1]) &&\r
+          (((INT32 *)Guid)[2] == ((INT32 *)GuidCheckList[GuidIndex])[2]) &&\r
+          (((INT32 *)Guid)[3] == ((INT32 *)GuidCheckList[GuidIndex])[3]))\r
+      {\r
+        FvInfoPpi = PrivateData->PpiData.PpiList.PpiPtrs[Index].Ppi->Ppi;\r
+        DEBUG ((DEBUG_VERBOSE, "      FvInfo: %p -> ", FvInfoPpi->FvInfo));\r
+        if ((UINTN)FvInfoPpi->FvInfo == OrgFvHandle) {\r
+          ConvertPointer (\r
+            (VOID **)&FvInfoPpi->FvInfo,\r
+            OrgFvHandle,\r
+            OrgFvHandle + FvSize,\r
+            Offset,\r
+            OffsetPositive\r
+            );\r
+          DEBUG ((DEBUG_VERBOSE, "%p", FvInfoPpi->FvInfo));\r
+        }\r
+\r
+        DEBUG ((DEBUG_VERBOSE, "\n"));\r
+        break;\r
+      }\r
+    }\r
+  }\r
+}\r
+\r
+/**\r
+\r
+  Dumps the PPI lists to debug output.\r
+\r
+  @param PrivateData     Points to PeiCore's private instance data.\r
+\r
+**/\r
+VOID\r
+DumpPpiList (\r
+  IN PEI_CORE_INSTANCE  *PrivateData\r
+  )\r
+{\r
+  DEBUG_CODE_BEGIN ();\r
+  UINTN  Index;\r
+\r
+  if (PrivateData == NULL) {\r
+    return;\r
+  }\r
+\r
+  for (Index = 0; Index < PrivateData->PpiData.CallbackNotifyList.CurrentCount; Index++) {\r
+    DEBUG ((\r
+      DEBUG_VERBOSE,\r
+      "CallbackNotify[%2d] {%g} at 0x%x (%a)\n",\r
+      Index,\r
+      PrivateData->PpiData.CallbackNotifyList.NotifyPtrs[Index].Notify->Guid,\r
+      (UINTN)PrivateData->PpiData.CallbackNotifyList.NotifyPtrs[Index].Raw,\r
+      (\r
+       !(\r
+         ((EFI_PHYSICAL_ADDRESS)(UINTN)PrivateData->PpiData.CallbackNotifyList.NotifyPtrs[Index].Raw >= PrivateData->PhysicalMemoryBegin) &&\r
+         (((EFI_PHYSICAL_ADDRESS)((UINTN)PrivateData->PpiData.CallbackNotifyList.NotifyPtrs[Index].Raw) + sizeof (EFI_PEI_NOTIFY_DESCRIPTOR)) < PrivateData->FreePhysicalMemoryTop)\r
+         )\r
+        ? "CAR" : "Post-Memory"\r
+      )\r
+      ));\r
+  }\r
+\r
+  for (Index = 0; Index < PrivateData->PpiData.DispatchNotifyList.CurrentCount; Index++) {\r
+    DEBUG ((\r
+      DEBUG_VERBOSE,\r
+      "DispatchNotify[%2d] {%g} at 0x%x (%a)\n",\r
+      Index,\r
+      PrivateData->PpiData.DispatchNotifyList.NotifyPtrs[Index].Notify->Guid,\r
+      (UINTN)PrivateData->PpiData.DispatchNotifyList.NotifyPtrs[Index].Raw,\r
+      (\r
+       !(\r
+         ((EFI_PHYSICAL_ADDRESS)(UINTN)PrivateData->PpiData.DispatchNotifyList.NotifyPtrs[Index].Raw >= PrivateData->PhysicalMemoryBegin) &&\r
+         (((EFI_PHYSICAL_ADDRESS)((UINTN)PrivateData->PpiData.DispatchNotifyList.NotifyPtrs[Index].Raw) + sizeof (EFI_PEI_NOTIFY_DESCRIPTOR)) < PrivateData->FreePhysicalMemoryTop)\r
+         )\r
+      ? "CAR" : "Post-Memory"\r
+      )\r
+      ));\r
+  }\r
+\r
+  for (Index = 0; Index < PrivateData->PpiData.PpiList.CurrentCount; Index++) {\r
+    DEBUG ((\r
+      DEBUG_VERBOSE,\r
+      "PPI[%2d] {%g} at 0x%x (%a)\n",\r
+      Index,\r
+      PrivateData->PpiData.PpiList.PpiPtrs[Index].Ppi->Guid,\r
+      (UINTN)PrivateData->PpiData.PpiList.PpiPtrs[Index].Raw,\r
+      (\r
+       !(\r
+         ((EFI_PHYSICAL_ADDRESS)(UINTN)PrivateData->PpiData.PpiList.PpiPtrs[Index].Raw >= PrivateData->PhysicalMemoryBegin) &&\r
+         (((EFI_PHYSICAL_ADDRESS)((UINTN)PrivateData->PpiData.PpiList.PpiPtrs[Index].Raw) + sizeof (EFI_PEI_PPI_DESCRIPTOR)) < PrivateData->FreePhysicalMemoryTop)\r
+         )\r
+      ? "CAR" : "Post-Memory"\r
+      )\r
+      ));\r
+  }\r
+\r
+  DEBUG_CODE_END ();\r
+}\r
+\r
 /**\r
 \r
   This function installs an interface in the PEI PPI database by GUID.\r
@@ -229,21 +452,21 @@ InternalPeiInstallPpi (
   IN BOOLEAN                       Single\r
   )\r
 {\r
-  PEI_CORE_INSTANCE     *PrivateData;\r
-  PEI_PPI_LIST          *PpiListPointer;\r
-  UINTN                 Index;\r
-  UINTN                 LastCount;\r
-  VOID                  *TempPtr;\r
+  PEI_CORE_INSTANCE  *PrivateData;\r
+  PEI_PPI_LIST       *PpiListPointer;\r
+  UINTN              Index;\r
+  UINTN              LastCount;\r
+  VOID               *TempPtr;\r
 \r
   if (PpiList == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS(PeiServices);\r
+  PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices);\r
 \r
   PpiListPointer = &PrivateData->PpiData.PpiList;\r
-  Index = PpiListPointer->CurrentCount;\r
-  LastCount = Index;\r
+  Index          = PpiListPointer->CurrentCount;\r
+  LastCount      = Index;\r
 \r
   //\r
   // This is loop installs all PPI descriptors in the PpiList.  It is terminated\r
@@ -251,7 +474,7 @@ InternalPeiInstallPpi (
   // EFI_PEI_PPI_DESCRIPTOR in the list.\r
   //\r
 \r
-  for (;;) {\r
+  for ( ; ;) {\r
     //\r
     // Check if it is a valid PPI.\r
     // If not, rollback list to exclude all in this list.\r
@@ -259,8 +482,8 @@ InternalPeiInstallPpi (
     //\r
     if ((PpiList->Flags & EFI_PEI_PPI_DESCRIPTOR_PPI) == 0) {\r
       PpiListPointer->CurrentCount = LastCount;\r
-      DEBUG((EFI_D_ERROR, "ERROR -> InstallPpi: %g %p\n", PpiList->Guid, PpiList->Ppi));\r
-      return  EFI_INVALID_PARAMETER;\r
+      DEBUG ((DEBUG_ERROR, "ERROR -> InstallPpi: %g %p\n", PpiList->Guid, PpiList->Ppi));\r
+      return EFI_INVALID_PARAMETER;\r
     }\r
 \r
     if (Index >= PpiListPointer->MaxCount) {\r
@@ -276,12 +499,12 @@ InternalPeiInstallPpi (
         PpiListPointer->PpiPtrs,\r
         sizeof (PEI_PPI_LIST_POINTERS) * PpiListPointer->MaxCount\r
         );\r
-      PpiListPointer->PpiPtrs = TempPtr;\r
+      PpiListPointer->PpiPtrs  = TempPtr;\r
       PpiListPointer->MaxCount = PpiListPointer->MaxCount + PPI_GROWTH_STEP;\r
     }\r
 \r
-    DEBUG((EFI_D_INFO, "Install PPI: %g\n", PpiList->Guid));\r
-    PpiListPointer->PpiPtrs[Index].Ppi = (EFI_PEI_PPI_DESCRIPTOR *) PpiList;\r
+    DEBUG ((DEBUG_INFO, "Install PPI: %g\n", PpiList->Guid));\r
+    PpiListPointer->PpiPtrs[Index].Ppi = (EFI_PEI_PPI_DESCRIPTOR *)PpiList;\r
     Index++;\r
     PpiListPointer->CurrentCount++;\r
 \r
@@ -291,12 +514,14 @@ InternalPeiInstallPpi (
       //\r
       break;\r
     } else if ((PpiList->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) ==\r
-               EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) {\r
+               EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST)\r
+    {\r
       //\r
       // Continue until the end of the PPI List.\r
       //\r
       break;\r
     }\r
+\r
     //\r
     // Go to the next descriptor.\r
     //\r
@@ -368,19 +593,18 @@ PeiReInstallPpi (
   IN CONST EFI_PEI_PPI_DESCRIPTOR  *NewPpi\r
   )\r
 {\r
-  PEI_CORE_INSTANCE   *PrivateData;\r
-  UINTN               Index;\r
-\r
+  PEI_CORE_INSTANCE  *PrivateData;\r
+  UINTN              Index;\r
 \r
   if ((OldPpi == NULL) || (NewPpi == NULL)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
   if ((NewPpi->Flags & EFI_PEI_PPI_DESCRIPTOR_PPI) == 0) {\r
-    return  EFI_INVALID_PARAMETER;\r
+    return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS(PeiServices);\r
+  PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices);\r
 \r
   //\r
   // Find the old PPI instance in the database.  If we can not find it,\r
@@ -391,6 +615,7 @@ PeiReInstallPpi (
       break;\r
     }\r
   }\r
+\r
   if (Index == PrivateData->PpiData.PpiList.CurrentCount) {\r
     return EFI_NOT_FOUND;\r
   }\r
@@ -398,8 +623,8 @@ PeiReInstallPpi (
   //\r
   // Replace the old PPI with the new one.\r
   //\r
-  DEBUG((EFI_D_INFO, "Reinstall PPI: %g\n", NewPpi->Guid));\r
-  PrivateData->PpiData.PpiList.PpiPtrs[Index].Ppi = (EFI_PEI_PPI_DESCRIPTOR *) NewPpi;\r
+  DEBUG ((DEBUG_INFO, "Reinstall PPI: %g\n", NewPpi->Guid));\r
+  PrivateData->PpiData.PpiList.PpiPtrs[Index].Ppi = (EFI_PEI_PPI_DESCRIPTOR *)NewPpi;\r
 \r
   //\r
   // Process any callback level notifies for the newly installed PPI.\r
@@ -435,26 +660,25 @@ PeiReInstallPpi (
 EFI_STATUS\r
 EFIAPI\r
 PeiLocatePpi (\r
-  IN CONST EFI_PEI_SERVICES        **PeiServices,\r
-  IN CONST EFI_GUID                *Guid,\r
-  IN UINTN                         Instance,\r
-  IN OUT EFI_PEI_PPI_DESCRIPTOR    **PpiDescriptor,\r
-  IN OUT VOID                      **Ppi\r
+  IN CONST EFI_PEI_SERVICES      **PeiServices,\r
+  IN CONST EFI_GUID              *Guid,\r
+  IN UINTN                       Instance,\r
+  IN OUT EFI_PEI_PPI_DESCRIPTOR  **PpiDescriptor,\r
+  IN OUT VOID                    **Ppi\r
   )\r
 {\r
-  PEI_CORE_INSTANCE         *PrivateData;\r
-  UINTN                     Index;\r
-  EFI_GUID                  *CheckGuid;\r
-  EFI_PEI_PPI_DESCRIPTOR    *TempPtr;\r
-\r
+  PEI_CORE_INSTANCE       *PrivateData;\r
+  UINTN                   Index;\r
+  EFI_GUID                *CheckGuid;\r
+  EFI_PEI_PPI_DESCRIPTOR  *TempPtr;\r
 \r
-  PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS(PeiServices);\r
+  PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices);\r
 \r
   //\r
   // Search the data base for the matching instance of the GUIDed PPI.\r
   //\r
   for (Index = 0; Index < PrivateData->PpiData.PpiList.CurrentCount; Index++) {\r
-    TempPtr = PrivateData->PpiData.PpiList.PpiPtrs[Index].Ppi;\r
+    TempPtr   = PrivateData->PpiData.PpiList.PpiPtrs[Index].Ppi;\r
     CheckGuid = TempPtr->Guid;\r
 \r
     //\r
@@ -465,9 +689,9 @@ PeiLocatePpi (
     if ((((INT32 *)Guid)[0] == ((INT32 *)CheckGuid)[0]) &&\r
         (((INT32 *)Guid)[1] == ((INT32 *)CheckGuid)[1]) &&\r
         (((INT32 *)Guid)[2] == ((INT32 *)CheckGuid)[2]) &&\r
-        (((INT32 *)Guid)[3] == ((INT32 *)CheckGuid)[3])) {\r
+        (((INT32 *)Guid)[3] == ((INT32 *)CheckGuid)[3]))\r
+    {\r
       if (Instance == 0) {\r
-\r
         if (PpiDescriptor != NULL) {\r
           *PpiDescriptor = TempPtr;\r
         }\r
@@ -476,9 +700,9 @@ PeiLocatePpi (
           *Ppi = TempPtr->Ppi;\r
         }\r
 \r
-\r
         return EFI_SUCCESS;\r
       }\r
+\r
       Instance--;\r
     }\r
   }\r
@@ -523,15 +747,15 @@ InternalPeiNotifyPpi (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS(PeiServices);\r
+  PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices);\r
 \r
   CallbackNotifyListPointer = &PrivateData->PpiData.CallbackNotifyList;\r
-  CallbackNotifyIndex = CallbackNotifyListPointer->CurrentCount;\r
-  LastCallbackNotifyCount = CallbackNotifyIndex;\r
+  CallbackNotifyIndex       = CallbackNotifyListPointer->CurrentCount;\r
+  LastCallbackNotifyCount   = CallbackNotifyIndex;\r
 \r
   DispatchNotifyListPointer = &PrivateData->PpiData.DispatchNotifyList;\r
-  DispatchNotifyIndex = DispatchNotifyListPointer->CurrentCount;\r
-  LastDispatchNotifyCount = DispatchNotifyIndex;\r
+  DispatchNotifyIndex       = DispatchNotifyListPointer->CurrentCount;\r
+  LastDispatchNotifyCount   = DispatchNotifyIndex;\r
 \r
   //\r
   // This is loop installs all Notify descriptors in the NotifyList.  It is\r
@@ -539,15 +763,15 @@ InternalPeiNotifyPpi (
   // EFI_PEI_NOTIFY_DESCRIPTOR in the list.\r
   //\r
 \r
-  for (;;) {\r
+  for ( ; ;) {\r
     //\r
     // If some of the PPI data is invalid restore original Notify PPI database value\r
     //\r
     if ((NotifyList->Flags & EFI_PEI_PPI_DESCRIPTOR_NOTIFY_TYPES) == 0) {\r
-        CallbackNotifyListPointer->CurrentCount = LastCallbackNotifyCount;\r
-        DispatchNotifyListPointer->CurrentCount = LastDispatchNotifyCount;\r
-        DEBUG((DEBUG_ERROR, "ERROR -> NotifyPpi: %g %p\n", NotifyList->Guid, NotifyList->Notify));\r
-      return  EFI_INVALID_PARAMETER;\r
+      CallbackNotifyListPointer->CurrentCount = LastCallbackNotifyCount;\r
+      DispatchNotifyListPointer->CurrentCount = LastDispatchNotifyCount;\r
+      DEBUG ((DEBUG_ERROR, "ERROR -> NotifyPpi: %g %p\n", NotifyList->Guid, NotifyList->Notify));\r
+      return EFI_INVALID_PARAMETER;\r
     }\r
 \r
     if ((NotifyList->Flags & EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK) != 0) {\r
@@ -565,9 +789,10 @@ InternalPeiNotifyPpi (
           sizeof (PEI_PPI_LIST_POINTERS) * CallbackNotifyListPointer->MaxCount\r
           );\r
         CallbackNotifyListPointer->NotifyPtrs = TempPtr;\r
-        CallbackNotifyListPointer->MaxCount = CallbackNotifyListPointer->MaxCount + CALLBACK_NOTIFY_GROWTH_STEP;\r
+        CallbackNotifyListPointer->MaxCount   = CallbackNotifyListPointer->MaxCount + CALLBACK_NOTIFY_GROWTH_STEP;\r
       }\r
-      CallbackNotifyListPointer->NotifyPtrs[CallbackNotifyIndex].Notify = (EFI_PEI_NOTIFY_DESCRIPTOR *) NotifyList;\r
+\r
+      CallbackNotifyListPointer->NotifyPtrs[CallbackNotifyIndex].Notify = (EFI_PEI_NOTIFY_DESCRIPTOR *)NotifyList;\r
       CallbackNotifyIndex++;\r
       CallbackNotifyListPointer->CurrentCount++;\r
     } else {\r
@@ -585,14 +810,15 @@ InternalPeiNotifyPpi (
           sizeof (PEI_PPI_LIST_POINTERS) * DispatchNotifyListPointer->MaxCount\r
           );\r
         DispatchNotifyListPointer->NotifyPtrs = TempPtr;\r
-        DispatchNotifyListPointer->MaxCount = DispatchNotifyListPointer->MaxCount + DISPATCH_NOTIFY_GROWTH_STEP;\r
+        DispatchNotifyListPointer->MaxCount   = DispatchNotifyListPointer->MaxCount + DISPATCH_NOTIFY_GROWTH_STEP;\r
       }\r
-      DispatchNotifyListPointer->NotifyPtrs[DispatchNotifyIndex].Notify = (EFI_PEI_NOTIFY_DESCRIPTOR *) NotifyList;\r
+\r
+      DispatchNotifyListPointer->NotifyPtrs[DispatchNotifyIndex].Notify = (EFI_PEI_NOTIFY_DESCRIPTOR *)NotifyList;\r
       DispatchNotifyIndex++;\r
       DispatchNotifyListPointer->CurrentCount++;\r
     }\r
 \r
-    DEBUG((EFI_D_INFO, "Register PPI Notify: %g\n", NotifyList->Guid));\r
+    DEBUG ((DEBUG_INFO, "Register PPI Notify: %g\n", NotifyList->Guid));\r
 \r
     if (Single) {\r
       //\r
@@ -600,12 +826,14 @@ InternalPeiNotifyPpi (
       //\r
       break;\r
     } else if ((NotifyList->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) ==\r
-               EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) {\r
+               EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST)\r
+    {\r
       //\r
       // Continue until the end of the Notify List.\r
       //\r
       break;\r
     }\r
+\r
     //\r
     // Go to the next descriptor.\r
     //\r
@@ -624,7 +852,7 @@ InternalPeiNotifyPpi (
     CallbackNotifyListPointer->CurrentCount\r
     );\r
 \r
-  return  EFI_SUCCESS;\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 /**\r
@@ -663,13 +891,13 @@ ProcessDispatchNotifyList (
   IN PEI_CORE_INSTANCE  *PrivateData\r
   )\r
 {\r
-  UINTN                 TempValue;\r
+  UINTN  TempValue;\r
 \r
   while (TRUE) {\r
     //\r
     // Check if the PEIM that was just dispatched resulted in any\r
     // Notifies getting installed.  If so, go process any dispatch\r
-    // level Notifies that match the previouly installed PPIs.\r
+    // level Notifies that match the previously installed PPIs.\r
     // Use "while" instead of "if" since ProcessNotify can modify\r
     // DispatchNotifyList.CurrentCount (with NotifyPpi) so we have\r
     // to iterate until the same.\r
@@ -712,6 +940,7 @@ ProcessDispatchNotifyList (
       break;\r
     }\r
   }\r
+\r
   return;\r
 }\r
 \r
@@ -730,18 +959,18 @@ ProcessDispatchNotifyList (
 VOID\r
 ProcessNotify (\r
   IN PEI_CORE_INSTANCE  *PrivateData,\r
-  IN UINTN               NotifyType,\r
-  IN INTN                InstallStartIndex,\r
-  IN INTN                InstallStopIndex,\r
-  IN INTN                NotifyStartIndex,\r
-  IN INTN                NotifyStopIndex\r
+  IN UINTN              NotifyType,\r
+  IN INTN               InstallStartIndex,\r
+  IN INTN               InstallStopIndex,\r
+  IN INTN               NotifyStartIndex,\r
+  IN INTN               NotifyStopIndex\r
   )\r
 {\r
-  INTN                          Index1;\r
-  INTN                          Index2;\r
-  EFI_GUID                      *SearchGuid;\r
-  EFI_GUID                      *CheckGuid;\r
-  EFI_PEI_NOTIFY_DESCRIPTOR     *NotifyDescriptor;\r
+  INTN                       Index1;\r
+  INTN                       Index2;\r
+  EFI_GUID                   *SearchGuid;\r
+  EFI_GUID                   *CheckGuid;\r
+  EFI_PEI_NOTIFY_DESCRIPTOR  *NotifyDescriptor;\r
 \r
   for (Index1 = NotifyStartIndex; Index1 < NotifyStopIndex; Index1++) {\r
     if (NotifyType == EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK) {\r
@@ -762,13 +991,16 @@ ProcessNotify (
       if ((((INT32 *)SearchGuid)[0] == ((INT32 *)CheckGuid)[0]) &&\r
           (((INT32 *)SearchGuid)[1] == ((INT32 *)CheckGuid)[1]) &&\r
           (((INT32 *)SearchGuid)[2] == ((INT32 *)CheckGuid)[2]) &&\r
-          (((INT32 *)SearchGuid)[3] == ((INT32 *)CheckGuid)[3])) {\r
-        DEBUG ((EFI_D_INFO, "Notify: PPI Guid: %g, Peim notify entry point: %p\n",\r
+          (((INT32 *)SearchGuid)[3] == ((INT32 *)CheckGuid)[3]))\r
+      {\r
+        DEBUG ((\r
+          DEBUG_INFO,\r
+          "Notify: PPI Guid: %g, Peim notify entry point: %p\n",\r
           SearchGuid,\r
           NotifyDescriptor->Notify\r
           ));\r
         NotifyDescriptor->Notify (\r
-                            (EFI_PEI_SERVICES **) GetPeiServicesTablePointer (),\r
+                            (EFI_PEI_SERVICES **)GetPeiServicesTablePointer (),\r
                             NotifyDescriptor,\r
                             (PrivateData->PpiData.PpiList.PpiPtrs[Index2].Ppi)->Ppi\r
                             );\r
@@ -787,20 +1019,20 @@ ProcessNotify (
 **/\r
 VOID\r
 ProcessPpiListFromSec (\r
-  IN CONST EFI_PEI_SERVICES         **PeiServices,\r
-  IN CONST EFI_PEI_PPI_DESCRIPTOR   *PpiList\r
+  IN CONST EFI_PEI_SERVICES        **PeiServices,\r
+  IN CONST EFI_PEI_PPI_DESCRIPTOR  *PpiList\r
   )\r
 {\r
-  EFI_STATUS                Status;\r
-  EFI_SEC_HOB_DATA_PPI      *SecHobDataPpi;\r
-  EFI_HOB_GENERIC_HEADER    *SecHobList;\r
+  EFI_STATUS              Status;\r
+  EFI_SEC_HOB_DATA_PPI    *SecHobDataPpi;\r
+  EFI_HOB_GENERIC_HEADER  *SecHobList;\r
 \r
-  for (;;) {\r
+  for ( ; ;) {\r
     if ((PpiList->Flags & EFI_PEI_PPI_DESCRIPTOR_NOTIFY_TYPES) != 0) {\r
       //\r
       // It is a notification PPI.\r
       //\r
-      Status = InternalPeiNotifyPpi (PeiServices, (CONST EFI_PEI_NOTIFY_DESCRIPTOR *) PpiList, TRUE);\r
+      Status = InternalPeiNotifyPpi (PeiServices, (CONST EFI_PEI_NOTIFY_DESCRIPTOR *)PpiList, TRUE);\r
       ASSERT_EFI_ERROR (Status);\r
     } else {\r
       //\r
@@ -826,7 +1058,7 @@ ProcessPpiListFromSec (
   // returned into the HOB list. It does this after installing all PPIs passed from SEC\r
   // into the PPI database and before dispatching any PEIMs.\r
   //\r
-  Status = PeiLocatePpi (PeiServices, &gEfiSecHobDataPpiGuid, 0, NULL, (VOID **) &SecHobDataPpi);\r
+  Status = PeiLocatePpi (PeiServices, &gEfiSecHobDataPpiGuid, 0, NULL, (VOID **)&SecHobDataPpi);\r
   if (!EFI_ERROR (Status)) {\r
     Status = SecHobDataPpi->GetHobs (SecHobDataPpi, &SecHobList);\r
     if (!EFI_ERROR (Status)) {\r
@@ -836,3 +1068,67 @@ ProcessPpiListFromSec (
   }\r
 }\r
 \r
+/**\r
+\r
+  Migrate PPI Pointers of PEI_CORE from temporary memory to permanent memory.\r
+\r
+  @param PrivateData      Pointer to PeiCore's private data structure.\r
+  @param CoreFvHandle     Address of PEI_CORE FV Handle in temporary memory.\r
+\r
+**/\r
+VOID\r
+ConvertPeiCorePpiPointers (\r
+  IN  PEI_CORE_INSTANCE   *PrivateData,\r
+  IN  PEI_CORE_FV_HANDLE  *CoreFvHandle\r
+  )\r
+{\r
+  EFI_FV_FILE_INFO      FileInfo;\r
+  EFI_PHYSICAL_ADDRESS  OrgImageBase;\r
+  EFI_PHYSICAL_ADDRESS  MigratedImageBase;\r
+  UINTN                 PeiCoreModuleSize;\r
+  EFI_PEI_FILE_HANDLE   PeiCoreFileHandle;\r
+  VOID                  *PeiCoreImageBase;\r
+  VOID                  *PeiCoreEntryPoint;\r
+  EFI_STATUS            Status;\r
+\r
+  PeiCoreFileHandle = NULL;\r
+\r
+  //\r
+  // Find the PEI Core in the BFV in temporary memory.\r
+  //\r
+  Status =  CoreFvHandle->FvPpi->FindFileByType (\r
+                                   CoreFvHandle->FvPpi,\r
+                                   EFI_FV_FILETYPE_PEI_CORE,\r
+                                   CoreFvHandle->FvHandle,\r
+                                   &PeiCoreFileHandle\r
+                                   );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  if (!EFI_ERROR (Status)) {\r
+    Status = CoreFvHandle->FvPpi->GetFileInfo (CoreFvHandle->FvPpi, PeiCoreFileHandle, &FileInfo);\r
+    ASSERT_EFI_ERROR (Status);\r
+\r
+    Status = PeiGetPe32Data (PeiCoreFileHandle, &PeiCoreImageBase);\r
+    ASSERT_EFI_ERROR (Status);\r
+\r
+    //\r
+    // Find PEI Core EntryPoint in the BFV in temporary memory.\r
+    //\r
+    Status = PeCoffLoaderGetEntryPoint ((VOID *)(UINTN)PeiCoreImageBase, &PeiCoreEntryPoint);\r
+    ASSERT_EFI_ERROR (Status);\r
+\r
+    OrgImageBase      = (UINTN)PeiCoreImageBase;\r
+    MigratedImageBase = (UINTN)_ModuleEntryPoint - ((UINTN)PeiCoreEntryPoint - (UINTN)PeiCoreImageBase);\r
+\r
+    //\r
+    // Size of loaded PEI_CORE in permanent memory.\r
+    //\r
+    PeiCoreModuleSize = (UINTN)FileInfo.BufferSize - ((UINTN)OrgImageBase - (UINTN)FileInfo.Buffer);\r
+\r
+    //\r
+    // Migrate PEI_CORE PPI pointers from temporary memory to newly\r
+    // installed PEI_CORE in permanent memory.\r
+    //\r
+    ConvertPpiPointersFv (PrivateData, (UINTN)OrgImageBase, (UINTN)MigratedImageBase, PeiCoreModuleSize);\r
+  }\r
+}\r