mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-11-02 20:44:39 +01:00 
			
		
		
		
	Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Yingke Liu <yingke.d.liu@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15971 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			211 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			211 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
	Function prototypes and defines on Memory Only PE COFF loader
 | 
						|
 | 
						|
	Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
 | 
						|
  This program and the accompanying materials                          
 | 
						|
	are licensed and made available under the terms and conditions of the BSD License         
 | 
						|
	which accompanies this distribution.  The full text of the license may be found at        
 | 
						|
	http://opensource.org/licenses/bsd-license.php                                            
 | 
						|
 | 
						|
	THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
 | 
						|
	WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#ifndef __BASE_PE_COFF_LIB_H__
 | 
						|
#define __BASE_PE_COFF_LIB_H__
 | 
						|
 | 
						|
//
 | 
						|
// Return status codes from the PE/COFF Loader services
 | 
						|
// BUGBUG: Find where used and see if can be replaced by RETURN_STATUS codes
 | 
						|
//
 | 
						|
#define IMAGE_ERROR_SUCCESS                      0
 | 
						|
#define IMAGE_ERROR_IMAGE_READ                   1  
 | 
						|
#define IMAGE_ERROR_INVALID_PE_HEADER_SIGNATURE  2
 | 
						|
#define IMAGE_ERROR_INVALID_MACHINE_TYPE         3
 | 
						|
#define IMAGE_ERROR_INVALID_SUBSYSTEM            4
 | 
						|
#define IMAGE_ERROR_INVALID_IMAGE_ADDRESS        5
 | 
						|
#define IMAGE_ERROR_INVALID_IMAGE_SIZE           6
 | 
						|
#define IMAGE_ERROR_INVALID_SECTION_ALIGNMENT    7
 | 
						|
#define IMAGE_ERROR_SECTION_NOT_LOADED           8
 | 
						|
#define IMAGE_ERROR_FAILED_RELOCATION            9
 | 
						|
#define IMAGE_ERROR_FAILED_ICACHE_FLUSH          10
 | 
						|
 | 
						|
 | 
						|
//
 | 
						|
// PE/COFF Loader Read Function passed in by caller
 | 
						|
//
 | 
						|
typedef
 | 
						|
RETURN_STATUS
 | 
						|
(EFIAPI *PE_COFF_LOADER_READ_FILE) (
 | 
						|
  IN     VOID   *FileHandle,
 | 
						|
  IN     UINTN  FileOffset,
 | 
						|
  IN OUT UINTN  *ReadSize,
 | 
						|
  OUT    VOID   *Buffer
 | 
						|
  );
 | 
						|
 | 
						|
//
 | 
						|
// Context structure used while PE/COFF image is being loaded and relocated
 | 
						|
//
 | 
						|
typedef struct {
 | 
						|
  PHYSICAL_ADDRESS                  ImageAddress;
 | 
						|
  UINT64                            ImageSize;
 | 
						|
  PHYSICAL_ADDRESS                  DestinationAddress;
 | 
						|
  PHYSICAL_ADDRESS                  EntryPoint;
 | 
						|
  PE_COFF_LOADER_READ_FILE          ImageRead;
 | 
						|
  VOID                              *Handle;
 | 
						|
  VOID                              *FixupData;
 | 
						|
  UINT32                            SectionAlignment;
 | 
						|
  UINT32                            PeCoffHeaderOffset;
 | 
						|
  UINT32                            DebugDirectoryEntryRva;
 | 
						|
  VOID                              *CodeView;
 | 
						|
  CHAR8                             *PdbPointer;
 | 
						|
  UINTN                             SizeOfHeaders;
 | 
						|
  UINT32                            ImageCodeMemoryType;
 | 
						|
  UINT32                            ImageDataMemoryType;
 | 
						|
  UINT32                            ImageError;
 | 
						|
  UINTN                             FixupDataSize;
 | 
						|
  UINT16                            Machine;
 | 
						|
  UINT16                            ImageType;
 | 
						|
  BOOLEAN                           RelocationsStripped;
 | 
						|
  BOOLEAN                           IsTeImage;
 | 
						|
} PE_COFF_LOADER_IMAGE_CONTEXT;
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
	Retrieves information on a PE/COFF image
 | 
						|
 | 
						|
	@param	ImageContext The context of the image being loaded
 | 
						|
 | 
						|
	@retval	EFI_SUCCESS The information on the PE/COFF image was collected.
 | 
						|
	@retval	EFI_INVALID_PARAMETER ImageContext is NULL.
 | 
						|
	@retval	EFI_UNSUPPORTED The PE/COFF image is not supported.
 | 
						|
	@retval	Otherwise The error status from reading the PE/COFF image using the
 | 
						|
	ImageContext->ImageRead() function
 | 
						|
 | 
						|
**/
 | 
						|
