]> git.proxmox.com Git - mirror_edk2.git/blame - UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
UefiPayloadPkg: Apply uncrustify changes
[mirror_edk2.git] / UefiPayloadPkg / UefiPayloadEntry / UniversalPayloadEntry.c
CommitLineData
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
26extern 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
33VOID\r
34PrintHob (\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
49EFI_STATUS\r
50FixUpPcdDatabase (\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
102VOID\r
103AddNewHob (\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
129EFI_HOB_RESOURCE_DESCRIPTOR *\r
130FindResourceDescriptorByRange (\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
185EFI_HOB_RESOURCE_DESCRIPTOR *\r
186FindAnotherHighestBelow4GResourceDescriptor (\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
263EFI_STATUS\r
264BuildHobs (\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
401EFI_STATUS\r
402EFIAPI\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