]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmVirtPkg/PrePi/PrePi.c
ArmVirtPkg/PrePi: use standard PeCoff routines for self-relocation
[mirror_edk2.git] / ArmVirtPkg / PrePi / PrePi.c
index 72e35028c5bb96e5cc899bd1f4309c61d2b5db7d..4f0c3f98bad63d0682cccd76a0a062d1fd4f46ab 100755 (executable)
@@ -9,6 +9,7 @@
 #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
@@ -128,3 +129,37 @@ CEntryPoint (
   // 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