28 IN BOOLEAN OffsetPositive
31 if (((
UINTN)*Pointer < TempTop) &&
32 ((
UINTN)*Pointer >= TempBottom))
35 *Pointer = (
VOID *)((
UINTN)*Pointer + Offset);
37 *Pointer = (
VOID *)((
UINTN)*Pointer - Offset);
61 if (PrivateData->MemoryPages.Size != 0) {
68 (
UINTN)PrivateData->MemoryPages.Base,
69 (
UINTN)PrivateData->MemoryPages.Base + PrivateData->MemoryPages.Size,
70 PrivateData->MemoryPages.Offset,
71 PrivateData->MemoryPages.OffsetPositive
80 (
UINTN)SecCoreData->PeiTemporaryRamBase,
81 (
UINTN)SecCoreData->PeiTemporaryRamBase + SecCoreData->PeiTemporaryRamSize,
82 PrivateData->HeapOffset,
83 PrivateData->HeapOffsetPositive
91 (
UINTN)SecCoreData->StackBase,
92 (
UINTN)SecCoreData->StackBase + SecCoreData->StackSize,
93 PrivateData->StackOffset,
94 PrivateData->StackOffsetPositive
100 for (IndexHole = 0; IndexHole < HOLE_MAX_NUMBER; IndexHole++) {
101 if (PrivateData->HoleData[IndexHole].Size == 0) {
107 (
UINTN)PrivateData->HoleData[IndexHole].Base,
108 (
UINTN)PrivateData->HoleData[IndexHole].Base + PrivateData->HoleData[IndexHole].Size,
109 PrivateData->HoleData[IndexHole].Offset,
110 PrivateData->HoleData[IndexHole].OffsetPositive
171 for (Index = 0; Index < PrivateData->PpiData.PpiList.CurrentCount; Index++) {
175 &PrivateData->PpiData.PpiList.PpiPtrs[Index]
182 for (Index = 0; Index < PrivateData->PpiData.CallbackNotifyList.CurrentCount; Index++) {
186 &PrivateData->PpiData.CallbackNotifyList.NotifyPtrs[Index]
193 for (Index = 0; Index < PrivateData->PpiData.DispatchNotifyList.CurrentCount; Index++) {
197 &PrivateData->PpiData.DispatchNotifyList.NotifyPtrs[Index]
222 BOOLEAN OffsetPositive;
228 GuidCheckList[0] = &gEfiPeiFirmwareVolumeInfoPpiGuid;
229 GuidCheckList[1] = &gEfiPeiFirmwareVolumeInfo2PpiGuid;
231 if (FvHandle > OrgFvHandle) {
232 OffsetPositive =
TRUE;
233 Offset = FvHandle - OrgFvHandle;
235 OffsetPositive =
FALSE;
236 Offset = OrgFvHandle - FvHandle;
239 DEBUG ((DEBUG_VERBOSE,
"Converting PPI pointers in FV.\n"));
242 " OrgFvHandle at 0x%08x. FvHandle at 0x%08x. FvSize = 0x%x\n",
249 " OrgFvHandle range: 0x%08x - 0x%08x\n",
254 for (Index = 0; Index < PrivateData->PpiData.CallbackNotifyList.CurrentCount; Index++) {
256 (
VOID **)&PrivateData->PpiData.CallbackNotifyList.NotifyPtrs[Index].Raw,
258 OrgFvHandle + FvSize,
263 (
VOID **)&PrivateData->PpiData.CallbackNotifyList.NotifyPtrs[Index].Notify->Guid,
265 OrgFvHandle + FvSize,
270 (
VOID **)&PrivateData->PpiData.CallbackNotifyList.NotifyPtrs[Index].Notify->Notify,
272 OrgFvHandle + FvSize,
278 for (Index = 0; Index < PrivateData->PpiData.DispatchNotifyList.CurrentCount; Index++) {
280 (
VOID **)&PrivateData->PpiData.DispatchNotifyList.NotifyPtrs[Index].Raw,
282 OrgFvHandle + FvSize,
287 (
VOID **)&PrivateData->PpiData.DispatchNotifyList.NotifyPtrs[Index].Notify->Guid,
289 OrgFvHandle + FvSize,
294 (
VOID **)&PrivateData->PpiData.DispatchNotifyList.NotifyPtrs[Index].Notify->Notify,
296 OrgFvHandle + FvSize,
302 for (Index = 0; Index < PrivateData->PpiData.PpiList.CurrentCount; Index++) {
304 (
VOID **)&PrivateData->PpiData.PpiList.PpiPtrs[Index].Raw,
306 OrgFvHandle + FvSize,
311 (
VOID **)&PrivateData->PpiData.PpiList.PpiPtrs[Index].Ppi->Guid,
313 OrgFvHandle + FvSize,
318 (
VOID **)&PrivateData->PpiData.PpiList.PpiPtrs[Index].Ppi->Ppi,
320 OrgFvHandle + FvSize,
325 Guid = PrivateData->PpiData.PpiList.PpiPtrs[Index].Ppi->Guid;
326 for (GuidIndex = 0; GuidIndex <
ARRAY_SIZE (GuidCheckList); ++GuidIndex) {
332 if ((((INT32 *)Guid)[0] == ((INT32 *)GuidCheckList[GuidIndex])[0]) &&
333 (((INT32 *)Guid)[1] == ((INT32 *)GuidCheckList[GuidIndex])[1]) &&
334 (((INT32 *)Guid)[2] == ((INT32 *)GuidCheckList[GuidIndex])[2]) &&
335 (((INT32 *)Guid)[3] == ((INT32 *)GuidCheckList[GuidIndex])[3]))
337 FvInfoPpi = PrivateData->PpiData.PpiList.PpiPtrs[Index].Ppi->Ppi;
338 DEBUG ((DEBUG_VERBOSE,
" FvInfo: %p -> ", FvInfoPpi->
FvInfo));
343 OrgFvHandle + FvSize,
350 DEBUG ((DEBUG_VERBOSE,
"\n"));
372 if (PrivateData ==
NULL) {
376 for (Index = 0; Index < PrivateData->PpiData.CallbackNotifyList.CurrentCount; Index++) {
379 "CallbackNotify[%2d] {%g} at 0x%x (%a)\n",
381 PrivateData->PpiData.CallbackNotifyList.NotifyPtrs[Index].Notify->Guid,
382 (
UINTN)PrivateData->PpiData.CallbackNotifyList.NotifyPtrs[Index].Raw,
385 ((
EFI_PHYSICAL_ADDRESS)(
UINTN)PrivateData->PpiData.CallbackNotifyList.NotifyPtrs[Index].Raw >= PrivateData->PhysicalMemoryBegin) &&
388 ?
"CAR" :
"Post-Memory"
393 for (Index = 0; Index < PrivateData->PpiData.DispatchNotifyList.CurrentCount; Index++) {
396 "DispatchNotify[%2d] {%g} at 0x%x (%a)\n",
398 PrivateData->PpiData.DispatchNotifyList.NotifyPtrs[Index].Notify->Guid,
399 (
UINTN)PrivateData->PpiData.DispatchNotifyList.NotifyPtrs[Index].Raw,
402 ((
EFI_PHYSICAL_ADDRESS)(
UINTN)PrivateData->PpiData.DispatchNotifyList.NotifyPtrs[Index].Raw >= PrivateData->PhysicalMemoryBegin) &&
405 ?
"CAR" :
"Post-Memory"
410 for (Index = 0; Index < PrivateData->PpiData.PpiList.CurrentCount; Index++) {
413 "PPI[%2d] {%g} at 0x%x (%a)\n",
415 PrivateData->PpiData.PpiList.PpiPtrs[Index].Ppi->Guid,
416 (
UINTN)PrivateData->PpiData.PpiList.PpiPtrs[Index].Raw,
422 ?
"CAR" :
"Post-Memory"
461 if (PpiList ==
NULL) {
462 return EFI_INVALID_PARAMETER;
467 PpiListPointer = &PrivateData->PpiData.
PpiList;
468 Index = PpiListPointer->CurrentCount;
483 if ((PpiList->Flags & EFI_PEI_PPI_DESCRIPTOR_PPI) == 0) {
484 PpiListPointer->CurrentCount = LastCount;
485 DEBUG ((DEBUG_ERROR,
"ERROR -> InstallPpi: %g %p\n", PpiList->Guid, PpiList->Ppi));
486 return EFI_INVALID_PARAMETER;
489 if (Index >= PpiListPointer->MaxCount) {
496 if (TempPtr ==
NULL) {
497 ASSERT (TempPtr !=
NULL);
498 return EFI_OUT_OF_RESOURCES;
506 PpiListPointer->
PpiPtrs = TempPtr;
510 DEBUG ((DEBUG_INFO,
"Install PPI: %g\n", PpiList->Guid));
513 PpiListPointer->CurrentCount++;
520 }
else if ((PpiList->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) ==
521 EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST)
540 EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK,
542 PpiListPointer->CurrentCount,
603 if ((OldPpi ==
NULL) || (NewPpi ==
NULL)) {
604 return EFI_INVALID_PARAMETER;
607 if ((NewPpi->Flags & EFI_PEI_PPI_DESCRIPTOR_PPI) == 0) {
608 return EFI_INVALID_PARAMETER;
617 for (Index = 0; Index < PrivateData->PpiData.
PpiList.CurrentCount; Index++) {
623 if (Index == PrivateData->PpiData.
PpiList.CurrentCount) {
624 return EFI_NOT_FOUND;
630 DEBUG ((DEBUG_INFO,
"Reinstall PPI: %g\n", NewPpi->Guid));
638 EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK,
684 for (Index = 0; Index < PrivateData->PpiData.
PpiList.CurrentCount; Index++) {
686 CheckGuid = TempPtr->
Guid;
693 if ((((INT32 *)Guid)[0] == ((INT32 *)CheckGuid)[0]) &&
694 (((INT32 *)Guid)[1] == ((INT32 *)CheckGuid)[1]) &&
695 (((INT32 *)Guid)[2] == ((INT32 *)CheckGuid)[2]) &&
696 (((INT32 *)Guid)[3] == ((INT32 *)CheckGuid)[3]))
699 if (PpiDescriptor !=
NULL) {
700 *PpiDescriptor = TempPtr;
714 return EFI_NOT_FOUND;
743 UINTN CallbackNotifyIndex;
744 UINTN LastCallbackNotifyCount;
746 UINTN DispatchNotifyIndex;
747 UINTN LastDispatchNotifyCount;
750 if (NotifyList ==
NULL) {
751 return EFI_INVALID_PARAMETER;
757 CallbackNotifyIndex = CallbackNotifyListPointer->CurrentCount;
758 LastCallbackNotifyCount = CallbackNotifyIndex;
761 DispatchNotifyIndex = DispatchNotifyListPointer->CurrentCount;
762 LastDispatchNotifyCount = DispatchNotifyIndex;
774 if ((NotifyList->Flags & EFI_PEI_PPI_DESCRIPTOR_NOTIFY_TYPES) == 0) {
775 CallbackNotifyListPointer->CurrentCount = LastCallbackNotifyCount;
776 DispatchNotifyListPointer->CurrentCount = LastDispatchNotifyCount;
777 DEBUG ((DEBUG_ERROR,
"ERROR -> NotifyPpi: %g %p\n", NotifyList->Guid, NotifyList->Notify));
778 return EFI_INVALID_PARAMETER;
781 if ((NotifyList->Flags & EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK) != 0) {
782 if (CallbackNotifyIndex >= CallbackNotifyListPointer->MaxCount) {
789 if (TempPtr ==
NULL) {
790 ASSERT (TempPtr !=
NULL);
791 return EFI_OUT_OF_RESOURCES;
799 CallbackNotifyListPointer->
NotifyPtrs = TempPtr;
800 CallbackNotifyListPointer->MaxCount = CallbackNotifyListPointer->MaxCount + CALLBACK_NOTIFY_GROWTH_STEP;
804 CallbackNotifyIndex++;
805 CallbackNotifyListPointer->CurrentCount++;
807 if (DispatchNotifyIndex >= DispatchNotifyListPointer->MaxCount) {
814 if (TempPtr ==
NULL) {
815 ASSERT (TempPtr !=
NULL);
816 return EFI_OUT_OF_RESOURCES;
824 DispatchNotifyListPointer->
NotifyPtrs = TempPtr;
825 DispatchNotifyListPointer->MaxCount = DispatchNotifyListPointer->MaxCount + DISPATCH_NOTIFY_GROWTH_STEP;
829 DispatchNotifyIndex++;
830 DispatchNotifyListPointer->CurrentCount++;
833 DEBUG ((DEBUG_INFO,
"Register PPI Notify: %g\n", NotifyList->Guid));
840 }
else if ((NotifyList->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) ==
841 EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST)
860 EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK,
862 PrivateData->PpiData.
PpiList.CurrentCount,
863 LastCallbackNotifyCount,
864 CallbackNotifyListPointer->CurrentCount
917 while (PrivateData->PpiData.DispatchNotifyList.LastDispatchedCount != PrivateData->PpiData.DispatchNotifyList.CurrentCount) {
918 TempValue = PrivateData->PpiData.DispatchNotifyList.CurrentCount;
921 EFI_PEI_PPI_DESCRIPTOR_NOTIFY_DISPATCH,
923 PrivateData->PpiData.PpiList.LastDispatchedCount,
924 PrivateData->PpiData.DispatchNotifyList.LastDispatchedCount,
925 PrivateData->PpiData.DispatchNotifyList.CurrentCount
927 PrivateData->PpiData.DispatchNotifyList.LastDispatchedCount = TempValue;
938 while (PrivateData->PpiData.PpiList.LastDispatchedCount != PrivateData->PpiData.PpiList.CurrentCount) {
939 TempValue = PrivateData->PpiData.PpiList.CurrentCount;
942 EFI_PEI_PPI_DESCRIPTOR_NOTIFY_DISPATCH,
943 PrivateData->PpiData.PpiList.LastDispatchedCount,
944 PrivateData->PpiData.PpiList.CurrentCount,
946 PrivateData->PpiData.DispatchNotifyList.LastDispatchedCount
948 PrivateData->PpiData.PpiList.LastDispatchedCount = TempValue;
951 if (PrivateData->PpiData.DispatchNotifyList.LastDispatchedCount == PrivateData->PpiData.DispatchNotifyList.CurrentCount) {
975 IN INTN InstallStartIndex,
987 for (Index1 = NotifyStartIndex; Index1 < NotifyStopIndex; Index1++) {
988 if (NotifyType == EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK) {
989 NotifyDescriptor = PrivateData->PpiData.CallbackNotifyList.NotifyPtrs[Index1].
Notify;
991 NotifyDescriptor = PrivateData->PpiData.DispatchNotifyList.NotifyPtrs[Index1].
Notify;
994 CheckGuid = NotifyDescriptor->
Guid;
996 for (Index2 = InstallStartIndex; Index2 < InstallStopIndex; Index2++) {
997 SearchGuid = PrivateData->PpiData.PpiList.PpiPtrs[Index2].Ppi->Guid;
1003 if ((((INT32 *)SearchGuid)[0] == ((INT32 *)CheckGuid)[0]) &&
1004 (((INT32 *)SearchGuid)[1] == ((INT32 *)CheckGuid)[1]) &&
1005 (((INT32 *)SearchGuid)[2] == ((INT32 *)CheckGuid)[2]) &&
1006 (((INT32 *)SearchGuid)[3] == ((INT32 *)CheckGuid)[3]))
1010 "Notify: PPI Guid: %g, Peim notify entry point: %p\n",
1014 NotifyDescriptor->
Notify (
1017 (PrivateData->PpiData.PpiList.PpiPtrs[Index2].Ppi)->Ppi
1043 if ((PpiList->Flags & EFI_PEI_PPI_DESCRIPTOR_NOTIFY_TYPES) != 0) {
1057 if ((PpiList->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) == EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) {
1074 if (!EFI_ERROR (Status)) {
1075 Status = SecHobDataPpi->GetHobs (SecHobDataPpi, &SecHobList);
1076 if (!EFI_ERROR (Status)) {
1100 UINTN PeiCoreModuleSize;
1102 VOID *PeiCoreImageBase;
1103 VOID *PeiCoreEntryPoint;
1106 PeiCoreFileHandle =
NULL;
1111 Status = CoreFvHandle->FvPpi->FindFileByType (
1112 CoreFvHandle->FvPpi,
1113 EFI_FV_FILETYPE_PEI_CORE,
1114 CoreFvHandle->FvHandle,
1119 if (!EFI_ERROR (Status)) {
1120 Status = CoreFvHandle->FvPpi->GetFileInfo (CoreFvHandle->FvPpi, PeiCoreFileHandle, &
FileInfo);
1129 Status = PeCoffLoaderGetEntryPoint ((
VOID *)(
UINTN)PeiCoreImageBase, &PeiCoreEntryPoint);
1132 OrgImageBase = (
UINTN)PeiCoreImageBase;
1133 MigratedImageBase = (
UINTN)_ModuleEntryPoint - ((
UINTN)PeiCoreEntryPoint - (
UINTN)PeiCoreImageBase);
CONST EFI_PEI_SERVICES **EFIAPI GetPeiServicesTablePointer(VOID)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
EFI_STATUS PeiGetPe32Data(IN EFI_PEI_FILE_HANDLE FileHandle, OUT VOID **Pe32Data)
VOID *EFIAPI AllocateZeroPool(IN UINTN AllocationSize)
EFI_STATUS PeiInstallSecHobData(IN CONST EFI_PEI_SERVICES **PeiServices, IN EFI_HOB_GENERIC_HEADER *SecHobList)
#define ARRAY_SIZE(Array)
#define ASSERT_EFI_ERROR(StatusParameter)
#define DEBUG_CODE_BEGIN()
#define DEBUG(Expression)
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a)
VOID * EFI_PEI_FILE_HANDLE
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)
VOID ConvertPeiCorePpiPointers(IN PEI_CORE_INSTANCE *PrivateData, IN PEI_CORE_FV_HANDLE *CoreFvHandle)
EFI_STATUS InternalPeiNotifyPpi(IN CONST EFI_PEI_SERVICES **PeiServices, IN CONST EFI_PEI_NOTIFY_DESCRIPTOR *NotifyList, IN BOOLEAN Single)
VOID ProcessNotify(IN PEI_CORE_INSTANCE *PrivateData, IN UINTN NotifyType, IN INTN InstallStartIndex, IN INTN InstallStopIndex, IN INTN NotifyStartIndex, IN INTN NotifyStopIndex)
VOID ConvertSinglePpiPointer(IN CONST EFI_SEC_PEI_HAND_OFF *SecCoreData, IN PEI_CORE_INSTANCE *PrivateData, IN PEI_PPI_LIST_POINTERS *PpiPointer)
EFI_STATUS EFIAPI PeiInstallPpi(IN CONST EFI_PEI_SERVICES **PeiServices, IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList)
VOID ProcessDispatchNotifyList(IN PEI_CORE_INSTANCE *PrivateData)
EFI_STATUS EFIAPI PeiReInstallPpi(IN CONST EFI_PEI_SERVICES **PeiServices, IN CONST EFI_PEI_PPI_DESCRIPTOR *OldPpi, IN CONST EFI_PEI_PPI_DESCRIPTOR *NewPpi)
VOID DumpPpiList(IN PEI_CORE_INSTANCE *PrivateData)
VOID ConvertPpiPointersFv(IN PEI_CORE_INSTANCE *PrivateData, IN UINTN OrgFvHandle, IN UINTN FvHandle, IN UINTN FvSize)
VOID ConvertPpiPointers(IN CONST EFI_SEC_PEI_HAND_OFF *SecCoreData, IN PEI_CORE_INSTANCE *PrivateData)
VOID ProcessPpiListFromSec(IN CONST EFI_PEI_SERVICES **PeiServices, IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList)
EFI_STATUS EFIAPI PeiNotifyPpi(IN CONST EFI_PEI_SERVICES **PeiServices, IN CONST EFI_PEI_NOTIFY_DESCRIPTOR *NotifyList)
EFI_STATUS InternalPeiInstallPpi(IN CONST EFI_PEI_SERVICES **PeiServices, IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList, IN BOOLEAN Single)
VOID ConvertPointer(IN OUT VOID **Pointer, IN UINTN TempBottom, IN UINTN TempTop, IN UINTN Offset, IN BOOLEAN OffsetPositive)
VOID ConvertPointerInRanges(IN CONST EFI_SEC_PEI_HAND_OFF *SecCoreData, IN PEI_CORE_INSTANCE *PrivateData, IN OUT VOID **Pointer)
EFI_FILE_INFO * FileInfo(IN EFI_FILE_HANDLE FHand)
UINT64 EFI_PHYSICAL_ADDRESS
EFI_PEIM_NOTIFY_ENTRY_POINT Notify
PEI_PPI_LIST_POINTERS * NotifyPtrs
PEI_PPI_LIST_POINTERS * NotifyPtrs
PEI_CALLBACK_NOTIFY_LIST CallbackNotifyList
PEI_DISPATCH_NOTIFY_LIST DispatchNotifyList
PEI_PPI_LIST_POINTERS * PpiPtrs