Why does the initial call to the ProcessLibraryConstructorList() pass in the
PEI Services Table pointer pointer, when the PEI Services will crash? Would it
be better to pass in NULL?
Also why does it get called 3 times on boot?
I was trying to make a call to a PPI database call, and it crashed due all the
values being zero in the PpiData structure, and the PpiListPtrs being NULL
Thanks,
Andrew Fish
https://svn.code.sf.net/p/edk2/code/trunk/edk2/MdeModulePkg/Core/Pei/PeiMain/PeiMain.c
//
// Cache a pointer to the PEI Services Table that is either in temporary
memory or permanent memory
//
PrivateData.Ps = &PrivateData.ServiceTableShadow;
//
// Initialize libraries that the PEI Core is linked against
//
ProcessLibraryConstructorList (NULL, (CONST EFI_PEI_SERVICES
**)&PrivateData.Ps);
//
// Save PeiServicePointer so that it can be retrieved anywhere.
//
SetPeiServicesTablePointer ((CONST EFI_PEI_SERVICES **)&PrivateData.Ps);
//
// Initialize PEI Core Services
//
InitializeMemoryServices (&PrivateData, SecCoreData, OldCoreData);
if (OldCoreData == NULL) {
//
// Initialize PEI Core Private Data Buffer
//
PrivateData.PpiData.PpiListPtrs = AllocateZeroPool (sizeof
(PEI_PPI_LIST_POINTERS) * PcdGet32 (PcdPeiCoreMaxPpiSupported));
ASSERT (PrivateData.PpiData.PpiListPtrs != NULL);
PrivateData.Fv = AllocateZeroPool (sizeof
(PEI_CORE_FV_HANDLE) * PcdGet32 (PcdPeiCoreMaxFvSupported));
ASSERT (PrivateData.Fv != NULL);
PrivateData.Fv[0].PeimState = AllocateZeroPool (sizeof (UINT8) *
PcdGet32 (PcdPeiCoreMaxPeimPerFv) * PcdGet32 (PcdPeiCoreMaxFvSupported));
ASSERT (PrivateData.Fv[0].PeimState != NULL);
PrivateData.Fv[0].FvFileHandles = AllocateZeroPool (sizeof
(EFI_PEI_FILE_HANDLE) * PcdGet32 (PcdPeiCoreMaxPeimPerFv) * PcdGet32
(PcdPeiCoreMaxFvSupported));
ASSERT (PrivateData.Fv[0].FvFileHandles != NULL);
for (Index = 1; Index < PcdGet32 (PcdPeiCoreMaxFvSupported); Index ++) {
PrivateData.Fv[Index].PeimState = PrivateData.Fv[Index - 1].PeimState
+ PcdGet32 (PcdPeiCoreMaxPeimPerFv);
PrivateData.Fv[Index].FvFileHandles = PrivateData.Fv[Index -
1].FvFileHandles + PcdGet32 (PcdPeiCoreMaxPeimPerFv);
}
PrivateData.UnknownFvInfo = AllocateZeroPool (sizeof
(PEI_CORE_UNKNOW_FORMAT_FV_INFO) * PcdGet32 (PcdPeiCoreMaxFvSupported));
ASSERT (PrivateData.UnknownFvInfo != NULL);
PrivateData.CurrentFvFileHandles = AllocateZeroPool (sizeof
(EFI_PEI_FILE_HANDLE) * PcdGet32 (PcdPeiCoreMaxPeimPerFv));
ASSERT (PrivateData.CurrentFvFileHandles != NULL);
PrivateData.FileGuid = AllocatePool (sizeof (EFI_GUID) *
PcdGet32 (PcdPeiCoreMaxPeimPerFv));
ASSERT (PrivateData.FileGuid != NULL);
PrivateData.FileHandles = AllocatePool (sizeof
(EFI_PEI_FILE_HANDLE) * (PcdGet32 (PcdPeiCoreMaxPeimPerFv) + 1));
ASSERT (PrivateData.FileHandles != NULL);
}
InitializePpiServices (&PrivateData, OldCoreData);
https://svn.code.sf.net/p/edk2/code/trunk/edk2/MdeModulePkg/Core/Pei/Ppi/Ppi.c
VOID
InitializePpiServices (
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;
}
}
------------------------------------------------------------------------------
Comprehensive Server Monitoring with Site24x7.
Monitor 10 servers for $9/Month.
Get alerted through email, SMS, voice calls or mobile push notifications.
Take corrective actions from your mobile device.
http://pubads.g.doubleclick.net/gampad/clk?id=154624111&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel