X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=MdeModulePkg%2FCore%2FPei%2FPpi%2FPpi.c;h=db6eded6d6eddd4cf0cdb21402148abdbec1c27f;hb=322d827c0f41efe14387ee67834ddced09f95c9c;hp=0f119c7fb6bdd0226fb341db9621c6f6acb2ca6e;hpb=192f6d4c29fa0dd595b8d5a36bd2078e1474aa4e;p=mirror_edk2.git
diff --git a/MdeModulePkg/Core/Pei/Ppi/Ppi.c b/MdeModulePkg/Core/Pei/Ppi/Ppi.c
index 0f119c7fb6..db6eded6d6 100644
--- a/MdeModulePkg/Core/Pei/Ppi/Ppi.c
+++ b/MdeModulePkg/Core/Pei/Ppi/Ppi.c
@@ -1,171 +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:
-
- Ppi.c
+/** @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
-Abstract:
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
- EFI PEI Core PPI services
+**/
-Revision History
+#include "PeiMain.h"
---*/
+/**
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
+ 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 EFI_PEI_SERVICES **PeiServices,
+ IN PEI_CORE_INSTANCE *PrivateData,
IN PEI_CORE_INSTANCE *OldCoreData
)
-/*++
+{
+ if (OldCoreData == NULL) {
+ PrivateData->PpiData.NotifyListEnd = PcdGet32 (PcdPeiCoreMaxPpiSupported)-1;
+ PrivateData->PpiData.DispatchListEnd = PcdGet32 (PcdPeiCoreMaxPpiSupported)-1;
+ PrivateData->PpiData.LastDispatchedNotify = PcdGet32 (PcdPeiCoreMaxPpiSupported)-1;
+ }
+}
-Routine Description:
+/**
- Initialize PPI services.
+ Migrate Single PPI Pointer from the temporary memory to PEI installed memory.
-Arguments:
+ @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.
- PeiServices - The PEI core services table.
- OldCoreData - Pointer to the PEI Core data.
- NULL if being run in non-permament memory mode.
+**/
+VOID
+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);
+ }
-Returns:
- Nothing
+ //
+ // Only when the PEIM descriptor is in the old TempRam should it be necessary
+ // to try to convert the pointers in the PEIM descriptor
+ //
---*/
-{
- PEI_CORE_INSTANCE *PrivateData;
-
- if (OldCoreData == NULL) {
- PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS(PeiServices);
+ 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);
+ }
+ }
- PrivateData->PpiData.NotifyListEnd = MAX_PPI_DESCRIPTORS-1;
- PrivateData->PpiData.DispatchListEnd = MAX_PPI_DESCRIPTORS-1;
- PrivateData->PpiData.LastDispatchedNotify = MAX_PPI_DESCRIPTORS-1;
+ //
+ // 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);
+ }
+ }
}
-
- return;
}
-VOID
-ConvertPpiPointers (
- IN EFI_PEI_SERVICES **PeiServices,
- IN EFI_HOB_HANDOFF_INFO_TABLE *OldHandOffHob,
- IN EFI_HOB_HANDOFF_INFO_TABLE *NewHandOffHob
- )
-/*++
-
-Routine Description:
+/**
- Migrate the Hob list from the CAR stack to PEI installed memory.
+ Migrate PPI Pointers from the temporary memory stack to PEI installed memory.
-Arguments:
+ @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.
- PeiServices - The PEI core services table.
- OldHandOffHob - The old handoff HOB list.
- NewHandOffHob - The new handoff HOB list.
-
-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;
+ UINT8 IndexHole;
- PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS(PeiServices);
-
- 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 EFI_PEI_SERVICES **PeiServices,
- IN EFI_PEI_PPI_DESCRIPTOR *PpiList
+ 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;
@@ -186,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 = 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;
}
@@ -225,11 +244,11 @@ Returns:
// Dispatch any callback level notifies for newly installed PPIs.
//
DispatchNotify (
- PeiServices,
+ PrivateData,
EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK,
LastCallbackInstall,
PrivateData->PpiData.PpiListEnd,
- PrivateData->PpiData.DispatchListEnd,
+ PrivateData->PpiData.DispatchListEnd,
PrivateData->PpiData.NotifyListEnd
);
@@ -237,34 +256,30 @@ 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 (
- IN EFI_PEI_SERVICES **PeiServices,
- IN EFI_PEI_PPI_DESCRIPTOR *OldPpi,
- IN EFI_PEI_PPI_DESCRIPTOR *NewPpi
+ IN CONST EFI_PEI_SERVICES **PeiServices,
+ 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;
@@ -295,19 +310,20 @@ Returns:
//
// Remove the old PPI from the database, add the new one.
- //
+ //
DEBUG((EFI_D_INFO, "Reinstall PPI: %g\n", NewPpi->Guid));
- PrivateData->PpiData.PpiListPtrs[Index].Ppi = NewPpi;
+ ASSERT (Index < (INTN)(PcdGet32 (PcdPeiCoreMaxPpiSupported)));
+ PrivateData->PpiData.PpiListPtrs[Index].Ppi = (EFI_PEI_PPI_DESCRIPTOR *) NewPpi;
//
// Dispatch any callback level notifies for the newly installed PPI.
//
DispatchNotify (
- PeiServices,
+ PrivateData,
EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK,
Index,
Index+1,
- PrivateData->PpiData.DispatchListEnd,
+ PrivateData->PpiData.DispatchListEnd,
PrivateData->PpiData.NotifyListEnd
);
@@ -315,43 +331,38 @@ Returns:
return EFI_SUCCESS;
}
-
-EFI_STATUS
-EFIAPI
-PeiLocatePpi (
- IN EFI_PEI_SERVICES **PeiServices,
- IN EFI_GUID *Guid,
- 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
+ @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
-Returns:
+ @retval EFI_SUCCESS if the PPI is in the database
+ @retval EFI_NOT_FOUND if the PPI is not in the database
- Status - EFI_SUCCESS if the PPI is in the database
- 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
+ )
{
PEI_CORE_INSTANCE *PrivateData;
INTN Index;
EFI_GUID *CheckGuid;
EFI_PEI_PPI_DESCRIPTOR *TempPtr;
-
+
PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS(PeiServices);
//
@@ -390,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 EFI_PEI_SERVICES **PeiServices,
- IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyList
+ 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;
@@ -445,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 = 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) ==
@@ -477,80 +484,68 @@ 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.
//
DispatchNotify (
- PeiServices,
+ PrivateData,
EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK,
0,
PrivateData->PpiData.PpiListEnd,
LastCallbackNotify,
PrivateData->PpiData.NotifyListEnd
);
-
-
+
return EFI_SUCCESS;
}
-VOID
-ProcessNotifyList (
- IN EFI_PEI_SERVICES **PeiServices
- )
-/*++
-
-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
+ )
{
- PEI_CORE_INSTANCE *PrivateData;
INTN TempValue;
- PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS(PeiServices);
-
-
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) {
TempValue = PrivateData->PpiData.DispatchListEnd;
DispatchNotify (
- PeiServices,
+ PrivateData,
EFI_PEI_PPI_DESCRIPTOR_NOTIFY_DISPATCH,
0,
PrivateData->PpiData.LastDispatchedInstall,
@@ -559,73 +554,63 @@ 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) {
TempValue = PrivateData->PpiData.PpiListEnd;
DispatchNotify (
- PeiServices,
+ PrivateData,
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 EFI_PEI_SERVICES **PeiServices,
+ IN PEI_CORE_INSTANCE *PrivateData,
IN UINTN NotifyType,
IN INTN InstallStartIndex,
IN INTN InstallStopIndex,
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
-
---*/
-
{
- PEI_CORE_INSTANCE *PrivateData;
INTN Index1;
INTN Index2;
EFI_GUID *SearchGuid;
EFI_GUID *CheckGuid;
EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor;
- PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS(PeiServices);
-
//
// Remember that Installs moves up and Notifies moves down.
//
@@ -645,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 (
- PeiServices,
+ (EFI_PEI_SERVICES **) GetPeiServicesTablePointer (),
NotifyDescriptor,
(PrivateData->PpiData.PpiListPtrs[Index2].Ppi)->Ppi
);
}
}
}
-
- return;
}