]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c
MdeModulePkg DxeCore: Call PeCoffExtraActionLib member after Constructor
[mirror_edk2.git] / MdeModulePkg / Core / Dxe / DxeMain / DxeMain.c
CommitLineData
31f228cf 1/** @file\r
2 DXE Core Main Entry Point\r
3\r
a94d51bd 4Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>\r
cd5ebaa0 5This program and the accompanying materials\r
31f228cf 6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "DxeMain.h"\r
16\r
17//\r
18// DXE Core Global Variables for Protocols from PEI\r
19//\r
20EFI_HANDLE mDecompressHandle = NULL;\r
21\r
22//\r
23// DXE Core globals for Architecture Protocols\r
24//\r
25EFI_SECURITY_ARCH_PROTOCOL *gSecurity = NULL;\r
bc2dfdbc 26EFI_SECURITY2_ARCH_PROTOCOL *gSecurity2 = NULL;\r
31f228cf 27EFI_CPU_ARCH_PROTOCOL *gCpu = NULL;\r
28EFI_METRONOME_ARCH_PROTOCOL *gMetronome = NULL;\r
29EFI_TIMER_ARCH_PROTOCOL *gTimer = NULL;\r
30EFI_BDS_ARCH_PROTOCOL *gBds = NULL;\r
31EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *gWatchdogTimer = NULL;\r
32\r
0803854b 33//\r
34// DXE Core globals for optional protocol dependencies\r
35//\r
36EFI_SMM_BASE2_PROTOCOL *gSmmBase2 = NULL;\r
37\r
31f228cf 38//\r
39// DXE Core Global used to update core loaded image protocol handle\r
40//\r
41EFI_GUID *gDxeCoreFileName;\r
42EFI_LOADED_IMAGE_PROTOCOL *gDxeCoreLoadedImage;\r
43\r
44//\r
45// DXE Core Module Variables\r
46//\r
47EFI_BOOT_SERVICES mBootServices = {\r
48 {\r
49 EFI_BOOT_SERVICES_SIGNATURE, // Signature\r
50 EFI_BOOT_SERVICES_REVISION, // Revision\r
51 sizeof (EFI_BOOT_SERVICES), // HeaderSize\r
52 0, // CRC32\r
53 0 // Reserved\r
54 },\r
55 (EFI_RAISE_TPL) CoreRaiseTpl, // RaiseTPL\r
56 (EFI_RESTORE_TPL) CoreRestoreTpl, // RestoreTPL\r
57 (EFI_ALLOCATE_PAGES) CoreAllocatePages, // AllocatePages\r
58 (EFI_FREE_PAGES) CoreFreePages, // FreePages\r
59 (EFI_GET_MEMORY_MAP) CoreGetMemoryMap, // GetMemoryMap\r
60 (EFI_ALLOCATE_POOL) CoreAllocatePool, // AllocatePool\r
61 (EFI_FREE_POOL) CoreFreePool, // FreePool\r
62 (EFI_CREATE_EVENT) CoreCreateEvent, // CreateEvent\r
63 (EFI_SET_TIMER) CoreSetTimer, // SetTimer\r
64 (EFI_WAIT_FOR_EVENT) CoreWaitForEvent, // WaitForEvent\r
65 (EFI_SIGNAL_EVENT) CoreSignalEvent, // SignalEvent\r
66 (EFI_CLOSE_EVENT) CoreCloseEvent, // CloseEvent\r
67 (EFI_CHECK_EVENT) CoreCheckEvent, // CheckEvent\r
68 (EFI_INSTALL_PROTOCOL_INTERFACE) CoreInstallProtocolInterface, // InstallProtocolInterface\r
69 (EFI_REINSTALL_PROTOCOL_INTERFACE) CoreReinstallProtocolInterface, // ReinstallProtocolInterface\r
70 (EFI_UNINSTALL_PROTOCOL_INTERFACE) CoreUninstallProtocolInterface, // UninstallProtocolInterface\r
71 (EFI_HANDLE_PROTOCOL) CoreHandleProtocol, // HandleProtocol\r
72 (VOID *) NULL, // Reserved\r
73 (EFI_REGISTER_PROTOCOL_NOTIFY) CoreRegisterProtocolNotify, // RegisterProtocolNotify\r
74 (EFI_LOCATE_HANDLE) CoreLocateHandle, // LocateHandle\r
75 (EFI_LOCATE_DEVICE_PATH) CoreLocateDevicePath, // LocateDevicePath\r
76 (EFI_INSTALL_CONFIGURATION_TABLE) CoreInstallConfigurationTable, // InstallConfigurationTable\r
77 (EFI_IMAGE_LOAD) CoreLoadImage, // LoadImage\r
78 (EFI_IMAGE_START) CoreStartImage, // StartImage\r
79 (EFI_EXIT) CoreExit, // Exit\r
80 (EFI_IMAGE_UNLOAD) CoreUnloadImage, // UnloadImage\r
81 (EFI_EXIT_BOOT_SERVICES) CoreExitBootServices, // ExitBootServices\r
82 (EFI_GET_NEXT_MONOTONIC_COUNT) CoreEfiNotAvailableYetArg1, // GetNextMonotonicCount\r
83 (EFI_STALL) CoreStall, // Stall\r
84 (EFI_SET_WATCHDOG_TIMER) CoreSetWatchdogTimer, // SetWatchdogTimer\r
85 (EFI_CONNECT_CONTROLLER) CoreConnectController, // ConnectController\r
86 (EFI_DISCONNECT_CONTROLLER) CoreDisconnectController, // DisconnectController\r
87 (EFI_OPEN_PROTOCOL) CoreOpenProtocol, // OpenProtocol\r
88 (EFI_CLOSE_PROTOCOL) CoreCloseProtocol, // CloseProtocol\r
89 (EFI_OPEN_PROTOCOL_INFORMATION) CoreOpenProtocolInformation, // OpenProtocolInformation\r
90 (EFI_PROTOCOLS_PER_HANDLE) CoreProtocolsPerHandle, // ProtocolsPerHandle\r
91 (EFI_LOCATE_HANDLE_BUFFER) CoreLocateHandleBuffer, // LocateHandleBuffer\r
92 (EFI_LOCATE_PROTOCOL) CoreLocateProtocol, // LocateProtocol\r
93 (EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES) CoreInstallMultipleProtocolInterfaces, // InstallMultipleProtocolInterfaces\r
94 (EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES) CoreUninstallMultipleProtocolInterfaces, // UninstallMultipleProtocolInterfaces\r
95 (EFI_CALCULATE_CRC32) CoreEfiNotAvailableYetArg3, // CalculateCrc32\r
96 (EFI_COPY_MEM) CopyMem, // CopyMem\r
97 (EFI_SET_MEM) SetMem, // SetMem\r
98 (EFI_CREATE_EVENT_EX) CoreCreateEventEx // CreateEventEx\r
99};\r
100\r
101EFI_DXE_SERVICES mDxeServices = {\r
102 {\r
103 DXE_SERVICES_SIGNATURE, // Signature\r
104 DXE_SERVICES_REVISION, // Revision\r
105 sizeof (DXE_SERVICES), // HeaderSize\r
106 0, // CRC32\r
107 0 // Reserved\r
108 },\r
109 (EFI_ADD_MEMORY_SPACE) CoreAddMemorySpace, // AddMemorySpace\r
110 (EFI_ALLOCATE_MEMORY_SPACE) CoreAllocateMemorySpace, // AllocateMemorySpace\r
111 (EFI_FREE_MEMORY_SPACE) CoreFreeMemorySpace, // FreeMemorySpace\r
112 (EFI_REMOVE_MEMORY_SPACE) CoreRemoveMemorySpace, // RemoveMemorySpace\r
113 (EFI_GET_MEMORY_SPACE_DESCRIPTOR) CoreGetMemorySpaceDescriptor, // GetMemorySpaceDescriptor\r
114 (EFI_SET_MEMORY_SPACE_ATTRIBUTES) CoreSetMemorySpaceAttributes, // SetMemorySpaceAttributes\r
115 (EFI_GET_MEMORY_SPACE_MAP) CoreGetMemorySpaceMap, // GetMemorySpaceMap\r
116 (EFI_ADD_IO_SPACE) CoreAddIoSpace, // AddIoSpace\r
117 (EFI_ALLOCATE_IO_SPACE) CoreAllocateIoSpace, // AllocateIoSpace\r
118 (EFI_FREE_IO_SPACE) CoreFreeIoSpace, // FreeIoSpace\r
119 (EFI_REMOVE_IO_SPACE) CoreRemoveIoSpace, // RemoveIoSpace\r
120 (EFI_GET_IO_SPACE_DESCRIPTOR) CoreGetIoSpaceDescriptor, // GetIoSpaceDescriptor\r
121 (EFI_GET_IO_SPACE_MAP) CoreGetIoSpaceMap, // GetIoSpaceMap\r
122 (EFI_DISPATCH) CoreDispatcher, // Dispatch\r
123 (EFI_SCHEDULE) CoreSchedule, // Schedule\r
124 (EFI_TRUST) CoreTrust, // Trust\r
125 (EFI_PROCESS_FIRMWARE_VOLUME) CoreProcessFirmwareVolume, // ProcessFirmwareVolume\r
771ee501 126 (EFI_SET_MEMORY_SPACE_CAPABILITIES)CoreSetMemorySpaceCapabilities, // SetMemorySpaceCapabilities\r
31f228cf 127};\r
128\r
129EFI_SYSTEM_TABLE mEfiSystemTableTemplate = {\r
130 {\r
131 EFI_SYSTEM_TABLE_SIGNATURE, // Signature\r
132 EFI_SYSTEM_TABLE_REVISION, // Revision\r
133 sizeof (EFI_SYSTEM_TABLE), // HeaderSize\r
134 0, // CRC32\r
135 0 // Reserved\r
136 },\r
137 NULL, // FirmwareVendor\r
138 0, // FirmwareRevision\r
139 NULL, // ConsoleInHandle\r
140 NULL, // ConIn\r
141 NULL, // ConsoleOutHandle\r
142 NULL, // ConOut\r
143 NULL, // StandardErrorHandle\r
144 NULL, // StdErr\r
145 NULL, // RuntimeServices\r
146 &mBootServices, // BootServices\r
147 0, // NumberOfConfigurationTableEntries\r
148 NULL // ConfigurationTable\r
149};\r
150\r
151EFI_RUNTIME_SERVICES mEfiRuntimeServicesTableTemplate = {\r
152 {\r
153 EFI_RUNTIME_SERVICES_SIGNATURE, // Signature\r
154 EFI_RUNTIME_SERVICES_REVISION, // Revision\r
155 sizeof (EFI_RUNTIME_SERVICES), // HeaderSize\r
156 0, // CRC32\r
157 0 // Reserved\r
158 },\r
159 (EFI_GET_TIME) CoreEfiNotAvailableYetArg2, // GetTime\r
160 (EFI_SET_TIME) CoreEfiNotAvailableYetArg1, // SetTime\r
161 (EFI_GET_WAKEUP_TIME) CoreEfiNotAvailableYetArg3, // GetWakeupTime\r
162 (EFI_SET_WAKEUP_TIME) CoreEfiNotAvailableYetArg2, // SetWakeupTime\r
163 (EFI_SET_VIRTUAL_ADDRESS_MAP) CoreEfiNotAvailableYetArg4, // SetVirtualAddressMap\r
164 (EFI_CONVERT_POINTER) CoreEfiNotAvailableYetArg2, // ConvertPointer\r
165 (EFI_GET_VARIABLE) CoreEfiNotAvailableYetArg5, // GetVariable\r
166 (EFI_GET_NEXT_VARIABLE_NAME) CoreEfiNotAvailableYetArg3, // GetNextVariableName\r
167 (EFI_SET_VARIABLE) CoreEfiNotAvailableYetArg5, // SetVariable\r
168 (EFI_GET_NEXT_HIGH_MONO_COUNT) CoreEfiNotAvailableYetArg1, // GetNextHighMonotonicCount\r
169 (EFI_RESET_SYSTEM) CoreEfiNotAvailableYetArg4, // ResetSystem\r
170 (EFI_UPDATE_CAPSULE) CoreEfiNotAvailableYetArg3, // UpdateCapsule\r
171 (EFI_QUERY_CAPSULE_CAPABILITIES) CoreEfiNotAvailableYetArg4, // QueryCapsuleCapabilities\r
172 (EFI_QUERY_VARIABLE_INFO) CoreEfiNotAvailableYetArg4 // QueryVariableInfo\r
173};\r
174\r
175EFI_RUNTIME_ARCH_PROTOCOL gRuntimeTemplate = {\r
176 INITIALIZE_LIST_HEAD_VARIABLE (gRuntimeTemplate.ImageHead),\r
177 INITIALIZE_LIST_HEAD_VARIABLE (gRuntimeTemplate.EventHead),\r
178\r
179 //\r
180 // Make sure Size != sizeof (EFI_MEMORY_DESCRIPTOR). This will\r
181 // prevent people from having pointer math bugs in their code.\r
182 // now you have to use *DescriptorSize to make things work.\r
183 //\r
184 sizeof (EFI_MEMORY_DESCRIPTOR) + sizeof (UINT64) - (sizeof (EFI_MEMORY_DESCRIPTOR) % sizeof (UINT64)),\r
185 EFI_MEMORY_DESCRIPTOR_VERSION,\r
186 0,\r
187 NULL,\r
188 NULL,\r
189 FALSE,\r
190 FALSE\r
191};\r
192\r
193EFI_RUNTIME_ARCH_PROTOCOL *gRuntime = &gRuntimeTemplate;\r
194\r
195//\r
196// DXE Core Global Variables for the EFI System Table, Boot Services Table,\r
197// DXE Services Table, and Runtime Services Table\r
198//\r
199EFI_DXE_SERVICES *gDxeCoreDS = &mDxeServices;\r
200EFI_SYSTEM_TABLE *gDxeCoreST = NULL;\r
201\r
202//\r
203// For debug initialize gDxeCoreRT to template. gDxeCoreRT must be allocated from RT memory\r
204// but gDxeCoreRT is used for ASSERT () and DEBUG () type macros so lets give it\r
205// a value that will not cause debug infrastructure to crash early on.\r
206//\r
207EFI_RUNTIME_SERVICES *gDxeCoreRT = &mEfiRuntimeServicesTableTemplate;\r
208EFI_HANDLE gDxeCoreImageHandle = NULL;\r
209\r
210\r
211//\r
212// EFI Decompress Protocol\r
213//\r
214EFI_DECOMPRESS_PROTOCOL gEfiDecompress = {\r
215 DxeMainUefiDecompressGetInfo,\r
216 DxeMainUefiDecompress\r
217};\r
218\r
219//\r
e7af83ae 220// For Loading modules at fixed address feature, the configuration table is to cache the top address below which to load\r
221// Runtime code&boot time code\r
54ea99a7 222//\r
ebfb7bb5 223GLOBAL_REMOVE_IF_UNREFERENCED EFI_LOAD_FIXED_ADDRESS_CONFIGURATION_TABLE gLoadModuleAtFixAddressConfigurationTable = {0, 0};\r
54ea99a7 224\r
31f228cf 225// Main entry point to the DXE Core\r
226//\r
227\r
228/**\r
229 Main entry point to DXE Core.\r
230\r
231 @param HobStart Pointer to the beginning of the HOB List from PEI.\r
232\r
233 @return This function should never return.\r
234\r
235**/\r
236VOID\r
237EFIAPI\r
238DxeMain (\r
239 IN VOID *HobStart\r
240 )\r
241{\r
d0d41b52 242 EFI_STATUS Status;\r
243 EFI_PHYSICAL_ADDRESS MemoryBaseAddress;\r
244 UINT64 MemoryLength;\r
245 PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;\r
57f360f2
JF
246 UINTN Index;\r
247 EFI_HOB_GUID_TYPE *GuidHob;\r
248 EFI_VECTOR_HANDOFF_INFO *VectorInfoList;\r
249 EFI_VECTOR_HANDOFF_INFO *VectorInfo;\r
1cf4e933 250 VOID *EntryPoint;\r
31f228cf 251\r
1e172d6b 252 //\r
253 // Setup the default exception handlers\r
254 //\r
57f360f2
JF
255 VectorInfoList = NULL;\r
256 GuidHob = GetNextGuidHob (&gEfiVectorHandoffInfoPpiGuid, HobStart);\r
257 if (GuidHob != NULL) {\r
258 VectorInfoList = (EFI_VECTOR_HANDOFF_INFO *) (GET_GUID_HOB_DATA(GuidHob));\r
259 }\r
260 Status = InitializeCpuExceptionHandlers (VectorInfoList);\r
261 ASSERT_EFI_ERROR (Status);\r
1e172d6b 262 \r
e7af83ae 263 //\r
264 // Initialize Debug Agent to support source level debug in DXE phase\r
265 //\r
4cf7e038 266 InitializeDebugAgent (DEBUG_AGENT_INIT_DXE_CORE, HobStart, NULL);\r
e7af83ae 267\r
31f228cf 268 //\r
269 // Initialize Memory Services\r
270 //\r
271 CoreInitializeMemoryServices (&HobStart, &MemoryBaseAddress, &MemoryLength);\r
272\r
84edd20b
SZ
273 MemoryProfileInit (HobStart);\r
274\r
31f228cf 275 //\r
276 // Allocate the EFI System Table and EFI Runtime Service Table from EfiRuntimeServicesData\r
277 // Use the templates to initialize the contents of the EFI System Table and EFI Runtime Services Table\r
278 //\r
279 gDxeCoreST = AllocateRuntimeCopyPool (sizeof (EFI_SYSTEM_TABLE), &mEfiSystemTableTemplate);\r
280 ASSERT (gDxeCoreST != NULL);\r
281\r
282 gDxeCoreRT = AllocateRuntimeCopyPool (sizeof (EFI_RUNTIME_SERVICES), &mEfiRuntimeServicesTableTemplate);\r
283 ASSERT (gDxeCoreRT != NULL);\r
284\r
285 gDxeCoreST->RuntimeServices = gDxeCoreRT;\r
286\r
287 //\r
288 // Start the Image Services.\r
289 //\r
290 Status = CoreInitializeImageServices (HobStart);\r
291 ASSERT_EFI_ERROR (Status);\r
292\r
31f228cf 293 //\r
294 // Initialize the Global Coherency Domain Services\r
295 //\r
296 Status = CoreInitializeGcdServices (&HobStart, MemoryBaseAddress, MemoryLength);\r
297 ASSERT_EFI_ERROR (Status);\r
298\r
c5d53799
SZ
299 //\r
300 // Call constructor for all libraries\r
301 //\r
302 ProcessLibraryConstructorList (gDxeCoreImageHandle, gDxeCoreST);\r
303 PERF_END (NULL,"PEI", NULL, 0) ;\r
304 PERF_START (NULL,"DXE", NULL, 0) ;\r
305\r
31ffa077
SZ
306 //\r
307 // Report DXE Core image information to the PE/COFF Extra Action Library\r
308 //\r
309 ZeroMem (&ImageContext, sizeof (ImageContext));\r
310 ImageContext.ImageAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)gDxeCoreLoadedImage->ImageBase;\r
311 ImageContext.PdbPointer = PeCoffLoaderGetPdbPointer ((VOID*)(UINTN)ImageContext.ImageAddress);\r
312 ImageContext.SizeOfHeaders = PeCoffGetSizeOfHeaders ((VOID*)(UINTN)ImageContext.ImageAddress);\r
313 Status = PeCoffLoaderGetEntryPoint ((VOID*)(UINTN)ImageContext.ImageAddress, &EntryPoint);\r
314 if (Status == EFI_SUCCESS) {\r
315 ImageContext.EntryPoint = (EFI_PHYSICAL_ADDRESS)(UINTN)EntryPoint;\r
316 }\r
317 PeCoffLoaderRelocateImageExtraAction (&ImageContext);\r
318\r
31f228cf 319 //\r
320 // Install the DXE Services Table into the EFI System Tables's Configuration Table\r
321 //\r
322 Status = CoreInstallConfigurationTable (&gEfiDxeServicesTableGuid, gDxeCoreDS);\r
323 ASSERT_EFI_ERROR (Status);\r
324\r
325 //\r
326 // Install the HOB List into the EFI System Tables's Configuration Table\r
327 //\r
328 Status = CoreInstallConfigurationTable (&gEfiHobListGuid, HobStart);\r
329 ASSERT_EFI_ERROR (Status);\r
330\r
331 //\r
332 // Install Memory Type Information Table into the EFI System Tables's Configuration Table\r
333 //\r
334 Status = CoreInstallConfigurationTable (&gEfiMemoryTypeInformationGuid, &gMemoryTypeInformation);\r
335 ASSERT_EFI_ERROR (Status);\r
e7af83ae 336\r
54ea99a7 337 //\r
e7af83ae 338 // If Loading modules At fixed address feature is enabled, install Load moduels at fixed address\r
54ea99a7 339 // Configuration Table so that user could easily to retrieve the top address to load Dxe and PEI\r
e7af83ae 340 // Code and Tseg base to load SMM driver.\r
54ea99a7 341 //\r
852081fc 342 if (PcdGet64(PcdLoadModuleAtFixAddressEnable) != 0) {\r
54ea99a7 343 Status = CoreInstallConfigurationTable (&gLoadFixedAddressConfigurationTableGuid, &gLoadModuleAtFixAddressConfigurationTable);\r
344 ASSERT_EFI_ERROR (Status);\r
345 }\r
31f228cf 346 //\r
347 // Report Status Code here for DXE_ENTRY_POINT once it is available\r
348 //\r
349 REPORT_STATUS_CODE (\r
350 EFI_PROGRESS_CODE,\r
f9876ecf 351 (EFI_SOFTWARE_DXE_CORE | EFI_SW_DXE_CORE_PC_ENTRY_POINT)\r
31f228cf 352 );\r
353\r
354 //\r
355 // Create the aligned system table pointer structure that is used by external\r
356 // debuggers to locate the system table... Also, install debug image info\r
357 // configuration table.\r
358 //\r
359 CoreInitializeDebugImageInfoTable ();\r
360 CoreNewDebugImageInfoEntry (\r
361 EFI_DEBUG_IMAGE_INFO_TYPE_NORMAL,\r
362 gDxeCoreLoadedImage,\r
363 gDxeCoreImageHandle\r
364 );\r
365\r
366 DEBUG ((DEBUG_INFO | DEBUG_LOAD, "HOBLIST address in DXE = 0x%p\n", HobStart));\r
367\r
368 DEBUG_CODE_BEGIN ();\r
369 EFI_PEI_HOB_POINTERS Hob;\r
370\r
371 for (Hob.Raw = HobStart; !END_OF_HOB_LIST(Hob); Hob.Raw = GET_NEXT_HOB(Hob)) {\r
372 if (GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_MEMORY_ALLOCATION) {\r
8e90dd6b 373 DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Memory Allocation 0x%08x 0x%0lx - 0x%0lx\n", \\r
bfef82a1 374 Hob.MemoryAllocation->AllocDescriptor.MemoryType, \\r
31f228cf 375 Hob.MemoryAllocation->AllocDescriptor.MemoryBaseAddress, \\r
bfef82a1 376 Hob.MemoryAllocation->AllocDescriptor.MemoryBaseAddress + Hob.MemoryAllocation->AllocDescriptor.MemoryLength - 1));\r
31f228cf 377 }\r
378 }\r
379 for (Hob.Raw = HobStart; !END_OF_HOB_LIST(Hob); Hob.Raw = GET_NEXT_HOB(Hob)) {\r
380 if (GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_FV2) {\r
3351d21f 381 DEBUG ((DEBUG_INFO | DEBUG_LOAD, "FV2 Hob 0x%0lx - 0x%0lx\n", Hob.FirmwareVolume2->BaseAddress, Hob.FirmwareVolume2->BaseAddress + Hob.FirmwareVolume2->Length - 1));\r
31f228cf 382 } else if (GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_FV) {\r
24e11fd8 383 DEBUG ((DEBUG_INFO | DEBUG_LOAD, "FV Hob 0x%0lx - 0x%0lx\n", Hob.FirmwareVolume->BaseAddress, Hob.FirmwareVolume->BaseAddress + Hob.FirmwareVolume->Length - 1));\r
31f228cf 384 }\r
385 }\r
386 DEBUG_CODE_END ();\r
387\r
388 //\r
389 // Initialize the Event Services\r
390 //\r
391 Status = CoreInitializeEventServices ();\r
392 ASSERT_EFI_ERROR (Status);\r
393\r
84edd20b
SZ
394 MemoryProfileInstallProtocol ();\r
395\r
03d486b2 396 CoreInitializePropertiesTable ();\r
a94d51bd 397 CoreInitializeMemoryAttributesTable ();\r
03d486b2 398\r
57f360f2
JF
399 //\r
400 // Get persisted vector hand-off info from GUIDeed HOB again due to HobStart may be updated,\r
401 // and install configuration table\r
402 //\r
403 GuidHob = GetNextGuidHob (&gEfiVectorHandoffInfoPpiGuid, HobStart);\r
404 if (GuidHob != NULL) {\r
405 VectorInfoList = (EFI_VECTOR_HANDOFF_INFO *) (GET_GUID_HOB_DATA(GuidHob));\r
406 VectorInfo = VectorInfoList;\r
407 Index = 1;\r
408 while (VectorInfo->Attribute != EFI_VECTOR_HANDOFF_LAST_ENTRY) {\r
409 VectorInfo ++;\r
410 Index ++;\r
411 }\r
412 VectorInfo = AllocateCopyPool (sizeof (EFI_VECTOR_HANDOFF_INFO) * Index, (VOID *) VectorInfoList);\r
413 ASSERT (VectorInfo != NULL);\r
414 Status = CoreInstallConfigurationTable (&gEfiVectorHandoffTableGuid, (VOID *) VectorInfo);\r
415 ASSERT_EFI_ERROR (Status);\r
416 }\r
31f228cf 417\r
418 //\r
419 // Get the Protocols that were passed in from PEI to DXE through GUIDed HOBs\r
420 //\r
421 // These Protocols are not architectural. This implementation is sharing code between\r
422 // PEI and DXE in order to save FLASH space. These Protocols could also be implemented\r
423 // as part of the DXE Core. However, that would also require the DXE Core to be ported\r
424 // each time a different CPU is used, a different Decompression algorithm is used, or a\r
425 // different Image type is used. By placing these Protocols in PEI, the DXE Core remains\r
426 // generic, and only PEI and the Arch Protocols need to be ported from Platform to Platform,\r
427 // and from CPU to CPU.\r
428 //\r
429\r
430 //\r
431 // Publish the EFI, Tiano, and Custom Decompress protocols for use by other DXE components\r
432 //\r
433 Status = CoreInstallMultipleProtocolInterfaces (\r
434 &mDecompressHandle,\r
435 &gEfiDecompressProtocolGuid, &gEfiDecompress,\r
436 NULL\r
437 );\r
438 ASSERT_EFI_ERROR (Status);\r
439\r
440 //\r
441 // Register for the GUIDs of the Architectural Protocols, so the rest of the\r
442 // EFI Boot Services and EFI Runtime Services tables can be filled in.\r
74e44290 443 // Also register for the GUIDs of optional protocols.\r
31f228cf 444 //\r
74e44290 445 CoreNotifyOnProtocolInstallation ();\r
31f228cf 446\r
447 //\r
448 // Produce Firmware Volume Protocols, one for each FV in the HOB list.\r
449 //\r
450 Status = FwVolBlockDriverInit (gDxeCoreImageHandle, gDxeCoreST);\r
451 ASSERT_EFI_ERROR (Status);\r
452\r
453 Status = FwVolDriverInit (gDxeCoreImageHandle, gDxeCoreST);\r
454 ASSERT_EFI_ERROR (Status);\r
455\r
456 //\r
457 // Produce the Section Extraction Protocol\r
458 //\r
459 Status = InitializeSectionExtraction (gDxeCoreImageHandle, gDxeCoreST);\r
460 ASSERT_EFI_ERROR (Status);\r
461\r
462 //\r
463 // Initialize the DXE Dispatcher\r
464 //\r
465 PERF_START (NULL,"CoreInitializeDispatcher", "DxeMain", 0) ;\r
466 CoreInitializeDispatcher ();\r
467 PERF_END (NULL,"CoreInitializeDispatcher", "DxeMain", 0) ;\r
468\r
469 //\r
470 // Invoke the DXE Dispatcher\r
471 //\r
472 PERF_START (NULL, "CoreDispatcher", "DxeMain", 0);\r
473 CoreDispatcher ();\r
474 PERF_END (NULL, "CoreDispatcher", "DxeMain", 0);\r
475\r
476 //\r
477 // Display Architectural protocols that were not loaded if this is DEBUG build\r
478 //\r
479 DEBUG_CODE_BEGIN ();\r
480 CoreDisplayMissingArchProtocols ();\r
481 DEBUG_CODE_END ();\r
482\r
483 //\r
484 // Display any drivers that were not dispatched because dependency expression\r
485 // evaluated to false if this is a debug build\r
486 //\r
487 DEBUG_CODE_BEGIN ();\r
488 CoreDisplayDiscoveredNotDispatched ();\r
489 DEBUG_CODE_END ();\r
490\r
491 //\r
492 // Assert if the Architectural Protocols are not present.\r
493 //\r
37623a5c 494 Status = CoreAllEfiServicesAvailable ();\r
495 if (EFI_ERROR(Status)) {\r
496 //\r
497 // Report Status code that some Architectural Protocols are not present.\r
498 //\r
499 REPORT_STATUS_CODE (\r
500 EFI_ERROR_CODE | EFI_ERROR_MAJOR,\r
501 (EFI_SOFTWARE_DXE_CORE | EFI_SW_DXE_CORE_EC_NO_ARCH)\r
502 ); \r
503 }\r
504 ASSERT_EFI_ERROR (Status);\r
31f228cf 505\r
506 //\r
507 // Report Status code before transfer control to BDS\r
508 //\r
509 REPORT_STATUS_CODE (\r
510 EFI_PROGRESS_CODE,\r
f9876ecf 511 (EFI_SOFTWARE_DXE_CORE | EFI_SW_DXE_CORE_PC_HANDOFF_TO_NEXT)\r
31f228cf 512 );\r
513\r
514 //\r
515 // Transfer control to the BDS Architectural Protocol\r
516 //\r
517 gBds->Entry (gBds);\r
518\r
519 //\r
520 // BDS should never return\r
521 //\r
522 ASSERT (FALSE);\r
523 CpuDeadLoop ();\r
524}\r
525\r
526\r
527\r
528/**\r
529 Place holder function until all the Boot Services and Runtime Services are\r
530 available.\r
531\r
532 @return EFI_NOT_AVAILABLE_YET\r
533\r
534**/\r
535EFI_STATUS\r
536EFIAPI\r
537CoreEfiNotAvailableYetArg0 (\r
538 VOID\r
539 )\r
540{\r
541 //\r
542 // This function should never be executed. If it does, then the architectural protocols\r
543 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the\r
544 // DXE Core and all the Architectural Protocols are complete.\r
545 //\r
546\r
547 return EFI_NOT_AVAILABLE_YET;\r
548}\r
549\r
550\r
551/**\r
552 Place holder function until all the Boot Services and Runtime Services are\r
553 available.\r
554\r
555 @param Arg1 Undefined\r
556\r
557 @return EFI_NOT_AVAILABLE_YET\r
558\r
559**/\r
560EFI_STATUS\r
561EFIAPI\r
562CoreEfiNotAvailableYetArg1 (\r
563 UINTN Arg1\r
564 )\r
565{\r
566 //\r
567 // This function should never be executed. If it does, then the architectural protocols\r
568 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the\r
569 // DXE Core and all the Architectural Protocols are complete.\r
570 //\r
571\r
572 return EFI_NOT_AVAILABLE_YET;\r
573}\r
574\r
575\r
576/**\r
577 Place holder function until all the Boot Services and Runtime Services are available.\r
578\r
579 @param Arg1 Undefined\r
580 @param Arg2 Undefined\r
581\r
582 @return EFI_NOT_AVAILABLE_YET\r
583\r
584**/\r
585EFI_STATUS\r
586EFIAPI\r
587CoreEfiNotAvailableYetArg2 (\r
588 UINTN Arg1,\r
589 UINTN Arg2\r
590 )\r
591{\r
592 //\r
593 // This function should never be executed. If it does, then the architectural protocols\r
594 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the\r
595 // DXE Core and all the Architectural Protocols are complete.\r
596 //\r
597\r
598 return EFI_NOT_AVAILABLE_YET;\r
599}\r
600\r
601\r
602/**\r
603 Place holder function until all the Boot Services and Runtime Services are available.\r
604\r
605 @param Arg1 Undefined\r
606 @param Arg2 Undefined\r
607 @param Arg3 Undefined\r
608\r
609 @return EFI_NOT_AVAILABLE_YET\r
610\r
611**/\r
612EFI_STATUS\r
613EFIAPI\r
614CoreEfiNotAvailableYetArg3 (\r
615 UINTN Arg1,\r
616 UINTN Arg2,\r
617 UINTN Arg3\r
618 )\r
619{\r
620 //\r
621 // This function should never be executed. If it does, then the architectural protocols\r
622 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the\r
623 // DXE Core and all the Architectural Protocols are complete.\r
624 //\r
625\r
626 return EFI_NOT_AVAILABLE_YET;\r
627}\r
628\r
629\r
630/**\r
631 Place holder function until all the Boot Services and Runtime Services are available.\r
632\r
633 @param Arg1 Undefined\r
634 @param Arg2 Undefined\r
635 @param Arg3 Undefined\r
636 @param Arg4 Undefined\r
637\r
638 @return EFI_NOT_AVAILABLE_YET\r
639\r
640**/\r
641EFI_STATUS\r
642EFIAPI\r
643CoreEfiNotAvailableYetArg4 (\r
644 UINTN Arg1,\r
645 UINTN Arg2,\r
646 UINTN Arg3,\r
647 UINTN Arg4\r
648 )\r
649{\r
650 //\r
651 // This function should never be executed. If it does, then the architectural protocols\r
652 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the\r
653 // DXE Core and all the Architectural Protocols are complete.\r
654 //\r
655\r
656 return EFI_NOT_AVAILABLE_YET;\r
657}\r
658\r
659\r
660/**\r
661 Place holder function until all the Boot Services and Runtime Services are available.\r
662\r
663 @param Arg1 Undefined\r
664 @param Arg2 Undefined\r
665 @param Arg3 Undefined\r
666 @param Arg4 Undefined\r
667 @param Arg5 Undefined\r
668\r
669 @return EFI_NOT_AVAILABLE_YET\r
670\r
671**/\r
672EFI_STATUS\r
673EFIAPI\r
674CoreEfiNotAvailableYetArg5 (\r
675 UINTN Arg1,\r
676 UINTN Arg2,\r
677 UINTN Arg3,\r
678 UINTN Arg4,\r
679 UINTN Arg5\r
680 )\r
681{\r
682 //\r
683 // This function should never be executed. If it does, then the architectural protocols\r
684 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the\r
685 // DXE Core and all the Architectural Protocols are complete.\r
686 //\r
687\r
688 return EFI_NOT_AVAILABLE_YET;\r
689}\r
690\r
691\r
692/**\r
693 Calcualte the 32-bit CRC in a EFI table using the service provided by the\r
694 gRuntime service.\r
695\r
696 @param Hdr Pointer to an EFI standard header\r
697\r
698**/\r
699VOID\r
700CalculateEfiHdrCrc (\r
701 IN OUT EFI_TABLE_HEADER *Hdr\r
702 )\r
703{\r
704 UINT32 Crc;\r
705\r
706 Hdr->CRC32 = 0;\r
707\r
708 //\r
709 // If gBS->CalculateCrce32 () == CoreEfiNotAvailableYet () then\r
710 // Crc will come back as zero if we set it to zero here\r
711 //\r
712 Crc = 0;\r
713 gBS->CalculateCrc32 ((UINT8 *)Hdr, Hdr->HeaderSize, &Crc);\r
714 Hdr->CRC32 = Crc;\r
715}\r
716\r
717\r
718/**\r
719 Terminates all boot services.\r
720\r
721 @param ImageHandle Handle that identifies the exiting image.\r
722 @param MapKey Key to the latest memory map.\r
723\r
724 @retval EFI_SUCCESS Boot Services terminated\r
725 @retval EFI_INVALID_PARAMETER MapKey is incorrect.\r
726\r
727**/\r
728EFI_STATUS\r
729EFIAPI\r
730CoreExitBootServices (\r
731 IN EFI_HANDLE ImageHandle,\r
732 IN UINTN MapKey\r
733 )\r
734{\r
735 EFI_STATUS Status;\r
736\r
785b5f5a 737 //\r
738 // Disable Timer\r
739 //\r
740 gTimer->SetTimerPeriod (gTimer, 0);\r
741\r
31f228cf 742 //\r
743 // Terminate memory services if the MapKey matches\r
744 //\r
745 Status = CoreTerminateMemoryMap (MapKey);\r
746 if (EFI_ERROR (Status)) {\r
044824d9 747 //\r
748 // Notify other drivers that ExitBootServices fail \r
749 //\r
750 CoreNotifySignalList (&gEventExitBootServicesFailedGuid);\r
31f228cf 751 return Status;\r
752 }\r
753\r
31f228cf 754 //\r
755 // Notify other drivers that we are exiting boot services.\r
756 //\r
757 CoreNotifySignalList (&gEfiEventExitBootServicesGuid);\r
758\r
e4c83a4f
LG
759 //\r
760 // Report that ExitBootServices() has been called\r
761 //\r
762 REPORT_STATUS_CODE (\r
763 EFI_PROGRESS_CODE,\r
764 (EFI_SOFTWARE_EFI_BOOT_SERVICE | EFI_SW_BS_PC_EXIT_BOOT_SERVICES)\r
765 );\r
766\r
213fecef 767 //\r
768 // Disable interrupt of Debug timer.\r
769 //\r
770 SaveAndSetDebugTimerInterrupt (FALSE);\r
771\r
31f228cf 772 //\r
773 // Disable CPU Interrupts\r
774 //\r
775 gCpu->DisableInterrupt (gCpu);\r
776\r
31f228cf 777 //\r
778 // Clear the non-runtime values of the EFI System Table\r
779 //\r
780 gDxeCoreST->BootServices = NULL;\r
781 gDxeCoreST->ConIn = NULL;\r
782 gDxeCoreST->ConsoleInHandle = NULL;\r
783 gDxeCoreST->ConOut = NULL;\r
784 gDxeCoreST->ConsoleOutHandle = NULL;\r
785 gDxeCoreST->StdErr = NULL;\r
786 gDxeCoreST->StandardErrorHandle = NULL;\r
787\r
788 //\r
789 // Recompute the 32-bit CRC of the EFI System Table\r
790 //\r
791 CalculateEfiHdrCrc (&gDxeCoreST->Hdr);\r
792\r
793 //\r
794 // Zero out the Boot Service Table\r
795 //\r
796 ZeroMem (gBS, sizeof (EFI_BOOT_SERVICES));\r
797 gBS = NULL;\r
798\r
799 //\r
800 // Update the AtRuntime field in Runtiem AP.\r
801 //\r
802 gRuntime->AtRuntime = TRUE;\r
803\r
804 return Status;\r
805}\r
806\r
807\r
808/**\r
809 Given a compressed source buffer, this function retrieves the size of the\r
810 uncompressed buffer and the size of the scratch buffer required to decompress\r
811 the compressed source buffer.\r
812\r
813 The GetInfo() function retrieves the size of the uncompressed buffer and the\r
814 temporary scratch buffer required to decompress the buffer specified by Source\r
815 and SourceSize. If the size of the uncompressed buffer or the size of the\r
816 scratch buffer cannot be determined from the compressed data specified by\r
817 Source and SourceData, then EFI_INVALID_PARAMETER is returned. Otherwise, the\r
818 size of the uncompressed buffer is returned in DestinationSize, the size of\r
819 the scratch buffer is returned in ScratchSize, and EFI_SUCCESS is returned.\r
820 The GetInfo() function does not have scratch buffer available to perform a\r
821 thorough checking of the validity of the source data. It just retrieves the\r
822 "Original Size" field from the beginning bytes of the source data and output\r
823 it as DestinationSize. And ScratchSize is specific to the decompression\r
824 implementation.\r
825\r
826 @param This A pointer to the EFI_DECOMPRESS_PROTOCOL instance.\r
827 @param Source The source buffer containing the compressed data.\r
828 @param SourceSize The size, in bytes, of the source buffer.\r
829 @param DestinationSize A pointer to the size, in bytes, of the\r
830 uncompressed buffer that will be generated when the\r
831 compressed buffer specified by Source and\r
832 SourceSize is decompressed.\r
833 @param ScratchSize A pointer to the size, in bytes, of the scratch\r
834 buffer that is required to decompress the\r
835 compressed buffer specified by Source and\r
836 SourceSize.\r
837\r
838 @retval EFI_SUCCESS The size of the uncompressed data was returned in\r
839 DestinationSize and the size of the scratch buffer\r
840 was returned in ScratchSize.\r
841 @retval EFI_INVALID_PARAMETER The size of the uncompressed data or the size of\r
842 the scratch buffer cannot be determined from the\r
843 compressed data specified by Source and\r
844 SourceSize.\r
845\r
846**/\r
847EFI_STATUS\r
848EFIAPI\r
849DxeMainUefiDecompressGetInfo (\r
850 IN EFI_DECOMPRESS_PROTOCOL *This,\r
851 IN VOID *Source,\r
852 IN UINT32 SourceSize,\r
853 OUT UINT32 *DestinationSize,\r
854 OUT UINT32 *ScratchSize\r
855 )\r
856{\r
857 if (Source == NULL || DestinationSize == NULL || ScratchSize == NULL) {\r
858 return EFI_INVALID_PARAMETER;\r
859 }\r
860 return UefiDecompressGetInfo (Source, SourceSize, DestinationSize, ScratchSize);\r
861}\r
862\r
863\r
864/**\r
865 Decompresses a compressed source buffer.\r
866\r
867 The Decompress() function extracts decompressed data to its original form.\r
868 This protocol is designed so that the decompression algorithm can be\r
869 implemented without using any memory services. As a result, the Decompress()\r
870 Function is not allowed to call AllocatePool() or AllocatePages() in its\r
871 implementation. It is the caller's responsibility to allocate and free the\r
872 Destination and Scratch buffers.\r
873 If the compressed source data specified by Source and SourceSize is\r
93e8d03c 874 successfully decompressed into Destination, then EFI_SUCCESS is returned. If\r
31f228cf 875 the compressed source data specified by Source and SourceSize is not in a\r
876 valid compressed data format, then EFI_INVALID_PARAMETER is returned.\r
877\r
878 @param This A pointer to the EFI_DECOMPRESS_PROTOCOL instance.\r
879 @param Source The source buffer containing the compressed data.\r
880 @param SourceSize SourceSizeThe size of source data.\r
881 @param Destination On output, the destination buffer that contains\r
882 the uncompressed data.\r
883 @param DestinationSize The size of the destination buffer. The size of\r
884 the destination buffer needed is obtained from\r
885 EFI_DECOMPRESS_PROTOCOL.GetInfo().\r
886 @param Scratch A temporary scratch buffer that is used to perform\r
887 the decompression.\r
888 @param ScratchSize The size of scratch buffer. The size of the\r
889 scratch buffer needed is obtained from GetInfo().\r
890\r
891 @retval EFI_SUCCESS Decompression completed successfully, and the\r
892 uncompressed buffer is returned in Destination.\r
893 @retval EFI_INVALID_PARAMETER The source buffer specified by Source and\r
894 SourceSize is corrupted (not in a valid\r
895 compressed format).\r
896\r
897**/\r
898EFI_STATUS\r
899EFIAPI\r
900DxeMainUefiDecompress (\r
901 IN EFI_DECOMPRESS_PROTOCOL *This,\r
902 IN VOID *Source,\r
903 IN UINT32 SourceSize,\r
904 IN OUT VOID *Destination,\r
905 IN UINT32 DestinationSize,\r
906 IN OUT VOID *Scratch,\r
907 IN UINT32 ScratchSize\r
908 )\r
909{\r
910 EFI_STATUS Status;\r
911 UINT32 TestDestinationSize;\r
912 UINT32 TestScratchSize;\r
913\r
914 if (Source == NULL || Destination== NULL || Scratch == NULL) {\r
915 return EFI_INVALID_PARAMETER;\r
916 }\r
917\r
918 Status = UefiDecompressGetInfo (Source, SourceSize, &TestDestinationSize, &TestScratchSize);\r
919 if (EFI_ERROR (Status)) {\r
920 return Status;\r
921 }\r
922\r
923 if (ScratchSize < TestScratchSize || DestinationSize < TestDestinationSize) {\r
924 return RETURN_INVALID_PARAMETER;\r
925 }\r
926\r
927 return UefiDecompress (Source, Destination, Scratch);\r
928}\r