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