]> git.proxmox.com Git - mirror_edk2.git/blame - EdkModulePkg/Universal/Runtime/RuntimeDxe/Ipf/PeHotRelocateEx.c
Initial import.
[mirror_edk2.git] / EdkModulePkg / Universal / Runtime / RuntimeDxe / Ipf / PeHotRelocateEx.c
CommitLineData
878ddf1f 1/*++\r
2\r
3Copyright (c) 2006, Intel Corporation \r
4All rights reserved. This program and the accompanying materials \r
5are licensed and made available under the terms and conditions of the BSD License \r
6which accompanies this distribution. The full text of the license may be found at \r
7http://opensource.org/licenses/bsd-license.php \r
8 \r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11\r
12Module Name:\r
13\r
14 PeHotRelocateEx.c\r
15\r
16Abstract:\r
17\r
18 Fixes IPF specific relocation types\r
19\r
20\r
21Revision History\r
22\r
23--*/\r
24\r
25#include "Runtime.h"\r
26#include "PeHotRelocateEx.h"\r
27\r
28EFI_STATUS\r
29PeHotRelocateImageEx (\r
30 IN UINT16 *Reloc,\r
31 IN OUT CHAR8 *Fixup,\r
32 IN OUT CHAR8 **FixupData,\r
33 IN UINT64 Adjust\r
34 )\r
35/*++\r
36\r
37Routine Description:\r
38\r
39 Performs an IPF specific relocation fixup\r
40\r
41Arguments:\r
42\r
43 Reloc - Pointer to the relocation record\r
44\r
45 Fixup - Pointer to the address to fix up\r
46\r
47 FixupData - Pointer to a buffer to log the fixups\r
48\r
49 Adjust - The offset to adjust the fixup\r
50\r
51Returns:\r
52\r
53 None\r
54\r
55--*/\r
56{\r
57 UINT64 *F64;\r
58 UINT64 FixupVal;\r
59\r
60 switch ((*Reloc) >> 12) {\r
61 case EFI_IMAGE_REL_BASED_DIR64:\r
62 F64 = (UINT64 *) Fixup;\r
63 *FixupData = ALIGN_POINTER (*FixupData, sizeof (UINT64));\r
64 if (*(UINT64 *) (*FixupData) == *F64) {\r
65 *F64 = *F64 + (UINT64) Adjust;\r
66 }\r
67\r
68 *FixupData = *FixupData + sizeof (UINT64);\r
69 break;\r
70\r
71 case EFI_IMAGE_REL_BASED_IA64_IMM64:\r
72 F64 = (UINT64 *) Fixup;\r
73 *FixupData = ALIGN_POINTER (*FixupData, sizeof (UINT64));\r
74 if (*(UINT64 *) (*FixupData) == *F64) {\r
75 //\r
76 // Align it to bundle address before fixing up the\r
77 // 64-bit immediate value of the movl instruction.\r
78 //\r
79 //\r
80 Fixup = (CHAR8 *) ((UINT64) Fixup & (UINT64)~(15));\r
81 FixupVal = (UINT64) 0;\r
82\r
83 //\r
84 // Extract the lower 32 bits of IMM64 from bundle\r
85 //\r
86 EXT_IMM64 (\r
87 FixupVal,\r
88 (UINT32 *) Fixup + IMM64_IMM7B_INST_WORD_X,\r
89 IMM64_IMM7B_SIZE_X,\r
90 IMM64_IMM7B_INST_WORD_POS_X,\r
91 IMM64_IMM7B_VAL_POS_X\r
92 );\r
93\r
94 EXT_IMM64 (\r
95 FixupVal,\r
96 (UINT32 *) Fixup + IMM64_IMM9D_INST_WORD_X,\r
97 IMM64_IMM9D_SIZE_X,\r
98 IMM64_IMM9D_INST_WORD_POS_X,\r
99 IMM64_IMM9D_VAL_POS_X\r
100 );\r
101\r
102 EXT_IMM64 (\r
103 FixupVal,\r
104 (UINT32 *) Fixup + IMM64_IMM5C_INST_WORD_X,\r
105 IMM64_IMM5C_SIZE_X,\r
106 IMM64_IMM5C_INST_WORD_POS_X,\r
107 IMM64_IMM5C_VAL_POS_X\r
108 );\r
109\r
110 EXT_IMM64 (\r
111 FixupVal,\r
112 (UINT32 *) Fixup + IMM64_IC_INST_WORD_X,\r
113 IMM64_IC_SIZE_X,\r
114 IMM64_IC_INST_WORD_POS_X,\r
115 IMM64_IC_VAL_POS_X\r
116 );\r
117\r
118 EXT_IMM64 (\r
119 FixupVal,\r
120 (UINT32 *) Fixup + IMM64_IMM41a_INST_WORD_X,\r
121 IMM64_IMM41a_SIZE_X,\r
122 IMM64_IMM41a_INST_WORD_POS_X,\r
123 IMM64_IMM41a_VAL_POS_X\r
124 );\r
125\r
126 //\r
127 // Update 64-bit address\r
128 //\r
129 FixupVal += Adjust;\r
130\r
131 //\r
132 // Insert IMM64 into bundle\r
133 //\r
134 INS_IMM64 (\r
135 FixupVal,\r
136 ((UINT32 *) Fixup + IMM64_IMM7B_INST_WORD_X),\r
137 IMM64_IMM7B_SIZE_X,\r
138 IMM64_IMM7B_INST_WORD_POS_X,\r
139 IMM64_IMM7B_VAL_POS_X\r
140 );\r
141\r
142 INS_IMM64 (\r
143 FixupVal,\r
144 ((UINT32 *) Fixup + IMM64_IMM9D_INST_WORD_X),\r
145 IMM64_IMM9D_SIZE_X,\r
146 IMM64_IMM9D_INST_WORD_POS_X,\r
147 IMM64_IMM9D_VAL_POS_X\r
148 );\r
149\r
150 INS_IMM64 (\r
151 FixupVal,\r
152 ((UINT32 *) Fixup + IMM64_IMM5C_INST_WORD_X),\r
153 IMM64_IMM5C_SIZE_X,\r
154 IMM64_IMM5C_INST_WORD_POS_X,\r
155 IMM64_IMM5C_VAL_POS_X\r
156 );\r
157\r
158 INS_IMM64 (\r
159 FixupVal,\r
160 ((UINT32 *) Fixup + IMM64_IC_INST_WORD_X),\r
161 IMM64_IC_SIZE_X,\r
162 IMM64_IC_INST_WORD_POS_X,\r
163 IMM64_IC_VAL_POS_X\r
164 );\r
165\r
166 INS_IMM64 (\r
167 FixupVal,\r
168 ((UINT32 *) Fixup + IMM64_IMM41a_INST_WORD_X),\r
169 IMM64_IMM41a_SIZE_X,\r
170 IMM64_IMM41a_INST_WORD_POS_X,\r
171 IMM64_IMM41a_VAL_POS_X\r
172 );\r
173\r
174 INS_IMM64 (\r
175 FixupVal,\r
176 ((UINT32 *) Fixup + IMM64_IMM41b_INST_WORD_X),\r
177 IMM64_IMM41b_SIZE_X,\r
178 IMM64_IMM41b_INST_WORD_POS_X,\r
179 IMM64_IMM41b_VAL_POS_X\r
180 );\r
181\r
182 INS_IMM64 (\r
183 FixupVal,\r
184 ((UINT32 *) Fixup + IMM64_IMM41c_INST_WORD_X),\r
185 IMM64_IMM41c_SIZE_X,\r
186 IMM64_IMM41c_INST_WORD_POS_X,\r
187 IMM64_IMM41c_VAL_POS_X\r
188 );\r
189\r
190 INS_IMM64 (\r
191 FixupVal,\r
192 ((UINT32 *) Fixup + IMM64_SIGN_INST_WORD_X),\r
193 IMM64_SIGN_SIZE_X,\r
194 IMM64_SIGN_INST_WORD_POS_X,\r
195 IMM64_SIGN_VAL_POS_X\r
196 );\r
197\r
198 *(UINT64 *) (*FixupData) = *F64;\r
199 }\r
200\r
201 *FixupData = *FixupData + sizeof (UINT64);\r
202 break;\r
203\r
204 default:\r
205 DEBUG ((EFI_D_ERROR, "PeHotRelocateEx:unknown fixed type\n"));\r
206 return EFI_UNSUPPORTED;\r
207 }\r
208\r
209 return EFI_SUCCESS;\r
210}\r
211\r
212\r
213//\r
214// Cache Flush Routine.\r
215//\r
216EFI_STATUS\r
217FlushCpuCache (\r
218 IN EFI_PHYSICAL_ADDRESS Start,\r
219 IN UINT64 Length\r
220 )\r
221/*++\r
222\r
223Routine Description:\r
224\r
225 Flush cache with specified range.\r
226\r
227Arguments:\r
228\r
229 Start - Start address\r
230 Length - Length in bytes\r
231\r
232Returns:\r
233\r
234 Status code\r
235 \r
236 EFI_SUCCESS - success\r
237\r
238--*/\r
239{\r
240 SalFlushCache (Start, Length);\r
241 return EFI_SUCCESS;\r
242}\r