]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - DuetPkg/EfiLdr/EfiLoader.c
add return if no valid architecture
[mirror_edk2.git] / DuetPkg / EfiLdr / EfiLoader.c
... / ...
CommitLineData
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
25#include "TianoDecompress.h"\r
26\r
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
36\r
37VOID\r
38EfiLoader (\r
39 UINT32 BiosMemoryMapBaseAddress\r
40 )\r
41{\r
42 BIOS_MEMORY_MAP *BiosMemoryMap; \r
43 //EFILDR_HEADER *EFILDRHeader;\r
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
53 CHAR8 PrintBuffer[256];\r
54 STATIC EFILDRHANDOFF Handoff;\r
55\r
56 ClearScreen();\r
57 \r
58 PrintHeader ('A');\r
59
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
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
74 AsciiSPrint (PrintBuffer, 256, "Get %d entries of memory map!\n", NumberOfMemoryMapEntries);\r
75 PrintString (PrintBuffer);\r
76\r
77 //\r
78 // Get information on where the image is in memory\r
79 //\r
80\r
81 //EFILDRHeader = (EFILDR_HEADER *)(UINTN)(EFILDR_HEADER_ADDRESS);\r
82 EFILDRImage = (EFILDR_IMAGE *)(UINTN)(EFILDR_HEADER_ADDRESS + sizeof(EFILDR_HEADER));\r
83\r
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
95 AsciiSPrint (PrintBuffer, 256, "Decompress BFV image, Image Address=0x%x Offset=0x%x\n", \r
96 (UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset),\r
97 EFILDRImage->Offset);\r
98 PrintString (PrintBuffer);\r
99\r
100 Status = TianoGetInfo (\r
101 (VOID *)(UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset),\r
102 EFILDRImage->Length,\r
103 &DestinationSize, \r
104 &ScratchSize\r
105 );\r
106\r
107 if (EFI_ERROR (Status)) {\r
108 AsciiSPrint (PrintBuffer, 256, "Fail to get decompress information for BFV!\n");\r
109 PrintString (PrintBuffer);\r
110 SystemHang();\r
111 }\r
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
117 Status = TianoDecompress (\r
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
125\r
126 if (EFI_ERROR (Status)) {\r
127 AsciiSPrint (PrintBuffer, 256, "Fail to decompress BFV!\n");\r
128 PrintString (PrintBuffer);\r
129 SystemHang();\r
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
135 SystemHang();\r
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
140 PrintHeader ('B');\r
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
151 AsciiSPrint (PrintBuffer, 256, "Decompress DxeIpl image, Image Address=0x%x Offset=0x%x\n", \r
152 (UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset),\r
153 EFILDRImage->Offset);\r
154 PrintString (PrintBuffer);\r
155\r
156 Status = TianoGetInfo (\r
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
163 AsciiSPrint (PrintBuffer, 256, "Fail to get decompress information for DxeIpl!\n");\r
164 PrintString (PrintBuffer);\r
165 SystemHang();\r
166 }\r
167\r
168 Status = TianoDecompress (\r
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
177 AsciiSPrint (PrintBuffer, 256, "Fail to decompress DxeIpl image\n");\r
178 PrintString (PrintBuffer);\r
179 SystemHang();\r
180 }\r
181\r
182 AsciiSPrint (PrintBuffer, 256, "Start load DxeIpl PE image\n");\r
183 PrintString (PrintBuffer); \r
184\r
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
195 AsciiSPrint (PrintBuffer, 256, "Fail to load and relocate DxeIpl PE image!\n");\r
196 PrintString (PrintBuffer);\r
197 SystemHang();\r
198 }\r
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
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
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
222\r
223 Status = TianoGetInfo (\r
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
230 AsciiSPrint (PrintBuffer, 256, "Fail to get decompress information for DXEMain FV image!\n");\r
231 PrintString (PrintBuffer);\r
232 SystemHang();\r
233 }\r
234\r
235 Status = TianoDecompress (\r
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
244 SystemHang();\r
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
257 SystemHang();\r
258 }\r
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
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
301 AsciiSPrint (PrintBuffer, 256, "Transfer to DxeIpl ...Address=0x%x\n", (UINTN)DxeIplImage.EntryPoint);\r
302 PrintString (PrintBuffer);\r
303 \r
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
314 SystemHang();\r
315}\r
316\r
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