Temporarily rollback the change from 5625 though 5628 for more investigation.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5629 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
qhuang8 2008-08-12 05:04:35 +00:00
parent 1bd90a4c47
commit 14941e689f
5 changed files with 78 additions and 113 deletions

View File

@ -100,7 +100,7 @@ DiscoverPeimsAndOrderWithApriori (
Private->AprioriCount -= sizeof (EFI_FFS_FILE_HEADER) - sizeof (EFI_COMMON_SECTION_HEADER); Private->AprioriCount -= sizeof (EFI_FFS_FILE_HEADER) - sizeof (EFI_COMMON_SECTION_HEADER);
Private->AprioriCount /= sizeof (EFI_GUID); Private->AprioriCount /= sizeof (EFI_GUID);
ZeroMem (FileGuid, sizeof (FileGuid)); SetMem (FileGuid, sizeof (FileGuid), 0);
for (Index = 0; Index < PeimCount; Index++) { for (Index = 0; Index < PeimCount; Index++) {
// //
// Make an array of file name guids that matches the FileHandle array so we can convert // Make an array of file name guids that matches the FileHandle array so we can convert
@ -178,7 +178,6 @@ DiscoverPeimsAndOrderWithApriori (
@param PeiServices An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation. @param PeiServices An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
@param PrivateInMem PeiCore's private data structure @param PrivateInMem PeiCore's private data structure
@return PeiCore function address after shadowing.
**/ **/
VOID* VOID*
ShadowPeiCore( ShadowPeiCore(
@ -216,10 +215,6 @@ ShadowPeiCore(
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
//
// Compute the PeiCore's function address after shaowed PeiCore.
// _ModuleEntryPoint is PeiCore main function entry
//
return (VOID*) ((UINTN) EntryPoint + (UINTN) PeiCore - (UINTN) _ModuleEntryPoint); return (VOID*) ((UINTN) EntryPoint + (UINTN) PeiCore - (UINTN) _ModuleEntryPoint);
} }
@ -252,6 +247,8 @@ PeiDispatcher (
UINT32 AuthenticationState; UINT32 AuthenticationState;
EFI_PHYSICAL_ADDRESS EntryPoint; EFI_PHYSICAL_ADDRESS EntryPoint;
EFI_PEIM_ENTRY_POINT2 PeimEntryPoint; EFI_PEIM_ENTRY_POINT2 PeimEntryPoint;
BOOLEAN PeimNeedingDispatch;
BOOLEAN PeimDispatchOnThisPass;
UINTN SaveCurrentPeimCount; UINTN SaveCurrentPeimCount;
UINTN SaveCurrentFvCount; UINTN SaveCurrentFvCount;
EFI_PEI_FILE_HANDLE SaveCurrentFileHandle; EFI_PEI_FILE_HANDLE SaveCurrentFileHandle;
@ -335,15 +332,8 @@ PeiDispatcher (
// satisfied, this dipatcher should run only once. // satisfied, this dipatcher should run only once.
// //
do { do {
// PeimNeedingDispatch = FALSE;
// In case that reenter PeiCore happens, the last pass record is still available. PeimDispatchOnThisPass = FALSE;
//
if (!Private->PeimDispatcherReenter) {
Private->PeimNeedingDispatch = FALSE;
Private->PeimDispatchOnThisPass = FALSE;
} else {
Private->PeimDispatcherReenter = FALSE;
}
for (FvCount = Private->CurrentPeimFvCount; FvCount < Private->FvCount; FvCount++) { for (FvCount = Private->CurrentPeimFvCount; FvCount < Private->FvCount; FvCount++) {
Private->CurrentPeimFvCount = FvCount; Private->CurrentPeimFvCount = FvCount;
@ -369,7 +359,7 @@ PeiDispatcher (
if (Private->Fv[FvCount].PeimState[PeimCount] == PEIM_STATE_NOT_DISPATCHED) { if (Private->Fv[FvCount].PeimState[PeimCount] == PEIM_STATE_NOT_DISPATCHED) {
if (!DepexSatisfied (Private, PeimFileHandle, PeimCount)) { if (!DepexSatisfied (Private, PeimFileHandle, PeimCount)) {
Private->PeimNeedingDispatch = TRUE; PeimNeedingDispatch = TRUE;
} else { } else {
Status = PeiFfsGetFileInfo (PeimFileHandle, &FvFileInfo); Status = PeiFfsGetFileInfo (PeimFileHandle, &FvFileInfo);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
@ -421,7 +411,7 @@ PeiDispatcher (
PeimEntryPoint (PeimFileHandle, (const EFI_PEI_SERVICES **) PeiServices); PeimEntryPoint (PeimFileHandle, (const EFI_PEI_SERVICES **) PeiServices);
} }
Private->PeimDispatchOnThisPass = TRUE; PeimDispatchOnThisPass = TRUE;
} }
REPORT_STATUS_CODE_WITH_EXTENDED_DATA ( REPORT_STATUS_CODE_WITH_EXTENDED_DATA (
@ -591,9 +581,9 @@ PeiDispatcher (
PrivateInMem->PeiMemoryInstalled = TRUE; PrivateInMem->PeiMemoryInstalled = TRUE;
// //
// Indicate that PeiCore reenter // Restart scan of all PEIMs on next pass
// //
Private->PeimDispatcherReenter = TRUE; PrivateInMem->CurrentPeimCount = 0;
// //
// Shadow PEI Core. When permanent memory is avaiable, shadow // Shadow PEI Core. When permanent memory is avaiable, shadow
@ -678,7 +668,7 @@ PeiDispatcher (
// pass. If we did not dispatch a PEIM there is no point in trying again // pass. If we did not dispatch a PEIM there is no point in trying again
// as it will fail the next time too (nothing has changed). // as it will fail the next time too (nothing has changed).
// //
} while (Private->PeimNeedingDispatch && Private->PeimDispatchOnThisPass); } while (PeimNeedingDispatch && PeimDispatchOnThisPass);
} }
@ -703,7 +693,6 @@ InitializeDispatcherData (
) )
{ {
if (OldCoreData == NULL) { if (OldCoreData == NULL) {
PrivateData->PeimDispatcherReenter = FALSE;
PeiInitializeFv (PrivateData, SecCoreData); PeiInitializeFv (PrivateData, SecCoreData);
} }
@ -811,8 +800,6 @@ PeiRegisterForShadow (
@retval EFI_NOT_FOUND FV image can't be found. @retval EFI_NOT_FOUND FV image can't be found.
@retval EFI_SUCCESS Successfully to process it. @retval EFI_SUCCESS Successfully to process it.
@retval EFI_OUT_OF_RESOURCES Can not allocate page when aligning FV image
@retval Others Can not find EFI_SECTION_FIRMWARE_VOLUME_IMAGE section
**/ **/
EFI_STATUS EFI_STATUS
@ -827,7 +814,7 @@ ProcessFvFile (
EFI_FV_INFO FvImageInfo; EFI_FV_INFO FvImageInfo;
UINT32 FvAlignment; UINT32 FvAlignment;
VOID *FvBuffer; VOID *FvBuffer;
EFI_PEI_HOB_POINTERS HobPtr; EFI_PEI_HOB_POINTERS HobFv2;
FvBuffer = NULL; FvBuffer = NULL;
*AuthenticationState = 0; *AuthenticationState = 0;
@ -836,15 +823,15 @@ ProcessFvFile (
// Check if this EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE file has already // Check if this EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE file has already
// been extracted. // been extracted.
// //
HobPtr.Raw = GetHobList (); HobFv2.Raw = GetHobList ();
while ((HobPtr.Raw = GetNextHob (EFI_HOB_TYPE_FV2, HobPtr.Raw)) != NULL) { while ((HobFv2.Raw = GetNextHob (EFI_HOB_TYPE_FV2, HobFv2.Raw)) != NULL) {
if (CompareGuid (&(((EFI_FFS_FILE_HEADER *)FvFileHandle)->Name), &HobPtr.FirmwareVolume2->FileName)) { if (CompareGuid (&(((EFI_FFS_FILE_HEADER *)FvFileHandle)->Name), &HobFv2.FirmwareVolume2->FileName)) {
// //
// this FILE has been dispatched, it will not be dispatched again. // this FILE has been dispatched, it will not be dispatched again.
// //
return EFI_SUCCESS; return EFI_SUCCESS;
} }
HobPtr.Raw = GET_NEXT_HOB (HobPtr); HobFv2.Raw = GET_NEXT_HOB (HobFv2);
} }
// //
@ -860,13 +847,11 @@ ProcessFvFile (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
// //
// Collect FvImage Info. // Collect FvImage Info.
// //
Status = PeiFfsGetVolumeInfo (FvImageHandle, &FvImageInfo); Status = PeiFfsGetVolumeInfo (FvImageHandle, &FvImageInfo);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
// //
// FvAlignment must be more than 8 bytes required by FvHeader structure. // FvAlignment must be more than 8 bytes required by FvHeader structure.
// //
@ -874,7 +859,6 @@ ProcessFvFile (
if (FvAlignment < 8) { if (FvAlignment < 8) {
FvAlignment = 8; FvAlignment = 8;
} }
// //
// Check FvImage // Check FvImage
// //
@ -902,24 +886,12 @@ ProcessFvFile (
); );
// //
// Inform the extracted FvImage to Fv HOB consumer phase, i.e. DXE phase // Inform HOB consumer phase, i.e. DXE core, the existance of this FV
// based on its parent Fvimage is informed or not.
// If FvHob of its parent fvimage is built, the extracted FvImage will be built also.
// Or, the extracted FvImage will not be built.
// //
HobPtr.Raw = GetHobList ();
while ((HobPtr.Raw = GetNextHob (EFI_HOB_TYPE_FV, HobPtr.Raw)) != NULL) {
if (((EFI_PHYSICAL_ADDRESS) (UINTN)FvFileHandle > HobPtr.FirmwareVolume->BaseAddress) &&
((EFI_PHYSICAL_ADDRESS) (UINTN)FvFileHandle < HobPtr.FirmwareVolume->BaseAddress + HobPtr.FirmwareVolume->Length)) {
BuildFvHob ( BuildFvHob (
(EFI_PHYSICAL_ADDRESS) (UINTN) FvImageInfo.FvStart, (EFI_PHYSICAL_ADDRESS) (UINTN) FvImageInfo.FvStart,
FvImageInfo.FvSize FvImageInfo.FvSize
); );
break;
}
HobPtr.Raw = GET_NEXT_HOB (HobPtr);
}
// //
// Makes the encapsulated volume show up in DXE phase to skip processing of // Makes the encapsulated volume show up in DXE phase to skip processing of
// encapsulated file again. // encapsulated file again.

View File

@ -18,7 +18,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
Initialize the memory services. Initialize the memory services.
@param PrivateData Points to PeiCore's private instance data.
@param PrivateData Add parameter description
@param SecCoreData Points to a data structure containing information about the PEI core's operating @param SecCoreData Points to a data structure containing information about the PEI core's operating
environment, such as the size and location of temporary RAM, the stack location and environment, such as the size and location of temporary RAM, the stack location and
the BFV location. the BFV location.
@ -75,12 +76,8 @@ InitializeMemoryServices (
/** /**
This function registers the found memory configuration with the PEI Foundation. Install the permanent memory is now available.
Creates HOB (PHIT and Stack).
The usage model is that the PEIM that discovers the permanent memory shall invoke this service.
This routine will hold discoveried memory information into PeiCore's private data,
and set SwitchStackSignal flag. After PEIM who discovery memory is dispatched,
PeiDispatcher will migrate temporary memory to permenement memory.
@param PeiServices An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation. @param PeiServices An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
@param MemoryBegin Start of memory address. @param MemoryBegin Start of memory address.
@ -123,6 +120,7 @@ PeiInstallPeiMemory (
@param Memory Pointer of memory allocated. @param Memory Pointer of memory allocated.
@retval EFI_SUCCESS The allocation was successful @retval EFI_SUCCESS The allocation was successful
@retval EFI_INVALID_PARAMETER Only AllocateAnyAddress is supported.
@retval EFI_NOT_AVAILABLE_YET Called with permanent memory not available @retval EFI_NOT_AVAILABLE_YET Called with permanent memory not available
@retval EFI_OUT_OF_RESOURCES There is not enough HOB heap to satisfy the requirement @retval EFI_OUT_OF_RESOURCES There is not enough HOB heap to satisfy the requirement
to allocate the number of pages. to allocate the number of pages.
@ -139,6 +137,7 @@ PeiAllocatePages (
{ {
PEI_CORE_INSTANCE *PrivateData; PEI_CORE_INSTANCE *PrivateData;
EFI_PEI_HOB_POINTERS Hob; EFI_PEI_HOB_POINTERS Hob;
EFI_PHYSICAL_ADDRESS Offset;
EFI_PHYSICAL_ADDRESS *FreeMemoryTop; EFI_PHYSICAL_ADDRESS *FreeMemoryTop;
EFI_PHYSICAL_ADDRESS *FreeMemoryBottom; EFI_PHYSICAL_ADDRESS *FreeMemoryBottom;
@ -151,7 +150,7 @@ PeiAllocatePages (
if (!PrivateData->PeiMemoryInstalled) { if (!PrivateData->PeiMemoryInstalled) {
// //
// When PeiInstallMemory is called but CAR has *not* been moved to temporary memory, // When PeiInstallMemory is called but CAR has *not* been moved to temporary memory,
// the AllocatePage will dependent on the field of PEI_CORE_INSTANCE structure. // the AllocatePage will dependent the field of PEI_CORE_INSTANCE structure.
// //
if (!PrivateData->SwitchStackSignal) { if (!PrivateData->SwitchStackSignal) {
return EFI_NOT_AVAILABLE_YET; return EFI_NOT_AVAILABLE_YET;
@ -165,9 +164,16 @@ PeiAllocatePages (
} }
// //
// Check to see if on 4k boundary, If not aligned, make the allocation aligned. // Check to see if on 4k boundary
// //
*(FreeMemoryTop) -= *(FreeMemoryTop) & 0xFFF; Offset = *(FreeMemoryTop) & 0xFFF;
//
// If not aligned, make the allocation aligned.
//
if (Offset != 0) {
*(FreeMemoryTop) -= Offset;
}
// //
// Verify that there is sufficient memory to satisfy the allocation // Verify that there is sufficient memory to satisfy the allocation
@ -204,10 +210,8 @@ PeiAllocatePages (
/** /**
Pool allocation service. Before permenent memory is discoveried, the pool will Memory allocation service on the CAR.
be allocated the heap in the CAR. Genenrally, the size of heap in temporary
memory does not exceed to 64K, so the biggest pool size could be allocated is
64K.
@param PeiServices An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation. @param PeiServices An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
@param Size Amount of memory required @param Size Amount of memory required
@ -233,11 +237,6 @@ PeiAllocatePool (
// If some "post-memory" PEIM wishes to allocate larger pool, // If some "post-memory" PEIM wishes to allocate larger pool,
// it should use AllocatePages service instead. // it should use AllocatePages service instead.
// //
//
// Generally, the size of heap in temporary memory does not exceed to 64K,
// so the maxmium size of pool is 0x10000 - sizeof (EFI_HOB_MEMORY_POOL)
//
ASSERT (Size < 0x10000 - sizeof (EFI_HOB_MEMORY_POOL)); ASSERT (Size < 0x10000 - sizeof (EFI_HOB_MEMORY_POOL));
Status = PeiServicesCreateHob ( Status = PeiServicesCreateHob (
EFI_HOB_TYPE_MEMORY_POOL, EFI_HOB_TYPE_MEMORY_POOL,
@ -246,5 +245,6 @@ PeiAllocatePool (
); );
*Buffer = Hob+1; *Buffer = Hob+1;
return Status; return Status;
} }

View File

@ -137,9 +137,6 @@ typedef struct{
UINTN CurrentPeimFvCount; UINTN CurrentPeimFvCount;
UINTN CurrentPeimCount; UINTN CurrentPeimCount;
EFI_PEI_FILE_HANDLE CurrentFileHandle; EFI_PEI_FILE_HANDLE CurrentFileHandle;
BOOLEAN PeimNeedingDispatch;
BOOLEAN PeimDispatchOnThisPass;
BOOLEAN PeimDispatcherReenter;
UINTN AllFvCount; UINTN AllFvCount;
EFI_PEI_FV_HANDLE AllFv[FixedPcdGet32 (PcdPeiCoreMaxFvSupported)]; EFI_PEI_FV_HANDLE AllFv[FixedPcdGet32 (PcdPeiCoreMaxFvSupported)];
EFI_PEI_HOB_POINTERS HobList; EFI_PEI_HOB_POINTERS HobList;

View File

@ -21,7 +21,8 @@ STATIC EFI_PEI_PPI_DESCRIPTOR mMemoryDiscoveredPpi = {
}; };
/// ///
/// Pei service instance /// Pei Core Module Variables
///
/// ///
STATIC EFI_PEI_SERVICES gPs = { STATIC EFI_PEI_SERVICES gPs = {
{ {
@ -66,10 +67,11 @@ STATIC EFI_PEI_SERVICES gPs = {
/** /**
This routine is invoked by main entry of PeiMain module during transition The entry routine to Pei Core, invoked by PeiMain during transition
from SEC to PEI. After switching stack in the PEI core, it will restart from SEC to PEI. After switching stack in the PEI core, it will restart
with the old core data. with the old core data.
@param SecCoreData Points to a data structure containing information about the PEI core's operating @param SecCoreData Points to a data structure containing information about the PEI core's operating
environment, such as the size and location of temporary RAM, the stack location and environment, such as the size and location of temporary RAM, the stack location and
the BFV location. the BFV location.
@ -81,7 +83,6 @@ STATIC EFI_PEI_SERVICES gPs = {
calls and/or code in these early PPIs calls and/or code in these early PPIs
@param Data Pointer to old core data that is used to initialize the @param Data Pointer to old core data that is used to initialize the
core's data areas. core's data areas.
If NULL, it is first PeiCore entering.
@retval EFI_NOT_FOUND Never reach @retval EFI_NOT_FOUND Never reach
@ -97,13 +98,13 @@ PeiCore (
PEI_CORE_INSTANCE PrivateData; PEI_CORE_INSTANCE PrivateData;
EFI_STATUS Status; EFI_STATUS Status;
PEI_CORE_TEMP_POINTERS TempPtr; PEI_CORE_TEMP_POINTERS TempPtr;
UINT64 Tick; UINT64 mTick;
PEI_CORE_INSTANCE *OldCoreData; PEI_CORE_INSTANCE *OldCoreData;
EFI_PEI_CPU_IO_PPI *CpuIo; EFI_PEI_CPU_IO_PPI *CpuIo;
EFI_PEI_PCI_CFG2_PPI *PciCfg; EFI_PEI_PCI_CFG2_PPI *PciCfg;
PEICORE_FUNCTION_POINTER ShadowedPeiCore; PEICORE_FUNCTION_POINTER ShadowedPeiCore;
Tick = 0; mTick = 0;
OldCoreData = (PEI_CORE_INSTANCE *) Data; OldCoreData = (PEI_CORE_INSTANCE *) Data;
// //
@ -112,17 +113,16 @@ PeiCore (
// //
if (PerformanceMeasurementEnabled()) { if (PerformanceMeasurementEnabled()) {
if (OldCoreData == NULL) { if (OldCoreData == NULL) {
Tick = GetPerformanceCounter (); mTick = GetPerformanceCounter ();
} }
} }
if (OldCoreData != NULL) {
ShadowedPeiCore = (PEICORE_FUNCTION_POINTER) (UINTN) OldCoreData->ShadowedPeiCore;
// //
// PeiCore has been shadowed to memory for first entering, so // PeiCore has been shadowed to memory for first entering, so
// just jump to PeiCore in memory here. // just jump to PeiCore in memory here.
// //
if (OldCoreData != NULL) {
ShadowedPeiCore = (PEICORE_FUNCTION_POINTER) (UINTN) OldCoreData->ShadowedPeiCore;
if (ShadowedPeiCore != NULL) { if (ShadowedPeiCore != NULL) {
OldCoreData->ShadowedPeiCore = NULL; OldCoreData->ShadowedPeiCore = NULL;
ShadowedPeiCore ( ShadowedPeiCore (
@ -142,10 +142,6 @@ PeiCore (
PrivateData.ServiceTableShadow.CpuIo = CpuIo; PrivateData.ServiceTableShadow.CpuIo = CpuIo;
PrivateData.ServiceTableShadow.PciCfg = PciCfg; PrivateData.ServiceTableShadow.PciCfg = PciCfg;
} else { } else {
//
// If OldCoreData is NULL, means current is first Peicore's entering.
//
ZeroMem (&PrivateData, sizeof (PEI_CORE_INSTANCE)); ZeroMem (&PrivateData, sizeof (PEI_CORE_INSTANCE));
PrivateData.Signature = PEI_CORE_HANDLE_SIGNATURE; PrivateData.Signature = PEI_CORE_HANDLE_SIGNATURE;
CopyMem (&PrivateData.ServiceTableShadow, &gPs, sizeof (gPs)); CopyMem (&PrivateData.ServiceTableShadow, &gPs, sizeof (gPs));
@ -190,11 +186,11 @@ PeiCore (
FixedPcdGet32 (PcdStatusCodeValuePeiCoreEntry) FixedPcdGet32 (PcdStatusCodeValuePeiCoreEntry)
); );
PERF_START (NULL,"PEI", NULL, Tick); PERF_START (NULL,"PEI", NULL, mTick);
// //
// If first pass, start performance measurement. // If first pass, start performance measurement.
// //
PERF_START (NULL,"PreMem", NULL, Tick); PERF_START (NULL,"PreMem", NULL, mTick);
// //
// If SEC provided any PPI services to PEI, install them. // If SEC provided any PPI services to PEI, install them.

View File

@ -62,7 +62,6 @@ InitializeSecurityServices (
/** /**
Provide a callback for when the security PPI is installed. Provide a callback for when the security PPI is installed.
This routine will cache installed security PPI into PeiCore's private data.
@param PeiServices An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation. @param PeiServices An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
@param NotifyDescriptor The descriptor for the notification event. @param NotifyDescriptor The descriptor for the notification event.
@ -106,7 +105,7 @@ SecurityPpiNotifyCallback (
@retval EFI_SUCCESS Image is OK @retval EFI_SUCCESS Image is OK
@retval EFI_SECURITY_VIOLATION Image is illegal @retval EFI_SECURITY_VIOLATION Image is illegal
@retval EFI_NOT_FOUND If security PPI is not installed.
**/ **/
EFI_STATUS EFI_STATUS
VerifyPeim ( VerifyPeim (
@ -149,9 +148,10 @@ VerifyPeim (
/** /**
Verify a Firmware volume. Verify a Firmware volume.
@param CurrentFvAddress Pointer to the current Firmware Volume under consideration @param CurrentFvAddress - Pointer to the current Firmware Volume under consideration
@retval EFI_SUCCESS Firmware Volume is legal @retval EFI_SUCCESS Firmware Volume is legal
@retval EFI_SECURITY_VIOLATION Firmware Volume fails integrity test
**/ **/
EFI_STATUS EFI_STATUS