]> git.proxmox.com Git - mirror_edk2.git/blame - DuetPkg/EfiLdr/EfiLoader.c
add return if no valid architecture
[mirror_edk2.git] / DuetPkg / EfiLdr / EfiLoader.c
CommitLineData
9071550e 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 EfiLoader.c\r
14\r
15Abstract:\r
16\r
17Revision History:\r
18\r
19--*/\r
20\r
21#include "EfiLdr.h"\r
22#include "Support.h"\r
23#include "Debug.h"\r
24#include "PeLoader.h"\r
3da85e63 25#include "TianoDecompress.h"\r
26\r
3da85e63 27VOID\r
28SystemHang(\r
29 VOID\r
30 )\r
31{\r
32 CHAR8 PrintBuffer[256];\r
33 AsciiSPrint (PrintBuffer, 256, "## FATEL ERROR ##: Fail to load DUET images! System hang!\n");\r
34 CpuDeadLoop();\r
35}\r
9071550e 36\r
37VOID\r
38EfiLoader (\r
39 UINT32 BiosMemoryMapBaseAddress\r
40 )\r
41{\r
42 BIOS_MEMORY_MAP *BiosMemoryMap; \r
e188a609 43 //EFILDR_HEADER *EFILDRHeader;\r
9071550e 44 EFILDR_IMAGE *EFILDRImage;\r
45 EFI_MEMORY_DESCRIPTOR EfiMemoryDescriptor[EFI_MAX_MEMORY_DESCRIPTORS];\r
46 EFI_STATUS Status;\r
47 UINTN NumberOfMemoryMapEntries;\r
48 UINT32 DestinationSize;\r
49 UINT32 ScratchSize;\r
50 UINTN BfvPageNumber;\r
51 UINTN BfvBase;\r
52 EFI_MAIN_ENTRYPOINT EfiMainEntrypoint;\r
3da85e63 53 CHAR8 PrintBuffer[256];\r
e56dd2ce 54 STATIC EFILDRHANDOFF Handoff;\r
9071550e 55\r
9071550e 56 ClearScreen();\r
3da85e63 57 \r
58 PrintHeader ('A');\r
49794755 59
3da85e63 60 AsciiSPrint (PrintBuffer, 256, "Enter DUET Loader ...\n", BiosMemoryMapBaseAddress);\r
61 PrintString (PrintBuffer);\r
62\r
63 AsciiSPrint (PrintBuffer, 256, "BiosMemoryMapBaseAddress = 0x%x\n", BiosMemoryMapBaseAddress);\r
64 PrintString (PrintBuffer);\r
9071550e 65\r
66 //\r
67 // Add all EfiConventionalMemory descriptors to the table. If there are partial pages, then\r
68 // round the start address up to the next page, and round the length down to a page boundry.\r
69 //\r
70 BiosMemoryMap = (BIOS_MEMORY_MAP *)(UINTN)(BiosMemoryMapBaseAddress);\r
71 NumberOfMemoryMapEntries = 0;\r
72 GenMemoryMap (&NumberOfMemoryMapEntries, EfiMemoryDescriptor, BiosMemoryMap);\r
73\r
3da85e63 74 AsciiSPrint (PrintBuffer, 256, "Get %d entries of memory map!\n", NumberOfMemoryMapEntries);\r
75 PrintString (PrintBuffer);\r
76\r
9071550e 77 //\r
78 // Get information on where the image is in memory\r
79 //\r
80\r
e188a609 81 //EFILDRHeader = (EFILDR_HEADER *)(UINTN)(EFILDR_HEADER_ADDRESS);\r
9071550e 82 EFILDRImage = (EFILDR_IMAGE *)(UINTN)(EFILDR_HEADER_ADDRESS + sizeof(EFILDR_HEADER));\r
83\r
9071550e 84\r
85 //\r
86 // Point to the 4th image (Bfv)\r
87 //\r
88 \r
89 EFILDRImage += 3;\r
90\r
91 //\r
92 // Decompress the image\r
93 //\r
94\r
c5dfb477 95 AsciiSPrint (PrintBuffer, 256, "Decompress BFV image, Image Address=0x%x Offset=0x%x\n", \r
3da85e63 96 (UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset),\r
97 EFILDRImage->Offset);\r
98 PrintString (PrintBuffer);\r
99\r
100 Status = TianoGetInfo (\r
9071550e 101 (VOID *)(UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset),\r
102 EFILDRImage->Length,\r
103 &DestinationSize, \r
104 &ScratchSize\r
105 );\r
3da85e63 106\r
9071550e 107 if (EFI_ERROR (Status)) {\r
3da85e63 108 AsciiSPrint (PrintBuffer, 256, "Fail to get decompress information for BFV!\n");\r
109 PrintString (PrintBuffer);\r
110 SystemHang();\r
9071550e 111 }\r
f8e01ca8 112 \r
113 AsciiSPrint (PrintBuffer, 256, "BFV decompress: DestinationSize=0x%X, ScratchSize=0x%X!\n",\r
114 DestinationSize, ScratchSize);\r
115 PrintString (PrintBuffer);\r
116 \r
9071550e 117 Status = TianoDecompress (\r
9071550e 118 (VOID *)(UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset),\r
119 EFILDRImage->Length,\r
120 (VOID *)(UINTN)EFI_DECOMPRESSED_BUFFER_ADDRESS,\r
121 DestinationSize, \r
122 (VOID *)(UINTN)((EFI_DECOMPRESSED_BUFFER_ADDRESS + DestinationSize + 0x1000) & 0xfffff000),\r
123 ScratchSize\r
124 );\r
3da85e63 125\r
9071550e 126 if (EFI_ERROR (Status)) {\r
3da85e63 127 AsciiSPrint (PrintBuffer, 256, "Fail to decompress BFV!\n");\r
128 PrintString (PrintBuffer);\r
129 SystemHang();\r
9071550e 130 }\r
131\r
132 BfvPageNumber = EFI_SIZE_TO_PAGES (DestinationSize);\r
133 BfvBase = (UINTN) FindSpace (BfvPageNumber, &NumberOfMemoryMapEntries, EfiMemoryDescriptor, EfiRuntimeServicesData, EFI_MEMORY_WB);\r
134 if (BfvBase == 0) {\r
3da85e63 135 SystemHang();\r
9071550e 136 }\r
137 ZeroMem ((VOID *)(UINTN)BfvBase, BfvPageNumber * EFI_PAGE_SIZE);\r
138 CopyMem ((VOID *)(UINTN)BfvBase, (VOID *)(UINTN)EFI_DECOMPRESSED_BUFFER_ADDRESS, DestinationSize);\r
139\r
3da85e63 140 PrintHeader ('B');\r
9071550e 141\r
142 //\r
143 // Point to the 2nd image (DxeIpl)\r
144 //\r
145 \r
146 EFILDRImage -= 2;\r
147\r
148 //\r
149 // Decompress the image\r
150 //\r
c5dfb477 151 AsciiSPrint (PrintBuffer, 256, "Decompress DxeIpl image, Image Address=0x%x Offset=0x%x\n", \r
3da85e63 152 (UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset),\r
153 EFILDRImage->Offset);\r
ff514e29 154 PrintString (PrintBuffer);\r
9071550e 155\r
3da85e63 156 Status = TianoGetInfo (\r
9071550e 157 (VOID *)(UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset),\r
158 EFILDRImage->Length,\r
159 &DestinationSize, \r
160 &ScratchSize\r
161 );\r
162 if (EFI_ERROR (Status)) {\r
3da85e63 163 AsciiSPrint (PrintBuffer, 256, "Fail to get decompress information for DxeIpl!\n");\r
164 PrintString (PrintBuffer);\r
165 SystemHang();\r
9071550e 166 }\r
167\r
168 Status = TianoDecompress (\r
9071550e 169 (VOID *)(UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset),\r
170 EFILDRImage->Length,\r
171 (VOID *)(UINTN)EFI_DECOMPRESSED_BUFFER_ADDRESS,\r
172 DestinationSize, \r
173 (VOID *)(UINTN)((EFI_DECOMPRESSED_BUFFER_ADDRESS + DestinationSize + 0x1000) & 0xfffff000),\r
174 ScratchSize\r
175 );\r
176 if (EFI_ERROR (Status)) {\r
3da85e63 177 AsciiSPrint (PrintBuffer, 256, "Fail to decompress DxeIpl image\n");\r
178 PrintString (PrintBuffer);\r
179 SystemHang();\r
9071550e 180 }\r
181\r
3da85e63 182 AsciiSPrint (PrintBuffer, 256, "Start load DxeIpl PE image\n");\r
183 PrintString (PrintBuffer); \r
184\r
9071550e 185 //\r
186 // Load and relocate the EFI PE/COFF Firmware Image \r
187 //\r
188 Status = EfiLdrPeCoffLoadPeImage (\r
189 (VOID *)(UINTN)(EFI_DECOMPRESSED_BUFFER_ADDRESS), \r
190 &DxeIplImage, \r
191 &NumberOfMemoryMapEntries, \r
192 EfiMemoryDescriptor\r
193 );\r
194 if (EFI_ERROR (Status)) {\r
3da85e63 195 AsciiSPrint (PrintBuffer, 256, "Fail to load and relocate DxeIpl PE image!\n");\r
196 PrintString (PrintBuffer);\r
197 SystemHang();\r
9071550e 198 }\r
ff514e29 199 AsciiSPrint (PrintBuffer, 256, "DxeIpl PE image is successed loaded at 0x%x, entry=0x%x\n",\r
200 (UINTN)DxeIplImage.ImageBasePage, (UINTN)DxeIplImage.EntryPoint);\r
201 PrintString (PrintBuffer); \r
9071550e 202\r
203// PrintString("Image.NoPages = "); \r
204// PrintValue(Image.NoPages);\r
205// PrintString("\n");\r
206\r
207PrintHeader ('C');\r
208\r
209 //\r
210 // Point to the 3rd image (DxeMain)\r
211 //\r
212 \r
213 EFILDRImage++;\r
214\r
215 //\r
216 // Decompress the image\r
217 //\r
ff514e29 218 AsciiSPrint (PrintBuffer, 256, "Decompress DXEMain FV image, Image Address=0x%x! Offset=0x%x\n", \r
219 (UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset),\r
220 EFILDRImage->Offset);\r
221 PrintString (PrintBuffer);\r
9071550e 222\r
3da85e63 223 Status = TianoGetInfo (\r
9071550e 224 (VOID *)(UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset),\r
225 EFILDRImage->Length,\r
226 &DestinationSize, \r
227 &ScratchSize\r
228 );\r
229 if (EFI_ERROR (Status)) {\r
ff514e29 230 AsciiSPrint (PrintBuffer, 256, "Fail to get decompress information for DXEMain FV image!\n");\r
231 PrintString (PrintBuffer);\r
3da85e63 232 SystemHang();\r
9071550e 233 }\r
234\r
235 Status = TianoDecompress (\r
9071550e 236 (VOID *)(UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset),\r
237 EFILDRImage->Length,\r
238 (VOID *)(UINTN)EFI_DECOMPRESSED_BUFFER_ADDRESS,\r
239 DestinationSize, \r
240 (VOID *)(UINTN)((EFI_DECOMPRESSED_BUFFER_ADDRESS + DestinationSize + 0x1000) & 0xfffff000),\r
241 ScratchSize\r
242 );\r
243 if (EFI_ERROR (Status)) {\r
3da85e63 244 SystemHang();\r
9071550e 245 }\r
246\r
247 //\r
248 // Load and relocate the EFI PE/COFF Firmware Image \r
249 //\r
250 Status = EfiLdrPeCoffLoadPeImage (\r
251 (VOID *)(UINTN)(EFI_DECOMPRESSED_BUFFER_ADDRESS), \r
252 &DxeCoreImage, \r
253 &NumberOfMemoryMapEntries, \r
254 EfiMemoryDescriptor\r
255 );\r
256 if (EFI_ERROR (Status)) {\r
3da85e63 257 SystemHang();\r
9071550e 258 }\r
ff514e29 259 AsciiSPrint (PrintBuffer, 256, "DxeCore PE image is successed loaded at 0x%x, entry=0x%x\n",\r
260 (UINTN)DxeCoreImage.ImageBasePage, (UINTN)DxeCoreImage.EntryPoint);\r
261 PrintString (PrintBuffer); \r
9071550e 262\r
263PrintHeader ('E');\r
264\r
265 //\r
266 // Display the table of memory descriptors.\r
267 //\r
268\r
269// PrintString("\nEFI Memory Descriptors\n"); \r
270/*\r
271 {\r
272 UINTN Index;\r
273 for (Index = 0; Index < NumberOfMemoryMapEntries; Index++) {\r
274 PrintString("Type = "); \r
275 PrintValue(EfiMemoryDescriptor[Index].Type);\r
276 PrintString(" Start = "); \r
277 PrintValue((UINT32)(EfiMemoryDescriptor[Index].PhysicalStart));\r
278 PrintString(" NumberOfPages = "); \r
279 PrintValue((UINT32)(EfiMemoryDescriptor[Index].NumberOfPages));\r
280 PrintString("\n");\r
281 }\r
282 }\r
283*/\r
284\r
285 //\r
286 // Jump to EFI Firmware\r
287 //\r
288\r
289 if (DxeIplImage.EntryPoint != NULL) {\r
290\r
291 Handoff.MemDescCount = NumberOfMemoryMapEntries;\r
292 Handoff.MemDesc = EfiMemoryDescriptor;\r
293 Handoff.BfvBase = (VOID *)(UINTN)BfvBase;\r
294 Handoff.BfvSize = BfvPageNumber * EFI_PAGE_SIZE;\r
295 Handoff.DxeIplImageBase = (VOID *)(UINTN)DxeIplImage.ImageBasePage;\r
296 Handoff.DxeIplImageSize = DxeIplImage.NoPages * EFI_PAGE_SIZE;\r
297 Handoff.DxeCoreImageBase = (VOID *)(UINTN)DxeCoreImage.ImageBasePage;\r
298 Handoff.DxeCoreImageSize = DxeCoreImage.NoPages * EFI_PAGE_SIZE;\r
299 Handoff.DxeCoreEntryPoint = (VOID *)(UINTN)DxeCoreImage.EntryPoint;\r
300\r
ff514e29 301 AsciiSPrint (PrintBuffer, 256, "Transfer to DxeIpl ...Address=0x%x\n", (UINTN)DxeIplImage.EntryPoint);\r
302 PrintString (PrintBuffer);\r
303 \r
9071550e 304 EfiMainEntrypoint = (EFI_MAIN_ENTRYPOINT)(UINTN)DxeIplImage.EntryPoint;\r
305 EfiMainEntrypoint (&Handoff);\r
306 }\r
307\r
308PrintHeader ('F');\r
309\r
310 //\r
311 // There was a problem loading the image, so HALT the system.\r
312 //\r
313\r
3da85e63 314 SystemHang();\r
9071550e 315}\r
316\r
c51b1cb6 317EFI_STATUS\r
318EFIAPI\r
319_ModuleEntryPoint (\r
320 UINT32 BiosMemoryMapBaseAddress\r
321 )\r
322{\r
323 EfiLoader(BiosMemoryMapBaseAddress);\r
324 return EFI_SUCCESS;\r
325}\r
326\r
327\r