summaryrefslogtreecommitdiffstats
path: root/UefiPayloadPkg/PayloadLoaderPeim/ElfLib.h
diff options
context:
space:
mode:
Diffstat (limited to 'UefiPayloadPkg/PayloadLoaderPeim/ElfLib.h')
-rw-r--r--UefiPayloadPkg/PayloadLoaderPeim/ElfLib.h122
1 files changed, 122 insertions, 0 deletions
diff --git a/UefiPayloadPkg/PayloadLoaderPeim/ElfLib.h b/UefiPayloadPkg/PayloadLoaderPeim/ElfLib.h
new file mode 100644
index 0000000000..9cfc2912cf
--- /dev/null
+++ b/UefiPayloadPkg/PayloadLoaderPeim/ElfLib.h
@@ -0,0 +1,122 @@
+/** @file
+ ELF library
+
+ Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef ELF_LIB_H_
+#define ELF_LIB_H_
+
+#include <PiPei.h>
+
+#define ELF_CLASS32 1
+#define ELF_CLASS64 2
+
+#define ELF_PT_LOAD 1
+
+typedef struct {
+ RETURN_STATUS ParseStatus; ///< Return the status after ParseElfImage().
+ UINT8 *FileBase; ///< The source location in memory.
+ UINTN FileSize; ///< The size including sections that don't require loading.
+ UINT8 *PreferredImageAddress; ///< The preferred image to be loaded. No relocation is needed if loaded to this address.
+ BOOLEAN ReloadRequired; ///< The image needs a new memory location for running.
+ UINT8 *ImageAddress; ///< The destination memory address set by caller.
+ UINTN ImageSize; ///< The memory size for loading and execution.
+ UINT32 EiClass;
+ UINT32 ShNum;
+ UINT32 PhNum;
+ UINTN ShStrOff;
+ UINTN ShStrLen;
+ UINTN EntryPoint; ///< Return the actual entry point after LoadElfImage().
+} ELF_IMAGE_CONTEXT;
+
+
+typedef struct {
+ UINT32 PtType;
+ UINTN Offset;
+ UINTN Length;
+ UINTN MemLen;
+ UINTN MemAddr;
+ UINTN Alignment;
+} SEGMENT_INFO;
+
+/**
+ Parse the ELF image info.
+
+ @param[in] ImageBase Memory address of an image.
+ @param[out] ElfCt The EFL image context pointer.
+
+ @retval EFI_INVALID_PARAMETER Input parameters are not valid.
+ @retval EFI_UNSUPPORTED Unsupported binary type.
+ @retval EFI_LOAD_ERROR ELF binary loading error.
+ @retval EFI_SUCCESS ELF binary is loaded successfully.
+**/
+EFI_STATUS
+EFIAPI
+ParseElfImage (
+ IN VOID *ImageBase,
+ OUT ELF_IMAGE_CONTEXT *ElfCt
+ );
+
+/**
+ Load the ELF segments to specified address in ELF header.
+
+ This function loads ELF image segments into memory address specified
+ in ELF program header.
+
+ @param[in] ElfCt ELF image context pointer.
+
+ @retval EFI_INVALID_PARAMETER Input parameters are not valid.
+ @retval EFI_UNSUPPORTED Unsupported binary type.
+ @retval EFI_LOAD_ERROR ELF binary loading error.
+ @retval EFI_SUCCESS ELF binary is loaded successfully.
+**/
+EFI_STATUS
+EFIAPI
+LoadElfImage (
+ IN ELF_IMAGE_CONTEXT *ElfCt
+ );
+
+/**
+ Get a ELF section name from its index.
+
+ @param[in] ElfCt ELF image context pointer.
+ @param[in] SectionIndex ELF section index.
+ @param[out] SectionName The pointer to the section name.
+
+ @retval EFI_INVALID_PARAMETER ElfCt or SecName is NULL.
+ @retval EFI_NOT_FOUND Could not find the section.
+ @retval EFI_SUCCESS Section name was filled successfully.
+**/
+EFI_STATUS
+EFIAPI
+GetElfSectionName (
+ IN ELF_IMAGE_CONTEXT *ElfCt,
+ IN UINT32 SectionIndex,
+ OUT CHAR8 **SectionName
+ );
+
+/**
+ Get the offset and size of x-th ELF section.
+
+ @param[in] ElfCt ELF image context pointer.
+ @param[in] Index ELF section index.
+ @param[out] Offset Return the offset of the specific section.
+ @param[out] Size Return the size of the specific section.
+
+ @retval EFI_INVALID_PARAMETER ImageBase, Offset or Size is NULL.
+ @retval EFI_INVALID_PARAMETER EiClass doesn't equal to ELFCLASS32 or ELFCLASS64.
+ @retval EFI_NOT_FOUND Could not find the section.
+ @retval EFI_SUCCESS Offset and Size are returned.
+**/
+EFI_STATUS
+EFIAPI
+GetElfSectionPos (
+ IN ELF_IMAGE_CONTEXT *ElfCt,
+ IN UINT32 Index,
+ OUT UINTN *Offset,
+ OUT UINTN *Size
+ );
+#endif /* ELF_LIB_H_ */