]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c
Updated EFI_MANAGED_NETWORK_PROTOCOL_GUID value according to UEFI 2.1b.
[mirror_edk2.git] / MdeModulePkg / Core / Pei / Dispatcher / Dispatcher.c
index 67aa1bd53520dba24f5b440e9fa2519bb1fd859b..900e1d2d5040a396703c288cb89fed8a1ca1b2b3 100644 (file)
@@ -29,9 +29,16 @@ 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 EFI_PEI_STARTUP_DESCRIPTOR  *PeiStartupDescriptor,\r
+  IN CONST EFI_SEC_PEI_HAND_OFF  *SecCoreData,\r
   IN PEI_CORE_INSTANCE           *PrivateData,\r
   IN PEI_CORE_DISPATCH_DATA      *DispatchData\r
   )\r
@@ -44,7 +51,9 @@ Routine Description:
 \r
 Arguments:\r
 \r
-  PeiStartupDescriptor - Pointer to IN EFI_PEI_STARTUP_DESCRIPTOR\r
+  SecCoreData          - Points to a data structure containing information about the PEI core's operating\r
+                         environment, such as the size and location of temporary RAM, the stack location and\r
+                         the BFV location.\r
   PrivateData          - Pointer to the private data passed in from caller\r
   DispatchData         - Pointer to PEI_CORE_DISPATCH_DATA data.\r
 \r
@@ -57,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
@@ -203,19 +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
-                  PeiStartupDescriptor,\r
-                  (VOID*)PrivateDataInMem,\r
+                  InvokePeiCore,\r
+                  (VOID*) (UINTN) PeiCore,\r
+                  (VOID*) &PeiCoreParameters,  \r
                   TopOfStack,\r
                   (VOID*)(UINTN)PrivateData->StackBase\r
                   );\r
@@ -360,7 +372,7 @@ VOID
 InitializeDispatcherData (\r
   IN EFI_PEI_SERVICES             **PeiServices,\r
   IN PEI_CORE_INSTANCE            *OldCoreData,\r
-  IN EFI_PEI_STARTUP_DESCRIPTOR   *PeiStartupDescriptor\r
+  IN CONST EFI_SEC_PEI_HAND_OFF   *SecCoreData\r
   )\r
 /*++\r
 \r
@@ -373,7 +385,9 @@ Arguments:
   PeiServices          - The PEI core services table.\r
   OldCoreData          - Pointer to old core data (before switching stack).\r
                          NULL if being run in non-permament memory mode.\r
-  PeiStartupDescriptor - Information and services provided by SEC phase.\r
+  SecCoreData          - Points to a data structure containing information about the PEI core's operating\r
+                         environment, such as the size and location of temporary RAM, the stack location and\r
+                         the BFV location.\r
 \r
 Returns:\r
 \r
@@ -386,8 +400,8 @@ Returns:
   PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices);\r
 \r
   if (OldCoreData == NULL) {\r
-    PrivateData->DispatchData.CurrentFvAddress = (EFI_FIRMWARE_VOLUME_HEADER *) PeiStartupDescriptor->BootFirmwareVolume;\r
-    PrivateData->DispatchData.BootFvAddress = (EFI_FIRMWARE_VOLUME_HEADER *) PeiStartupDescriptor->BootFirmwareVolume;\r
+    PrivateData->DispatchData.CurrentFvAddress = (EFI_FIRMWARE_VOLUME_HEADER *) SecCoreData->BootFirmwareVolumeBase;\r
+    PrivateData->DispatchData.BootFvAddress = (EFI_FIRMWARE_VOLUME_HEADER *) SecCoreData->BootFirmwareVolumeBase;\r
   } else {\r
 \r
     //\r
@@ -575,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