3 Copyright (c) 2006 - 2007, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 DXE Core Main Entry Point
25 // DXE Core Global Variables for Protocols from PEI
27 EFI_HANDLE mDecompressHandle
= NULL
;
28 EFI_PEI_PE_COFF_LOADER_PROTOCOL
*gEfiPeiPeCoffLoader
= NULL
;
31 // DXE Core globals for Architecture Protocols
33 EFI_SECURITY_ARCH_PROTOCOL
*gSecurity
= NULL
;
34 EFI_CPU_ARCH_PROTOCOL
*gCpu
= NULL
;
35 EFI_METRONOME_ARCH_PROTOCOL
*gMetronome
= NULL
;
36 EFI_TIMER_ARCH_PROTOCOL
*gTimer
= NULL
;
37 EFI_BDS_ARCH_PROTOCOL
*gBds
= NULL
;
38 EFI_WATCHDOG_TIMER_ARCH_PROTOCOL
*gWatchdogTimer
= NULL
;
42 // BugBug: I'n not runtime, but is the PPI?
44 EFI_STATUS_CODE_PROTOCOL gStatusCodeInstance
= {
48 EFI_STATUS_CODE_PROTOCOL
*gStatusCode
= &gStatusCodeInstance
;
52 // DXE Core Global used to update core loaded image protocol handle
54 EFI_GUID
*gDxeCoreFileName
;
55 EFI_LOADED_IMAGE_PROTOCOL
*gDxeCoreLoadedImage
;
60 // DXE Core Module Variables
63 EFI_BOOT_SERVICES mBootServices
= {
65 EFI_BOOT_SERVICES_SIGNATURE
, // Signature
66 EFI_BOOT_SERVICES_REVISION
, // Revision
67 sizeof (EFI_BOOT_SERVICES
), // HeaderSize
71 (EFI_RAISE_TPL
) CoreRaiseTpl
, // RaiseTPL
72 (EFI_RESTORE_TPL
) CoreRestoreTpl
, // RestoreTPL
73 (EFI_ALLOCATE_PAGES
) CoreAllocatePages
, // AllocatePages
74 (EFI_FREE_PAGES
) CoreFreePages
, // FreePages
75 (EFI_GET_MEMORY_MAP
) CoreGetMemoryMap
, // GetMemoryMap
76 (EFI_ALLOCATE_POOL
) CoreAllocatePool
, // AllocatePool
77 (EFI_FREE_POOL
) CoreFreePool
, // FreePool
78 (EFI_CREATE_EVENT
) CoreCreateEvent
, // CreateEvent
79 (EFI_SET_TIMER
) CoreSetTimer
, // SetTimer
80 (EFI_WAIT_FOR_EVENT
) CoreWaitForEvent
, // WaitForEvent
81 (EFI_SIGNAL_EVENT
) CoreSignalEvent
, // SignalEvent
82 (EFI_CLOSE_EVENT
) CoreCloseEvent
, // CloseEvent
83 (EFI_CHECK_EVENT
) CoreCheckEvent
, // CheckEvent
84 (EFI_INSTALL_PROTOCOL_INTERFACE
) CoreInstallProtocolInterface
, // InstallProtocolInterface
85 (EFI_REINSTALL_PROTOCOL_INTERFACE
) CoreReinstallProtocolInterface
, // ReinstallProtocolInterface
86 (EFI_UNINSTALL_PROTOCOL_INTERFACE
) CoreUninstallProtocolInterface
, // UninstallProtocolInterface
87 (EFI_HANDLE_PROTOCOL
) CoreHandleProtocol
, // HandleProtocol
88 (VOID
*) NULL
, // Reserved
89 (EFI_REGISTER_PROTOCOL_NOTIFY
) CoreRegisterProtocolNotify
, // RegisterProtocolNotify
90 (EFI_LOCATE_HANDLE
) CoreLocateHandle
, // LocateHandle
91 (EFI_LOCATE_DEVICE_PATH
) CoreLocateDevicePath
, // LocateDevicePath
92 (EFI_INSTALL_CONFIGURATION_TABLE
) CoreInstallConfigurationTable
, // InstallConfigurationTable
93 (EFI_IMAGE_LOAD
) CoreLoadImage
, // LoadImage
94 (EFI_IMAGE_START
) CoreStartImage
, // StartImage
95 (EFI_EXIT
) CoreExit
, // Exit
96 (EFI_IMAGE_UNLOAD
) CoreUnloadImage
, // UnloadImage
97 (EFI_EXIT_BOOT_SERVICES
) CoreExitBootServices
, // ExitBootServices
98 (EFI_GET_NEXT_MONOTONIC_COUNT
) CoreEfiNotAvailableYetArg1
, // GetNextMonotonicCount
99 (EFI_STALL
) CoreStall
, // Stall
100 (EFI_SET_WATCHDOG_TIMER
) CoreSetWatchdogTimer
, // SetWatchdogTimer
101 (EFI_CONNECT_CONTROLLER
) CoreConnectController
, // ConnectController
102 (EFI_DISCONNECT_CONTROLLER
) CoreDisconnectController
, // DisconnectController
103 (EFI_OPEN_PROTOCOL
) CoreOpenProtocol
, // OpenProtocol
104 (EFI_CLOSE_PROTOCOL
) CoreCloseProtocol
, // CloseProtocol
105 (EFI_OPEN_PROTOCOL_INFORMATION
) CoreOpenProtocolInformation
, // OpenProtocolInformation
106 (EFI_PROTOCOLS_PER_HANDLE
) CoreProtocolsPerHandle
, // ProtocolsPerHandle
107 (EFI_LOCATE_HANDLE_BUFFER
) CoreLocateHandleBuffer
, // LocateHandleBuffer
108 (EFI_LOCATE_PROTOCOL
) CoreLocateProtocol
, // LocateProtocol
109 (EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES
) CoreInstallMultipleProtocolInterfaces
, // InstallMultipleProtocolInterfaces
110 (EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES
) CoreUninstallMultipleProtocolInterfaces
, // UninstallMultipleProtocolInterfaces
111 (EFI_CALCULATE_CRC32
) CoreEfiNotAvailableYetArg3
, // CalculateCrc32
112 (EFI_COPY_MEM
) CopyMem
, // CopyMem
113 (EFI_SET_MEM
) SetMem
, // SetMem
114 (EFI_CREATE_EVENT_EX
) CoreCreateEventEx
// CreateEventEx
117 EFI_DXE_SERVICES mDxeServices
= {
119 EFI_DXE_SERVICES_SIGNATURE
, // Signature
120 EFI_DXE_SERVICES_REVISION
, // Revision
121 sizeof (EFI_DXE_SERVICES
), // HeaderSize
125 (EFI_ADD_MEMORY_SPACE
) CoreAddMemorySpace
, // AddMemorySpace
126 (EFI_ALLOCATE_MEMORY_SPACE
) CoreAllocateMemorySpace
, // AllocateMemorySpace
127 (EFI_FREE_MEMORY_SPACE
) CoreFreeMemorySpace
, // FreeMemorySpace
128 (EFI_REMOVE_MEMORY_SPACE
) CoreRemoveMemorySpace
, // RemoveMemorySpace
129 (EFI_GET_MEMORY_SPACE_DESCRIPTOR
) CoreGetMemorySpaceDescriptor
, // GetMemorySpaceDescriptor
130 (EFI_SET_MEMORY_SPACE_ATTRIBUTES
) CoreSetMemorySpaceAttributes
, // SetMemorySpaceAttributes
131 (EFI_GET_MEMORY_SPACE_MAP
) CoreGetMemorySpaceMap
, // GetMemorySpaceMap
132 (EFI_ADD_IO_SPACE
) CoreAddIoSpace
, // AddIoSpace
133 (EFI_ALLOCATE_IO_SPACE
) CoreAllocateIoSpace
, // AllocateIoSpace
134 (EFI_FREE_IO_SPACE
) CoreFreeIoSpace
, // FreeIoSpace
135 (EFI_REMOVE_IO_SPACE
) CoreRemoveIoSpace
, // RemoveIoSpace
136 (EFI_GET_IO_SPACE_DESCRIPTOR
) CoreGetIoSpaceDescriptor
, // GetIoSpaceDescriptor
137 (EFI_GET_IO_SPACE_MAP
) CoreGetIoSpaceMap
, // GetIoSpaceMap
138 (EFI_DISPATCH
) CoreDispatcher
, // Dispatch
139 (EFI_SCHEDULE
) CoreSchedule
, // Schedule
140 (EFI_TRUST
) CoreTrust
, // Trust
141 (EFI_PROCESS_FIRMWARE_VOLUME
) CoreProcessFirmwareVolume
, // ProcessFirmwareVolume
144 EFI_SYSTEM_TABLE mEfiSystemTableTemplate
= {
146 EFI_SYSTEM_TABLE_SIGNATURE
, // Signature
147 EFI_SYSTEM_TABLE_REVISION
, // Revision
148 sizeof (EFI_SYSTEM_TABLE
), // HeaderSize
152 NULL
, // FirmwareVendor
153 0, // FirmwareRevision
154 NULL
, // ConsoleInHandle
156 NULL
, // ConsoleOutHandle
158 NULL
, // StandardErrorHandle
160 NULL
, // RuntimeServices
161 &mBootServices
, // BootServices
162 0, // NumberOfConfigurationTableEntries
163 NULL
// ConfigurationTable
166 EFI_RUNTIME_SERVICES mEfiRuntimeServicesTableTemplate
= {
168 EFI_RUNTIME_SERVICES_SIGNATURE
, // Signature
169 EFI_RUNTIME_SERVICES_REVISION
, // Revision
170 sizeof (EFI_RUNTIME_SERVICES
), // HeaderSize
174 (EFI_GET_TIME
) CoreEfiNotAvailableYetArg2
, // GetTime
175 (EFI_SET_TIME
) CoreEfiNotAvailableYetArg1
, // SetTime
176 (EFI_GET_WAKEUP_TIME
) CoreEfiNotAvailableYetArg3
, // GetWakeupTime
177 (EFI_SET_WAKEUP_TIME
) CoreEfiNotAvailableYetArg2
, // SetWakeupTime
178 (EFI_SET_VIRTUAL_ADDRESS_MAP
) CoreEfiNotAvailableYetArg4
, // SetVirtualAddressMap
179 (EFI_CONVERT_POINTER
) CoreEfiNotAvailableYetArg2
, // ConvertPointer
180 (EFI_GET_VARIABLE
) CoreEfiNotAvailableYetArg5
, // GetVariable
181 (EFI_GET_NEXT_VARIABLE_NAME
) CoreEfiNotAvailableYetArg3
, // GetNextVariableName
182 (EFI_SET_VARIABLE
) CoreEfiNotAvailableYetArg5
, // SetVariable
183 (EFI_GET_NEXT_HIGH_MONO_COUNT
) CoreEfiNotAvailableYetArg1
, // GetNextHighMonotonicCount
184 (EFI_RESET_SYSTEM
) CoreEfiNotAvailableYetArg4
, // ResetSystem
185 (EFI_UPDATE_CAPSULE
) CoreEfiNotAvailableYetArg3
, // UpdateCapsule
186 (EFI_QUERY_CAPSULE_CAPABILITIES
) CoreEfiNotAvailableYetArg4
, // QueryCapsuleCapabilities
187 (EFI_QUERY_VARIABLE_INFO
) CoreEfiNotAvailableYetArg4
// QueryVariableInfo
190 EFI_RUNTIME_ARCH_PROTOCOL gRuntimeTemplate
= {
191 INITIALIZE_LIST_HEAD_VARIABLE (gRuntimeTemplate
.ImageHead
),
192 INITIALIZE_LIST_HEAD_VARIABLE (gRuntimeTemplate
.EventHead
),
195 // Make sure Size != sizeof (EFI_MEMORY_DESCRIPTOR). This will
196 // prevent people from having pointer math bugs in their code.
197 // now you have to use *DescriptorSize to make things work.
199 sizeof (EFI_MEMORY_DESCRIPTOR
) + sizeof (UINT64
) - (sizeof (EFI_MEMORY_DESCRIPTOR
) % sizeof (UINT64
)),
200 EFI_MEMORY_DESCRIPTOR_VERSION
,
208 EFI_RUNTIME_ARCH_PROTOCOL
*gRuntime
= &gRuntimeTemplate
;
211 // DXE Core Global Variables for the EFI System Table, Boot Services Table,
212 // DXE Services Table, and Runtime Services Table
214 EFI_BOOT_SERVICES
*gBS
= &mBootServices
;
215 EFI_DXE_SERVICES
*gDS
= &mDxeServices
;
216 EFI_SYSTEM_TABLE
*gST
= NULL
;
219 // For debug initialize gRT to template. gRT must be allocated from RT memory
220 // but gRT is used for ASSERT () and DEBUG () type macros so lets give it
221 // a value that will not cause debug infrastructure to crash early on.
223 EFI_RUNTIME_SERVICES
*gRT
= &mEfiRuntimeServicesTableTemplate
;
224 EFI_HANDLE gDxeCoreImageHandle
= NULL
;
229 // EFI Decompress Protocol
231 EFI_DECOMPRESS_PROTOCOL gEfiDecompress
= {
232 DxeMainUefiDecompressGetInfo
,
233 DxeMainUefiDecompress
237 // Tiano Decompress Protocol
239 EFI_TIANO_DECOMPRESS_PROTOCOL gEfiTianoDecompress
= {
240 DxeMainTianoDecompressGetInfo
,
241 DxeMainTianoDecompress
245 // Customized Decompress Protocol
247 EFI_CUSTOMIZED_DECOMPRESS_PROTOCOL gEfiCustomizedDecompress
= {
248 DxeMainCustomDecompressGetInfo
,
249 DxeMainCustomDecompress
253 // Main entry point to the DXE Core
264 Main entry point to DXE Core.
268 HobStart - Pointer to the beginning of the HOB List from PEI
272 This function should never return
277 EFI_PHYSICAL_ADDRESS MemoryBaseAddress
;
280 mHobStart
= HobStart
;
283 // Initialize Memory Services
285 CoreInitializeMemoryServices (&HobStart
, &MemoryBaseAddress
, &MemoryLength
);
288 // Allocate the EFI System Table and EFI Runtime Service Table from EfiRuntimeServicesData
289 // Use the templates to initialize the contents of the EFI System Table and EFI Runtime Services Table
291 gST
= CoreAllocateRuntimeCopyPool (sizeof (EFI_SYSTEM_TABLE
), &mEfiSystemTableTemplate
);
292 ASSERT (gST
!= NULL
);
294 gRT
= CoreAllocateRuntimeCopyPool (sizeof (EFI_RUNTIME_SERVICES
), &mEfiRuntimeServicesTableTemplate
);
295 ASSERT (gRT
!= NULL
);
297 gST
->RuntimeServices
= gRT
;
300 // Start the Image Services.
302 Status
= CoreInitializeImageServices (HobStart
);
303 ASSERT_EFI_ERROR (Status
);
306 // Call constructor for all libraries
308 ProcessLibraryConstructorList (gDxeCoreImageHandle
, gST
);
309 PERF_END (0,PEI_TOK
, NULL
, 0) ;
310 PERF_START (0,DXE_TOK
, NULL
, 0) ;
313 // Initialize the Global Coherency Domain Services
315 Status
= CoreInitializeGcdServices (&HobStart
, MemoryBaseAddress
, MemoryLength
);
316 ASSERT_EFI_ERROR (Status
);
319 // Install the DXE Services Table into the EFI System Tables's Configuration Table
321 Status
= CoreInstallConfigurationTable (&gEfiDxeServicesTableGuid
, gDS
);
322 ASSERT_EFI_ERROR (Status
);
325 // Install the HOB List into the EFI System Tables's Configuration Table
327 Status
= CoreInstallConfigurationTable (&gEfiHobListGuid
, HobStart
);
328 ASSERT_EFI_ERROR (Status
);
331 // Install Memory Type Information Table into the EFI System Tables's Configuration Table
333 Status
= CoreInstallConfigurationTable (&gEfiMemoryTypeInformationGuid
, &gMemoryTypeInformation
);
334 ASSERT_EFI_ERROR (Status
);
337 // Initialize the ReportStatusCode with PEI version, if available
339 CoreGetPeiProtocol (&gEfiStatusCodeRuntimeProtocolGuid
, (VOID
**)&gStatusCode
->ReportStatusCode
);
342 // Report Status Code here for DXE_ENTRY_POINT once it is available
344 CoreReportProgressCode ((EFI_SOFTWARE_DXE_CORE
| EFI_SW_DXE_CORE_PC_ENTRY_POINT
));
347 // Create the aligned system table pointer structure that is used by external
348 // debuggers to locate the system table... Also, install debug image info
349 // configuration table.
351 CoreInitializeDebugImageInfoTable ();
352 CoreNewDebugImageInfoEntry (
353 EFI_DEBUG_IMAGE_INFO_TYPE_NORMAL
,
358 DEBUG ((EFI_D_INFO
| EFI_D_LOAD
, "HOBLIST address in DXE = 0x%08x\n", HobStart
));
361 // Initialize the Event Services
363 Status
= CoreInitializeEventServices ();
364 ASSERT_EFI_ERROR (Status
);
368 // Get the Protocols that were passed in from PEI to DXE through GUIDed HOBs
370 // These Protocols are not architectural. This implementation is sharing code between
371 // PEI and DXE in order to save FLASH space. These Protocols could also be implemented
372 // as part of the DXE Core. However, that would also require the DXE Core to be ported
373 // each time a different CPU is used, a different Decompression algorithm is used, or a
374 // different Image type is used. By placing these Protocols in PEI, the DXE Core remains
375 // generic, and only PEI and the Arch Protocols need to be ported from Platform to Platform,
376 // and from CPU to CPU.
380 // Publish the EFI, Tiano, and Custom Decompress protocols for use by other DXE components
382 Status
= CoreInstallMultipleProtocolInterfaces (
384 &gEfiDecompressProtocolGuid
, &gEfiDecompress
,
385 &gEfiTianoDecompressProtocolGuid
, &gEfiTianoDecompress
,
386 &gEfiCustomizedDecompressProtocolGuid
, &gEfiCustomizedDecompress
,
389 ASSERT_EFI_ERROR (Status
);
391 gEfiPeiPeCoffLoader
= GetPeCoffLoaderProtocol ();
392 ASSERT (gEfiPeiPeCoffLoader
!= NULL
);
395 // Register for the GUIDs of the Architectural Protocols, so the rest of the
396 // EFI Boot Services and EFI Runtime Services tables can be filled in.
398 CoreNotifyOnArchProtocolInstallation ();
401 // Produce Firmware Volume Protocols, one for each FV in the HOB list.
403 Status
= FwVolBlockDriverInit (gDxeCoreImageHandle
, gST
);
404 ASSERT_EFI_ERROR (Status
);
406 Status
= FwVolDriverInit (gDxeCoreImageHandle
, gST
);
407 ASSERT_EFI_ERROR (Status
);
410 // Produce the Section Extraction Protocol
412 Status
= InitializeSectionExtraction (gDxeCoreImageHandle
, gST
);
413 ASSERT_EFI_ERROR (Status
);
416 // Initialize the DXE Dispatcher
418 PERF_START (0,"CoreInitializeDispatcher", "DxeMain", 0) ;
419 CoreInitializeDispatcher ();
420 PERF_END (0,"CoreInitializeDispatcher", "DxeMain", 0) ;
423 // Invoke the DXE Dispatcher
425 PERF_START (0, "CoreDispatcher", "DxeMain", 0);
427 PERF_END (0, "CoreDispatcher", "DxeMain", 0);
430 // Display Architectural protocols that were not loaded if this is DEBUG build
433 CoreDisplayMissingArchProtocols ();
437 // Assert if the Architectural Protocols are not present.
439 ASSERT_EFI_ERROR (CoreAllEfiServicesAvailable ());
442 // Report Status code before transfer control to BDS
444 CoreReportProgressCode ((EFI_SOFTWARE_DXE_CORE
| EFI_SW_DXE_CORE_PC_HANDOFF_TO_NEXT
));
446 // Display any drivers that were not dispatched because dependency expression
447 // evaluated to false if this is a debug build
450 CoreDisplayDiscoveredNotDispatched ();
454 // Transfer control to the BDS Architectural Protocol
459 // BDS should never return
468 CoreEfiNotAvailableYetArg0 (
475 Place holder function until all the Boot Services and Runtime Services are available
483 EFI_NOT_AVAILABLE_YET
488 // This function should never be executed. If it does, then the architectural protocols
489 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
490 // DXE Core and all the Architectural Protocols are complete.
493 return EFI_NOT_AVAILABLE_YET
;
498 CoreEfiNotAvailableYetArg1 (
505 Place holder function until all the Boot Services and Runtime Services are available
513 EFI_NOT_AVAILABLE_YET
518 // This function should never be executed. If it does, then the architectural protocols
519 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
520 // DXE Core and all the Architectural Protocols are complete.
523 return EFI_NOT_AVAILABLE_YET
;
528 CoreEfiNotAvailableYetArg2 (
536 Place holder function until all the Boot Services and Runtime Services are available
546 EFI_NOT_AVAILABLE_YET
551 // This function should never be executed. If it does, then the architectural protocols
552 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
553 // DXE Core and all the Architectural Protocols are complete.
556 return EFI_NOT_AVAILABLE_YET
;
561 CoreEfiNotAvailableYetArg3 (
570 Place holder function until all the Boot Services and Runtime Services are available
582 EFI_NOT_AVAILABLE_YET
587 // This function should never be executed. If it does, then the architectural protocols
588 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
589 // DXE Core and all the Architectural Protocols are complete.
592 return EFI_NOT_AVAILABLE_YET
;
597 CoreEfiNotAvailableYetArg4 (
607 Place holder function until all the Boot Services and Runtime Services are available
621 EFI_NOT_AVAILABLE_YET
626 // This function should never be executed. If it does, then the architectural protocols
627 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
628 // DXE Core and all the Architectural Protocols are complete.
631 return EFI_NOT_AVAILABLE_YET
;
636 CoreEfiNotAvailableYetArg5 (
647 Place holder function until all the Boot Services and Runtime Services are available
663 EFI_NOT_AVAILABLE_YET
668 // This function should never be executed. If it does, then the architectural protocols
669 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
670 // DXE Core and all the Architectural Protocols are complete.
673 return EFI_NOT_AVAILABLE_YET
;
679 IN EFI_GUID
*ProtocolGuid
,
686 Searches for a Protocol Interface passed from PEI through a HOB
690 ProtocolGuid - The Protocol GUID to search for in the HOB List
692 Interface - A pointer to the interface for the Protocol GUID
696 EFI_SUCCESS - The Protocol GUID was found and its interface is returned in Interface
698 EFI_NOT_FOUND - The Protocol GUID was not found in the HOB List
702 EFI_HOB_GUID_TYPE
*GuidHob
;
705 GuidHob
= GetNextGuidHob (ProtocolGuid
, mHobStart
);
706 if (GuidHob
== NULL
) {
707 return EFI_NOT_FOUND
;
710 Buffer
= GET_GUID_HOB_DATA (GuidHob
);
711 ASSERT (Buffer
!= NULL
);
713 *Interface
= (VOID
*)(*(UINTN
*)(Buffer
));
721 IN OUT EFI_TABLE_HEADER
*Hdr
727 Calcualte the 32-bit CRC in a EFI table using the service provided by the
732 Hdr - Pointer to an EFI standard header
745 // If gBS->CalculateCrce32 () == CoreEfiNotAvailableYet () then
746 // Crc will come back as zero if we set it to zero here
749 gBS
->CalculateCrc32 ((UINT8
*)Hdr
, Hdr
->HeaderSize
, &Crc
);
757 CoreExitBootServices (
758 IN EFI_HANDLE ImageHandle
,
765 Terminates all boot services.
769 ImageHandle - Handle that identifies the exiting image.
771 MapKey -Key to the latest memory map.
775 EFI_SUCCESS - Boot Services terminated
776 EFI_INVALID_PARAMETER - MapKey is incorrect.
783 // Terminate memory services if the MapKey matches
785 Status
= CoreTerminateMemoryMap (MapKey
);
786 if (EFI_ERROR (Status
)) {
791 // Notify other drivers that we are exiting boot services.
793 CoreNotifySignalList (&gEfiEventExitBootServicesGuid
);
798 gTimer
->SetTimerPeriod (gTimer
, 0);
801 // Disable CPU Interrupts
803 gCpu
->DisableInterrupt (gCpu
);
806 // Report that ExitBootServices() has been called
808 // We are using gEfiDxeServicesTableGuid as the caller ID for Dxe Core
810 CoreReportProgressCode ((EFI_SOFTWARE_EFI_BOOT_SERVICE
| EFI_SW_BS_PC_EXIT_BOOT_SERVICES
));
813 // Clear the non-runtime values of the EFI System Table
815 gST
->BootServices
= NULL
;
817 gST
->ConsoleInHandle
= NULL
;
819 gST
->ConsoleOutHandle
= NULL
;
821 gST
->StandardErrorHandle
= NULL
;
824 // Recompute the 32-bit CRC of the EFI System Table
826 CalculateEfiHdrCrc (&gST
->Hdr
);
829 // Zero out the Boot Service Table
831 SetMem (gBS
, sizeof (EFI_BOOT_SERVICES
), 0);
835 // Update the AtRuntime field in Runtiem AP.
837 gRuntime
->AtRuntime
= TRUE
;
843 DxeMainUefiDecompressGetInfo (
844 IN EFI_DECOMPRESS_PROTOCOL
*This
,
846 IN UINT32 SourceSize
,
847 OUT UINT32
*DestinationSize
,
848 OUT UINT32
*ScratchSize
851 return UefiDecompressGetInfo (Source
, SourceSize
, DestinationSize
, ScratchSize
);
856 DxeMainUefiDecompress (
857 IN EFI_DECOMPRESS_PROTOCOL
*This
,
859 IN UINT32 SourceSize
,
860 IN OUT VOID
*Destination
,
861 IN UINT32 DestinationSize
,
862 IN OUT VOID
*Scratch
,
863 IN UINT32 ScratchSize
867 UINT32 TestDestinationSize
;
868 UINT32 TestScratchSize
;
870 Status
= UefiDecompressGetInfo (Source
, SourceSize
, &TestDestinationSize
, &TestScratchSize
);
871 if (EFI_ERROR (Status
)) {
875 if (ScratchSize
< TestScratchSize
|| DestinationSize
< TestDestinationSize
) {
876 return RETURN_INVALID_PARAMETER
;
879 return UefiDecompress (Source
, Destination
, Scratch
);
883 DxeMainTianoDecompressGetInfo (
884 IN EFI_TIANO_DECOMPRESS_PROTOCOL
*This
,
886 IN UINT32 SourceSize
,
887 OUT UINT32
*DestinationSize
,
888 OUT UINT32
*ScratchSize
891 return TianoDecompressGetInfo (Source
, SourceSize
, DestinationSize
, ScratchSize
);
896 DxeMainTianoDecompress (
897 IN EFI_TIANO_DECOMPRESS_PROTOCOL
*This
,
899 IN UINT32 SourceSize
,
900 IN OUT VOID
*Destination
,
901 IN UINT32 DestinationSize
,
902 IN OUT VOID
*Scratch
,
903 IN UINT32 ScratchSize
907 UINT32 TestDestinationSize
;
908 UINT32 TestScratchSize
;
910 Status
= TianoDecompressGetInfo (Source
, SourceSize
, &TestDestinationSize
, &TestScratchSize
);
911 if (EFI_ERROR (Status
)) {
915 if (ScratchSize
< TestScratchSize
|| DestinationSize
< TestDestinationSize
) {
916 return RETURN_INVALID_PARAMETER
;
919 return TianoDecompress (Source
, Destination
, Scratch
);
923 DxeMainCustomDecompressGetInfo (
924 IN EFI_CUSTOMIZED_DECOMPRESS_PROTOCOL
*This
,
926 IN UINT32 SourceSize
,
927 OUT UINT32
*DestinationSize
,
928 OUT UINT32
*ScratchSize
931 return CustomDecompressGetInfo (Source
, SourceSize
, DestinationSize
, ScratchSize
);
936 DxeMainCustomDecompress (
937 IN EFI_CUSTOMIZED_DECOMPRESS_PROTOCOL
*This
,
939 IN UINT32 SourceSize
,
940 IN OUT VOID
*Destination
,
941 IN UINT32 DestinationSize
,
942 IN OUT VOID
*Scratch
,
943 IN UINT32 ScratchSize
947 UINT32 TestDestinationSize
;
948 UINT32 TestScratchSize
;
950 Status
= CustomDecompressGetInfo (Source
, SourceSize
, &TestDestinationSize
, &TestScratchSize
);
951 if (EFI_ERROR (Status
)) {
955 if (ScratchSize
< TestScratchSize
|| DestinationSize
< TestDestinationSize
) {
956 return RETURN_INVALID_PARAMETER
;
959 return CustomDecompress (Source
, Destination
, Scratch
);