#include <PiPei.h>\r
#include <Pi/PiBootMode.h>\r
\r
+#include <Library/PeCoffLib.h>\r
#include <Library/PrePiLib.h>\r
#include <Library/PrintLib.h>\r
#include <Library/PrePiHobListPointerLib.h>\r
// DXE Core should always load and never return\r
ASSERT (FALSE);\r
}\r
+\r
+VOID\r
+RelocatePeCoffImage (\r
+ IN EFI_PEI_FV_HANDLE FwVolHeader,\r
+ IN PE_COFF_LOADER_READ_FILE ImageRead\r
+ )\r
+{\r
+ EFI_PEI_FILE_HANDLE FileHandle;\r
+ VOID *SectionData;\r
+ PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;\r
+ EFI_STATUS Status;\r
+\r
+ FileHandle = NULL;\r
+ Status = FfsFindNextFile (EFI_FV_FILETYPE_SECURITY_CORE, FwVolHeader,\r
+ &FileHandle);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ Status = FfsFindSectionData (EFI_SECTION_PE32, FileHandle, &SectionData);\r
+ if (EFI_ERROR (Status)) {\r
+ Status = FfsFindSectionData (EFI_SECTION_TE, FileHandle, &SectionData);\r
+ }\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ ZeroMem (&ImageContext, sizeof ImageContext);\r
+\r
+ ImageContext.Handle = (EFI_HANDLE)SectionData;\r
+ ImageContext.ImageRead = ImageRead;\r
+ PeCoffLoaderGetImageInfo (&ImageContext);\r
+\r
+ if (ImageContext.ImageAddress != (UINTN)SectionData) {\r
+ ImageContext.ImageAddress = (UINTN)SectionData;\r
+ PeCoffLoaderRelocateImage (&ImageContext);\r
+ }\r
+}\r