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