X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=MdeModulePkg%2FCore%2FPei%2FPpi%2FPpi.c;h=db6eded6d6eddd4cf0cdb21402148abdbec1c27f;hb=322d827c0f41efe14387ee67834ddced09f95c9c;hp=2ee45c44f7c1e5f387565ee9f82e85f171150ac6;hpb=b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3;p=mirror_edk2.git diff --git a/MdeModulePkg/Core/Pei/Ppi/Ppi.c b/MdeModulePkg/Core/Pei/Ppi/Ppi.c index 2ee45c44f7..db6eded6d6 100644 --- a/MdeModulePkg/Core/Pei/Ppi/Ppi.c +++ b/MdeModulePkg/Core/Pei/Ppi/Ppi.c @@ -1,162 +1,189 @@ -/*++ - -Copyright (c) 2006, Intel Corporation -All rights reserved. This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -Module Name: +/** @file + EFI PEI Core PPI services + +Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
+This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php - Ppi.c +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -Abstract: +**/ - EFI PEI Core PPI services +#include "PeiMain.h" -Revision History +/** ---*/ + Initialize PPI services. -#include + @param PrivateData Pointer to the PEI Core data. + @param OldCoreData Pointer to old PEI Core data. + NULL if being run in non-permament memory mode. +**/ VOID InitializePpiServices ( IN PEI_CORE_INSTANCE *PrivateData, IN PEI_CORE_INSTANCE *OldCoreData ) -/*++ - -Routine Description: - - Initialize PPI services. - -Arguments: - - PeiServices - The PEI core services table. - OldCoreData - Pointer to the PEI Core data. - NULL if being run in non-permament memory mode. - -Returns: - Nothing - ---*/ { if (OldCoreData == NULL) { - PrivateData->PpiData.NotifyListEnd = MAX_PPI_DESCRIPTORS-1; - PrivateData->PpiData.DispatchListEnd = MAX_PPI_DESCRIPTORS-1; - PrivateData->PpiData.LastDispatchedNotify = MAX_PPI_DESCRIPTORS-1; + PrivateData->PpiData.NotifyListEnd = PcdGet32 (PcdPeiCoreMaxPpiSupported)-1; + PrivateData->PpiData.DispatchListEnd = PcdGet32 (PcdPeiCoreMaxPpiSupported)-1; + PrivateData->PpiData.LastDispatchedNotify = PcdGet32 (PcdPeiCoreMaxPpiSupported)-1; } - - return; } +/** + + Migrate Single PPI Pointer from the temporary memory to PEI installed memory. + + @param PpiPointer Pointer to Ppi + @param TempBottom Base of old temporary memory + @param TempTop Top of old temporary memory + @param Offset Offset of new memory to old temporary memory. + @param OffsetPositive Positive flag of Offset value. + +**/ VOID -ConvertPpiPointers ( - IN CONST EFI_PEI_SERVICES **PeiServices, - IN EFI_HOB_HANDOFF_INFO_TABLE *OldHandOffHob, - IN EFI_HOB_HANDOFF_INFO_TABLE *NewHandOffHob +ConvertSinglePpiPointer ( + IN PEI_PPI_LIST_POINTERS *PpiPointer, + IN UINTN TempBottom, + IN UINTN TempTop, + IN UINTN Offset, + IN BOOLEAN OffsetPositive ) -/*++ +{ + if (((UINTN)PpiPointer->Raw < TempTop) && + ((UINTN)PpiPointer->Raw >= TempBottom)) { + // + // Convert the pointer to the PPI descriptor from the old TempRam + // to the relocated physical memory. + // + if (OffsetPositive) { + PpiPointer->Raw = (VOID *) ((UINTN)PpiPointer->Raw + Offset); + } else { + PpiPointer->Raw = (VOID *) ((UINTN)PpiPointer->Raw - Offset); + } + + // + // Only when the PEIM descriptor is in the old TempRam should it be necessary + // to try to convert the pointers in the PEIM descriptor + // + + if (((UINTN)PpiPointer->Ppi->Guid < TempTop) && + ((UINTN)PpiPointer->Ppi->Guid >= TempBottom)) { + // + // Convert the pointer to the GUID in the PPI or NOTIFY descriptor + // from the old TempRam to the relocated physical memory. + // + if (OffsetPositive) { + PpiPointer->Ppi->Guid = (VOID *) ((UINTN)PpiPointer->Ppi->Guid + Offset); + } else { + PpiPointer->Ppi->Guid = (VOID *) ((UINTN)PpiPointer->Ppi->Guid - Offset); + } + } -Routine Description: + // + // Convert the pointer to the PPI interface structure in the PPI descriptor + // from the old TempRam to the relocated physical memory. + // + if ((UINTN)PpiPointer->Ppi->Ppi < TempTop && + (UINTN)PpiPointer->Ppi->Ppi >= TempBottom) { + if (OffsetPositive) { + PpiPointer->Ppi->Ppi = (VOID *) ((UINTN)PpiPointer->Ppi->Ppi + Offset); + } else { + PpiPointer->Ppi->Ppi = (VOID *) ((UINTN)PpiPointer->Ppi->Ppi - Offset); + } + } + } +} - Migrate the Hob list from the CAR stack to PEI installed memory. +/** -Arguments: + Migrate PPI Pointers from the temporary memory stack to PEI installed memory. - PeiServices - The PEI core services table. - OldHandOffHob - The old handoff HOB list. - NewHandOffHob - The new handoff HOB list. + @param SecCoreData Points to a data structure containing SEC to PEI handoff data, such as the size + and location of temporary RAM, the stack location and the BFV location. + @param PrivateData Pointer to PeiCore's private data structure. -Returns: - ---*/ +**/ +VOID +ConvertPpiPointers ( + IN CONST EFI_SEC_PEI_HAND_OFF *SecCoreData, + IN PEI_CORE_INSTANCE *PrivateData + ) { - PEI_CORE_INSTANCE *PrivateData; UINT8 Index; - PEI_PPI_LIST_POINTERS *PpiPointer; - UINTN Fixup; - - PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS(PeiServices); + UINT8 IndexHole; - Fixup = (UINTN)NewHandOffHob - (UINTN)OldHandOffHob; - - for (Index = 0; Index < MAX_PPI_DESCRIPTORS; Index++) { - if (Index < PrivateData->PpiData.PpiListEnd || - Index > PrivateData->PpiData.NotifyListEnd) { - PpiPointer = &PrivateData->PpiData.PpiListPtrs[Index]; - - if (((UINTN)PpiPointer->Raw < (UINTN)OldHandOffHob->EfiFreeMemoryBottom) && - ((UINTN)PpiPointer->Raw >= (UINTN)OldHandOffHob)) { - // - // Convert the pointer to the PEIM descriptor from the old HOB heap - // to the relocated HOB heap. - // - PpiPointer->Raw = (VOID *) ((UINTN)PpiPointer->Raw + Fixup); - - // - // Only when the PEIM descriptor is in the old HOB should it be necessary - // to try to convert the pointers in the PEIM descriptor - // + for (Index = 0; Index < PcdGet32 (PcdPeiCoreMaxPpiSupported); Index++) { + if (Index < PrivateData->PpiData.PpiListEnd || Index > PrivateData->PpiData.NotifyListEnd) { + // + // Convert PPI pointer in old Heap + // + ConvertSinglePpiPointer ( + &PrivateData->PpiData.PpiListPtrs[Index], + (UINTN)SecCoreData->PeiTemporaryRamBase, + (UINTN)SecCoreData->PeiTemporaryRamBase + SecCoreData->PeiTemporaryRamSize, + PrivateData->HeapOffset, + PrivateData->HeapOffsetPositive + ); - if (((UINTN)PpiPointer->Ppi->Guid < (UINTN)OldHandOffHob->EfiFreeMemoryBottom) && - ((UINTN)PpiPointer->Ppi->Guid >= (UINTN)OldHandOffHob)) { - // - // Convert the pointer to the GUID in the PPI or NOTIFY descriptor - // from the old HOB heap to the relocated HOB heap. - // - PpiPointer->Ppi->Guid = (VOID *) ((UINTN)PpiPointer->Ppi->Guid + Fixup); - } - - // - // Assume that no code is located in the temporary memory, so the pointer to - // the notification function in the NOTIFY descriptor needs not be converted. - // - if (Index < PrivateData->PpiData.PpiListEnd && - (UINTN)PpiPointer->Ppi->Ppi < (UINTN)OldHandOffHob->EfiFreeMemoryBottom && - (UINTN)PpiPointer->Ppi->Ppi >= (UINTN)OldHandOffHob) { - // - // Convert the pointer to the PPI interface structure in the PPI descriptor - // from the old HOB heap to the relocated HOB heap. - // - PpiPointer->Ppi->Ppi = (VOID *) ((UINTN)PpiPointer->Ppi->Ppi+ Fixup); + // + // Convert PPI pointer in old Stack + // + ConvertSinglePpiPointer ( + &PrivateData->PpiData.PpiListPtrs[Index], + (UINTN)SecCoreData->StackBase, + (UINTN)SecCoreData->StackBase + SecCoreData->StackSize, + PrivateData->StackOffset, + PrivateData->StackOffsetPositive + ); + + // + // Convert PPI pointer in old TempRam Hole + // + for (IndexHole = 0; IndexHole < HOLE_MAX_NUMBER; IndexHole ++) { + if (PrivateData->HoleData[IndexHole].Size == 0) { + continue; } + + ConvertSinglePpiPointer ( + &PrivateData->PpiData.PpiListPtrs[Index], + (UINTN)PrivateData->HoleData[IndexHole].Base, + (UINTN)PrivateData->HoleData[IndexHole].Base + PrivateData->HoleData[IndexHole].Size, + PrivateData->HoleData[IndexHole].Offset, + PrivateData->HoleData[IndexHole].OffsetPositive + ); } } } } +/** + + This function installs an interface in the PEI PPI database by GUID. + The purpose of the service is to publish an interface that other parties + can use to call additional PEIMs. + + @param PeiServices An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation. + @param PpiList Pointer to a list of PEI PPI Descriptors. + @retval EFI_SUCCESS if all PPIs in PpiList are successfully installed. + @retval EFI_INVALID_PARAMETER if PpiList is NULL pointer + if any PPI in PpiList is not valid + @retval EFI_OUT_OF_RESOURCES if there is no more memory resource to install PPI +**/ EFI_STATUS EFIAPI PeiInstallPpi ( IN CONST EFI_PEI_SERVICES **PeiServices, IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList ) -/*++ - -Routine Description: - - Install PPI services. - -Arguments: - - PeiServices - Pointer to the PEI Service Table - PpiList - Pointer to a list of PEI PPI Descriptors. - -Returns: - - EFI_SUCCESS - if all PPIs in PpiList are successfully installed. - EFI_INVALID_PARAMETER - if PpiList is NULL pointer - EFI_INVALID_PARAMETER - if any PPI in PpiList is not valid - EFI_OUT_OF_RESOURCES - if there is no more memory resource to install PPI - ---*/ { PEI_CORE_INSTANCE *PrivateData; INTN Index; @@ -177,34 +204,35 @@ Returns: // by the EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST being set in the last // EFI_PEI_PPI_DESCRIPTOR in the list. // - + for (;;) { // - // Since PpiData is used for NotifyList and InstallList, max resource + // Since PpiData is used for NotifyList and PpiList, max resource // is reached if the Install reaches the NotifyList + // PcdPeiCoreMaxPpiSupported can be set to a larger value in DSC to satisfy more PPI requirement. // if (Index == PrivateData->PpiData.NotifyListEnd + 1) { return EFI_OUT_OF_RESOURCES; } // - // Check if it is a valid PPI. + // Check if it is a valid PPI. // If not, rollback list to exclude all in this list. // Try to indicate which item failed. // if ((PpiList->Flags & EFI_PEI_PPI_DESCRIPTOR_PPI) == 0) { PrivateData->PpiData.PpiListEnd = LastCallbackInstall; - DEBUG((EFI_D_ERROR, "ERROR -> InstallPpi: %g %x\n", PpiList->Guid, PpiList->Ppi)); + DEBUG((EFI_D_ERROR, "ERROR -> InstallPpi: %g %p\n", PpiList->Guid, PpiList->Ppi)); return EFI_INVALID_PARAMETER; } - DEBUG((EFI_D_INFO, "Install PPI: %g\n", PpiList->Guid)); - PrivateData->PpiData.PpiListPtrs[Index].Ppi = (EFI_PEI_PPI_DESCRIPTOR*) PpiList; + DEBUG((EFI_D_INFO, "Install PPI: %g\n", PpiList->Guid)); + PrivateData->PpiData.PpiListPtrs[Index].Ppi = (EFI_PEI_PPI_DESCRIPTOR*) PpiList; PrivateData->PpiData.PpiListEnd++; - + // // Continue until the end of the PPI List. // - if ((PpiList->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) == + if ((PpiList->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) == EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) { break; } @@ -220,7 +248,7 @@ Returns: EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK, LastCallbackInstall, PrivateData->PpiData.PpiListEnd, - PrivateData->PpiData.DispatchListEnd, + PrivateData->PpiData.DispatchListEnd, PrivateData->PpiData.NotifyListEnd ); @@ -228,7 +256,23 @@ Returns: return EFI_SUCCESS; } +/** + + This function reinstalls an interface in the PEI PPI database by GUID. + The purpose of the service is to publish an interface that other parties can + use to replace an interface of the same name in the protocol database with a + different interface. + + @param PeiServices An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation. + @param OldPpi Pointer to the old PEI PPI Descriptors. + @param NewPpi Pointer to the new PEI PPI Descriptors. + @retval EFI_SUCCESS if the operation was successful + @retval EFI_INVALID_PARAMETER if OldPpi or NewPpi is NULL + @retval EFI_INVALID_PARAMETER if NewPpi is not valid + @retval EFI_NOT_FOUND if the PPI was not in the database + +**/ EFI_STATUS EFIAPI PeiReInstallPpi ( @@ -236,26 +280,6 @@ PeiReInstallPpi ( IN CONST EFI_PEI_PPI_DESCRIPTOR *OldPpi, IN CONST EFI_PEI_PPI_DESCRIPTOR *NewPpi ) -/*++ - -Routine Description: - - Re-Install PPI services. - -Arguments: - - PeiServices - Pointer to the PEI Service Table - OldPpi - Pointer to the old PEI PPI Descriptors. - NewPpi - Pointer to the new PEI PPI Descriptors. - -Returns: - - EFI_SUCCESS - if the operation was successful - EFI_INVALID_PARAMETER - if OldPpi or NewPpi is NULL - EFI_INVALID_PARAMETER - if NewPpi is not valid - EFI_NOT_FOUND - if the PPI was not in the database - ---*/ { PEI_CORE_INSTANCE *PrivateData; INTN Index; @@ -286,8 +310,9 @@ Returns: // // Remove the old PPI from the database, add the new one. - // + // DEBUG((EFI_D_INFO, "Reinstall PPI: %g\n", NewPpi->Guid)); + ASSERT (Index < (INTN)(PcdGet32 (PcdPeiCoreMaxPpiSupported))); PrivateData->PpiData.PpiListPtrs[Index].Ppi = (EFI_PEI_PPI_DESCRIPTOR *) NewPpi; // @@ -298,7 +323,7 @@ Returns: EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK, Index, Index+1, - PrivateData->PpiData.DispatchListEnd, + PrivateData->PpiData.DispatchListEnd, PrivateData->PpiData.NotifyListEnd ); @@ -306,43 +331,38 @@ Returns: return EFI_SUCCESS; } +/** + + Locate a given named PPI. + + @param PeiServices An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation. + @param Guid Pointer to GUID of the PPI. + @param Instance Instance Number to discover. + @param PpiDescriptor Pointer to reference the found descriptor. If not NULL, + returns a pointer to the descriptor (includes flags, etc) + @param Ppi Pointer to reference the found PPI + + @retval EFI_SUCCESS if the PPI is in the database + @retval EFI_NOT_FOUND if the PPI is not in the database + +**/ EFI_STATUS EFIAPI PeiLocatePpi ( IN CONST EFI_PEI_SERVICES **PeiServices, IN CONST EFI_GUID *Guid, - IN UINTN Instance, - IN OUT EFI_PEI_PPI_DESCRIPTOR **PpiDescriptor, - IN OUT VOID **Ppi + IN UINTN Instance, + IN OUT EFI_PEI_PPI_DESCRIPTOR **PpiDescriptor, + IN OUT VOID **Ppi ) -/*++ - -Routine Description: - - Locate a given named PPI. - -Arguments: - - PeiServices - Pointer to the PEI Service Table - Guid - Pointer to GUID of the PPI. - Instance - Instance Number to discover. - PpiDescriptor - Pointer to reference the found descriptor. If not NULL, - returns a pointer to the descriptor (includes flags, etc) - Ppi - Pointer to reference the found PPI - -Returns: - - Status - EFI_SUCCESS if the PPI is in the database - EFI_NOT_FOUND if the PPI is not in the database ---*/ { PEI_CORE_INSTANCE *PrivateData; INTN Index; EFI_GUID *CheckGuid; EFI_PEI_PPI_DESCRIPTOR *TempPtr; - + PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS(PeiServices); // @@ -381,31 +401,26 @@ Returns: return EFI_NOT_FOUND; } +/** + + This function installs a notification service to be called back when a given + interface is installed or reinstalled. The purpose of the service is to publish + an interface that other parties can use to call additional PPIs that may materialize later. + @param PeiServices An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation. + @param NotifyList Pointer to list of Descriptors to notify upon. + + @retval EFI_SUCCESS if successful + @retval EFI_OUT_OF_RESOURCES if no space in the database + @retval EFI_INVALID_PARAMETER if not a good decriptor + +**/ EFI_STATUS EFIAPI PeiNotifyPpi ( IN CONST EFI_PEI_SERVICES **PeiServices, IN CONST EFI_PEI_NOTIFY_DESCRIPTOR *NotifyList ) -/*++ - -Routine Description: - - Install a notification for a given PPI. - -Arguments: - - PeiServices - Pointer to the PEI Service Table - NotifyList - Pointer to list of Descriptors to notify upon. - -Returns: - - Status - EFI_SUCCESS if successful - EFI_OUT_OF_RESOURCES if no space in the database - EFI_INVALID_PARAMETER if not a good decriptor - ---*/ { PEI_CORE_INSTANCE *PrivateData; INTN Index; @@ -436,26 +451,27 @@ Returns: // // Since PpiData is used for NotifyList and InstallList, max resource // is reached if the Install reaches the PpiList + // PcdPeiCoreMaxPpiSupported can be set to a larger value in DSC to satisfy more Notify PPIs requirement. // if (Index == PrivateData->PpiData.PpiListEnd - 1) { return EFI_OUT_OF_RESOURCES; } - + // // If some of the PPI data is invalid restore original Notify PPI database value // if ((NotifyList->Flags & EFI_PEI_PPI_DESCRIPTOR_NOTIFY_TYPES) == 0) { PrivateData->PpiData.NotifyListEnd = LastCallbackNotify; - DEBUG((EFI_D_ERROR, "ERROR -> InstallNotify: %g %x\n", NotifyList->Guid, NotifyList->Notify)); + DEBUG((EFI_D_ERROR, "ERROR -> InstallNotify: %g %p\n", NotifyList->Guid, NotifyList->Notify)); return EFI_INVALID_PARAMETER; } - + if ((NotifyList->Flags & EFI_PEI_PPI_DESCRIPTOR_NOTIFY_DISPATCH) != 0) { - NotifyDispatchCount ++; - } - - PrivateData->PpiData.PpiListPtrs[Index].Notify = (EFI_PEI_NOTIFY_DESCRIPTOR *) NotifyList; - + NotifyDispatchCount ++; + } + + PrivateData->PpiData.PpiListPtrs[Index].Notify = (EFI_PEI_NOTIFY_DESCRIPTOR *) NotifyList; + PrivateData->PpiData.NotifyListEnd--; DEBUG((EFI_D_INFO, "Register PPI Notify: %g\n", NotifyList->Guid)); if ((NotifyList->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) == @@ -468,26 +484,26 @@ Returns: NotifyList++; Index--; } - + // - // If there is Dispatch Notify PPI installed put them on the bottom + // If there is Dispatch Notify PPI installed put them on the bottom // if (NotifyDispatchCount > 0) { - for (NotifyIndex = LastCallbackNotify; NotifyIndex > PrivateData->PpiData.NotifyListEnd; NotifyIndex--) { + for (NotifyIndex = LastCallbackNotify; NotifyIndex > PrivateData->PpiData.NotifyListEnd; NotifyIndex--) { if ((PrivateData->PpiData.PpiListPtrs[NotifyIndex].Notify->Flags & EFI_PEI_PPI_DESCRIPTOR_NOTIFY_DISPATCH) != 0) { NotifyPtr = PrivateData->PpiData.PpiListPtrs[NotifyIndex].Notify; - + for (Index = NotifyIndex; Index < PrivateData->PpiData.DispatchListEnd; Index++){ PrivateData->PpiData.PpiListPtrs[Index].Notify = PrivateData->PpiData.PpiListPtrs[Index + 1].Notify; } PrivateData->PpiData.PpiListPtrs[Index].Notify = NotifyPtr; - PrivateData->PpiData.DispatchListEnd--; + PrivateData->PpiData.DispatchListEnd--; } } - - LastCallbackNotify -= NotifyDispatchCount; + + LastCallbackNotify -= NotifyDispatchCount; } - + // // Dispatch any callback level notifies for all previously installed PPIs. // @@ -499,39 +515,31 @@ Returns: LastCallbackNotify, PrivateData->PpiData.NotifyListEnd ); - - + return EFI_SUCCESS; } -VOID -ProcessNotifyList ( - IN PEI_CORE_INSTANCE *PrivateData - ) -/*++ - -Routine Description: +/** Process the Notify List at dispatch level. -Arguments: - - PeiServices - Pointer to the PEI Service Table - -Returns: - ---*/ + @param PrivateData PeiCore's private data structure. +**/ +VOID +ProcessNotifyList ( + IN PEI_CORE_INSTANCE *PrivateData + ) { INTN TempValue; - + while (TRUE) { // // Check if the PEIM that was just dispatched resulted in any // Notifies getting installed. If so, go process any dispatch // level Notifies that match the previouly installed PPIs. - // Use "while" instead of "if" since DispatchNotify can modify + // Use "while" instead of "if" since DispatchNotify can modify // DispatchListEnd (with NotifyPpi) so we have to iterate until the same. // while (PrivateData->PpiData.LastDispatchedNotify != PrivateData->PpiData.DispatchListEnd) { @@ -546,13 +554,13 @@ Returns: ); PrivateData->PpiData.LastDispatchedNotify = TempValue; } - - + + // // Check if the PEIM that was just dispatched resulted in any // PPIs getting installed. If so, go process any dispatch // level Notifies that match the installed PPIs. - // Use "while" instead of "if" since DispatchNotify can modify + // Use "while" instead of "if" since DispatchNotify can modify // PpiListEnd (with InstallPpi) so we have to iterate until the same. // while (PrivateData->PpiData.LastDispatchedInstall != PrivateData->PpiData.PpiListEnd) { @@ -562,19 +570,31 @@ Returns: EFI_PEI_PPI_DESCRIPTOR_NOTIFY_DISPATCH, PrivateData->PpiData.LastDispatchedInstall, PrivateData->PpiData.PpiListEnd, - MAX_PPI_DESCRIPTORS-1, + PcdGet32 (PcdPeiCoreMaxPpiSupported)-1, PrivateData->PpiData.DispatchListEnd ); PrivateData->PpiData.LastDispatchedInstall = TempValue; } - + if (PrivateData->PpiData.LastDispatchedNotify == PrivateData->PpiData.DispatchListEnd) { break; } - } + } return; } +/** + + Dispatch notifications. + + @param PrivateData PeiCore's private data structure + @param NotifyType Type of notify to fire. + @param InstallStartIndex Install Beginning index. + @param InstallStopIndex Install Ending index. + @param NotifyStartIndex Notify Beginning index. + @param NotifyStopIndex Notify Ending index. + +**/ VOID DispatchNotify ( IN PEI_CORE_INSTANCE *PrivateData, @@ -584,25 +604,6 @@ DispatchNotify ( IN INTN NotifyStartIndex, IN INTN NotifyStopIndex ) -/*++ - -Routine Description: - - Dispatch notifications. - -Arguments: - - PeiServices - Pointer to the PEI Service Table - NotifyType - Type of notify to fire. - InstallStartIndex - Install Beginning index. - InstallStopIndex - Install Ending index. - NotifyStartIndex - Notify Beginning index. - NotifyStopIndex - Notify Ending index. - -Returns: None - ---*/ - { INTN Index1; INTN Index2; @@ -629,19 +630,17 @@ Returns: None (((INT32 *)SearchGuid)[1] == ((INT32 *)CheckGuid)[1]) && (((INT32 *)SearchGuid)[2] == ((INT32 *)CheckGuid)[2]) && (((INT32 *)SearchGuid)[3] == ((INT32 *)CheckGuid)[3])) { - DEBUG ((EFI_D_INFO, "Notify: PPI Guid: %g, Peim notify entry point: %x\n", - SearchGuid, + DEBUG ((EFI_D_INFO, "Notify: PPI Guid: %g, Peim notify entry point: %p\n", + SearchGuid, NotifyDescriptor->Notify )); NotifyDescriptor->Notify ( - GetPeiServicesTablePointer (), + (EFI_PEI_SERVICES **) GetPeiServicesTablePointer (), NotifyDescriptor, (PrivateData->PpiData.PpiListPtrs[Index2].Ppi)->Ppi ); } } } - - return; }