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

Reply via email to