]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Add InvokePeiCore function to invoke the PeiCore in new stack.
authorklu2 <klu2@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 14 Sep 2007 07:01:26 +0000 (07:01 +0000)
committerklu2 <klu2@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 14 Sep 2007 07:01:26 +0000 (07:01 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3844 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c
MdeModulePkg/Core/Pei/Dispatcher/Stack.c
MdeModulePkg/Core/Pei/Ipf/Stack.c
MdeModulePkg/Core/Pei/Ipf/SwitchStack.s [deleted file]
MdeModulePkg/Core/Pei/PeiMain.h
MdeModulePkg/Core/Pei/PeiMain.inf

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
index 551e23826c8a3287cc37a06eb7cc9b550983f63e..9e74eee5872983b94f9d0de453ccefc9fb00c6a6 100644 (file)
@@ -47,33 +47,9 @@ PeiSwitchStacks (
   IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,\r
   IN      VOID                      *Context1,  OPTIONAL\r
   IN      VOID                      *Context2,  OPTIONAL\r
-  IN      VOID                      *Context3,  OPTIONAL\r
   IN      VOID                      *NewStack,\r
   IN      VOID                      *NewBsp\r
   )\r
 {\r
-  BASE_LIBRARY_JUMP_BUFFER  JumpBuffer;\r
-  \r
-  ASSERT (EntryPoint != NULL);\r
-  ASSERT (NewStack != NULL);\r
-\r
-  //\r
-  // Stack should be aligned with CPU_STACK_ALIGNMENT\r
-  //\r
-  ASSERT (((UINTN)NewStack & (CPU_STACK_ALIGNMENT - 1)) == 0);\r
-\r
-  JumpBuffer.Eip = (UINTN)EntryPoint;\r
-  JumpBuffer.Esp = (UINTN)NewStack - sizeof (VOID*);\r
-  JumpBuffer.Esp -= sizeof (Context1) + sizeof (Context2) + sizeof(Context3);\r
-  ((VOID**)JumpBuffer.Esp)[1] = Context1;\r
-  ((VOID**)JumpBuffer.Esp)[2] = Context2;\r
-  ((VOID**)JumpBuffer.Esp)[3] = Context3;\r
-\r
-  LongJump (&JumpBuffer, (UINTN)-1);\r
-  \r
-\r
-  //\r
-  // InternalSwitchStack () will never return\r
-  //\r
-  ASSERT (FALSE);  \r
+  SwitchStack (EntryPoint, Context1, Context2, NewStack);\r
 }\r
index 7ffdac54c749227e3d870f7531e350c9c81eb09f..56a876df152b64c676d95a1cb7f5e3378e087817 100644 (file)
 \r
 #include <PeiMain.h>\r
 \r
-VOID\r
-EFIAPI\r
-InternalSwitchStack (\r
-  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,\r
-  IN      VOID                      *Context1,   OPTIONAL\r
-  IN      VOID                      *Context2,   OPTIONAL\r
-  IN      VOID                      *Context3,   OPTIONAL\r
-  IN      VOID                      *NewStack,\r
-  IN      VA_LIST                   Marker\r
-  );\r
-\r
 /**\r
   Transfers control to a function starting with a new stack.\r
 \r
@@ -55,18 +44,15 @@ PeiSwitchStacks (
   IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,\r
   IN      VOID                      *Context1,  OPTIONAL\r
   IN      VOID                      *Context2,  OPTIONAL\r
-  IN      VOID                      *Context3,  OPTIONAL\r
   IN      VOID                      *NewStack,\r
   IN      VOID                      *NewBsp\r
   )\r
 {\r
-  InternalSwitchStack(\r
+  SwitchStack (\r
     EntryPoint,\r
     Context1,\r
     Context2,\r
-    Context3,\r
     NewStack,\r
     NewBsp\r
     );\r
-\r
 }\r
diff --git a/MdeModulePkg/Core/Pei/Ipf/SwitchStack.s b/MdeModulePkg/Core/Pei/Ipf/SwitchStack.s
deleted file mode 100644 (file)
index 2f20703..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/// @file\r
-///  IPF specific SwitchStack() function\r
-///\r
-/// Copyright (c) 2006, Intel Corporation\r
-/// All rights reserved. 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
-///\r
-/// Module Name: SwitchStack.s\r
-///\r
-///\r
-\r
-.auto\r
-.text\r
-\r
-.proc   IpfAsmSwitchStack\r
-.type   IpfAsmSwitchStack, @function\r
-.regstk 6, 0, 0, 0\r
-IpfAsmSwitchStack::\r
-        mov                 r14 = ar.rsc\r
-        movl                r2  = ~((((1 << 14) - 1) << 16) | 3)\r
-\r
-        mov                 r17 = in1\r
-        mov                 r18 = in2\r
-        mov                 r19 = in3\r
-        and                 r2  = r14, r2\r
-\r
-        mov                 ar.rsc = r2\r
-        mov                 sp  = in4\r
-        mov                 r20 = in5\r
-\r
-        ld8.nt1             r16 = [in0], 8\r
-        ld8.nta             gp  = [in0]\r
-        mov                 r3  = -1\r
-\r
-        loadrs\r
-        mov                 ar.bspstore = r20\r
-        mov                 b7  = r16\r
-\r
-        alloc               r2  = ar.pfs, 0, 0, 3, 0\r
-        mov                 out0 = r17\r
-        mov                 out1 = r18\r
-        mov                 out2 = r19\r
-\r
-        mov                 ar.rnat = r3\r
-        mov                 ar.rsc = r14\r
-        br.call.sptk.many   b0  = b7\r
-.endp   IpfAsmSwitchStack\r
index b4d246211670cf038912e9285d9b5da0eb2f761b..50fd40a00e8f8704d165eb3daf4893a56e8e05be 100644 (file)
@@ -153,8 +153,9 @@ typedef struct{
 typedef\r
 EFI_STATUS\r
 (EFIAPI *PEI_CORE_ENTRY_POINT)(\r
-  IN EFI_PEI_STARTUP_DESCRIPTOR  *PeiStartupDescriptor,\r
-  IN PEI_CORE_INSTANCE           *OldCoreData\r
+  IN CONST  EFI_SEC_PEI_HAND_OFF    *SecCoreData,\r
+  IN CONST  EFI_PEI_PPI_DESCRIPTOR  *PpiList,\r
+  IN PEI_CORE_INSTANCE              *OldCoreData\r
   );\r
 \r
 //\r
@@ -171,6 +172,13 @@ typedef union {
 } PEI_CORE_TEMP_POINTERS;\r
 \r
 \r
+\r
+typedef struct {\r
+  CONST EFI_SEC_PEI_HAND_OFF    *SecCoreData;\r
+  EFI_PEI_PPI_DESCRIPTOR        *PpiList;\r
+  VOID                          *Data;\r
+} PEI_CORE_PARAMETERS;\r
+\r
 //\r
 // PeiCore function\r
 //\r
@@ -1209,7 +1217,6 @@ PeiSwitchStacks (
   IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,\r
   IN      VOID                      *Context1,  OPTIONAL\r
   IN      VOID                      *Context2,  OPTIONAL\r
-  IN      VOID                      *Context3,  OPTIONAL\r
   IN      VOID                      *NewStack,\r
   IN      VOID                      *NewBsp\r
   );\r
index df9ca825c701c12b7250071e8e56d6cfe8ce510f..b8e188d5fb5b79a3928a7f2aec653ae8d2645609 100644 (file)
@@ -60,7 +60,6 @@
   Ipf/IpfCpuCore.i\r
   Ipf/SwitchToCacheMode.c\r
   Ipf/InternalSwitchStack.c\r
-  Ipf/SwitchStack.s\r
 \r
 [Sources.EBC]\r
   Dispatcher/Stack.c\r