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
{\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
// 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
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