]>
Commit | Line | Data |
---|---|---|
0ff6de93 ZL |
1 | /** @file\r |
2 | \r | |
3 | Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>\r | |
4 | SPDX-License-Identifier: BSD-2-Clause-Patent\r | |
5 | \r | |
6 | **/\r | |
7 | \r | |
8 | #include "UefiPayloadEntry.h"\r | |
9 | \r | |
e5efcf8b | 10 | #define MEMORY_ATTRIBUTE_MASK (EFI_RESOURCE_ATTRIBUTE_PRESENT | \\r |
0ff6de93 ZL |
11 | EFI_RESOURCE_ATTRIBUTE_INITIALIZED | \\r |
12 | EFI_RESOURCE_ATTRIBUTE_TESTED | \\r | |
13 | EFI_RESOURCE_ATTRIBUTE_READ_PROTECTED | \\r | |
14 | EFI_RESOURCE_ATTRIBUTE_WRITE_PROTECTED | \\r | |
15 | EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTED | \\r | |
16 | EFI_RESOURCE_ATTRIBUTE_READ_ONLY_PROTECTED | \\r | |
17 | EFI_RESOURCE_ATTRIBUTE_16_BIT_IO | \\r | |
18 | EFI_RESOURCE_ATTRIBUTE_32_BIT_IO | \\r | |
19 | EFI_RESOURCE_ATTRIBUTE_64_BIT_IO | \\r | |
20 | EFI_RESOURCE_ATTRIBUTE_PERSISTENT )\r | |
21 | \r | |
e5efcf8b | 22 | #define TESTED_MEMORY_ATTRIBUTES (EFI_RESOURCE_ATTRIBUTE_PRESENT | \\r |
0ff6de93 ZL |
23 | EFI_RESOURCE_ATTRIBUTE_INITIALIZED | \\r |
24 | EFI_RESOURCE_ATTRIBUTE_TESTED )\r | |
25 | \r | |
26 | extern VOID *mHobList;\r | |
27 | \r | |
fda5226a ZL |
28 | /**\r |
29 | Print all HOBs info from the HOB list.\r | |
30 | \r | |
31 | @return The pointer to the HOB list.\r | |
32 | **/\r | |
33 | VOID\r | |
34 | PrintHob (\r | |
e5efcf8b | 35 | IN CONST VOID *HobStart\r |
fda5226a ZL |
36 | );\r |
37 | \r | |
27cb64ff ZL |
38 | /**\r |
39 | Some bootloader may pass a pcd database, and UPL also contain a PCD database.\r | |
40 | Dxe PCD driver has the assumption that the two PCD database can be catenated and\r | |
d02dbb53 | 41 | the local token number should be successive.\r |
27cb64ff ZL |
42 | This function will fix up the UPL PCD database to meet that assumption.\r |
43 | \r | |
44 | @param[in] DxeFv The FV where to find the Universal PCD database.\r | |
45 | \r | |
46 | @retval EFI_SUCCESS If it completed successfully.\r | |
47 | @retval other Failed to fix up.\r | |
48 | **/\r | |
49 | EFI_STATUS\r | |
50 | FixUpPcdDatabase (\r | |
e5efcf8b | 51 | IN EFI_FIRMWARE_VOLUME_HEADER *DxeFv\r |
27cb64ff ZL |
52 | )\r |
53 | {\r | |
e5efcf8b MK |
54 | EFI_STATUS Status;\r |
55 | EFI_FFS_FILE_HEADER *FileHeader;\r | |
56 | VOID *PcdRawData;\r | |
57 | PEI_PCD_DATABASE *PeiDatabase;\r | |
58 | PEI_PCD_DATABASE *UplDatabase;\r | |
59 | EFI_HOB_GUID_TYPE *GuidHob;\r | |
60 | DYNAMICEX_MAPPING *ExMapTable;\r | |
61 | UINTN Index;\r | |
27cb64ff ZL |
62 | \r |
63 | GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r | |
64 | if (GuidHob == NULL) {\r | |
65 | //\r | |
66 | // No fix-up is needed.\r | |
67 | //\r | |
68 | return EFI_SUCCESS;\r | |
69 | }\r | |
e5efcf8b MK |
70 | \r |
71 | PeiDatabase = (PEI_PCD_DATABASE *)GET_GUID_HOB_DATA (GuidHob);\r | |
27cb64ff ZL |
72 | DEBUG ((DEBUG_INFO, "Find the Pei PCD data base, the total local token number is %d\n", PeiDatabase->LocalTokenCount));\r |
73 | \r | |
74 | Status = FvFindFileByTypeGuid (DxeFv, EFI_FV_FILETYPE_DRIVER, PcdGetPtr (PcdPcdDriverFile), &FileHeader);\r | |
75 | ASSERT_EFI_ERROR (Status);\r | |
76 | if (EFI_ERROR (Status)) {\r | |
77 | return Status;\r | |
78 | }\r | |
e5efcf8b | 79 | \r |
27cb64ff ZL |
80 | Status = FileFindSection (FileHeader, EFI_SECTION_RAW, &PcdRawData);\r |
81 | ASSERT_EFI_ERROR (Status);\r | |
82 | if (EFI_ERROR (Status)) {\r | |
83 | return Status;\r | |
84 | }\r | |
85 | \r | |
e5efcf8b MK |
86 | UplDatabase = (PEI_PCD_DATABASE *)PcdRawData;\r |
87 | ExMapTable = (DYNAMICEX_MAPPING *)(UINTN)((UINTN)PcdRawData + UplDatabase->ExMapTableOffset);\r | |
27cb64ff ZL |
88 | \r |
89 | for (Index = 0; Index < UplDatabase->ExTokenCount; Index++) {\r | |
90 | ExMapTable[Index].TokenNumber += PeiDatabase->LocalTokenCount;\r | |
91 | }\r | |
e5efcf8b | 92 | \r |
27cb64ff ZL |
93 | DEBUG ((DEBUG_INFO, "Fix up UPL PCD database successfully\n"));\r |
94 | return EFI_SUCCESS;\r | |
95 | }\r | |
96 | \r | |
0ff6de93 ZL |
97 | /**\r |
98 | Add HOB into HOB list\r | |
99 | \r | |
100 | @param[in] Hob The HOB to be added into the HOB list.\r | |
101 | **/\r | |
102 | VOID\r | |
103 | AddNewHob (\r | |
e5efcf8b | 104 | IN EFI_PEI_HOB_POINTERS *Hob\r |
0ff6de93 ZL |
105 | )\r |
106 | {\r | |
e5efcf8b | 107 | EFI_PEI_HOB_POINTERS NewHob;\r |
0ff6de93 ZL |
108 | \r |
109 | if (Hob->Raw == NULL) {\r | |
110 | return;\r | |
111 | }\r | |
e5efcf8b | 112 | \r |
0ff6de93 ZL |
113 | NewHob.Header = CreateHob (Hob->Header->HobType, Hob->Header->HobLength);\r |
114 | \r | |
115 | if (NewHob.Header != NULL) {\r | |
116 | CopyMem (NewHob.Header + 1, Hob->Header + 1, Hob->Header->HobLength - sizeof (EFI_HOB_GENERIC_HEADER));\r | |
117 | }\r | |
118 | }\r | |
119 | \r | |
120 | /**\r | |
6ef57974 | 121 | Found the Resource Descriptor HOB that contains a range (Base, Top)\r |
0ff6de93 | 122 | \r |
6ef57974 | 123 | @param[in] HobList Hob start address\r |
0ff6de93 | 124 | @param[in] Base Memory start address\r |
6ef57974 | 125 | @param[in] Top Memory end address.\r |
0ff6de93 | 126 | \r |
6ef57974 | 127 | @retval The pointer to the Resource Descriptor HOB.\r |
0ff6de93 ZL |
128 | **/\r |
129 | EFI_HOB_RESOURCE_DESCRIPTOR *\r | |
130 | FindResourceDescriptorByRange (\r | |
e5efcf8b MK |
131 | IN VOID *HobList,\r |
132 | IN EFI_PHYSICAL_ADDRESS Base,\r | |
133 | IN EFI_PHYSICAL_ADDRESS Top\r | |
0ff6de93 ZL |
134 | )\r |
135 | {\r | |
e5efcf8b MK |
136 | EFI_PEI_HOB_POINTERS Hob;\r |
137 | EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;\r | |
0ff6de93 | 138 | \r |
e5efcf8b | 139 | for (Hob.Raw = (UINT8 *)HobList; !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {\r |
0ff6de93 ZL |
140 | //\r |
141 | // Skip all HOBs except Resource Descriptor HOBs\r | |
142 | //\r | |
143 | if (GET_HOB_TYPE (Hob) != EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {\r | |
144 | continue;\r | |
145 | }\r | |
146 | \r | |
147 | //\r | |
148 | // Skip Resource Descriptor HOBs that do not describe tested system memory\r | |
149 | //\r | |
150 | ResourceHob = Hob.ResourceDescriptor;\r | |
151 | if (ResourceHob->ResourceType != EFI_RESOURCE_SYSTEM_MEMORY) {\r | |
152 | continue;\r | |
153 | }\r | |
e5efcf8b | 154 | \r |
0ff6de93 ZL |
155 | if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) != TESTED_MEMORY_ATTRIBUTES) {\r |
156 | continue;\r | |
157 | }\r | |
158 | \r | |
159 | //\r | |
160 | // Skip Resource Descriptor HOBs that do not contain the PHIT range EfiFreeMemoryBottom..EfiFreeMemoryTop\r | |
161 | //\r | |
162 | if (Base < ResourceHob->PhysicalStart) {\r | |
163 | continue;\r | |
164 | }\r | |
e5efcf8b | 165 | \r |
0ff6de93 ZL |
166 | if (Top > (ResourceHob->PhysicalStart + ResourceHob->ResourceLength)) {\r |
167 | continue;\r | |
168 | }\r | |
e5efcf8b | 169 | \r |
0ff6de93 ZL |
170 | return ResourceHob;\r |
171 | }\r | |
e5efcf8b | 172 | \r |
0ff6de93 ZL |
173 | return NULL;\r |
174 | }\r | |
175 | \r | |
176 | /**\r | |
177 | Find the highest below 4G memory resource descriptor, except the input Resource Descriptor.\r | |
178 | \r | |
179 | @param[in] HobList Hob start address\r | |
180 | @param[in] MinimalNeededSize Minimal needed size.\r | |
181 | @param[in] ExceptResourceHob Ignore this Resource Descriptor.\r | |
182 | \r | |
6ef57974 | 183 | @retval The pointer to the Resource Descriptor HOB.\r |
0ff6de93 ZL |
184 | **/\r |
185 | EFI_HOB_RESOURCE_DESCRIPTOR *\r | |
186 | FindAnotherHighestBelow4GResourceDescriptor (\r | |
e5efcf8b MK |
187 | IN VOID *HobList,\r |
188 | IN UINTN MinimalNeededSize,\r | |
189 | IN EFI_HOB_RESOURCE_DESCRIPTOR *ExceptResourceHob\r | |
0ff6de93 ZL |
190 | )\r |
191 | {\r | |
e5efcf8b MK |
192 | EFI_PEI_HOB_POINTERS Hob;\r |
193 | EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;\r | |
194 | EFI_HOB_RESOURCE_DESCRIPTOR *ReturnResourceHob;\r | |
195 | \r | |
0ff6de93 ZL |
196 | ReturnResourceHob = NULL;\r |
197 | \r | |
e5efcf8b | 198 | for (Hob.Raw = (UINT8 *)HobList; !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {\r |
0ff6de93 ZL |
199 | //\r |
200 | // Skip all HOBs except Resource Descriptor HOBs\r | |
201 | //\r | |
202 | if (GET_HOB_TYPE (Hob) != EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {\r | |
203 | continue;\r | |
204 | }\r | |
205 | \r | |
206 | //\r | |
207 | // Skip Resource Descriptor HOBs that do not describe tested system memory\r | |
208 | //\r | |
209 | ResourceHob = Hob.ResourceDescriptor;\r | |
210 | if (ResourceHob->ResourceType != EFI_RESOURCE_SYSTEM_MEMORY) {\r | |
211 | continue;\r | |
212 | }\r | |
e5efcf8b | 213 | \r |
0ff6de93 ZL |
214 | if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) != TESTED_MEMORY_ATTRIBUTES) {\r |
215 | continue;\r | |
216 | }\r | |
217 | \r | |
218 | //\r | |
219 | // Skip if the Resource Descriptor HOB equals to ExceptResourceHob\r | |
220 | //\r | |
221 | if (ResourceHob == ExceptResourceHob) {\r | |
222 | continue;\r | |
223 | }\r | |
e5efcf8b | 224 | \r |
0ff6de93 ZL |
225 | //\r |
226 | // Skip Resource Descriptor HOBs that are beyond 4G\r | |
227 | //\r | |
228 | if ((ResourceHob->PhysicalStart + ResourceHob->ResourceLength) > BASE_4GB) {\r | |
229 | continue;\r | |
230 | }\r | |
e5efcf8b | 231 | \r |
0ff6de93 ZL |
232 | //\r |
233 | // Skip Resource Descriptor HOBs that are too small\r | |
234 | //\r | |
235 | if (ResourceHob->ResourceLength < MinimalNeededSize) {\r | |
236 | continue;\r | |
237 | }\r | |
238 | \r | |
239 | //\r | |
240 | // Return the topest Resource Descriptor\r | |
241 | //\r | |
242 | if (ReturnResourceHob == NULL) {\r | |
243 | ReturnResourceHob = ResourceHob;\r | |
244 | } else {\r | |
245 | if (ReturnResourceHob->PhysicalStart < ResourceHob->PhysicalStart) {\r | |
246 | ReturnResourceHob = ResourceHob;\r | |
247 | }\r | |
248 | }\r | |
249 | }\r | |
e5efcf8b | 250 | \r |
0ff6de93 ZL |
251 | return ReturnResourceHob;\r |
252 | }\r | |
253 | \r | |
254 | /**\r | |
255 | It will build HOBs based on information from bootloaders.\r | |
256 | \r | |
6ef57974 GD |
257 | @param[in] BootloaderParameter The starting memory address of bootloader parameter block.\r |
258 | @param[out] DxeFv The pointer to the DXE FV in memory.\r | |
259 | \r | |
0ff6de93 ZL |
260 | @retval EFI_SUCCESS If it completed successfully.\r |
261 | @retval Others If it failed to build required HOBs.\r | |
262 | **/\r | |
263 | EFI_STATUS\r | |
264 | BuildHobs (\r | |
b208d37c ZL |
265 | IN UINTN BootloaderParameter,\r |
266 | OUT EFI_FIRMWARE_VOLUME_HEADER **DxeFv\r | |
0ff6de93 ZL |
267 | )\r |
268 | {\r | |
e5efcf8b MK |
269 | EFI_PEI_HOB_POINTERS Hob;\r |
270 | UINTN MinimalNeededSize;\r | |
271 | EFI_PHYSICAL_ADDRESS FreeMemoryBottom;\r | |
272 | EFI_PHYSICAL_ADDRESS FreeMemoryTop;\r | |
273 | EFI_PHYSICAL_ADDRESS MemoryBottom;\r | |
274 | EFI_PHYSICAL_ADDRESS MemoryTop;\r | |
275 | EFI_HOB_RESOURCE_DESCRIPTOR *PhitResourceHob;\r | |
276 | EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;\r | |
277 | UNIVERSAL_PAYLOAD_EXTRA_DATA *ExtraData;\r | |
278 | UINT8 *GuidHob;\r | |
279 | EFI_HOB_FIRMWARE_VOLUME *FvHob;\r | |
280 | UNIVERSAL_PAYLOAD_ACPI_TABLE *AcpiTable;\r | |
281 | ACPI_BOARD_INFO *AcpiBoardInfo;\r | |
282 | \r | |
283 | Hob.Raw = (UINT8 *)BootloaderParameter;\r | |
0ff6de93 ZL |
284 | MinimalNeededSize = FixedPcdGet32 (PcdSystemMemoryUefiRegionSize);\r |
285 | \r | |
286 | ASSERT (Hob.Raw != NULL);\r | |
e5efcf8b MK |
287 | ASSERT ((UINTN)Hob.HandoffInformationTable->EfiFreeMemoryTop == Hob.HandoffInformationTable->EfiFreeMemoryTop);\r |
288 | ASSERT ((UINTN)Hob.HandoffInformationTable->EfiMemoryTop == Hob.HandoffInformationTable->EfiMemoryTop);\r | |
289 | ASSERT ((UINTN)Hob.HandoffInformationTable->EfiFreeMemoryBottom == Hob.HandoffInformationTable->EfiFreeMemoryBottom);\r | |
290 | ASSERT ((UINTN)Hob.HandoffInformationTable->EfiMemoryBottom == Hob.HandoffInformationTable->EfiMemoryBottom);\r | |
0ff6de93 ZL |
291 | \r |
292 | //\r | |
293 | // Try to find Resource Descriptor HOB that contains Hob range EfiMemoryBottom..EfiMemoryTop\r | |
294 | //\r | |
e5efcf8b | 295 | PhitResourceHob = FindResourceDescriptorByRange (Hob.Raw, Hob.HandoffInformationTable->EfiMemoryBottom, Hob.HandoffInformationTable->EfiMemoryTop);\r |
0ff6de93 ZL |
296 | if (PhitResourceHob == NULL) {\r |
297 | //\r | |
298 | // Boot loader's Phit Hob is not in an available Resource Descriptor, find another Resource Descriptor for new Phit Hob\r | |
299 | //\r | |
e5efcf8b | 300 | ResourceHob = FindAnotherHighestBelow4GResourceDescriptor (Hob.Raw, MinimalNeededSize, NULL);\r |
0ff6de93 ZL |
301 | if (ResourceHob == NULL) {\r |
302 | return EFI_NOT_FOUND;\r | |
303 | }\r | |
304 | \r | |
305 | MemoryBottom = ResourceHob->PhysicalStart + ResourceHob->ResourceLength - MinimalNeededSize;\r | |
306 | FreeMemoryBottom = MemoryBottom;\r | |
307 | FreeMemoryTop = ResourceHob->PhysicalStart + ResourceHob->ResourceLength;\r | |
308 | MemoryTop = FreeMemoryTop;\r | |
309 | } else if (PhitResourceHob->PhysicalStart + PhitResourceHob->ResourceLength - Hob.HandoffInformationTable->EfiMemoryTop >= MinimalNeededSize) {\r | |
310 | //\r | |
311 | // New availiable Memory range in new hob is right above memory top in old hob.\r | |
312 | //\r | |
313 | MemoryBottom = Hob.HandoffInformationTable->EfiFreeMemoryTop;\r | |
314 | FreeMemoryBottom = Hob.HandoffInformationTable->EfiMemoryTop;\r | |
315 | FreeMemoryTop = FreeMemoryBottom + MinimalNeededSize;\r | |
316 | MemoryTop = FreeMemoryTop;\r | |
317 | } else if (Hob.HandoffInformationTable->EfiMemoryBottom - PhitResourceHob->PhysicalStart >= MinimalNeededSize) {\r | |
318 | //\r | |
319 | // New availiable Memory range in new hob is right below memory bottom in old hob.\r | |
320 | //\r | |
321 | MemoryBottom = Hob.HandoffInformationTable->EfiMemoryBottom - MinimalNeededSize;\r | |
322 | FreeMemoryBottom = MemoryBottom;\r | |
323 | FreeMemoryTop = Hob.HandoffInformationTable->EfiMemoryBottom;\r | |
324 | MemoryTop = Hob.HandoffInformationTable->EfiMemoryTop;\r | |
325 | } else {\r | |
326 | //\r | |
327 | // In the Resource Descriptor HOB contains boot loader Hob, there is no enough free memory size for payload hob\r | |
328 | // Find another Resource Descriptor Hob\r | |
329 | //\r | |
e5efcf8b | 330 | ResourceHob = FindAnotherHighestBelow4GResourceDescriptor (Hob.Raw, MinimalNeededSize, PhitResourceHob);\r |
0ff6de93 ZL |
331 | if (ResourceHob == NULL) {\r |
332 | return EFI_NOT_FOUND;\r | |
333 | }\r | |
334 | \r | |
335 | MemoryBottom = ResourceHob->PhysicalStart + ResourceHob->ResourceLength - MinimalNeededSize;\r | |
336 | FreeMemoryBottom = MemoryBottom;\r | |
337 | FreeMemoryTop = ResourceHob->PhysicalStart + ResourceHob->ResourceLength;\r | |
338 | MemoryTop = FreeMemoryTop;\r | |
339 | }\r | |
e5efcf8b MK |
340 | \r |
341 | HobConstructor ((VOID *)(UINTN)MemoryBottom, (VOID *)(UINTN)MemoryTop, (VOID *)(UINTN)FreeMemoryBottom, (VOID *)(UINTN)FreeMemoryTop);\r | |
0ff6de93 ZL |
342 | //\r |
343 | // From now on, mHobList will point to the new Hob range.\r | |
344 | //\r | |
345 | \r | |
b208d37c ZL |
346 | //\r |
347 | // Create an empty FvHob for the DXE FV that contains DXE core.\r | |
348 | //\r | |
e5efcf8b | 349 | BuildFvHob ((EFI_PHYSICAL_ADDRESS)0, 0);\r |
0ff6de93 ZL |
350 | //\r |
351 | // Since payload created new Hob, move all hobs except PHIT from boot loader hob list.\r | |
352 | //\r | |
353 | while (!END_OF_HOB_LIST (Hob)) {\r | |
354 | if (Hob.Header->HobType != EFI_HOB_TYPE_HANDOFF) {\r | |
355 | // Add this hob to payload HOB\r | |
356 | AddNewHob (&Hob);\r | |
357 | }\r | |
e5efcf8b | 358 | \r |
0ff6de93 ZL |
359 | Hob.Raw = GET_NEXT_HOB (Hob);\r |
360 | }\r | |
361 | \r | |
b208d37c ZL |
362 | //\r |
363 | // Get DXE FV location\r | |
364 | //\r | |
e5efcf8b | 365 | GuidHob = GetFirstGuidHob (&gUniversalPayloadExtraDataGuid);\r |
b208d37c | 366 | ASSERT (GuidHob != NULL);\r |
e5efcf8b | 367 | ExtraData = (UNIVERSAL_PAYLOAD_EXTRA_DATA *)GET_GUID_HOB_DATA (GuidHob);\r |
b208d37c ZL |
368 | ASSERT (ExtraData->Count == 1);\r |
369 | ASSERT (AsciiStrCmp (ExtraData->Entry[0].Identifier, "uefi_fv") == 0);\r | |
370 | \r | |
e5efcf8b | 371 | *DxeFv = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)ExtraData->Entry[0].Base;\r |
b208d37c ZL |
372 | ASSERT ((*DxeFv)->FvLength == ExtraData->Entry[0].Size);\r |
373 | \r | |
cc5a6726 GD |
374 | //\r |
375 | // Create guid hob for acpi board information\r | |
376 | //\r | |
e5efcf8b | 377 | GuidHob = GetFirstGuidHob (&gUniversalPayloadAcpiTableGuid);\r |
cc5a6726 | 378 | if (GuidHob != NULL) {\r |
e5efcf8b | 379 | AcpiTable = (UNIVERSAL_PAYLOAD_ACPI_TABLE *)GET_GUID_HOB_DATA (GuidHob);\r |
cc5a6726 GD |
380 | AcpiBoardInfo = BuildHobFromAcpi ((UINT64)AcpiTable->Rsdp);\r |
381 | ASSERT (AcpiBoardInfo != NULL);\r | |
382 | }\r | |
383 | \r | |
b208d37c ZL |
384 | //\r |
385 | // Update DXE FV information to first fv hob in the hob list, which\r | |
386 | // is the empty FvHob created before.\r | |
387 | //\r | |
e5efcf8b MK |
388 | FvHob = GetFirstHob (EFI_HOB_TYPE_FV);\r |
389 | FvHob->BaseAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)*DxeFv;\r | |
390 | FvHob->Length = (*DxeFv)->FvLength;\r | |
0ff6de93 ZL |
391 | return EFI_SUCCESS;\r |
392 | }\r | |
393 | \r | |
394 | /**\r | |
395 | Entry point to the C language phase of UEFI payload.\r | |
396 | \r | |
6ef57974 GD |
397 | @param[in] BootloaderParameter The starting address of bootloader parameter block.\r |
398 | \r | |
0ff6de93 ZL |
399 | @retval It will not return if SUCCESS, and return error when passing bootloader parameter.\r |
400 | **/\r | |
401 | EFI_STATUS\r | |
402 | EFIAPI\r | |
403 | _ModuleEntryPoint (\r | |
e5efcf8b | 404 | IN UINTN BootloaderParameter\r |
0ff6de93 ZL |
405 | )\r |
406 | {\r | |
e5efcf8b MK |
407 | EFI_STATUS Status;\r |
408 | PHYSICAL_ADDRESS DxeCoreEntryPoint;\r | |
409 | EFI_PEI_HOB_POINTERS Hob;\r | |
410 | EFI_FIRMWARE_VOLUME_HEADER *DxeFv;\r | |
0ff6de93 | 411 | \r |
e5efcf8b | 412 | mHobList = (VOID *)BootloaderParameter;\r |
b208d37c | 413 | DxeFv = NULL;\r |
0ff6de93 ZL |
414 | // Call constructor for all libraries\r |
415 | ProcessLibraryConstructorList ();\r | |
416 | \r | |
417 | DEBUG ((DEBUG_INFO, "Entering Universal Payload...\n"));\r | |
e5efcf8b | 418 | DEBUG ((DEBUG_INFO, "sizeof(UINTN) = 0x%x\n", sizeof (UINTN)));\r |
0ff6de93 | 419 | \r |
fda5226a ZL |
420 | DEBUG_CODE (\r |
421 | //\r | |
422 | // Dump the Hobs from boot loader\r | |
423 | //\r | |
424 | PrintHob (mHobList);\r | |
e5efcf8b | 425 | );\r |
fda5226a | 426 | \r |
0ff6de93 ZL |
427 | // Initialize floating point operating environment to be compliant with UEFI spec.\r |
428 | InitializeFloatingPointUnits ();\r | |
429 | \r | |
430 | // Build HOB based on information from Bootloader\r | |
b208d37c ZL |
431 | Status = BuildHobs (BootloaderParameter, &DxeFv);\r |
432 | ASSERT_EFI_ERROR (Status);\r | |
433 | \r | |
27cb64ff | 434 | FixUpPcdDatabase (DxeFv);\r |
b208d37c ZL |
435 | Status = UniversalLoadDxeCore (DxeFv, &DxeCoreEntryPoint);\r |
436 | ASSERT_EFI_ERROR (Status);\r | |
0ff6de93 ZL |
437 | \r |
438 | //\r | |
439 | // Mask off all legacy 8259 interrupt sources\r | |
440 | //\r | |
441 | IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);\r | |
e5efcf8b | 442 | IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);\r |
0ff6de93 | 443 | \r |
e5efcf8b | 444 | Hob.HandoffInformationTable = (EFI_HOB_HANDOFF_INFO_TABLE *)GetFirstHob (EFI_HOB_TYPE_HANDOFF);\r |
b208d37c | 445 | HandOffToDxeCore (DxeCoreEntryPoint, Hob);\r |
0ff6de93 ZL |
446 | \r |
447 | // Should not get here\r | |
448 | CpuDeadLoop ();\r | |
449 | return EFI_SUCCESS;\r | |
450 | }\r |