blob: f8460edb36ef0e4a63dadde65597a71e18cbec46 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
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_ */
|