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