mirror of https://github.com/acidanthera/audk.git
After PeiCore is shadowed into permanent memory, the pointers to build-in Ffs2 FvPpi should be also fixed up to be pointed to the one in permanent memory.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9508 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
99c55b5c93
commit
8e0e40ed3d
|
@ -721,6 +721,8 @@ InitializeDispatcherData (
|
|||
if (OldCoreData == NULL) {
|
||||
PrivateData->PeimDispatcherReenter = FALSE;
|
||||
PeiInitializeFv (PrivateData, SecCoreData);
|
||||
} else {
|
||||
PeiReinitializeFv (PrivateData);
|
||||
}
|
||||
|
||||
return;
|
||||
|
|
|
@ -1374,3 +1374,51 @@ FindNextCoreFvHandle (
|
|||
|
||||
return &Private->Fv[Instance];
|
||||
}
|
||||
|
||||
/**
|
||||
After PeiCore image is shadowed into permanent memory, all build-in FvPpi should
|
||||
be re-installed with the instance in permanent memory and all cached FvPpi pointers in
|
||||
PrivateData->Fv[] array should be fixed up to be pointed to the one in permenant
|
||||
memory.
|
||||
|
||||
@param PrivateData Pointer to PEI_CORE_INSTANCE.
|
||||
**/
|
||||
VOID
|
||||
PeiReinitializeFv (
|
||||
IN PEI_CORE_INSTANCE *PrivateData
|
||||
)
|
||||
{
|
||||
VOID *OldFfs2FvPpi;
|
||||
EFI_PEI_PPI_DESCRIPTOR *OldDescriptor;
|
||||
UINTN Index;
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// Locate old build-in Ffs2 EFI_PEI_FIRMWARE_VOLUME_PPI which
|
||||
// in flash.
|
||||
//
|
||||
Status = PeiServicesLocatePpi (
|
||||
&gEfiFirmwareFileSystem2Guid,
|
||||
0,
|
||||
&OldDescriptor,
|
||||
&OldFfs2FvPpi
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
//
|
||||
// Re-install the EFI_PEI_FIRMWARE_VOLUME_PPI for build-in Ffs2
|
||||
// which is shadowed from flash to permanent memory within PeiCore image.
|
||||
//
|
||||
Status = PeiServicesReInstallPpi (OldDescriptor, &mPeiFfs2FvPpiList);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
//
|
||||
// Fixup all FvPpi pointers for the implementation in flash to permanent memory.
|
||||
//
|
||||
for (Index = 0; Index < FixedPcdGet32 (PcdPeiCoreMaxFvSupported); Index ++) {
|
||||
if (PrivateData->Fv[Index].FvPpi == OldFfs2FvPpi) {
|
||||
PrivateData->Fv[Index].FvPpi = &mPeiFfs2FvPpi;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1066,4 +1066,17 @@ FindNextCoreFvHandle (
|
|||
IN UINTN Instance
|
||||
);
|
||||
|
||||
/**
|
||||
After PeiCore image is shadowed into permanent memory, all build-in FvPpi should
|
||||
be re-installed with the instance in permanent memory and all cached FvPpi pointers in
|
||||
PrivateData->Fv[] array should be fixed up to be pointed to the one in permenant
|
||||
memory.
|
||||
|
||||
@param PrivateData Pointer to PEI_CORE_INSTANCE.
|
||||
**/
|
||||
VOID
|
||||
PeiReinitializeFv (
|
||||
IN PEI_CORE_INSTANCE *PrivateData
|
||||
);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue