]> git.proxmox.com Git - mirror_edk2.git/blame - UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c
UefiPayloadPkg: Fix the build failure for non-universal payload
[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
1e5e58d3
PR
10STATIC UINT32 mTopOfLowerUsableDram = 0;\r
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
91a978ce 27 IN MEMORY_MAP_ENTRY *MemoryMapEntry,\r
1e5e58d3
PR
28 IN VOID *Params\r
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
45 if (MemoryMapEntry->Type == E820_RAM || MemoryMapEntry->Type == E820_ACPI) {\r
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
68 Base = MemoryMapEntry->Base;\r
69 Size = MemoryMapEntry->Size;\r
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
80 DEBUG ((DEBUG_INFO , "buildhob: base = 0x%lx, size = 0x%lx, type = 0x%x\n", Base, Size, Type));\r
81\r
82 if (MemoryMapEntry->Type == E820_UNUSABLE ||\r
83 MemoryMapEntry->Type == E820_DISABLED) {\r
84 BuildMemoryAllocationHob (Base, Size, EfiUnusableMemory);\r
85 } else if (MemoryMapEntry->Type == E820_PMEM) {\r
86 BuildMemoryAllocationHob (Base, Size, EfiPersistentMemory);\r
87 }\r
88\r
89 return EFI_SUCCESS;\r
90}\r
91\r
92\r
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
90246a6d 106 IN MEMORY_MAP_ENTRY *MemoryMapEntry,\r
1e5e58d3
PR
107 IN VOID *Params\r
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
123 (MemoryMapEntry->Type == E820_PMEM)) {\r
124 return EFI_SUCCESS;\r
125 }\r
126\r
127 //\r
128 // Skip resources above 4GiB\r
129 //\r
130 if ((MemoryMapEntry->Base + MemoryMapEntry->Size) > 0x100000000ULL) {\r
131 return EFI_SUCCESS;\r
132 }\r
133\r
134 if ((MemoryMapEntry->Type == E820_RAM) || (MemoryMapEntry->Type == E820_ACPI) ||\r
135 (MemoryMapEntry->Type == E820_NVS)) {\r
136 //\r
137 // It's usable DRAM. Update TOLUD.\r
138 //\r
139 if (mTopOfLowerUsableDram < (MemoryMapEntry->Base + MemoryMapEntry->Size)) {\r
140 mTopOfLowerUsableDram = (UINT32)(MemoryMapEntry->Base + MemoryMapEntry->Size);\r
141 }\r
142 } else {\r
143 //\r
144 // It might be 'reserved DRAM' or 'MMIO'.\r
145 //\r
146 // If it touches usable DRAM at Base assume it's DRAM as well,\r
147 // as it could be bootloader installed tables, TSEG, GTT, ...\r
148 //\r
149 if (mTopOfLowerUsableDram == MemoryMapEntry->Base) {\r
150 mTopOfLowerUsableDram = (UINT32)(MemoryMapEntry->Base + MemoryMapEntry->Size);\r
151 }\r
152 }\r
153\r
154 return EFI_SUCCESS;\r
155}\r
156\r
157\r
158/**\r
159 Callback function to build resource descriptor HOB\r
160\r
161 This function build a HOB based on the memory map entry info.\r
162 Only add EFI_RESOURCE_SYSTEM_MEMORY.\r
04af8bf2 163\r
7c4ab1c2
GD
164 @param MemoryMapEntry Memory map entry info got from bootloader.\r
165 @param Params Not used for now.\r
04af8bf2 166\r
7c4ab1c2 167 @retval RETURN_SUCCESS Successfully build a HOB.\r
04af8bf2 168**/\r
7c4ab1c2
GD
169EFI_STATUS\r
170MemInfoCallback (\r
90246a6d 171 IN MEMORY_MAP_ENTRY *MemoryMapEntry,\r
7c4ab1c2 172 IN VOID *Params\r
04af8bf2
DG
173 )\r
174{\r
7c4ab1c2
GD
175 EFI_PHYSICAL_ADDRESS Base;\r
176 EFI_RESOURCE_TYPE Type;\r
177 UINT64 Size;\r
178 EFI_RESOURCE_ATTRIBUTE_TYPE Attribue;\r
04af8bf2 179\r
1e5e58d3
PR
180 //\r
181 // Skip everything not known to be usable DRAM.\r
182 // It will be added later.\r
183 //\r
184 if ((MemoryMapEntry->Type != E820_RAM) && (MemoryMapEntry->Type != E820_ACPI) &&\r
185 (MemoryMapEntry->Type != E820_NVS)) {\r
186 return RETURN_SUCCESS;\r
187 }\r
188\r
189 Type = EFI_RESOURCE_SYSTEM_MEMORY;\r
7c4ab1c2
GD
190 Base = MemoryMapEntry->Base;\r
191 Size = MemoryMapEntry->Size;\r
04af8bf2 192\r
7c4ab1c2
GD
193 Attribue = EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
194 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
195 EFI_RESOURCE_ATTRIBUTE_TESTED |\r
196 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
197 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
198 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
199 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE;\r
04af8bf2 200\r
7c4ab1c2
GD
201 BuildResourceDescriptorHob (Type, Attribue, (EFI_PHYSICAL_ADDRESS)Base, Size);\r
202 DEBUG ((DEBUG_INFO , "buildhob: base = 0x%lx, size = 0x%lx, type = 0x%x\n", Base, Size, Type));\r
04af8bf2 203\r
1e5e58d3
PR
204 if (MemoryMapEntry->Type == E820_ACPI) {\r
205 BuildMemoryAllocationHob (Base, Size, EfiACPIReclaimMemory);\r
206 } else if (MemoryMapEntry->Type == E820_NVS) {\r
207 BuildMemoryAllocationHob (Base, Size, EfiACPIMemoryNVS);\r
208 }\r
209\r
7c4ab1c2 210 return RETURN_SUCCESS;\r
04af8bf2
DG
211}\r
212\r
213\r
7c4ab1c2 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
226 EFI_STATUS Status;\r
04af8bf2
DG
227 SYSTEM_TABLE_INFO SysTableInfo;\r
228 SYSTEM_TABLE_INFO *NewSysTableInfo;\r
cc5a6726 229 ACPI_BOARD_INFO *AcpiBoardInfo;\r
04af8bf2
DG
230 EFI_PEI_GRAPHICS_INFO_HOB GfxInfo;\r
231 EFI_PEI_GRAPHICS_INFO_HOB *NewGfxInfo;\r
232 EFI_PEI_GRAPHICS_DEVICE_INFO_HOB GfxDeviceInfo;\r
233 EFI_PEI_GRAPHICS_DEVICE_INFO_HOB *NewGfxDeviceInfo;\r
302a8f35 234 UNIVERSAL_PAYLOAD_SMBIOS_TABLE *SmBiosTableHob;\r
8c0d6780 235 UNIVERSAL_PAYLOAD_ACPI_TABLE *AcpiTableHob;\r
04af8bf2 236\r
04af8bf2 237 //\r
1e5e58d3
PR
238 // First find TOLUD\r
239 //\r
240 DEBUG ((DEBUG_INFO , "Guessing Top of Lower Usable DRAM:\n"));\r
241 Status = ParseMemoryInfo (FindToludCallback, NULL);\r
242 if (EFI_ERROR(Status)) {\r
243 return Status;\r
244 }\r
245 DEBUG ((DEBUG_INFO , "Assuming TOLUD = 0x%x\n", mTopOfLowerUsableDram));\r
246\r
247 //\r
248 // Parse memory info and build memory HOBs for Usable RAM\r
04af8bf2 249 //\r
1e5e58d3 250 DEBUG ((DEBUG_INFO , "Building ResourceDescriptorHobs for usable memory:\n"));\r
7c4ab1c2 251 Status = ParseMemoryInfo (MemInfoCallback, NULL);\r
04af8bf2
DG
252 if (EFI_ERROR(Status)) {\r
253 return Status;\r
254 }\r
255\r
04af8bf2
DG
256 //\r
257 // Create guid hob for frame buffer information\r
258 //\r
259 Status = ParseGfxInfo (&GfxInfo);\r
260 if (!EFI_ERROR (Status)) {\r
261 NewGfxInfo = BuildGuidHob (&gEfiGraphicsInfoHobGuid, sizeof (GfxInfo));\r
262 ASSERT (NewGfxInfo != NULL);\r
263 CopyMem (NewGfxInfo, &GfxInfo, sizeof (GfxInfo));\r
264 DEBUG ((DEBUG_INFO, "Created graphics info hob\n"));\r
265 }\r
266\r
267\r
268 Status = ParseGfxDeviceInfo (&GfxDeviceInfo);\r
269 if (!EFI_ERROR (Status)) {\r
270 NewGfxDeviceInfo = BuildGuidHob (&gEfiGraphicsDeviceInfoHobGuid, sizeof (GfxDeviceInfo));\r
271 ASSERT (NewGfxDeviceInfo != NULL);\r
272 CopyMem (NewGfxDeviceInfo, &GfxDeviceInfo, sizeof (GfxDeviceInfo));\r
273 DEBUG ((DEBUG_INFO, "Created graphics device info hob\n"));\r
274 }\r
275\r
276\r
277 //\r
278 // Create guid hob for system tables like acpi table and smbios table\r
279 //\r
280 Status = ParseSystemTable(&SysTableInfo);\r
281 ASSERT_EFI_ERROR (Status);\r
282 if (!EFI_ERROR (Status)) {\r
283 NewSysTableInfo = BuildGuidHob (&gUefiSystemTableInfoGuid, sizeof (SYSTEM_TABLE_INFO));\r
284 ASSERT (NewSysTableInfo != NULL);\r
285 CopyMem (NewSysTableInfo, &SysTableInfo, sizeof (SYSTEM_TABLE_INFO));\r
286 DEBUG ((DEBUG_INFO, "Detected Acpi Table at 0x%lx, length 0x%x\n", SysTableInfo.AcpiTableBase, SysTableInfo.AcpiTableSize));\r
287 DEBUG ((DEBUG_INFO, "Detected Smbios Table at 0x%lx, length 0x%x\n", SysTableInfo.SmbiosTableBase, SysTableInfo.SmbiosTableSize));\r
288 }\r
302a8f35
ZL
289 //\r
290 // Creat SmBios table Hob\r
291 //\r
292 SmBiosTableHob = BuildGuidHob (&gUniversalPayloadSmbiosTableGuid, sizeof (UNIVERSAL_PAYLOAD_SMBIOS_TABLE));\r
293 ASSERT (SmBiosTableHob != NULL);\r
294 SmBiosTableHob->Header.Revision = UNIVERSAL_PAYLOAD_SMBIOS_TABLE_REVISION;\r
295 SmBiosTableHob->Header.Length = sizeof (UNIVERSAL_PAYLOAD_SMBIOS_TABLE);\r
296 SmBiosTableHob->SmBiosEntryPoint = SysTableInfo.SmbiosTableBase;\r
297 DEBUG ((DEBUG_INFO, "Create smbios table gUniversalPayloadSmbiosTableGuid guid hob\n"));\r
04af8bf2 298\r
8c0d6780
ZL
299 //\r
300 // Creat ACPI table Hob\r
301 //\r
302 AcpiTableHob = BuildGuidHob (&gUniversalPayloadAcpiTableGuid, sizeof (UNIVERSAL_PAYLOAD_ACPI_TABLE));\r
303 ASSERT (AcpiTableHob != NULL);\r
304 AcpiTableHob->Header.Revision = UNIVERSAL_PAYLOAD_ACPI_TABLE_REVISION;\r
305 AcpiTableHob->Header.Length = sizeof (UNIVERSAL_PAYLOAD_ACPI_TABLE);\r
306 AcpiTableHob->Rsdp = SysTableInfo.AcpiTableBase;\r
307 DEBUG ((DEBUG_INFO, "Create smbios table gUniversalPayloadAcpiTableGuid guid hob\n"));\r
308\r
04af8bf2
DG
309 //\r
310 // Create guid hob for acpi board information\r
311 //\r
cc5a6726
GD
312 AcpiBoardInfo = BuildHobFromAcpi (SysTableInfo.AcpiTableBase);\r
313 ASSERT (AcpiBoardInfo != NULL);\r
04af8bf2 314\r
1e5e58d3
PR
315 //\r
316 // Parse memory info and build memory HOBs for reserved DRAM and MMIO\r
317 //\r
318 DEBUG ((DEBUG_INFO , "Building ResourceDescriptorHobs for reserved memory:\n"));\r
cc5a6726 319 Status = ParseMemoryInfo (MemInfoCallbackMmio, AcpiBoardInfo);\r
1e5e58d3
PR
320 if (EFI_ERROR(Status)) {\r
321 return Status;\r
322 }\r
323\r
978d428e
MM
324 //\r
325 // Parse the misc info provided by bootloader\r
326 //\r
327 Status = ParseMiscInfo ();\r
328 if (EFI_ERROR (Status)) {\r
329 DEBUG ((DEBUG_WARN, "Error when parsing misc info, Status = %r\n", Status));\r
330 }\r
331\r
04af8bf2
DG
332 //\r
333 // Parse platform specific information.\r
334 //\r
335 Status = ParsePlatformInfo ();\r
336 if (EFI_ERROR (Status)) {\r
337 DEBUG ((DEBUG_ERROR, "Error when parsing platform info, Status = %r\n", Status));\r
338 return Status;\r
339 }\r
340\r
7c4ab1c2
GD
341 return EFI_SUCCESS;\r
342}\r
343\r
344\r
345/**\r
346 This function will build some generic HOBs that doesn't depend on information from bootloaders.\r
347\r
348**/\r
349VOID\r
350BuildGenericHob (\r
351 VOID\r
352 )\r
353{\r
354 UINT32 RegEax;\r
355 UINT8 PhysicalAddressBits;\r
356 EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttribute;\r
357\r
358 // The UEFI payload FV\r
359 BuildMemoryAllocationHob (PcdGet32 (PcdPayloadFdMemBase), PcdGet32 (PcdPayloadFdMemSize), EfiBootServicesData);\r
360\r
361 //\r
362 // Build CPU memory space and IO space hob\r
363 //\r
364 AsmCpuid (0x80000000, &RegEax, NULL, NULL, NULL);\r
365 if (RegEax >= 0x80000008) {\r
366 AsmCpuid (0x80000008, &RegEax, NULL, NULL, NULL);\r
367 PhysicalAddressBits = (UINT8) RegEax;\r
368 } else {\r
369 PhysicalAddressBits = 36;\r
370 }\r
371\r
372 BuildCpuHob (PhysicalAddressBits, 16);\r
373\r
374 //\r
375 // Report Local APIC range, cause sbl HOB to be NULL, comment now\r
376 //\r
377 ResourceAttribute = (\r
378 EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
379 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
380 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
381 EFI_RESOURCE_ATTRIBUTE_TESTED\r
382 );\r
383 BuildResourceDescriptorHob (EFI_RESOURCE_MEMORY_MAPPED_IO, ResourceAttribute, 0xFEC80000, SIZE_512KB);\r
384 BuildMemoryAllocationHob ( 0xFEC80000, SIZE_512KB, EfiMemoryMappedIO);\r
385\r
386}\r
387\r
388\r
389/**\r
390 Entry point to the C language phase of UEFI payload.\r
391\r
6ef57974
GD
392 @param[in] BootloaderParameter The starting address of bootloader parameter block.\r
393\r
7c4ab1c2
GD
394 @retval It will not return if SUCCESS, and return error when passing bootloader parameter.\r
395**/\r
396EFI_STATUS\r
397EFIAPI\r
422e5d2f 398_ModuleEntryPoint (\r
7c4ab1c2
GD
399 IN UINTN BootloaderParameter\r
400 )\r
401{\r
402 EFI_STATUS Status;\r
403 PHYSICAL_ADDRESS DxeCoreEntryPoint;\r
7c4ab1c2 404 UINTN MemBase;\r
7c4ab1c2
GD
405 UINTN HobMemBase;\r
406 UINTN HobMemTop;\r
407 EFI_PEI_HOB_POINTERS Hob;\r
422e5d2f
GD
408 SERIAL_PORT_INFO SerialPortInfo;\r
409 UNIVERSAL_PAYLOAD_SERIAL_PORT_INFO *UniversalSerialPort;\r
7c4ab1c2 410\r
f10a112f
GD
411 Status = PcdSet64S (PcdBootloaderParameter, BootloaderParameter);\r
412 ASSERT_EFI_ERROR (Status);\r
413\r
7c4ab1c2
GD
414 // Initialize floating point operating environment to be compliant with UEFI spec.\r
415 InitializeFloatingPointUnits ();\r
416\r
417 // HOB region is used for HOB and memory allocation for this module\r
418 MemBase = PcdGet32 (PcdPayloadFdMemBase);\r
419 HobMemBase = ALIGN_VALUE (MemBase + PcdGet32 (PcdPayloadFdMemSize), SIZE_1MB);\r
420 HobMemTop = HobMemBase + FixedPcdGet32 (PcdSystemMemoryUefiRegionSize);\r
421\r
d63595c3 422 HobConstructor ((VOID *)MemBase, (VOID *)HobMemTop, (VOID *)HobMemBase, (VOID *)HobMemTop);\r
7c4ab1c2 423\r
422e5d2f
GD
424 //\r
425 // Build serial port info\r
426 //\r
427 Status = ParseSerialInfo (&SerialPortInfo);\r
428 if (!EFI_ERROR (Status)) {\r
429 UniversalSerialPort = BuildGuidHob (&gUniversalPayloadSerialPortInfoGuid, sizeof (UNIVERSAL_PAYLOAD_SERIAL_PORT_INFO));\r
430 ASSERT (UniversalSerialPort != NULL);\r
431 UniversalSerialPort->Header.Revision = UNIVERSAL_PAYLOAD_SERIAL_PORT_INFO_REVISION;\r
432 UniversalSerialPort->Header.Length = sizeof (UNIVERSAL_PAYLOAD_SERIAL_PORT_INFO);\r
433 UniversalSerialPort->UseMmio = (SerialPortInfo.Type == 1)?FALSE:TRUE;\r
434 UniversalSerialPort->RegisterBase = SerialPortInfo.BaseAddr;\r
435 UniversalSerialPort->BaudRate = SerialPortInfo.Baud;\r
436 UniversalSerialPort->RegisterStride = (UINT8)SerialPortInfo.RegWidth;\r
437 }\r
438\r
439 // The library constructors might depend on serial port, so call it after serial port hob\r
440 ProcessLibraryConstructorList ();\r
441 DEBUG ((DEBUG_INFO, "sizeof(UINTN) = 0x%x\n", sizeof(UINTN)));\r
442\r
7c4ab1c2
GD
443 // Build HOB based on information from Bootloader\r
444 Status = BuildHobFromBl ();\r
445 if (EFI_ERROR (Status)) {\r
446 DEBUG ((DEBUG_ERROR, "BuildHobFromBl Status = %r\n", Status));\r
447 return Status;\r
448 }\r
449\r
450 // Build other HOBs required by DXE\r
451 BuildGenericHob ();\r
452\r
453 // Load the DXE Core\r
454 Status = LoadDxeCore (&DxeCoreEntryPoint);\r
455 ASSERT_EFI_ERROR (Status);\r
456\r
457 DEBUG ((DEBUG_INFO, "DxeCoreEntryPoint = 0x%lx\n", DxeCoreEntryPoint));\r
458\r
04af8bf2
DG
459 //\r
460 // Mask off all legacy 8259 interrupt sources\r
461 //\r
462 IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);\r
463 IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);\r
464\r
fea7901d 465 Hob.HandoffInformationTable = (EFI_HOB_HANDOFF_INFO_TABLE *) GetFirstHob(EFI_HOB_TYPE_HANDOFF);\r
7c4ab1c2
GD
466 HandOffToDxeCore (DxeCoreEntryPoint, Hob);\r
467\r
468 // Should not get here\r
469 CpuDeadLoop ();\r
04af8bf2
DG
470 return EFI_SUCCESS;\r
471}\r