]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c
Add InvokePeiCore function to invoke the PeiCore in new stack.
[mirror_edk2.git] / MdeModulePkg / Core / Pei / Dispatcher / Dispatcher.c
index 335fe9fc5dfad6561e1c85cc701679dc061cb129..900e1d2d5040a396703c288cb89fed8a1ca1b2b3 100644 (file)
@@ -29,6 +29,13 @@ TransferOldDataToNewDataRange (
   IN PEI_CORE_INSTANCE        *PrivateData\r
   );\r
 \r
+STATIC\r
+VOID\r
+InvokePeiCore (\r
+  VOID          *Context1,\r
+  VOID          *Context2\r
+  );\r
+\r
 EFI_STATUS\r
 PeiDispatcher (\r
   IN CONST EFI_SEC_PEI_HAND_OFF  *SecCoreData,\r
@@ -59,11 +66,12 @@ Returns:
 {\r
   EFI_STATUS                        Status;\r
   PEI_CORE_TEMP_POINTERS            TempPtr;\r
-  UINTN                             PrivateDataInMem;\r
   BOOLEAN                           NextFvFound;\r
   EFI_FIRMWARE_VOLUME_HEADER        *NextFvAddress;\r
   EFI_FIRMWARE_VOLUME_HEADER        *DefaultFvAddress;\r
   VOID                              *TopOfStack;\r
+  PEI_CORE_PARAMETERS               PeiCoreParameters;\r
+\r
   //\r
   // Debug data for uninstalled Peim list\r
   //\r
@@ -205,20 +213,21 @@ Returns:
               // nobody else should have any data on the stack.\r
               //\r
               if (PrivateData->SwitchStackSignal) {\r
-                TempPtr.PeiCore = (PEI_CORE_ENTRY_POINT)PeiCore;\r
-                PrivateDataInMem = (UINTN) TransferOldDataToNewDataRange (PrivateData);\r
-                ASSERT (PrivateDataInMem != 0);\r
                 //\r
                 // Adjust the top of stack to be aligned at CPU_STACK_ALIGNMENT\r
                 //\r
                 TopOfStack = (VOID *)((UINTN)PrivateData->StackBase + (UINTN)PrivateData->StackSize - CPU_STACK_ALIGNMENT);\r
                 TopOfStack = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT);\r
+                \r
+                PeiCoreParameters.SecCoreData = SecCoreData;\r
+                PeiCoreParameters.PpiList     = NULL;\r
+                PeiCoreParameters.Data        = TransferOldDataToNewDataRange (PrivateData);\r
+                ASSERT (PeiCoreParameters.Data != 0);\r
 \r
                 PeiSwitchStacks (\r
-                  (SWITCH_STACK_ENTRY_POINT)(UINTN)TempPtr.Raw,\r
-                  (VOID*) SecCoreData,\r
-                  NULL,\r
-                  (VOID*)PrivateDataInMem,\r
+                  InvokePeiCore,\r
+                  (VOID*) (UINTN) PeiCore,\r
+                  (VOID*) &PeiCoreParameters,  \r
                   TopOfStack,\r
                   (VOID*)(UINTN)PrivateData->StackBase\r
                   );\r
@@ -580,4 +589,45 @@ PeiRegisterForShadow (
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  This routine invoke the PeiCore's entry in new stack environment.\r
+\r
+       @param Context1         The first context parameter is entry of PeiCore\r
+  @param Context2      The second context parameter is parameter structure point for PeiCore\r
+\r
+**/ \r
+STATIC\r
+VOID\r
+InvokePeiCore (\r
+  VOID          *Context1,\r
+  VOID          *Context2\r
+  )\r
+{\r
+  PEI_CORE_ENTRY_POINT  PeiCoreEntryPoint;\r
+  PEI_CORE_PARAMETERS       *PeiCoreParameters;\r
+\r
+  //\r
+  // Running on new stack in SEC Core\r
+  //\r
+\r
+  PeiCoreEntryPoint = (PEI_CORE_ENTRY_POINT) (UINTN) Context1;\r
+  PeiCoreParameters = (PEI_CORE_PARAMETERS *)Context2;\r
+\r
+  //\r
+  // Call PEI Core using new stack\r
+  //\r
+  PeiCoreEntryPoint (\r
+    PeiCoreParameters->SecCoreData,\r
+    PeiCoreParameters->PpiList,\r
+    PeiCoreParameters->Data\r
+    );\r
+\r
+  //\r
+  // Never returns\r
+  //\r
+  ASSERT_EFI_ERROR (FALSE);\r
+}\r
+\r
+\r
+\r
 \r