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
\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
{\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
- PeiStartupDescriptor,\r
- (VOID*)PrivateDataInMem,\r
+ InvokePeiCore,\r
+ (VOID*) (UINTN) PeiCore,\r
+ (VOID*) &PeiCoreParameters, \r
TopOfStack,\r
(VOID*)(UINTN)PrivateData->StackBase\r
);\r
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
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
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
return BuildGuidDataHob (&gEfiPeiCorePrivateGuid, PrivateData, sizeof (PEI_CORE_INSTANCE));\r
}\r
\r
+/**\r
+ This routine enable a PEIM to register itself to shadow when PEI Foundation\r
+ discovery permanent memory.\r
+\r
+ @param FileHandle File handle of a PEIM.\r
+ \r
+ @retval EFI_NOT_FOUND The file handle doesn't point to PEIM itself.\r
+ @retval EFI_ALREADY_STARTED Indicate that the PEIM has been registered itself.\r
+ @retval EFI_SUCCESS Successfully to register itself.\r
+\r
+**/ \r
+EFI_STATUS\r
+EFIAPI\r
+PeiRegisterForShadow (\r
+ IN EFI_PEI_FILE_HANDLE FileHandle\r
+ )\r
+{\r
+ PEI_CORE_INSTANCE *Private;\r
+ Private = PEI_CORE_INSTANCE_FROM_PS_THIS (GetPeiServicesTablePointer ());\r
+\r
+ if (Private->CurrentFileHandle != FileHandle) {\r
+ //\r
+ // The FileHandle must be for the current PEIM\r
+ //\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ if (Private->Fv[Private->CurrentPeimFvCount].PeimState[Private->CurrentPeimCount] >= PEIM_STATE_REGISITER_FOR_SHADOW) {\r
+ //\r
+ // If the PEIM has already entered the PEIM_STATE_REGISTER_FOR_SHADOW or PEIM_STATE_DONE then it's already been started\r
+ //\r
+ return EFI_ALREADY_STARTED;\r
+ }\r
+ \r
+ Private->Fv[Private->CurrentPeimFvCount].PeimState[Private->CurrentPeimCount] = PEIM_STATE_REGISITER_FOR_SHADOW;\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