]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BeagleBoardPkg/Library/DxeHobPeCoffLib/DxeHobPeCoff.c
EmbeddedPkg BeagleBoardPkg: move special HOB reuse libraries into platform
[mirror_edk2.git] / BeagleBoardPkg / Library / DxeHobPeCoffLib / DxeHobPeCoff.c
diff --git a/BeagleBoardPkg/Library/DxeHobPeCoffLib/DxeHobPeCoff.c b/BeagleBoardPkg/Library/DxeHobPeCoffLib/DxeHobPeCoff.c
new file mode 100644 (file)
index 0000000..bcc6948
--- /dev/null
@@ -0,0 +1,288 @@
+/** @file\r
+  PE/COFF Loader Library implementation that wraps a protocol passed up from\r
+  SEC/PEI via a HOB. This is done to save space.\r
+\r
+  Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+  Portions copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <PiDxe.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/HobLib.h>\r
+\r
+#include <Protocol/PeCoffLoader.h>\r
+\r
+\r
+PE_COFF_LOADER_PROTOCOL  *gPeCoffLoader = NULL;\r
+\r
+\r
+/**\r
+  Retrieves information about a PE/COFF image.\r
+\r
+  Computes the PeCoffHeaderOffset, IsTeImage, ImageType, ImageAddress, ImageSize,\r
+  DestinationAddress, RelocationsStripped, SectionAlignment, SizeOfHeaders, and\r
+  DebugDirectoryEntryRva fields of the ImageContext structure.\r
+  If ImageContext is NULL, then return RETURN_INVALID_PARAMETER.\r
+  If the PE/COFF image accessed through the ImageRead service in the ImageContext\r
+  structure is not a supported PE/COFF image type, then return RETURN_UNSUPPORTED.\r
+  If any errors occur while computing the fields of ImageContext,\r
+  then the error status is returned in the ImageError field of ImageContext.\r
+  If the image is a TE image, then SectionAlignment is set to 0.\r
+  The ImageRead and Handle fields of ImageContext structure must be valid prior\r
+  to invoking this service.\r
+\r
+  @param  ImageContext              Pointer to the image context structure that describes the PE/COFF\r
+                                    image that needs to be examined by this function.\r
+\r
+  @retval RETURN_SUCCESS            The information on the PE/COFF image was collected.\r
+  @retval RETURN_INVALID_PARAMETER  ImageContext is NULL.\r
+  @retval RETURN_UNSUPPORTED        The PE/COFF image is not supported.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+PeCoffLoaderGetImageInfo (\r
+  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext\r
+  )\r
+{\r
+  return gPeCoffLoader->GetImageInfo (ImageContext);\r
+}\r
+\r
+\r
+/**\r
+  Applies relocation fixups to a PE/COFF image that was loaded with PeCoffLoaderLoadImage().\r
+\r
+  If the DestinationAddress field of ImageContext is 0, then use the ImageAddress field of\r
+  ImageContext as the relocation base address.  Otherwise, use the DestinationAddress field\r
+  of ImageContext as the relocation base address.  The caller must allocate the relocation\r
+  fixup log buffer and fill in the FixupData field of ImageContext prior to calling this function.\r
+\r
+  The ImageRead, Handle, PeCoffHeaderOffset, IsTeImage, Machine, ImageType, ImageAddress,\r
+  ImageSize, DestinationAddress, RelocationsStripped, SectionAlignment, SizeOfHeaders,\r
+  DebugDirectoryEntryRva, EntryPoint, FixupDataSize, CodeView, PdbPointer, and FixupData of\r
+  the ImageContext structure must be valid prior to invoking this service.\r
+\r
+  If ImageContext is NULL, then ASSERT().\r
+\r
+  Note that if the platform does not maintain coherency between the instruction cache(s) and the data\r
+  cache(s) in hardware, then the caller is responsible for performing cache maintenance operations\r
+  prior to transferring control to a PE/COFF image that is loaded using this library.\r
+\r
+  @param  ImageContext        Pointer to the image context structure that describes the PE/COFF\r
+                              image that is being relocated.\r
+\r
+  @retval RETURN_SUCCESS      The PE/COFF image was relocated.\r
+                              Extended status information is in the ImageError field of ImageContext.\r
+  @retval RETURN_LOAD_ERROR   The image in not a valid PE/COFF image.\r
+                              Extended status information is in the ImageError field of ImageContext.\r
+  @retval RETURN_UNSUPPORTED  A relocation record type is not supported.\r
+                              Extended status information is in the ImageError field of ImageContext.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+PeCoffLoaderRelocateImage (\r
+  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext\r
+  )\r
+{\r
+  return gPeCoffLoader->RelocateImage (ImageContext);\r
+}\r
+\r
+/**\r
+  Loads a PE/COFF image into memory.\r
+\r
+  Loads the PE/COFF image accessed through the ImageRead service of ImageContext into the buffer\r
+  specified by the ImageAddress and ImageSize fields of ImageContext.  The caller must allocate\r
+  the load buffer and fill in the ImageAddress and ImageSize fields prior to calling this function.\r
+  The EntryPoint, FixupDataSize, CodeView, PdbPointer and HiiResourceData fields of ImageContext are computed.\r
+  The ImageRead, Handle, PeCoffHeaderOffset, IsTeImage, Machine, ImageType, ImageAddress, ImageSize,\r
+  DestinationAddress, RelocationsStripped, SectionAlignment, SizeOfHeaders, and DebugDirectoryEntryRva\r
+  fields of the ImageContext structure must be valid prior to invoking this service.\r
+\r
+  If ImageContext is NULL, then ASSERT().\r
+\r
+  Note that if the platform does not maintain coherency between the instruction cache(s) and the data\r
+  cache(s) in hardware, then the caller is responsible for performing cache maintenance operations\r
+  prior to transferring control to a PE/COFF image that is loaded using this library.\r
+\r
+  @param  ImageContext              Pointer to the image context structure that describes the PE/COFF\r
+                                    image that is being loaded.\r
+\r
+  @retval RETURN_SUCCESS            The PE/COFF image was loaded into the buffer specified by\r
+                                    the ImageAddress and ImageSize fields of ImageContext.\r
+                                    Extended status information is in the ImageError field of ImageContext.\r
+  @retval RETURN_BUFFER_TOO_SMALL   The caller did not provide a large enough buffer.\r
+                                    Extended status information is in the ImageError field of ImageContext.\r
+  @retval RETURN_LOAD_ERROR         The PE/COFF image is an EFI Runtime image with no relocations.\r
+                                    Extended status information is in the ImageError field of ImageContext.\r
+  @retval RETURN_INVALID_PARAMETER  The image address is invalid.\r
+                                    Extended status information is in the ImageError field of ImageContext.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+PeCoffLoaderLoadImage (\r
+  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext\r
+  )\r
+{\r
+  return gPeCoffLoader->LoadImage (ImageContext);\r
+}\r
+\r
+\r
+\r
+/**\r
+  Reads contents of a PE/COFF image from a buffer in system memory.\r
+\r
+  This is the default implementation of a PE_COFF_LOADER_READ_FILE function\r
+  that assumes FileHandle pointer to the beginning of a PE/COFF image.\r
+  This function reads contents of the PE/COFF image that starts at the system memory\r
+  address specified by FileHandle. The read operation copies ReadSize bytes from the\r
+  PE/COFF image starting at byte offset FileOffset into the buffer specified by Buffer.\r
+  The size of the buffer actually read is returned in ReadSize.\r
+\r
+  If FileHandle is NULL, then ASSERT().\r
+  If ReadSize is NULL, then ASSERT().\r
+  If Buffer is NULL, then ASSERT().\r
+\r
+  @param  FileHandle        Pointer to base of the input stream\r
+  @param  FileOffset        Offset into the PE/COFF image to begin the read operation.\r
+  @param  ReadSize          On input, the size in bytes of the requested read operation.\r
+                            On output, the number of bytes actually read.\r
+  @param  Buffer            Output buffer that contains the data read from the PE/COFF image.\r
+\r
+  @retval RETURN_SUCCESS    Data is read from FileOffset from the Handle into\r
+                            the buffer.\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+PeCoffLoaderImageReadFromMemory (\r
+  IN     VOID    *FileHandle,\r
+  IN     UINTN   FileOffset,\r
+  IN OUT UINTN   *ReadSize,\r
+  OUT    VOID    *Buffer\r
+  )\r
+{\r
+  return gPeCoffLoader->ReadFromMemory (\r
+                          FileHandle,\r
+                          FileOffset,\r
+                          ReadSize,\r
+                          Buffer\r
+                          );\r
+\r
+}\r
+\r
+\r
+\r
+/**\r
+  Reapply fixups on a fixed up PE32/PE32+ image to allow virutal calling at EFI\r
+  runtime.\r
+\r
+  This function reapplies relocation fixups to the PE/COFF image specified by ImageBase\r
+  and ImageSize so the image will execute correctly when the PE/COFF image is mapped\r
+  to the address specified by VirtualImageBase. RelocationData must be identical\r
+  to the FiuxupData buffer from the PE_COFF_LOADER_IMAGE_CONTEXT structure\r
+  after this PE/COFF image was relocated with PeCoffLoaderRelocateImage().\r
+\r
+  Note that if the platform does not maintain coherency between the instruction cache(s) and the data\r
+  cache(s) in hardware, then the caller is responsible for performing cache maintenance operations\r
+  prior to transferring control to a PE/COFF image that is loaded using this library.\r
+\r
+  @param  ImageBase          Base address of a PE/COFF image that has been loaded\r
+                             and relocated into system memory.\r
+  @param  VirtImageBase      The request virtual address that the PE/COFF image is to\r
+                             be fixed up for.\r
+  @param  ImageSize          The size, in bytes, of the PE/COFF image.\r
+  @param  RelocationData     A pointer to the relocation data that was collected when the PE/COFF\r
+                             image was relocated using PeCoffLoaderRelocateImage().\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+PeCoffLoaderRelocateImageForRuntime (\r
+  IN  PHYSICAL_ADDRESS        ImageBase,\r
+  IN  PHYSICAL_ADDRESS        VirtImageBase,\r
+  IN  UINTN                   ImageSize,\r
+  IN  VOID                    *RelocationData\r
+  )\r
+{\r
+  return gPeCoffLoader->RelocateImageForRuntime (\r
+                          ImageBase,\r
+                          VirtImageBase,\r
+                          ImageSize,\r
+                          RelocationData\r
+                          );\r
+}\r
+\r
+\r
+/**\r
+  Unloads a loaded PE/COFF image from memory and releases its taken resource.\r
+  Releases any environment specific resources that were allocated when the image\r
+  specified by ImageContext was loaded using PeCoffLoaderLoadImage().\r
+\r
+  For NT32 emulator, the PE/COFF image loaded by system needs to release.\r
+  For real platform, the PE/COFF image loaded by Core doesn't needs to be unloaded,\r
+  this function can simply return RETURN_SUCCESS.\r
+\r
+  If ImageContext is NULL, then ASSERT().\r
+\r
+  @param  ImageContext              Pointer to the image context structure that describes the PE/COFF\r
+                                    image to be unloaded.\r
+\r
+  @retval RETURN_SUCCESS            The PE/COFF image was unloaded successfully.\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+PeCoffLoaderUnloadImage (\r
+  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext\r
+  )\r
+{\r
+  return gPeCoffLoader->UnloadImage (ImageContext);\r
+}\r
+\r
+typedef struct {\r
+  EFI_HOB_GUID_TYPE             Hob;\r
+  VOID                          *Interface;\r
+} PROTOCOL_HOB;\r
+\r
+\r
+/**\r
+  The constructor function caches the pointer of DXE Services Table.\r
+\r
+  The constructor function caches the pointer of DXE Services Table.\r
+  It will ASSERT() if that operation fails.\r
+  It will ASSERT() if the pointer of DXE Services Table is NULL.\r
+  It will always return EFI_SUCCESS.\r
+\r
+  @param  ImageHandle   The firmware allocated handle for the EFI image.\r
+  @param  SystemTable   A pointer to the EFI System Table.\r
+\r
+  @retval EFI_SUCCESS   The constructor always returns EFI_SUCCESS.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DxeHobPeCoffLibConstructor (\r
+  IN EFI_HANDLE        ImageHandle,\r
+  IN EFI_SYSTEM_TABLE  *SystemTable\r
+  )\r
+{\r
+  PROTOCOL_HOB   *Hob;\r
+\r
+  Hob = GetFirstGuidHob (&gPeCoffLoaderProtocolGuid);\r
+  if (Hob == NULL) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+\r
+  gPeCoffLoader = Hob->Interface;\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r