]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Pei/Ppi/Ppi.c
Enhance the PEI Core to convert pointers pointing to PPI descriptors on the temporary...
[mirror_edk2.git] / MdeModulePkg / Core / Pei / Ppi / Ppi.c
index 68593a6d1d493fbe42cd5edff3e46a5bb54f7f82..9129c23159fa03c2dca239e0772d009ed7a66246 100644 (file)
@@ -1,8 +1,8 @@
 /** @file\r
   EFI PEI Core PPI services\r
   \r
-Copyright (c) 2006 - 2010, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2006 - 2011, 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
@@ -30,9 +30,9 @@ InitializePpiServices (
   )\r
 {\r
   if (OldCoreData == NULL) {\r
-    PrivateData->PpiData.NotifyListEnd = PcdGet32 (PcdPeiCoreMaxPpiSupported)-1;\r
-    PrivateData->PpiData.DispatchListEnd = PcdGet32 (PcdPeiCoreMaxPpiSupported)-1;\r
-    PrivateData->PpiData.LastDispatchedNotify = PcdGet32 (PcdPeiCoreMaxPpiSupported)-1;\r
+    PrivateData->PpiData.NotifyListEnd = FixedPcdGet32 (PcdPeiCoreMaxPpiSupported)-1;\r
+    PrivateData->PpiData.DispatchListEnd = FixedPcdGet32 (PcdPeiCoreMaxPpiSupported)-1;\r
+    PrivateData->PpiData.LastDispatchedNotify = FixedPcdGet32 (PcdPeiCoreMaxPpiSupported)-1;\r
   }\r
 }\r
 \r
@@ -40,51 +40,62 @@ InitializePpiServices (
 \r
   Migrate the Hob list from the temporary memory stack to PEI installed memory.\r
 \r
-  @param PrivateData         Pointer to PeiCore's private data structure.\r
-  @param OldCheckingBottom   Bottom of temporary memory range. All Ppi in this range\r
-                             will be fixup for PpiData and PpiDescriptor pointer.\r
-  @param OldCheckingTop      Top of temporary memory range. All Ppi in this range\r
-                             will be fixup for PpiData and PpiDescriptor.\r
-  @param Fixup               The address difference between\r
-                             the new Hob list and old Hob list.\r
+  @param SecCoreData     Points to a data structure containing SEC to PEI handoff data, such as the size \r
+                         and location of temporary RAM, the stack location and the BFV location.\r
+  @param PrivateData     Pointer to PeiCore's private data structure.\r
 \r
 **/\r
 VOID\r
 ConvertPpiPointers (\r
-  IN PEI_CORE_INSTANCE       *PrivateData,\r
-  IN UINTN                   OldCheckingBottom,\r
-  IN UINTN                   OldCheckingTop,\r
-  IN INTN                    Fixup\r
+  IN CONST EFI_SEC_PEI_HAND_OFF  *SecCoreData,\r
+  IN PEI_CORE_INSTANCE           *PrivateData\r
   )\r
 {\r
   UINT8                 Index;\r
   PEI_PPI_LIST_POINTERS *PpiPointer;\r
+  UINTN                 OldHeapTop;\r
+  UINTN                 OldHeapBottom;\r
+  UINTN                 OldStackTop;\r
+  UINTN                 OldStackBottom;\r
 \r
-  for (Index = 0; Index < PcdGet32 (PcdPeiCoreMaxPpiSupported); Index++) {\r
+  OldHeapBottom = (UINTN)SecCoreData->PeiTemporaryRamBase;\r
+  OldHeapTop = (UINTN)SecCoreData->PeiTemporaryRamBase + SecCoreData->PeiTemporaryRamSize;\r
+  OldStackBottom = (UINTN)SecCoreData->StackBase;\r
+  OldStackTop = (UINTN)SecCoreData->StackBase + SecCoreData->StackSize;\r
+\r
+  for (Index = 0; Index < FixedPcdGet32 (PcdPeiCoreMaxPpiSupported); Index++) {\r
     if (Index < PrivateData->PpiData.PpiListEnd ||\r
         Index > PrivateData->PpiData.NotifyListEnd) {\r
       PpiPointer = &PrivateData->PpiData.PpiListPtrs[Index];\r
 \r
-      if (((UINTN)PpiPointer->Raw < OldCheckingTop) &&\r
-          ((UINTN)PpiPointer->Raw >= OldCheckingBottom)) {\r
+      if (((UINTN)PpiPointer->Raw < OldHeapTop) &&\r
+          ((UINTN)PpiPointer->Raw >= OldHeapBottom)) {\r
         //\r
-        // Convert the pointer to the PEIM descriptor from the old HOB heap\r
+        // Convert the pointer to the PPI descriptor from the old HOB heap\r
         // to the relocated HOB heap.\r
         //\r
-        PpiPointer->Raw = (VOID *) ((UINTN)PpiPointer->Raw + Fixup);\r
+        if (PrivateData->HeapOffsetPositive) {\r
+          PpiPointer->Raw = (VOID *) ((UINTN)PpiPointer->Raw + PrivateData->HeapOffset);\r
+        } else {\r
+          PpiPointer->Raw = (VOID *) ((UINTN)PpiPointer->Raw - PrivateData->HeapOffset);\r
+        }\r
 \r
         //\r
         // Only when the PEIM descriptor is in the old HOB should it be necessary\r
         // to try to convert the pointers in the PEIM descriptor\r
         //\r
 \r
-        if (((UINTN)PpiPointer->Ppi->Guid < OldCheckingTop) &&\r
-            ((UINTN)PpiPointer->Ppi->Guid >= OldCheckingBottom)) {\r
+        if (((UINTN)PpiPointer->Ppi->Guid < OldHeapTop) &&\r
+            ((UINTN)PpiPointer->Ppi->Guid >= OldHeapBottom)) {\r
           //\r
           // Convert the pointer to the GUID in the PPI or NOTIFY descriptor\r
           // from the old HOB heap to the relocated HOB heap.\r
           //\r
-          PpiPointer->Ppi->Guid = (VOID *) ((UINTN)PpiPointer->Ppi->Guid + Fixup);\r
+          if (PrivateData->HeapOffsetPositive) {\r
+            PpiPointer->Ppi->Guid = (VOID *) ((UINTN)PpiPointer->Ppi->Guid + PrivateData->HeapOffset);\r
+          } else {\r
+            PpiPointer->Ppi->Guid = (VOID *) ((UINTN)PpiPointer->Ppi->Guid - PrivateData->HeapOffset);\r
+          }\r
         }\r
 \r
         //\r
@@ -92,13 +103,27 @@ ConvertPpiPointers (
         // the notification function in the NOTIFY descriptor needs not be converted.\r
         //\r
         if (Index < PrivateData->PpiData.PpiListEnd &&\r
-            (UINTN)PpiPointer->Ppi->Ppi < OldCheckingTop &&\r
-            (UINTN)PpiPointer->Ppi->Ppi >= OldCheckingBottom) {\r
+            (UINTN)PpiPointer->Ppi->Ppi < OldHeapTop &&\r
+            (UINTN)PpiPointer->Ppi->Ppi >= OldHeapBottom) {\r
             //\r
             // Convert the pointer to the PPI interface structure in the PPI descriptor\r
             // from the old HOB heap to the relocated HOB heap.\r
             //\r
-            PpiPointer->Ppi->Ppi = (VOID *) ((UINTN)PpiPointer->Ppi->Ppi+ Fixup);\r
+            if (PrivateData->HeapOffsetPositive) {\r
+              PpiPointer->Ppi->Ppi = (VOID *) ((UINTN)PpiPointer->Ppi->Ppi + PrivateData->HeapOffset);\r
+            } else {\r
+              PpiPointer->Ppi->Ppi = (VOID *) ((UINTN)PpiPointer->Ppi->Ppi - PrivateData->HeapOffset);\r
+            }\r
+        }\r
+      } else if (((UINTN)PpiPointer->Raw < OldStackTop) && ((UINTN)PpiPointer->Raw >= OldStackBottom)) {\r
+        //\r
+        // Convert the pointer to the PPI descriptor from the temporary stack\r
+        // to the permanent PEI stack.\r
+        //\r
+        if (PrivateData->StackOffsetPositive) {\r
+          PpiPointer->Raw = (VOID *) ((UINTN)PpiPointer->Raw + PrivateData->StackOffset);\r
+        } else {\r
+          PpiPointer->Raw = (VOID *) ((UINTN)PpiPointer->Raw - PrivateData->StackOffset);\r
         }\r
       }\r
     }\r
@@ -254,7 +279,7 @@ PeiReInstallPpi (
   // Remove the old PPI from the database, add the new one.\r
   //\r
   DEBUG((EFI_D_INFO, "Reinstall PPI: %g\n", NewPpi->Guid));\r
-  ASSERT (Index < (INTN)(PcdGet32 (PcdPeiCoreMaxPpiSupported)));\r
+  ASSERT (Index < (INTN)(FixedPcdGet32 (PcdPeiCoreMaxPpiSupported)));\r
   PrivateData->PpiData.PpiListPtrs[Index].Ppi = (EFI_PEI_PPI_DESCRIPTOR *) NewPpi;\r
 \r
   //\r
@@ -512,7 +537,7 @@ ProcessNotifyList (
         EFI_PEI_PPI_DESCRIPTOR_NOTIFY_DISPATCH,\r
         PrivateData->PpiData.LastDispatchedInstall,\r
         PrivateData->PpiData.PpiListEnd,\r
-        PcdGet32 (PcdPeiCoreMaxPpiSupported)-1,\r
+        FixedPcdGet32 (PcdPeiCoreMaxPpiSupported)-1,\r
         PrivateData->PpiData.DispatchListEnd\r
         );\r
       PrivateData->PpiData.LastDispatchedInstall = TempValue;\r