]> git.proxmox.com Git - mirror_edk2.git/blame - UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c
Maintainers.txt: Add new reviewer for UefiPayloadPkg
[mirror_edk2.git] / UefiPayloadPkg / UefiPayloadEntry / UefiPayloadEntry.c
CommitLineData
04af8bf2 1/** @file\r
04af8bf2 2\r
302a8f35 3 Copyright (c) 2014 - 2021, Intel Corporation. All rights reserved.<BR>\r
7c4ab1c2 4 SPDX-License-Identifier: BSD-2-Clause-Patent\r
04af8bf2
DG
5\r
6**/\r
04af8bf2 7\r
7c4ab1c2 8#include "UefiPayloadEntry.h"\r
04af8bf2 9\r
e5efcf8b 10STATIC UINT32 mTopOfLowerUsableDram = 0;\r
1e5e58d3 11\r
04af8bf2 12/**\r
7c4ab1c2 13 Callback function to build resource descriptor HOB\r
04af8bf2 14\r
7c4ab1c2 15 This function build a HOB based on the memory map entry info.\r
1e5e58d3
PR
16 It creates only EFI_RESOURCE_MEMORY_MAPPED_IO and EFI_RESOURCE_MEMORY_RESERVED\r
17 resources.\r
18\r
19 @param MemoryMapEntry Memory map entry info got from bootloader.\r
20 @param Params A pointer to ACPI_BOARD_INFO.\r
21\r
22 @retval EFI_SUCCESS Successfully build a HOB.\r
23 @retval EFI_INVALID_PARAMETER Invalid parameter provided.\r
24**/\r
25EFI_STATUS\r
26MemInfoCallbackMmio (\r
e5efcf8b
MK
27 IN MEMORY_MAP_ENTRY *MemoryMapEntry,\r
28 IN VOID *Params\r
1e5e58d3
PR
29 )\r
30{\r
31 EFI_PHYSICAL_ADDRESS Base;\r
32 EFI_RESOURCE_TYPE Type;\r
33 UINT64 Size;\r
34 EFI_RESOURCE_ATTRIBUTE_TYPE Attribue;\r
35 ACPI_BOARD_INFO *AcpiBoardInfo;\r
36\r
37 AcpiBoardInfo = (ACPI_BOARD_INFO *)Params;\r
38 if (AcpiBoardInfo == NULL) {\r
39 return EFI_INVALID_PARAMETER;\r
40 }\r
41\r
42 //\r
43 // Skip types already handled in MemInfoCallback\r
44 //\r
e5efcf8b 45 if ((MemoryMapEntry->Type == E820_RAM) || (MemoryMapEntry->Type == E820_ACPI)) {\r
1e5e58d3
PR
46 return EFI_SUCCESS;\r
47 }\r
48\r
49 if (MemoryMapEntry->Base == AcpiBoardInfo->PcieBaseAddress) {\r
50 //\r
51 // MMCONF is always MMIO\r
52 //\r
53 Type = EFI_RESOURCE_MEMORY_MAPPED_IO;\r
54 } else if (MemoryMapEntry->Base < mTopOfLowerUsableDram) {\r
55 //\r
56 // It's in DRAM and thus must be reserved\r
57 //\r
58 Type = EFI_RESOURCE_MEMORY_RESERVED;\r
59 } else if ((MemoryMapEntry->Base < 0x100000000ULL) && (MemoryMapEntry->Base >= mTopOfLowerUsableDram)) {\r
60 //\r
61 // It's not in DRAM, must be MMIO\r
62 //\r
63 Type = EFI_RESOURCE_MEMORY_MAPPED_IO;\r
64 } else {\r
65 Type = EFI_RESOURCE_MEMORY_RESERVED;\r
66 }\r
67\r
e5efcf8b
MK
68 Base = MemoryMapEntry->Base;\r
69 Size = MemoryMapEntry->Size;\r
1e5e58d3
PR
70\r
71 Attribue = EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
72 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
73 EFI_RESOURCE_ATTRIBUTE_TESTED |\r
74 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
75 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
76 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
77 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE;\r
78\r
79 BuildResourceDescriptorHob (Type, Attribue, (EFI_PHYSICAL_ADDRESS)Base, Size);\r
e5efcf8b 80 DEBUG ((DEBUG_INFO, "buildhob: base = 0x%lx, size = 0x%lx, type = 0x%x\n", Base, Size, Type));\r
1e5e58d3 81\r
e5efcf8b
MK
82 if ((MemoryMapEntry->Type == E820_UNUSABLE) ||\r
83 (MemoryMapEntry->Type == E820_DISABLED))\r
84 {\r
1e5e58d3
PR
85 BuildMemoryAllocationHob (Base, Size, EfiUnusableMemory);\r
86 } else if (MemoryMapEntry->Type == E820_PMEM) {\r
87 BuildMemoryAllocationHob (Base, Size, EfiPersistentMemory);\r
88 }\r
89\r
90 return EFI_SUCCESS;\r
91}\r
92\r
1e5e58d3
PR
93/**\r
94 Callback function to find TOLUD (Top of Lower Usable DRAM)\r
95\r
96 Estimate where TOLUD (Top of Lower Usable DRAM) resides. The exact position\r
97 would require platform specific code.\r
98\r
99 @param MemoryMapEntry Memory map entry info got from bootloader.\r
100 @param Params Not used for now.\r
101\r
102 @retval EFI_SUCCESS Successfully updated mTopOfLowerUsableDram.\r
103**/\r
104EFI_STATUS\r
105FindToludCallback (\r
e5efcf8b
MK
106 IN MEMORY_MAP_ENTRY *MemoryMapEntry,\r
107 IN VOID *Params\r
1e5e58d3
PR
108 )\r
109{\r
110 //\r
111 // This code assumes that the memory map on this x86 machine below 4GiB is continous\r
112 // until TOLUD. In addition it assumes that the bootloader provided memory tables have\r
113 // no "holes" and thus the first memory range not covered by e820 marks the end of\r
114 // usable DRAM. In addition it's assumed that every reserved memory region touching\r
115 // usable RAM is also covering DRAM, everything else that is marked reserved thus must be\r
116 // MMIO not detectable by bootloader/OS\r
117 //\r
118\r
119 //\r
120 // Skip memory types not RAM or reserved\r
121 //\r
122 if ((MemoryMapEntry->Type == E820_UNUSABLE) || (MemoryMapEntry->Type == E820_DISABLED) ||\r
e5efcf8b
MK
123 (MemoryMapEntry->Type == E820_PMEM))\r
124 {\r
1e5e58d3
PR
125 return EFI_SUCCESS;\r
126 }\r
127\r
128 //\r
129 // Skip resources above 4GiB\r
130 //\r
131 if ((MemoryMapEntry->Base + MemoryMapEntry->Size) > 0x100000000ULL) {\r
132 return EFI_SUCCESS;\r
133 }\r
134\r
135 if ((MemoryMapEntry->Type == E820_RAM) || (MemoryMapEntry->Type == E820_ACPI) ||\r
e5efcf8b
MK
136 (MemoryMapEntry->Type == E820_NVS))\r
137 {\r
1e5e58d3
PR
138 //\r
139 // It's usable DRAM. Update TOLUD.\r
140 //\r
141 if (mTopOfLowerUsableDram < (MemoryMapEntry->Base + MemoryMapEntry->Size)) {\r
142 mTopOfLowerUsableDram = (UINT32)(MemoryMapEntry->Base + MemoryMapEntry->Size);\r
143 }\r
144 } else {\r
145 //\r
146 // It might be 'reserved DRAM' or 'MMIO'.\r
147 //\r
148 // If it touches usable DRAM at Base assume it's DRAM as well,\r
149 // as it could be bootloader installed tables, TSEG, GTT, ...\r
150 //\r
151 if (mTopOfLowerUsableDram == MemoryMapEntry->Base) {\r
152 mTopOfLowerUsableDram = (UINT32)(MemoryMapEntry->Base + MemoryMapEntry->Size);\r
153 }\r
154 }\r
155\r
156 return EFI_SUCCESS;\r
157}\r
158\r
1e5e58d3
PR
159/**\r
160 Callback function to build resource descriptor HOB\r
161\r
162 This function build a HOB based on the memory map entry info.\r
163 Only add EFI_RESOURCE_SYSTEM_MEMORY.\r
04af8bf2 164\r
7c4ab1c2
GD
165 @param MemoryMapEntry Memory map entry info got from bootloader.\r
166 @param Params Not used for now.\r
04af8bf2 167\r
7c4ab1c2 168 @retval RETURN_SUCCESS Successfully build a HOB.\r
04af8bf2 169**/\r
7c4ab1c2
GD
170EFI_STATUS\r
171MemInfoCallback (\r
e5efcf8b
MK
172 IN MEMORY_MAP_ENTRY *MemoryMapEntry,\r
173 IN VOID *Params\r
04af8bf2
DG
174 )\r
175{\r
7c4ab1c2
GD
176 EFI_PHYSICAL_ADDRESS Base;\r
177 EFI_RESOURCE_TYPE Type;\r
178 UINT64 Size;\r
179 EFI_RESOURCE_ATTRIBUTE_TYPE Attribue;\r
04af8bf2 180\r
1e5e58d3
PR
181 //\r
182 // Skip everything not known to be usable DRAM.\r
183 // It will be added later.\r
184 //\r
185 if ((MemoryMapEntry->Type != E820_RAM) && (MemoryMapEntry->Type != E820_ACPI) &&\r
e5efcf8b
MK
186 (MemoryMapEntry->Type != E820_NVS))\r
187 {\r
1e5e58d3
PR
188 return RETURN_SUCCESS;\r
189 }\r
190\r
e5efcf8b
MK
191 Type = EFI_RESOURCE_SYSTEM_MEMORY;\r
192 Base = MemoryMapEntry->Base;\r
193 Size = MemoryMapEntry->Size;\r
04af8bf2 194\r
7c4ab1c2
GD
195 Attribue = EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
196 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
197 EFI_RESOURCE_ATTRIBUTE_TESTED |\r
198 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
199 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
200 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
201 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE;\r
04af8bf2 202\r
7c4ab1c2 203 BuildResourceDescriptorHob (Type, Attribue, (EFI_PHYSICAL_ADDRESS)Base, Size);\r
e5efcf8b 204 DEBUG ((DEBUG_INFO, "buildhob: base = 0x%lx, size = 0x%lx, type = 0x%x\n", Base, Size, Type));\r
04af8bf2 205\r
1e5e58d3
PR
206 if (MemoryMapEntry->Type == E820_ACPI) {\r
207 BuildMemoryAllocationHob (Base, Size, EfiACPIReclaimMemory);\r
208 } else if (MemoryMapEntry->Type == E820_NVS) {\r
209 BuildMemoryAllocationHob (Base, Size, EfiACPIMemoryNVS);\r
210 }\r
211\r
7c4ab1c2 212 return RETURN_SUCCESS;\r
04af8bf2
DG
213}\r
214\r
04af8bf2 215/**\r
7c4ab1c2 216 It will build HOBs based on information from bootloaders.\r
04af8bf2 217\r
7c4ab1c2
GD
218 @retval EFI_SUCCESS If it completed successfully.\r
219 @retval Others If it failed to build required HOBs.\r
04af8bf2
DG
220**/\r
221EFI_STATUS\r
7c4ab1c2
GD
222BuildHobFromBl (\r
223 VOID\r
04af8bf2
DG
224 )\r
225{\r
e5efcf8b
MK
226 EFI_STATUS Status;\r
227 ACPI_BOARD_INFO *AcpiBoardInfo;\r
228 EFI_PEI_GRAPHICS_INFO_HOB GfxInfo;\r
229 EFI_PEI_GRAPHICS_INFO_HOB *NewGfxInfo;\r
230 EFI_PEI_GRAPHICS_DEVICE_INFO_HOB GfxDeviceInfo;\r
231 EFI_PEI_GRAPHICS_DEVICE_INFO_HOB *NewGfxDeviceInfo;\r
232 UNIVERSAL_PAYLOAD_SMBIOS_TABLE *SmBiosTableHob;\r
233 UNIVERSAL_PAYLOAD_ACPI_TABLE *AcpiTableHob;\r
04af8bf2 234\r
04af8bf2 235 //\r
1e5e58d3
PR
236 // First find TOLUD\r
237 //\r
e5efcf8b 238 DEBUG ((DEBUG_INFO, "Guessing Top of Lower Usable DRAM:\n"));\r
1e5e58d3 239 Status = ParseMemoryInfo (FindToludCallback, NULL);\r
e5efcf8b 240 if (EFI_ERROR (Status)) {\r
1e5e58d3
PR
241 return Status;\r
242 }\r
e5efcf8b
MK
243\r
244 DEBUG ((DEBUG_INFO, "Assuming TOLUD = 0x%x\n", mTopOfLowerUsableDram));\r
1e5e58d3
PR
245\r
246 //\r
247 // Parse memory info and build memory HOBs for Usable RAM\r
04af8bf2 248 //\r
e5efcf8b 249 DEBUG ((DEBUG_INFO, "Building ResourceDescriptorHobs for usable memory:\n"));\r
7c4ab1c2 250 Status = ParseMemoryInfo (MemInfoCallback, NULL);\r
e5efcf8b 251 if (EFI_ERROR (Status)) {\r
04af8bf2
DG
252 return Status;\r
253 }\r
254\r
04af8bf2
DG
255 //\r
256 // Create guid hob for frame buffer information\r
257 //\r
258 Status = ParseGfxInfo (&GfxInfo);\r
259 if (!EFI_ERROR (Status)) {\r
260 NewGfxInfo = BuildGuidHob (&gEfiGraphicsInfoHobGuid, sizeof (GfxInfo));\r
261 ASSERT (NewGfxInfo != NULL);\r
262 CopyMem (NewGfxInfo, &GfxInfo, sizeof (GfxInfo));\r
263 DEBUG ((DEBUG_INFO, "Created graphics info hob\n"));\r
264 }\r
265\r
04af8bf2
DG
266 Status = ParseGfxDeviceInfo (&GfxDeviceInfo);\r
267 if (!EFI_ERROR (Status)) {\r
268 NewGfxDeviceInfo = BuildGuidHob (&gEfiGraphicsDeviceInfoHobGuid, sizeof (GfxDeviceInfo));\r
269 ASSERT (NewGfxDeviceInfo != NULL);\r
270 CopyMem (NewGfxDeviceInfo, &GfxDeviceInfo, sizeof (GfxDeviceInfo));\r
271 DEBUG ((DEBUG_INFO, "Created graphics device info hob\n"));\r
272 }\r
273\r
302a8f35
ZL
274 //\r
275 // Creat SmBios table Hob\r
276 //\r
277 SmBiosTableHob = BuildGuidHob (&gUniversalPayloadSmbiosTableGuid, sizeof (UNIVERSAL_PAYLOAD_SMBIOS_TABLE));\r
278 ASSERT (SmBiosTableHob != NULL);\r
279 SmBiosTableHob->Header.Revision = UNIVERSAL_PAYLOAD_SMBIOS_TABLE_REVISION;\r
e5efcf8b 280 SmBiosTableHob->Header.Length = sizeof (UNIVERSAL_PAYLOAD_SMBIOS_TABLE);\r
302a8f35 281 DEBUG ((DEBUG_INFO, "Create smbios table gUniversalPayloadSmbiosTableGuid guid hob\n"));\r
e5efcf8b 282 Status = ParseSmbiosTable (SmBiosTableHob);\r
e7663fdd
KBT
283 if (!EFI_ERROR (Status)) {\r
284 DEBUG ((DEBUG_INFO, "Detected Smbios Table at 0x%lx\n", SmBiosTableHob->SmBiosEntryPoint));\r
285 }\r
04af8bf2 286\r
8c0d6780
ZL
287 //\r
288 // Creat ACPI table Hob\r
289 //\r
290 AcpiTableHob = BuildGuidHob (&gUniversalPayloadAcpiTableGuid, sizeof (UNIVERSAL_PAYLOAD_ACPI_TABLE));\r
291 ASSERT (AcpiTableHob != NULL);\r
292 AcpiTableHob->Header.Revision = UNIVERSAL_PAYLOAD_ACPI_TABLE_REVISION;\r
e5efcf8b 293 AcpiTableHob->Header.Length = sizeof (UNIVERSAL_PAYLOAD_ACPI_TABLE);\r
e7663fdd 294 DEBUG ((DEBUG_INFO, "Create ACPI table gUniversalPayloadAcpiTableGuid guid hob\n"));\r
e5efcf8b 295 Status = ParseAcpiTableInfo (AcpiTableHob);\r
e7663fdd
KBT
296 if (!EFI_ERROR (Status)) {\r
297 DEBUG ((DEBUG_INFO, "Detected ACPI Table at 0x%lx\n", AcpiTableHob->Rsdp));\r
298 }\r
8c0d6780 299\r
04af8bf2
DG
300 //\r
301 // Create guid hob for acpi board information\r
302 //\r
e7663fdd 303 AcpiBoardInfo = BuildHobFromAcpi (AcpiTableHob->Rsdp);\r
cc5a6726 304 ASSERT (AcpiBoardInfo != NULL);\r
04af8bf2 305\r
1e5e58d3
PR
306 //\r
307 // Parse memory info and build memory HOBs for reserved DRAM and MMIO\r
308 //\r
e5efcf8b 309 DEBUG ((DEBUG_INFO, "Building ResourceDescriptorHobs for reserved memory:\n"));\r
cc5a6726 310 Status = ParseMemoryInfo (MemInfoCallbackMmio, AcpiBoardInfo);\r
e5efcf8b 311 if (EFI_ERROR (Status)) {\r
1e5e58d3
PR
312 return Status;\r
313 }\r
314\r
978d428e
MM
315 //\r
316 // Parse the misc info provided by bootloader\r
317 //\r
318 Status = ParseMiscInfo ();\r
319 if (EFI_ERROR (Status)) {\r
320 DEBUG ((DEBUG_WARN, "Error when parsing misc info, Status = %r\n", Status));\r
321 }\r
322\r
04af8bf2
DG
323 //\r
324 // Parse platform specific information.\r
325 //\r
326 Status = ParsePlatformInfo ();\r
327 if (EFI_ERROR (Status)) {\r
328 DEBUG ((DEBUG_ERROR, "Error when parsing platform info, Status = %r\n", Status));\r
329 return Status;\r
330 }\r
331\r
7c4ab1c2
GD
332 return EFI_SUCCESS;\r
333}\r
334\r
7c4ab1c2
GD
335/**\r
336 This function will build some generic HOBs that doesn't depend on information from bootloaders.\r
337\r
338**/\r
339VOID\r
340BuildGenericHob (\r
341 VOID\r
342 )\r
343{\r
e5efcf8b
MK
344 UINT32 RegEax;\r
345 UINT8 PhysicalAddressBits;\r
346 EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttribute;\r
7c4ab1c2
GD
347\r
348 // The UEFI payload FV\r
349 BuildMemoryAllocationHob (PcdGet32 (PcdPayloadFdMemBase), PcdGet32 (PcdPayloadFdMemSize), EfiBootServicesData);\r
350\r
351 //\r
352 // Build CPU memory space and IO space hob\r
353 //\r
354 AsmCpuid (0x80000000, &RegEax, NULL, NULL, NULL);\r
355 if (RegEax >= 0x80000008) {\r
356 AsmCpuid (0x80000008, &RegEax, NULL, NULL, NULL);\r
e5efcf8b 357 PhysicalAddressBits = (UINT8)RegEax;\r
7c4ab1c2 358 } else {\r
e5efcf8b 359 PhysicalAddressBits = 36;\r
7c4ab1c2
GD
360 }\r
361\r
362 BuildCpuHob (PhysicalAddressBits, 16);\r
363\r
364 //\r
365 // Report Local APIC range, cause sbl HOB to be NULL, comment now\r
366 //\r
367 ResourceAttribute = (\r
e5efcf8b
MK
368 EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
369 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
370 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
371 EFI_RESOURCE_ATTRIBUTE_TESTED\r
372 );\r
7c4ab1c2 373 BuildResourceDescriptorHob (EFI_RESOURCE_MEMORY_MAPPED_IO, ResourceAttribute, 0xFEC80000, SIZE_512KB);\r
e5efcf8b 374 BuildMemoryAllocationHob (0xFEC80000, SIZE_512KB, EfiMemoryMappedIO);\r
7c4ab1c2
GD
375}\r
376\r
7c4ab1c2
GD
377/**\r
378 Entry point to the C language phase of UEFI payload.\r
379\r
6ef57974
GD
380 @param[in] BootloaderParameter The starting address of bootloader parameter block.\r
381\r
7c4ab1c2
GD
382 @retval It will not return if SUCCESS, and return error when passing bootloader parameter.\r
383**/\r
384EFI_STATUS\r
385EFIAPI\r
422e5d2f 386_ModuleEntryPoint (\r
e5efcf8b 387 IN UINTN BootloaderParameter\r
7c4ab1c2
GD
388 )\r
389{\r
e5efcf8b
MK
390 EFI_STATUS Status;\r
391 PHYSICAL_ADDRESS DxeCoreEntryPoint;\r
392 UINTN MemBase;\r
393 UINTN HobMemBase;\r
394 UINTN HobMemTop;\r
395 EFI_PEI_HOB_POINTERS Hob;\r
396 SERIAL_PORT_INFO SerialPortInfo;\r
422e5d2f 397 UNIVERSAL_PAYLOAD_SERIAL_PORT_INFO *UniversalSerialPort;\r
7c4ab1c2 398\r
f10a112f
GD
399 Status = PcdSet64S (PcdBootloaderParameter, BootloaderParameter);\r
400 ASSERT_EFI_ERROR (Status);\r
401\r
7c4ab1c2
GD
402 // Initialize floating point operating environment to be compliant with UEFI spec.\r
403 InitializeFloatingPointUnits ();\r
404\r
405 // HOB region is used for HOB and memory allocation for this module\r
406 MemBase = PcdGet32 (PcdPayloadFdMemBase);\r
407 HobMemBase = ALIGN_VALUE (MemBase + PcdGet32 (PcdPayloadFdMemSize), SIZE_1MB);\r
408 HobMemTop = HobMemBase + FixedPcdGet32 (PcdSystemMemoryUefiRegionSize);\r
409\r
d63595c3 410 HobConstructor ((VOID *)MemBase, (VOID *)HobMemTop, (VOID *)HobMemBase, (VOID *)HobMemTop);\r
7c4ab1c2 411\r
422e5d2f
GD
412 //\r
413 // Build serial port info\r
414 //\r
415 Status = ParseSerialInfo (&SerialPortInfo);\r
416 if (!EFI_ERROR (Status)) {\r
417 UniversalSerialPort = BuildGuidHob (&gUniversalPayloadSerialPortInfoGuid, sizeof (UNIVERSAL_PAYLOAD_SERIAL_PORT_INFO));\r
418 ASSERT (UniversalSerialPort != NULL);\r
419 UniversalSerialPort->Header.Revision = UNIVERSAL_PAYLOAD_SERIAL_PORT_INFO_REVISION;\r
420 UniversalSerialPort->Header.Length = sizeof (UNIVERSAL_PAYLOAD_SERIAL_PORT_INFO);\r
e5efcf8b 421 UniversalSerialPort->UseMmio = (SerialPortInfo.Type == 1) ? FALSE : TRUE;\r
422e5d2f
GD
422 UniversalSerialPort->RegisterBase = SerialPortInfo.BaseAddr;\r
423 UniversalSerialPort->BaudRate = SerialPortInfo.Baud;\r
424 UniversalSerialPort->RegisterStride = (UINT8)SerialPortInfo.RegWidth;\r
425 }\r
426\r
427 // The library constructors might depend on serial port, so call it after serial port hob\r
428 ProcessLibraryConstructorList ();\r
e5efcf8b 429 DEBUG ((DEBUG_INFO, "sizeof(UINTN) = 0x%x\n", sizeof (UINTN)));\r
422e5d2f 430\r
7c4ab1c2
GD
431 // Build HOB based on information from Bootloader\r
432 Status = BuildHobFromBl ();\r
433 if (EFI_ERROR (Status)) {\r
434 DEBUG ((DEBUG_ERROR, "BuildHobFromBl Status = %r\n", Status));\r
435 return Status;\r
436 }\r
437\r
438 // Build other HOBs required by DXE\r
439 BuildGenericHob ();\r
440\r
441 // Load the DXE Core\r
442 Status = LoadDxeCore (&DxeCoreEntryPoint);\r
443 ASSERT_EFI_ERROR (Status);\r
444\r
445 DEBUG ((DEBUG_INFO, "DxeCoreEntryPoint = 0x%lx\n", DxeCoreEntryPoint));\r
446\r
04af8bf2
DG
447 //\r
448 // Mask off all legacy 8259 interrupt sources\r
449 //\r
450 IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);\r
e5efcf8b 451 IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);\r
04af8bf2 452\r
e5efcf8b 453 Hob.HandoffInformationTable = (EFI_HOB_HANDOFF_INFO_TABLE *)GetFirstHob (EFI_HOB_TYPE_HANDOFF);\r
7c4ab1c2
GD
454 HandOffToDxeCore (DxeCoreEntryPoint, Hob);\r
455\r
456 // Should not get here\r
457 CpuDeadLoop ();\r
04af8bf2
DG
458 return EFI_SUCCESS;\r
459}\r