-/*++\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:\r
-\r
- Ppi.c\r
+/** @file\r
+ EFI PEI Core PPI services\r
+ \r
+Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
+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
-Abstract:\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
- EFI PEI Core PPI services\r
+**/\r
\r
-Revision History\r
+#include "PeiMain.h"\r
\r
---*/\r
+/**\r
\r
-//\r
-// Include common header file for this module.\r
-//\r
-#include "CommonHeader.h"\r
+ Initialize PPI services.\r
\r
-#include <PeiMain.h>\r
+ @param PrivateData Pointer to the PEI Core data.\r
+ @param OldCoreData Pointer to old PEI Core data. \r
+ NULL if being run in non-permament memory mode.\r
\r
+**/\r
VOID\r
InitializePpiServices (\r
- IN EFI_PEI_SERVICES **PeiServices,\r
+ IN PEI_CORE_INSTANCE *PrivateData,\r
IN PEI_CORE_INSTANCE *OldCoreData\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Initialize PPI services.\r
-\r
-Arguments:\r
-\r
- PeiServices - The PEI core services table.\r
- OldCoreData - Pointer to the PEI Core data.\r
- NULL if being run in non-permament memory mode.\r
-\r
-Returns:\r
- Nothing\r
-\r
---*/\r
{\r
- PEI_CORE_INSTANCE *PrivateData;\r
- \r
if (OldCoreData == NULL) {\r
- PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS(PeiServices);\r
-\r
- PrivateData->PpiData.NotifyListEnd = MAX_PPI_DESCRIPTORS-1;\r
- PrivateData->PpiData.DispatchListEnd = MAX_PPI_DESCRIPTORS-1;\r
- PrivateData->PpiData.LastDispatchedNotify = MAX_PPI_DESCRIPTORS-1;\r
+ PrivateData->PpiData.NotifyListEnd = FixedPcdGet32 (PcdPeiCoreMaxPpiSupported)-1;\r
+ PrivateData->PpiData.DispatchListEnd = FixedPcdGet32 (PcdPeiCoreMaxPpiSupported)-1;\r
+ PrivateData->PpiData.LastDispatchedNotify = FixedPcdGet32 (PcdPeiCoreMaxPpiSupported)-1;\r
}\r
- \r
- return; \r
}\r
\r
-VOID\r
-ConvertPpiPointers (\r
- IN EFI_PEI_SERVICES **PeiServices,\r
- IN EFI_HOB_HANDOFF_INFO_TABLE *OldHandOffHob,\r
- IN EFI_HOB_HANDOFF_INFO_TABLE *NewHandOffHob\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Migrate the Hob list from the CAR stack to PEI installed memory.\r
+/**\r
\r
-Arguments:\r
+ Migrate the Hob list from the temporary memory stack to PEI installed memory.\r
\r
- PeiServices - The PEI core services table.\r
- OldHandOffHob - The old handoff HOB list.\r
- NewHandOffHob - The new handoff HOB list.\r
+ @param PrivateData Pointer to PeiCore's private data structure.\r
+ @param OldCheckingBottom Bottom of temporary memory range. All Ppi in this range\r
+ will be fixup for PpiData and PpiDescriptor pointer.\r
+ @param OldCheckingTop Top of temporary memory range. All Ppi in this range\r
+ will be fixup for PpiData and PpiDescriptor.\r
+ @param Fixup The address difference between\r
+ the new Hob list and old Hob list.\r
\r
-Returns:\r
- \r
---*/\r
+**/\r
+VOID\r
+ConvertPpiPointers (\r
+ IN PEI_CORE_INSTANCE *PrivateData,\r
+ IN UINTN OldCheckingBottom,\r
+ IN UINTN OldCheckingTop,\r
+ IN INTN Fixup\r
+ )\r
{\r
- PEI_CORE_INSTANCE *PrivateData;\r
UINT8 Index;\r
PEI_PPI_LIST_POINTERS *PpiPointer;\r
- UINTN Fixup;\r
-\r
- PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS(PeiServices);\r
\r
- Fixup = (UINTN)NewHandOffHob - (UINTN)OldHandOffHob;\r
- \r
- for (Index = 0; Index < MAX_PPI_DESCRIPTORS; Index++) {\r
+ for (Index = 0; Index < FixedPcdGet32 (PcdPeiCoreMaxPpiSupported); Index++) {\r
if (Index < PrivateData->PpiData.PpiListEnd ||\r
Index > PrivateData->PpiData.NotifyListEnd) {\r
PpiPointer = &PrivateData->PpiData.PpiListPtrs[Index];\r
- \r
- if (((UINTN)PpiPointer->Raw < (UINTN)OldHandOffHob->EfiFreeMemoryBottom) && \r
- ((UINTN)PpiPointer->Raw >= (UINTN)OldHandOffHob)) {\r
+\r
+ if (((UINTN)PpiPointer->Raw < OldCheckingTop) &&\r
+ ((UINTN)PpiPointer->Raw >= OldCheckingBottom)) {\r
//\r
// Convert the pointer to the PEIM descriptor from the old HOB heap\r
// to the relocated HOB heap.\r
// Only when the PEIM descriptor is in the old HOB should it be necessary\r
// to try to convert the pointers in the PEIM descriptor\r
//\r
- \r
- if (((UINTN)PpiPointer->Ppi->Guid < (UINTN)OldHandOffHob->EfiFreeMemoryBottom) && \r
- ((UINTN)PpiPointer->Ppi->Guid >= (UINTN)OldHandOffHob)) {\r
+\r
+ if (((UINTN)PpiPointer->Ppi->Guid < OldCheckingTop) &&\r
+ ((UINTN)PpiPointer->Ppi->Guid >= OldCheckingBottom)) {\r
//\r
// Convert the pointer to the GUID in the PPI or NOTIFY descriptor\r
// from the old HOB heap to the relocated HOB heap.\r
// the notification function in the NOTIFY descriptor needs not be converted.\r
//\r
if (Index < PrivateData->PpiData.PpiListEnd &&\r
- (UINTN)PpiPointer->Ppi->Ppi < (UINTN)OldHandOffHob->EfiFreeMemoryBottom &&\r
- (UINTN)PpiPointer->Ppi->Ppi >= (UINTN)OldHandOffHob) {\r
+ (UINTN)PpiPointer->Ppi->Ppi < OldCheckingTop &&\r
+ (UINTN)PpiPointer->Ppi->Ppi >= OldCheckingBottom) {\r
//\r
// Convert the pointer to the PPI interface structure in the PPI descriptor\r
// from the old HOB heap to the relocated HOB heap.\r
//\r
- PpiPointer->Ppi->Ppi = (VOID *) ((UINTN)PpiPointer->Ppi->Ppi+ Fixup); \r
+ PpiPointer->Ppi->Ppi = (VOID *) ((UINTN)PpiPointer->Ppi->Ppi+ Fixup);\r
}\r
}\r
}\r
}\r
}\r
\r
+/**\r
+\r
+ This function installs an interface in the PEI PPI database by GUID. \r
+ The purpose of the service is to publish an interface that other parties\r
+ can use to call additional PEIMs.\r
\r
+ @param PeiServices An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.\r
+ @param PpiList Pointer to a list of PEI PPI Descriptors.\r
\r
+ @retval EFI_SUCCESS if all PPIs in PpiList are successfully installed.\r
+ @retval EFI_INVALID_PARAMETER if PpiList is NULL pointer\r
+ if any PPI in PpiList is not valid\r
+ @retval EFI_OUT_OF_RESOURCES if there is no more memory resource to install PPI\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PeiInstallPpi (\r
- IN EFI_PEI_SERVICES **PeiServices,\r
- IN EFI_PEI_PPI_DESCRIPTOR *PpiList\r
+ IN CONST EFI_PEI_SERVICES **PeiServices,\r
+ IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Install PPI services.\r
-\r
-Arguments:\r
-\r
- PeiServices - Pointer to the PEI Service Table\r
- PpiList - Pointer to a list of PEI PPI Descriptors.\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - if all PPIs in PpiList are successfully installed.\r
- EFI_INVALID_PARAMETER - if PpiList is NULL pointer\r
- EFI_INVALID_PARAMETER - if any PPI in PpiList is not valid\r
- EFI_OUT_OF_RESOURCES - if there is no more memory resource to install PPI\r
-\r
---*/\r
{\r
PEI_CORE_INSTANCE *PrivateData;\r
INTN Index;\r
// by the EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST being set in the last\r
// EFI_PEI_PPI_DESCRIPTOR in the list.\r
//\r
- \r
+\r
for (;;) {\r
//\r
- // Since PpiData is used for NotifyList and InstallList, max resource\r
+ // Since PpiData is used for NotifyList and PpiList, max resource\r
// is reached if the Install reaches the NotifyList\r
+ // PcdPeiCoreMaxPpiSupported can be set to a larger value in DSC to satisfy more PPI requirement.\r
//\r
if (Index == PrivateData->PpiData.NotifyListEnd + 1) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
//\r
- // Check if it is a valid PPI. \r
+ // Check if it is a valid PPI.\r
// If not, rollback list to exclude all in this list.\r
// Try to indicate which item failed.\r
//\r
if ((PpiList->Flags & EFI_PEI_PPI_DESCRIPTOR_PPI) == 0) {\r
PrivateData->PpiData.PpiListEnd = LastCallbackInstall;\r
- DEBUG((EFI_D_ERROR, "ERROR -> InstallPpi: %g %x\n", PpiList->Guid, PpiList->Ppi));\r
+ DEBUG((EFI_D_ERROR, "ERROR -> InstallPpi: %g %p\n", PpiList->Guid, PpiList->Ppi));\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- DEBUG((EFI_D_INFO, "Install PPI: %g\n", PpiList->Guid)); \r
- PrivateData->PpiData.PpiListPtrs[Index].Ppi = PpiList; \r
+ DEBUG((EFI_D_INFO, "Install PPI: %g\n", PpiList->Guid));\r
+ PrivateData->PpiData.PpiListPtrs[Index].Ppi = (EFI_PEI_PPI_DESCRIPTOR*) PpiList;\r
PrivateData->PpiData.PpiListEnd++;\r
- \r
+\r
//\r
// Continue until the end of the PPI List.\r
//\r
- if ((PpiList->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) == \r
+ if ((PpiList->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) ==\r
EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) {\r
break;\r
}\r
// Dispatch any callback level notifies for newly installed PPIs.\r
//\r
DispatchNotify (\r
- PeiServices,\r
+ PrivateData,\r
EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK,\r
LastCallbackInstall,\r
PrivateData->PpiData.PpiListEnd,\r
- PrivateData->PpiData.DispatchListEnd, \r
+ PrivateData->PpiData.DispatchListEnd,\r
PrivateData->PpiData.NotifyListEnd\r
);\r
\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+\r
+ This function reinstalls an interface in the PEI PPI database by GUID. \r
+ The purpose of the service is to publish an interface that other parties can \r
+ use to replace an interface of the same name in the protocol database with a \r
+ different interface.\r
\r
+ @param PeiServices An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.\r
+ @param OldPpi Pointer to the old PEI PPI Descriptors.\r
+ @param NewPpi Pointer to the new PEI PPI Descriptors.\r
+\r
+ @retval EFI_SUCCESS if the operation was successful\r
+ @retval EFI_INVALID_PARAMETER if OldPpi or NewPpi is NULL\r
+ @retval EFI_INVALID_PARAMETER if NewPpi is not valid\r
+ @retval EFI_NOT_FOUND if the PPI was not in the database\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PeiReInstallPpi (\r
- IN EFI_PEI_SERVICES **PeiServices,\r
- IN EFI_PEI_PPI_DESCRIPTOR *OldPpi,\r
- IN EFI_PEI_PPI_DESCRIPTOR *NewPpi\r
+ IN CONST EFI_PEI_SERVICES **PeiServices,\r
+ IN CONST EFI_PEI_PPI_DESCRIPTOR *OldPpi,\r
+ IN CONST EFI_PEI_PPI_DESCRIPTOR *NewPpi\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Re-Install PPI services.\r
-\r
-Arguments:\r
-\r
- PeiServices - Pointer to the PEI Service Table\r
- OldPpi - Pointer to the old PEI PPI Descriptors.\r
- NewPpi - Pointer to the new PEI PPI Descriptors.\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - if the operation was successful\r
- EFI_INVALID_PARAMETER - if OldPpi or NewPpi is NULL\r
- EFI_INVALID_PARAMETER - if NewPpi is not valid\r
- EFI_NOT_FOUND - if the PPI was not in the database\r
-\r
---*/\r
{\r
PEI_CORE_INSTANCE *PrivateData;\r
INTN Index;\r
\r
//\r
// Remove the old PPI from the database, add the new one.\r
- // \r
+ //\r
DEBUG((EFI_D_INFO, "Reinstall PPI: %g\n", NewPpi->Guid));\r
- PrivateData->PpiData.PpiListPtrs[Index].Ppi = NewPpi;\r
+ ASSERT (Index < (INTN)(FixedPcdGet32 (PcdPeiCoreMaxPpiSupported)));\r
+ PrivateData->PpiData.PpiListPtrs[Index].Ppi = (EFI_PEI_PPI_DESCRIPTOR *) NewPpi;\r
\r
//\r
// Dispatch any callback level notifies for the newly installed PPI.\r
//\r
DispatchNotify (\r
- PeiServices,\r
+ PrivateData,\r
EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK,\r
Index,\r
Index+1,\r
- PrivateData->PpiData.DispatchListEnd, \r
+ PrivateData->PpiData.DispatchListEnd,\r
PrivateData->PpiData.NotifyListEnd\r
);\r
\r
return EFI_SUCCESS;\r
}\r
\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PeiLocatePpi (\r
- IN EFI_PEI_SERVICES **PeiServices,\r
- IN EFI_GUID *Guid,\r
- IN UINTN Instance,\r
- IN OUT EFI_PEI_PPI_DESCRIPTOR **PpiDescriptor,\r
- IN OUT VOID **Ppi\r
- )\r
-/*++\r
-\r
-Routine Description:\r
+/**\r
\r
Locate a given named PPI.\r
\r
-Arguments:\r
\r
- PeiServices - Pointer to the PEI Service Table\r
- Guid - Pointer to GUID of the PPI.\r
- Instance - Instance Number to discover.\r
- PpiDescriptor - Pointer to reference the found descriptor. If not NULL,\r
- returns a pointer to the descriptor (includes flags, etc)\r
- Ppi - Pointer to reference the found PPI\r
+ @param PeiServices An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.\r
+ @param Guid Pointer to GUID of the PPI.\r
+ @param Instance Instance Number to discover.\r
+ @param PpiDescriptor Pointer to reference the found descriptor. If not NULL,\r
+ returns a pointer to the descriptor (includes flags, etc)\r
+ @param Ppi Pointer to reference the found PPI\r
\r
-Returns:\r
+ @retval EFI_SUCCESS if the PPI is in the database\r
+ @retval EFI_NOT_FOUND if the PPI is not in the database\r
\r
- Status - EFI_SUCCESS if the PPI is in the database \r
- EFI_NOT_FOUND if the PPI is not in the database\r
---*/\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+PeiLocatePpi (\r
+ IN CONST EFI_PEI_SERVICES **PeiServices,\r
+ IN CONST EFI_GUID *Guid,\r
+ IN UINTN Instance,\r
+ IN OUT EFI_PEI_PPI_DESCRIPTOR **PpiDescriptor,\r
+ IN OUT VOID **Ppi\r
+ )\r
{\r
PEI_CORE_INSTANCE *PrivateData;\r
INTN Index;\r
EFI_GUID *CheckGuid;\r
EFI_PEI_PPI_DESCRIPTOR *TempPtr;\r
\r
- \r
+\r
PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS(PeiServices);\r
\r
//\r
return EFI_NOT_FOUND;\r
}\r
\r
+/**\r
\r
+ This function installs a notification service to be called back when a given \r
+ interface is installed or reinstalled. The purpose of the service is to publish \r
+ an interface that other parties can use to call additional PPIs that may materialize later.\r
+\r
+ @param PeiServices An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.\r
+ @param NotifyList Pointer to list of Descriptors to notify upon.\r
+\r
+ @retval EFI_SUCCESS if successful\r
+ @retval EFI_OUT_OF_RESOURCES if no space in the database\r
+ @retval EFI_INVALID_PARAMETER if not a good decriptor\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PeiNotifyPpi (\r
- IN EFI_PEI_SERVICES **PeiServices,\r
- IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyList\r
+ IN CONST EFI_PEI_SERVICES **PeiServices,\r
+ IN CONST EFI_PEI_NOTIFY_DESCRIPTOR *NotifyList\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Install a notification for a given PPI.\r
-\r
-Arguments:\r
-\r
- PeiServices - Pointer to the PEI Service Table\r
- NotifyList - Pointer to list of Descriptors to notify upon.\r
-\r
-Returns:\r
-\r
- Status - EFI_SUCCESS if successful\r
- EFI_OUT_OF_RESOURCES if no space in the database\r
- EFI_INVALID_PARAMETER if not a good decriptor\r
-\r
---*/\r
{\r
PEI_CORE_INSTANCE *PrivateData;\r
INTN Index;\r
//\r
// Since PpiData is used for NotifyList and InstallList, max resource\r
// is reached if the Install reaches the PpiList\r
+ // PcdPeiCoreMaxPpiSupported can be set to a larger value in DSC to satisfy more Notify PPIs requirement.\r
//\r
if (Index == PrivateData->PpiData.PpiListEnd - 1) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
- \r
+\r
//\r
// If some of the PPI data is invalid restore original Notify PPI database value\r
//\r
if ((NotifyList->Flags & EFI_PEI_PPI_DESCRIPTOR_NOTIFY_TYPES) == 0) {\r
PrivateData->PpiData.NotifyListEnd = LastCallbackNotify;\r
- DEBUG((EFI_D_ERROR, "ERROR -> InstallNotify: %g %x\n", NotifyList->Guid, NotifyList->Notify));\r
+ DEBUG((EFI_D_ERROR, "ERROR -> InstallNotify: %g %p\n", NotifyList->Guid, NotifyList->Notify));\r
return EFI_INVALID_PARAMETER;\r
}\r
- \r
+\r
if ((NotifyList->Flags & EFI_PEI_PPI_DESCRIPTOR_NOTIFY_DISPATCH) != 0) {\r
- NotifyDispatchCount ++; \r
- } \r
- \r
- PrivateData->PpiData.PpiListPtrs[Index].Notify = NotifyList; \r
- \r
+ NotifyDispatchCount ++;\r
+ }\r
+\r
+ PrivateData->PpiData.PpiListPtrs[Index].Notify = (EFI_PEI_NOTIFY_DESCRIPTOR *) NotifyList;\r
+\r
PrivateData->PpiData.NotifyListEnd--;\r
DEBUG((EFI_D_INFO, "Register PPI Notify: %g\n", NotifyList->Guid));\r
if ((NotifyList->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) ==\r
NotifyList++;\r
Index--;\r
}\r
- \r
+\r
//\r
- // If there is Dispatch Notify PPI installed put them on the bottom \r
+ // If there is Dispatch Notify PPI installed put them on the bottom\r
//\r
if (NotifyDispatchCount > 0) {\r
- for (NotifyIndex = LastCallbackNotify; NotifyIndex > PrivateData->PpiData.NotifyListEnd; NotifyIndex--) { \r
+ for (NotifyIndex = LastCallbackNotify; NotifyIndex > PrivateData->PpiData.NotifyListEnd; NotifyIndex--) {\r
if ((PrivateData->PpiData.PpiListPtrs[NotifyIndex].Notify->Flags & EFI_PEI_PPI_DESCRIPTOR_NOTIFY_DISPATCH) != 0) {\r
NotifyPtr = PrivateData->PpiData.PpiListPtrs[NotifyIndex].Notify;\r
- \r
+\r
for (Index = NotifyIndex; Index < PrivateData->PpiData.DispatchListEnd; Index++){\r
PrivateData->PpiData.PpiListPtrs[Index].Notify = PrivateData->PpiData.PpiListPtrs[Index + 1].Notify;\r
}\r
PrivateData->PpiData.PpiListPtrs[Index].Notify = NotifyPtr;\r
- PrivateData->PpiData.DispatchListEnd--; \r
+ PrivateData->PpiData.DispatchListEnd--;\r
}\r
}\r
- \r
- LastCallbackNotify -= NotifyDispatchCount; \r
+\r
+ LastCallbackNotify -= NotifyDispatchCount;\r
}\r
- \r
+\r
//\r
// Dispatch any callback level notifies for all previously installed PPIs.\r
//\r
DispatchNotify (\r
- PeiServices,\r
+ PrivateData,\r
EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK,\r
0,\r
PrivateData->PpiData.PpiListEnd,\r
LastCallbackNotify,\r
PrivateData->PpiData.NotifyListEnd\r
);\r
- \r
- \r
+\r
return EFI_SUCCESS;\r
}\r
\r
\r
-VOID\r
-ProcessNotifyList (\r
- IN EFI_PEI_SERVICES **PeiServices\r
- )\r
-/*++\r
-\r
-Routine Description:\r
+/**\r
\r
Process the Notify List at dispatch level.\r
\r
-Arguments:\r
-\r
- PeiServices - Pointer to the PEI Service Table\r
-\r
-Returns:\r
-\r
---*/\r
+ @param PrivateData PeiCore's private data structure.\r
\r
+**/\r
+VOID\r
+ProcessNotifyList (\r
+ IN PEI_CORE_INSTANCE *PrivateData\r
+ )\r
{\r
- PEI_CORE_INSTANCE *PrivateData;\r
INTN TempValue;\r
\r
- PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS(PeiServices);\r
-\r
- \r
while (TRUE) {\r
//\r
// Check if the PEIM that was just dispatched resulted in any\r
// Notifies getting installed. If so, go process any dispatch\r
// level Notifies that match the previouly installed PPIs.\r
- // Use "while" instead of "if" since DispatchNotify can modify \r
+ // Use "while" instead of "if" since DispatchNotify can modify\r
// DispatchListEnd (with NotifyPpi) so we have to iterate until the same.\r
//\r
while (PrivateData->PpiData.LastDispatchedNotify != PrivateData->PpiData.DispatchListEnd) {\r
TempValue = PrivateData->PpiData.DispatchListEnd;\r
DispatchNotify (\r
- PeiServices,\r
+ PrivateData,\r
EFI_PEI_PPI_DESCRIPTOR_NOTIFY_DISPATCH,\r
0,\r
PrivateData->PpiData.LastDispatchedInstall,\r
);\r
PrivateData->PpiData.LastDispatchedNotify = TempValue;\r
}\r
- \r
- \r
+\r
+\r
//\r
// Check if the PEIM that was just dispatched resulted in any\r
// PPIs getting installed. If so, go process any dispatch\r
// level Notifies that match the installed PPIs.\r
- // Use "while" instead of "if" since DispatchNotify can modify \r
+ // Use "while" instead of "if" since DispatchNotify can modify\r
// PpiListEnd (with InstallPpi) so we have to iterate until the same.\r
//\r
while (PrivateData->PpiData.LastDispatchedInstall != PrivateData->PpiData.PpiListEnd) {\r
TempValue = PrivateData->PpiData.PpiListEnd;\r
DispatchNotify (\r
- PeiServices,\r
+ PrivateData,\r
EFI_PEI_PPI_DESCRIPTOR_NOTIFY_DISPATCH,\r
PrivateData->PpiData.LastDispatchedInstall,\r
PrivateData->PpiData.PpiListEnd,\r
- MAX_PPI_DESCRIPTORS-1,\r
+ FixedPcdGet32 (PcdPeiCoreMaxPpiSupported)-1,\r
PrivateData->PpiData.DispatchListEnd\r
);\r
PrivateData->PpiData.LastDispatchedInstall = TempValue;\r
}\r
- \r
+\r
if (PrivateData->PpiData.LastDispatchedNotify == PrivateData->PpiData.DispatchListEnd) {\r
break;\r
}\r
- } \r
+ }\r
return;\r
}\r
\r
+/**\r
+\r
+ Dispatch notifications.\r
+\r
+ @param PrivateData PeiCore's private data structure\r
+ @param NotifyType Type of notify to fire.\r
+ @param InstallStartIndex Install Beginning index.\r
+ @param InstallStopIndex Install Ending index.\r
+ @param NotifyStartIndex Notify Beginning index.\r
+ @param NotifyStopIndex Notify Ending index.\r
+\r
+**/\r
VOID\r
DispatchNotify (\r
- IN EFI_PEI_SERVICES **PeiServices,\r
+ IN PEI_CORE_INSTANCE *PrivateData,\r
IN UINTN NotifyType,\r
IN INTN InstallStartIndex,\r
IN INTN InstallStopIndex,\r
IN INTN NotifyStartIndex,\r
IN INTN NotifyStopIndex\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Dispatch notifications.\r
-\r
-Arguments:\r
-\r
- PeiServices - Pointer to the PEI Service Table\r
- NotifyType - Type of notify to fire.\r
- InstallStartIndex - Install Beginning index.\r
- InstallStopIndex - Install Ending index.\r
- NotifyStartIndex - Notify Beginning index.\r
- NotifyStopIndex - Notify Ending index.\r
-\r
-Returns: None\r
-\r
---*/\r
-\r
{\r
- PEI_CORE_INSTANCE *PrivateData;\r
INTN Index1;\r
INTN Index2;\r
EFI_GUID *SearchGuid;\r
EFI_GUID *CheckGuid;\r
EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor;\r
\r
- PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS(PeiServices);\r
-\r
//\r
// Remember that Installs moves up and Notifies moves down.\r
//\r
(((INT32 *)SearchGuid)[1] == ((INT32 *)CheckGuid)[1]) &&\r
(((INT32 *)SearchGuid)[2] == ((INT32 *)CheckGuid)[2]) &&\r
(((INT32 *)SearchGuid)[3] == ((INT32 *)CheckGuid)[3])) {\r
- DEBUG ((EFI_D_INFO, "Notify: PPI Guid: %g, Peim notify entry point: %x\n", \r
- SearchGuid, \r
+ DEBUG ((EFI_D_INFO, "Notify: PPI Guid: %g, Peim notify entry point: %p\n",\r
+ SearchGuid,\r
NotifyDescriptor->Notify\r
));\r
NotifyDescriptor->Notify (\r
- PeiServices,\r
+ (EFI_PEI_SERVICES **) GetPeiServicesTablePointer (),\r
NotifyDescriptor,\r
(PrivateData->PpiData.PpiListPtrs[Index2].Ppi)->Ppi\r
);\r
}\r
}\r
}\r
-\r
- return;\r
}\r
\r