mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-10-25 17:23:53 +02:00 
			
		
		
		
	C code changes for building EDK2 RISC-V platform. Signed-off-by: Abner Chang <abner.chang@hpe.com> Co-authored-by: Gilbert Chen <gilbert.chen@hpe.com> Co-authored-by: Daniel Helmut Schaefer <daniel.schaefer@hpe.com> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org> Reviewed-by: Bob Feng <bob.c.feng@intel.com> Cc: Bob Feng <bob.c.feng@intel.com> Cc: Liming Gao <liming.gao@intel.com> Cc: Leif Lindholm <leif.lindholm@linaro.org> Cc: Gilbert Chen <gilbert.chen@hpe.com>
		
			
				
	
	
		
			214 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			214 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Function prototypes and defines on Memory Only PE COFF loader
 | |
| 
 | |
|   Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
 | |
|   Portion Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
 | |
|   SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| 
 | |
| **/
 | |
| 
 | |
| #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
 | |
| 
 | |
| //
 | |
| // Macro definitions for RISC-V architecture.
 | |
| //
 | |
| #define RV_X(x, s, n) (((x) >> (s)) & ((1<<(n))-1))
 | |
| #define RISCV_IMM_BITS 12
 | |
| #define RISCV_IMM_REACH (1LL<<RISCV_IMM_BITS)
 | |
| #define RISCV_CONST_HIGH_PART(VALUE) \
 | |
|   (((VALUE) + (RISCV_IMM_REACH/2)) & ~(RISCV_IMM_REACH-1))
 | |
| 
 | |
| //
 | |
| // 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 instruction 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 address to patch into the instruction
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| EFIAPI
 | |
| ThumbMovtImmediatePatch (
 | |
|   IN OUT UINT16 *Instruction,
 | |
|   IN     UINT16 Address
 | |
|   );
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Pass in a pointer to an ARM MOVW/MOVT instruction pair and
 | |
|   return the immediate data encoded in the two` instruction
 | |
| 
 | |
|   @param  Instructions  Pointer to ARM MOVW/MOVT instruction 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 address to patch into the instructions
 | |
| **/
 | |
| VOID
 | |
| EFIAPI
 | |
| ThumbMovwMovtImmediatePatch (
 | |
|   IN OUT UINT16 *Instructions,
 | |
|   IN     UINT32 Address
 | |
|   );
 | |
| 
 | |
| 
 | |
| 
 | |
| #endif
 |