]> git.proxmox.com Git - mirror_edk2.git/blame - DuetPkg/EfiLdr/EfiLoader.c
Add missing module for duet package.
[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
25\r
26VOID\r
27EfiLoader (\r
28 UINT32 BiosMemoryMapBaseAddress\r
29 )\r
30{\r
31 BIOS_MEMORY_MAP *BiosMemoryMap; \r
32 EFILDR_HEADER *EFILDRHeader;\r
33 EFILDR_IMAGE *EFILDRImage;\r
34 EFI_MEMORY_DESCRIPTOR EfiMemoryDescriptor[EFI_MAX_MEMORY_DESCRIPTORS];\r
35 EFI_STATUS Status;\r
36 UINTN NumberOfMemoryMapEntries;\r
37 UINT32 DestinationSize;\r
38 UINT32 ScratchSize;\r
39 UINTN BfvPageNumber;\r
40 UINTN BfvBase;\r
41 EFI_MAIN_ENTRYPOINT EfiMainEntrypoint;\r
42 static EFILDRHANDOFF Handoff;\r
43\r
44PrintHeader ('A');\r
45\r
46 ClearScreen();\r
47 PrintString("EFI Loader\n");\r
48\r
49// PrintString("&BiosMemoryMapBaseAddress = "); \r
50// PrintValue64 ((UINT64)(&BiosMemoryMapBaseAddress));\r
51// PrintString(" BiosMemoryMapBaseAddress = "); \r
52// PrintValue(BiosMemoryMapBaseAddress);\r
53// PrintString("\n");\r
54\r
55 //\r
56 // Add all EfiConventionalMemory descriptors to the table. If there are partial pages, then\r
57 // round the start address up to the next page, and round the length down to a page boundry.\r
58 //\r
59 BiosMemoryMap = (BIOS_MEMORY_MAP *)(UINTN)(BiosMemoryMapBaseAddress);\r
60 NumberOfMemoryMapEntries = 0;\r
61 GenMemoryMap (&NumberOfMemoryMapEntries, EfiMemoryDescriptor, BiosMemoryMap);\r
62\r
63 //\r
64 // Get information on where the image is in memory\r
65 //\r
66\r
67 EFILDRHeader = (EFILDR_HEADER *)(UINTN)(EFILDR_HEADER_ADDRESS);\r
68 EFILDRImage = (EFILDR_IMAGE *)(UINTN)(EFILDR_HEADER_ADDRESS + sizeof(EFILDR_HEADER));\r
69\r
70PrintHeader ('D');\r
71\r
72 //\r
73 // Point to the 4th image (Bfv)\r
74 //\r
75 \r
76 EFILDRImage += 3;\r
77\r
78 //\r
79 // Decompress the image\r
80 //\r
81\r
82 Status = UefiDecompressGetInfo (\r
83 NULL, \r
84 (VOID *)(UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset),\r
85 EFILDRImage->Length,\r
86 &DestinationSize, \r
87 &ScratchSize\r
88 );\r
89 if (EFI_ERROR (Status)) {\r
90 CpuDeadLoop();\r
91 }\r
92\r
93 Status = TianoDecompress (\r
94 NULL, \r
95 (VOID *)(UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset),\r
96 EFILDRImage->Length,\r
97 (VOID *)(UINTN)EFI_DECOMPRESSED_BUFFER_ADDRESS,\r
98 DestinationSize, \r
99 (VOID *)(UINTN)((EFI_DECOMPRESSED_BUFFER_ADDRESS + DestinationSize + 0x1000) & 0xfffff000),\r
100 ScratchSize\r
101 );\r
102 if (EFI_ERROR (Status)) {\r
103 CpuDeadLoop();\r
104 }\r
105\r
106 BfvPageNumber = EFI_SIZE_TO_PAGES (DestinationSize);\r
107 BfvBase = (UINTN) FindSpace (BfvPageNumber, &NumberOfMemoryMapEntries, EfiMemoryDescriptor, EfiRuntimeServicesData, EFI_MEMORY_WB);\r
108 if (BfvBase == 0) {\r
109 CpuDeadLoop();\r
110 }\r
111 ZeroMem ((VOID *)(UINTN)BfvBase, BfvPageNumber * EFI_PAGE_SIZE);\r
112 CopyMem ((VOID *)(UINTN)BfvBase, (VOID *)(UINTN)EFI_DECOMPRESSED_BUFFER_ADDRESS, DestinationSize);\r
113\r
114PrintHeader ('B');\r
115\r
116 //\r
117 // Point to the 2nd image (DxeIpl)\r
118 //\r
119 \r
120 EFILDRImage -= 2;\r
121\r
122 //\r
123 // Decompress the image\r
124 //\r
125\r
126 Status = UefiDecompressGetInfo (\r
127 NULL, \r
128 (VOID *)(UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset),\r
129 EFILDRImage->Length,\r
130 &DestinationSize, \r
131 &ScratchSize\r
132 );\r
133 if (EFI_ERROR (Status)) {\r
134 CpuDeadLoop();\r
135 }\r
136\r
137 Status = TianoDecompress (\r
138 NULL, \r
139 (VOID *)(UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset),\r
140 EFILDRImage->Length,\r
141 (VOID *)(UINTN)EFI_DECOMPRESSED_BUFFER_ADDRESS,\r
142 DestinationSize, \r
143 (VOID *)(UINTN)((EFI_DECOMPRESSED_BUFFER_ADDRESS + DestinationSize + 0x1000) & 0xfffff000),\r
144 ScratchSize\r
145 );\r
146 if (EFI_ERROR (Status)) {\r
147 CpuDeadLoop();\r
148 }\r
149\r
150 //\r
151 // Load and relocate the EFI PE/COFF Firmware Image \r
152 //\r
153 Status = EfiLdrPeCoffLoadPeImage (\r
154 (VOID *)(UINTN)(EFI_DECOMPRESSED_BUFFER_ADDRESS), \r
155 &DxeIplImage, \r
156 &NumberOfMemoryMapEntries, \r
157 EfiMemoryDescriptor\r
158 );\r
159 if (EFI_ERROR (Status)) {\r
160 CpuDeadLoop();\r
161 }\r
162\r
163// PrintString("Image.NoPages = "); \r
164// PrintValue(Image.NoPages);\r
165// PrintString("\n");\r
166\r
167PrintHeader ('C');\r
168\r
169 //\r
170 // Point to the 3rd image (DxeMain)\r
171 //\r
172 \r
173 EFILDRImage++;\r
174\r
175 //\r
176 // Decompress the image\r
177 //\r
178\r
179 Status = UefiDecompressGetInfo (\r
180 NULL, \r
181 (VOID *)(UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset),\r
182 EFILDRImage->Length,\r
183 &DestinationSize, \r
184 &ScratchSize\r
185 );\r
186 if (EFI_ERROR (Status)) {\r
187 CpuDeadLoop();\r
188 }\r
189\r
190 Status = TianoDecompress (\r
191 NULL, \r
192 (VOID *)(UINTN)(EFILDR_HEADER_ADDRESS + EFILDRImage->Offset),\r
193 EFILDRImage->Length,\r
194 (VOID *)(UINTN)EFI_DECOMPRESSED_BUFFER_ADDRESS,\r
195 DestinationSize, \r
196 (VOID *)(UINTN)((EFI_DECOMPRESSED_BUFFER_ADDRESS + DestinationSize + 0x1000) & 0xfffff000),\r
197 ScratchSize\r
198 );\r
199 if (EFI_ERROR (Status)) {\r
200 CpuDeadLoop();\r
201 }\r
202\r
203 //\r
204 // Load and relocate the EFI PE/COFF Firmware Image \r
205 //\r
206 Status = EfiLdrPeCoffLoadPeImage (\r
207 (VOID *)(UINTN)(EFI_DECOMPRESSED_BUFFER_ADDRESS), \r
208 &DxeCoreImage, \r
209 &NumberOfMemoryMapEntries, \r
210 EfiMemoryDescriptor\r
211 );\r
212 if (EFI_ERROR (Status)) {\r
213 CpuDeadLoop();\r
214 }\r
215\r
216PrintHeader ('E');\r
217\r
218 //\r
219 // Display the table of memory descriptors.\r
220 //\r
221\r
222// PrintString("\nEFI Memory Descriptors\n"); \r
223/*\r
224 {\r
225 UINTN Index;\r
226 for (Index = 0; Index < NumberOfMemoryMapEntries; Index++) {\r
227 PrintString("Type = "); \r
228 PrintValue(EfiMemoryDescriptor[Index].Type);\r
229 PrintString(" Start = "); \r
230 PrintValue((UINT32)(EfiMemoryDescriptor[Index].PhysicalStart));\r
231 PrintString(" NumberOfPages = "); \r
232 PrintValue((UINT32)(EfiMemoryDescriptor[Index].NumberOfPages));\r
233 PrintString("\n");\r
234 }\r
235 }\r
236*/\r
237\r
238 //\r
239 // Jump to EFI Firmware\r
240 //\r
241\r
242 if (DxeIplImage.EntryPoint != NULL) {\r
243\r
244 Handoff.MemDescCount = NumberOfMemoryMapEntries;\r
245 Handoff.MemDesc = EfiMemoryDescriptor;\r
246 Handoff.BfvBase = (VOID *)(UINTN)BfvBase;\r
247 Handoff.BfvSize = BfvPageNumber * EFI_PAGE_SIZE;\r
248 Handoff.DxeIplImageBase = (VOID *)(UINTN)DxeIplImage.ImageBasePage;\r
249 Handoff.DxeIplImageSize = DxeIplImage.NoPages * EFI_PAGE_SIZE;\r
250 Handoff.DxeCoreImageBase = (VOID *)(UINTN)DxeCoreImage.ImageBasePage;\r
251 Handoff.DxeCoreImageSize = DxeCoreImage.NoPages * EFI_PAGE_SIZE;\r
252 Handoff.DxeCoreEntryPoint = (VOID *)(UINTN)DxeCoreImage.EntryPoint;\r
253\r
254 EfiMainEntrypoint = (EFI_MAIN_ENTRYPOINT)(UINTN)DxeIplImage.EntryPoint;\r
255 EfiMainEntrypoint (&Handoff);\r
256 }\r
257\r
258PrintHeader ('F');\r
259\r
260 //\r
261 // There was a problem loading the image, so HALT the system.\r
262 //\r
263\r
264 CpuDeadLoop();\r
265}\r
266\r