RETURN_STATUS
 | 
						|
EFIAPI
 | 
						|
PeCoffLoaderGetImageInfo (
 | 
						|
  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext
 | 
						|
  )
 | 
						|
;
 | 
						|
 | 
						|
/**
 | 
						|
	Relocates a PE/COFF image in memory
 | 
						|
 | 
						|
	@param	ImageContext Contains information on the loaded image to relocate
 | 
						|
 | 
						|
	@retval EFI_SUCCESS      if the PE/COFF image was relocated
 | 
						|
	@retval EFI_LOAD_ERROR   if the image is not a valid PE/COFF image
 | 
						|
	@retval EFI_UNSUPPORTED  not support
 | 
						|
 | 
						|
**/
 | 
						|
RETURN_STATUS
 | 
						|
EFIAPI
 | 
						|
PeCoffLoaderRelocateImage (
 | 
						|
  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext
 | 
						|
  )
 | 
						|
;
 | 
						|
 | 
						|
/**
 | 
						|
	Loads a PE/COFF image into memory
 | 
						|
 | 
						|
	@param	ImageContext Contains information on image to load into memory
 | 
						|
 | 
						|
	@retval EFI_SUCCESS            if the PE/COFF image was loaded
 | 
						|
	@retval EFI_BUFFER_TOO_SMALL   if the caller did not provide a large enough buffer
 | 
						|
	@retval EFI_LOAD_ERROR         if the image is a runtime driver with no relocations
 | 
						|
	@retval EFI_INVALID_PARAMETER  if the image address is invalid
 | 
						|
 | 
						|
**/
 | 
						|
RETURN_STATUS
 | 
						|
EFIAPI
 | 
						|
PeCoffLoaderLoadImage (
 | 
						|
  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext
 | 
						|
  )
 | 
						|
;
 | 
						|
 | 
						|
VOID *
 | 
						|
EFIAPI
 | 
						|
PeCoffLoaderGetPdbPointer (
 | 
						|
  IN VOID  *Pe32Data
 | 
						|
  )
 | 
						|
;
 | 
						|
 | 
						|
RETURN_STATUS
 | 
						|
EFIAPI
 | 
						|
PeCoffLoaderGetEntryPoint (
 | 
						|
  IN  VOID  *Pe32Data,
 | 
						|
  OUT VOID  **EntryPoint,
 | 
						|
  OUT VOID  **BaseOfImage
 | 
						|
  )
 | 
						|
;
 | 
						|
 | 
						|
//
 | 
						|
// These functions are used by the ARM PE/COFF relocation code and by
 | 
						|
// the ELF to PE/COFF converter so that is why they are public
 | 
						|
//
 | 
						|
 | 
						|
/**
 | 
						|
  Pass in a pointer to an ARM MOVT or MOVW immediate instruciton and 
 | 
						|
  return the immediate data encoded in the instruction
 | 
						|
 | 
						|
  @param  Instruction   Pointer to ARM MOVT or MOVW immediate instruction
 | 
						|
 | 
						|
  @return Immediate address encoded in the instruction
 | 
						|
 | 
						|
**/
 | 
						|
UINT16
 | 
						|
EFIAPI
 | 
						|
ThumbMovtImmediateAddress (
 | 
						|
  IN UINT16 *Instruction
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Update an ARM MOVT or MOVW immediate instruction immediate data.
 | 
						|
 | 
						|
  @param  Instruction   Pointer to ARM MOVT or MOVW immediate instruction
 | 
						|
  @param  Address       New addres to patch into the instruction
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
ThumbMovtImmediatePatch (
 | 
						|
  IN OUT UINT16 *Instruction,
 | 
						|
  IN     UINT16 Address
 | 
						|
  );
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Pass in a pointer to an ARM MOVW/MOVT instruciton pair and 
 | 
						|
  return the immediate data encoded in the two` instruction
 | 
						|
 | 
						|
  @param  Instructions  Pointer to ARM MOVW/MOVT insturction pair
 | 
						|
 | 
						|
  @return Immediate address encoded in the instructions
 | 
						|
 | 
						|
**/
 | 
						|
UINT32
 | 
						|
EFIAPI
 | 
						|
ThumbMovwMovtImmediateAddress (
 | 
						|
  IN UINT16 *Instructions
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Update an ARM MOVW/MOVT immediate instruction instruction pair.
 | 
						|
 | 
						|
  @param  Instructions  Pointer to ARM MOVW/MOVT instruction pair
 | 
						|
  @param  Address       New addres to patch into the instructions
 | 
						|
**/
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
ThumbMovwMovtImmediatePatch (
 | 
						|
  IN OUT UINT16 *Instructions,
 | 
						|
  IN     UINT32 Address
 | 
						|
  );
 | 
						|
 | 
						|
 | 
						|
 | 
						|
#endif
 |