diff --git a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c b/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c index ca37bde482..79ff8d1cf9 100644 --- a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c +++ b/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c @@ -1205,17 +1205,22 @@ EvacuateTempRam ( PeiCoreFvHandle.FvHandle = (EFI_PEI_FV_HANDLE)SecCoreData->BootFirmwareVolumeBase; } - for (FvIndex = 0; FvIndex < Private->FvCount; FvIndex++) { - if (Private->Fv[FvIndex].FvHandle == PeiCoreFvHandle.FvHandle) { - CopyMem (&PeiCoreFvHandle, &Private->Fv[FvIndex], sizeof (PEI_CORE_FV_HANDLE)); - break; + if (Private->PeimDispatcherReenter) { + // + // PEI_CORE should be migrated after dispatcher re-enters from main memory. + // + for (FvIndex = 0; FvIndex < Private->FvCount; FvIndex++) { + if (Private->Fv[FvIndex].FvHandle == PeiCoreFvHandle.FvHandle) { + CopyMem (&PeiCoreFvHandle, &Private->Fv[FvIndex], sizeof (PEI_CORE_FV_HANDLE)); + break; + } } + + Status = EFI_SUCCESS; + + ConvertPeiCorePpiPointers (Private, &PeiCoreFvHandle); } - Status = EFI_SUCCESS; - - ConvertPeiCorePpiPointers (Private, &PeiCoreFvHandle); - Hob.Raw = GetFirstGuidHob (&gEdkiiMigrationInfoGuid); if (Hob.Raw != NULL) { MigrationInfo = GET_GUID_HOB_DATA (Hob); @@ -1237,6 +1242,14 @@ EvacuateTempRam ( ) { if ((MigrationInfo == NULL) || (MigrationInfo->MigrateAll == TRUE)) { + if (!Private->PeimDispatcherReenter) { + // + // Migration before dispatcher reentery is supported only when gEdkiiMigrationInfoGuid + // HOB is built for selective FV migration. + // + return EFI_SUCCESS; + } + // // Migrate all FVs and copy raw data // @@ -1253,10 +1266,18 @@ EvacuateTempRam ( } } - if (Index == MigrationInfo->ToMigrateFvCount) { + if ((Index == MigrationInfo->ToMigrateFvCount) || + ((!Private->PeimDispatcherReenter) && + (((FvMigrationFlags & FLAGS_FV_MIGRATE_BEFORE_PEI_CORE_REENTRY) == 0) || + (FvHeader == PeiCoreFvHandle.FvHandle)))) + { // // This FV is not expected to migrate // + // FV should not be migrated before dispatcher reentry if any of the below condition is true: + // a. MigrationInfo HOB is not built with flag FLAGS_FV_MIGRATE_BEFORE_PEI_CORE_REENTRY. + // b. FV contains currently executing PEI Core. + // continue; } } diff --git a/MdeModulePkg/Core/Pei/PeiMain/PeiMain.c b/MdeModulePkg/Core/Pei/PeiMain/PeiMain.c index 0e3d9a8438..61f5699e1f 100644 --- a/MdeModulePkg/Core/Pei/PeiMain/PeiMain.c +++ b/MdeModulePkg/Core/Pei/PeiMain/PeiMain.c @@ -323,6 +323,21 @@ PeiCore ( // OldCoreData->PeiMemoryInstalled = TRUE; + if (PcdGetBool (PcdMigrateTemporaryRamFirmwareVolumes)) { + DEBUG ((DEBUG_VERBOSE, "Early Migration - PPI lists before temporary RAM evacuation:\n")); + DumpPpiList (OldCoreData); + + // + // Migrate installed content from Temporary RAM to Permanent RAM at this + // stage when PEI core still runs from a cached location. + // FVs that doesn't contain PEI_CORE should be migrated here. + // + EvacuateTempRam (OldCoreData, SecCoreData); + + DEBUG ((DEBUG_VERBOSE, "Early Migration - PPI lists after temporary RAM evacuation:\n")); + DumpPpiList (OldCoreData); + } + // // Indicate that PeiCore reenter // @@ -451,6 +466,7 @@ PeiCore ( // // Migrate installed content from Temporary RAM to Permanent RAM + // FVs containing PEI_CORE should be migrated here. // EvacuateTempRam (&PrivateData, SecCoreData); diff --git a/MdeModulePkg/Include/Guid/MigratedFvInfo.h b/MdeModulePkg/Include/Guid/MigratedFvInfo.h index 255e278235..99681fb88a 100644 --- a/MdeModulePkg/Include/Guid/MigratedFvInfo.h +++ b/MdeModulePkg/Include/Guid/MigratedFvInfo.h @@ -18,7 +18,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent // 1: FV raw data will be copied to permanent memory for later phase use (such as // FV measurement). // -#define FLAGS_FV_RAW_DATA_COPY BIT0 +#define FLAGS_FV_RAW_DATA_COPY BIT0 +#define FLAGS_FV_MIGRATE_BEFORE_PEI_CORE_REENTRY BIT1 /// /// In real use cases, not all FVs need migrate to permanent memory before TempRam tears