3 Copyright (c) 2006, 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 #if (EFI_SPECIFICATION_VERSION >= 0x00020000)
116 (EFI_CREATE_EVENT_EX
) CoreCreateEventEx
// CreateEventEx
120 EFI_DXE_SERVICES mDxeServices
= {
122 EFI_DXE_SERVICES_SIGNATURE
, // Signature
123 EFI_DXE_SERVICES_REVISION
, // Revision
124 sizeof (EFI_DXE_SERVICES
), // HeaderSize
128 (EFI_ADD_MEMORY_SPACE
) CoreAddMemorySpace
, // AddMemorySpace
129 (EFI_ALLOCATE_MEMORY_SPACE
) CoreAllocateMemorySpace
, // AllocateMemorySpace
130 (EFI_FREE_MEMORY_SPACE
) CoreFreeMemorySpace
, // FreeMemorySpace
131 (EFI_REMOVE_MEMORY_SPACE
) CoreRemoveMemorySpace
, // RemoveMemorySpace
132 (EFI_GET_MEMORY_SPACE_DESCRIPTOR
) CoreGetMemorySpaceDescriptor
, // GetMemorySpaceDescriptor
133 (EFI_SET_MEMORY_SPACE_ATTRIBUTES
) CoreSetMemorySpaceAttributes
, // SetMemorySpaceAttributes
134 (EFI_GET_MEMORY_SPACE_MAP
) CoreGetMemorySpaceMap
, // GetMemorySpaceMap
135 (EFI_ADD_IO_SPACE
) CoreAddIoSpace
, // AddIoSpace
136 (EFI_ALLOCATE_IO_SPACE
) CoreAllocateIoSpace
, // AllocateIoSpace
137 (EFI_FREE_IO_SPACE
) CoreFreeIoSpace
, // FreeIoSpace
138 (EFI_REMOVE_IO_SPACE
) CoreRemoveIoSpace
, // RemoveIoSpace
139 (EFI_GET_IO_SPACE_DESCRIPTOR
) CoreGetIoSpaceDescriptor
, // GetIoSpaceDescriptor
140 (EFI_GET_IO_SPACE_MAP
) CoreGetIoSpaceMap
, // GetIoSpaceMap
141 (EFI_DISPATCH
) CoreDispatcher
, // Dispatch
142 (EFI_SCHEDULE
) CoreSchedule
, // Schedule
143 (EFI_TRUST
) CoreTrust
, // Trust
144 (EFI_PROCESS_FIRMWARE_VOLUME
) CoreProcessFirmwareVolume
, // ProcessFirmwareVolume
147 EFI_SYSTEM_TABLE mEfiSystemTableTemplate
= {
149 EFI_SYSTEM_TABLE_SIGNATURE
, // Signature
150 EFI_SYSTEM_TABLE_REVISION
, // Revision
151 sizeof (EFI_SYSTEM_TABLE
), // HeaderSize
155 NULL
, // FirmwareVendor
156 0, // FirmwareRevision
157 NULL
, // ConsoleInHandle
159 NULL
, // ConsoleOutHandle
161 NULL
, // StandardErrorHandle
163 NULL
, // RuntimeServices
164 &mBootServices
, // BootServices
165 0, // NumberOfConfigurationTableEntries
166 NULL
// ConfigurationTable
169 EFI_RUNTIME_SERVICES mEfiRuntimeServicesTableTemplate
= {
171 EFI_RUNTIME_SERVICES_SIGNATURE
, // Signature
172 EFI_RUNTIME_SERVICES_REVISION
, // Revision
173 sizeof (EFI_RUNTIME_SERVICES
), // HeaderSize
177 (EFI_GET_TIME
) CoreEfiNotAvailableYetArg2
, // GetTime
178 (EFI_SET_TIME
) CoreEfiNotAvailableYetArg1
, // SetTime
179 (EFI_GET_WAKEUP_TIME
) CoreEfiNotAvailableYetArg3
, // GetWakeupTime
180 (EFI_SET_WAKEUP_TIME
) CoreEfiNotAvailableYetArg2
, // SetWakeupTime
181 (EFI_SET_VIRTUAL_ADDRESS_MAP
) CoreEfiNotAvailableYetArg4
, // SetVirtualAddressMap
182 (EFI_CONVERT_POINTER
) CoreEfiNotAvailableYetArg2
, // ConvertPointer
183 (EFI_GET_VARIABLE
) CoreEfiNotAvailableYetArg5
, // GetVariable
184 (EFI_GET_NEXT_VARIABLE_NAME
) CoreEfiNotAvailableYetArg3
, // GetNextVariableName
185 (EFI_SET_VARIABLE
) CoreEfiNotAvailableYetArg5
, // SetVariable
186 (EFI_GET_NEXT_HIGH_MONO_COUNT
) CoreEfiNotAvailableYetArg1
, // GetNextHighMonotonicCount
187 (EFI_RESET_SYSTEM
) CoreEfiNotAvailableYetArg4
// ResetSystem
188 #if ((EDK_RELEASE_VERSION != 0) && (EFI_SPECIFICATION_VERSION < 0x00020000))
190 // This Tiano extension was removed when UEFI 2.0 support was added.
191 // It's now just a protocol.
194 (EFI_REPORT_STATUS_CODE
) CoreEfiNotAvailableYetArg5
// ReportStatusCode
195 #elif (EFI_SPECIFICATION_VERSION >= 0x00020000)
197 // New runtime services added by UEFI 2.0
200 (EFI_UPDATE_CAPSULE
) CoreEfiNotAvailableYetArg3
, // UpdateCapsule
201 (EFI_QUERY_CAPSULE_CAPABILITIES
) CoreEfiNotAvailableYetArg4
, // QueryCapsuleCapabilities
202 (EFI_QUERY_VARIABLE_INFO
) CoreEfiNotAvailableYetArg4
// QueryVariableInfo
206 EFI_RUNTIME_ARCH_PROTOCOL gRuntimeTemplate
= {
207 INITIALIZE_LIST_HEAD_VARIABLE (gRuntimeTemplate
.ImageHead
),
208 INITIALIZE_LIST_HEAD_VARIABLE (gRuntimeTemplate
.EventHead
),
211 // Make sure Size != sizeof (EFI_MEMORY_DESCRIPTOR). This will
212 // prevent people from having pointer math bugs in their code.
213 // now you have to use *DescriptorSize to make things work.
215 sizeof (EFI_MEMORY_DESCRIPTOR
) + sizeof (UINT64
) - (sizeof (EFI_MEMORY_DESCRIPTOR
) % sizeof (UINT64
)),
216 EFI_MEMORY_DESCRIPTOR_VERSION
,
224 EFI_RUNTIME_ARCH_PROTOCOL
*gRuntime
= &gRuntimeTemplate
;
227 // DXE Core Global Variables for the EFI System Table, Boot Services Table,
228 // DXE Services Table, and Runtime Services Table
230 EFI_BOOT_SERVICES
*gBS
= &mBootServices
;
231 EFI_DXE_SERVICES
*gDS
= &mDxeServices
;
232 EFI_SYSTEM_TABLE
*gST
= NULL
;
235 // For debug initialize gRT to template. gRT must be allocated from RT memory
236 // but gRT is used for ASSERT () and DEBUG () type macros so lets give it
237 // a value that will not cause debug infrastructure to crash early on.
239 EFI_RUNTIME_SERVICES
*gRT
= &mEfiRuntimeServicesTableTemplate
;
240 EFI_HANDLE gDxeCoreImageHandle
= NULL
;
245 // EFI Decompress Protocol
247 EFI_DECOMPRESS_PROTOCOL gEfiDecompress
= {
248 DxeMainUefiDecompressGetInfo
,
249 DxeMainUefiDecompress
253 // Tiano Decompress Protocol
255 EFI_TIANO_DECOMPRESS_PROTOCOL gEfiTianoDecompress
= {
256 DxeMainTianoDecompressGetInfo
,
257 DxeMainTianoDecompress
261 // Customized Decompress Protocol
263 EFI_CUSTOMIZED_DECOMPRESS_PROTOCOL gEfiCustomizedDecompress
= {
264 DxeMainCustomDecompressGetInfo
,
265 DxeMainCustomDecompress
269 // Main entry point to the DXE Core
280 Main entry point to DXE Core.
284 HobStart - Pointer to the beginning of the HOB List from PEI
288 This function should never return
293 EFI_PHYSICAL_ADDRESS MemoryBaseAddress
;
296 mHobStart
= HobStart
;
299 // Initialize Memory Services
301 CoreInitializeMemoryServices (&HobStart
, &MemoryBaseAddress
, &MemoryLength
);
304 // Allocate the EFI System Table and EFI Runtime Service Table from EfiRuntimeServicesData
305 // Use the templates to initialize the contents of the EFI System Table and EFI Runtime Services Table
307 gST
= CoreAllocateRuntimeCopyPool (sizeof (EFI_SYSTEM_TABLE
), &mEfiSystemTableTemplate
);
308 ASSERT (gST
!= NULL
);
310 gRT
= CoreAllocateRuntimeCopyPool (sizeof (EFI_RUNTIME_SERVICES
), &mEfiRuntimeServicesTableTemplate
);
311 ASSERT (gRT
!= NULL
);
313 gST
->RuntimeServices
= gRT
;
316 // Start the Image Services.
318 Status
= CoreInitializeImageServices (HobStart
);
319 ASSERT_EFI_ERROR (Status
);
322 // Call constructor for all libraries
324 ProcessLibraryConstructorList (gDxeCoreImageHandle
, gST
);
325 PERF_END (0,PEI_TOK
, NULL
, 0) ;
326 PERF_START (0,DXE_TOK
, NULL
, 0) ;
329 // Initialize the Global Coherency Domain Services
331 Status
= CoreInitializeGcdServices (&HobStart
, MemoryBaseAddress
, MemoryLength
);
332 ASSERT_EFI_ERROR (Status
);
335 // Install the DXE Services Table into the EFI System Tables's Configuration Table
337 Status
= CoreInstallConfigurationTable (&gEfiDxeServicesTableGuid
, gDS
);
338 ASSERT_EFI_ERROR (Status
);
341 // Install the HOB List into the EFI System Tables's Configuration Table
343 Status
= CoreInstallConfigurationTable (&gEfiHobListGuid
, HobStart
);
344 ASSERT_EFI_ERROR (Status
);
347 // Install Memory Type Information Table into the EFI System Tables's Configuration Table
349 Status
= CoreInstallConfigurationTable (&gEfiMemoryTypeInformationGuid
, &gMemoryTypeInformation
);
350 ASSERT_EFI_ERROR (Status
);
353 // Initialize the ReportStatusCode with PEI version, if availible
355 CoreGetPeiProtocol (&gEfiStatusCodeRuntimeProtocolGuid
, (VOID
**)&gStatusCode
->ReportStatusCode
);
356 #if ((EDK_RELEASE_VERSION != 0) && (EFI_SPECIFICATION_VERSION < 0x00020000))
358 // This Tiano extension was removed when UEFI 2.0 support was added.
359 // It's now just a protocol.
361 gRT
->ReportStatusCode
= gStatusCode
->ReportStatusCode
;
365 // Report Status Code here for DXE_ENTRY_POINT once it is available
367 CoreReportProgressCode ((EFI_SOFTWARE_DXE_CORE
| EFI_SW_DXE_CORE_PC_ENTRY_POINT
));
370 // Create the aligned system table pointer structure that is used by external
371 // debuggers to locate the system table... Also, install debug image info
372 // configuration table.
374 CoreInitializeDebugImageInfoTable ();
375 CoreNewDebugImageInfoEntry (
376 EFI_DEBUG_IMAGE_INFO_TYPE_NORMAL
,
381 DEBUG ((EFI_D_INFO
| EFI_D_LOAD
, "HOBLIST address in DXE = 0x%08x\n", HobStart
));
384 // Initialize the Event Services
386 Status
= CoreInitializeEventServices ();
387 ASSERT_EFI_ERROR (Status
);
391 // Get the Protocols that were passed in from PEI to DXE through GUIDed HOBs
393 // These Protocols are not architectural. This implementation is sharing code between
394 // PEI and DXE in order to save FLASH space. These Protocols could also be implemented
395 // as part of the DXE Core. However, that would also require the DXE Core to be ported
396 // each time a different CPU is used, a different Decompression algorithm is used, or a
397 // different Image type is used. By placing these Protocols in PEI, the DXE Core remains
398 // generic, and only PEI and the Arch Protocols need to be ported from Platform to Platform,
399 // and from CPU to CPU.
403 // Publish the EFI, Tiano, and Custom Decompress protocols for use by other DXE components
405 Status
= CoreInstallMultipleProtocolInterfaces (
407 &gEfiDecompressProtocolGuid
, &gEfiDecompress
,
408 &gEfiTianoDecompressProtocolGuid
, &gEfiTianoDecompress
,
409 &gEfiCustomizedDecompressProtocolGuid
, &gEfiCustomizedDecompress
,
412 ASSERT_EFI_ERROR (Status
);
414 gEfiPeiPeCoffLoader
= GetPeCoffLoaderProtocol ();
415 ASSERT (gEfiPeiPeCoffLoader
!= NULL
);
418 // Register for the GUIDs of the Architectural Protocols, so the rest of the
419 // EFI Boot Services and EFI Runtime Services tables can be filled in.
421 CoreNotifyOnArchProtocolInstallation ();
424 // Produce Firmware Volume Protocols, one for each FV in the HOB list.
426 Status
= FwVolBlockDriverInit (gDxeCoreImageHandle
, gST
);
427 ASSERT_EFI_ERROR (Status
);
429 Status
= FwVolDriverInit (gDxeCoreImageHandle
, gST
);
430 ASSERT_EFI_ERROR (Status
);
433 // Produce the Section Extraction Protocol
435 Status
= InitializeSectionExtraction (gDxeCoreImageHandle
, gST
);
436 ASSERT_EFI_ERROR (Status
);
439 // Initialize the DXE Dispatcher
441 PERF_START (0,"CoreInitializeDispatcher", "DxeMain", 0) ;
442 CoreInitializeDispatcher ();
443 PERF_END (0,"CoreInitializeDispatcher", "DxeMain", 0) ;
446 // Invoke the DXE Dispatcher
448 PERF_START (0, "CoreDispatcher", "DxeMain", 0);
450 PERF_END (0, "CoreDispatcher", "DxeMain", 0);
453 // Display Architectural protocols that were not loaded if this is DEBUG build
456 CoreDisplayMissingArchProtocols ();
460 // Assert if the Architectural Protocols are not present.
462 ASSERT_EFI_ERROR (CoreAllEfiServicesAvailable ());
465 // Report Status code before transfer control to BDS
467 CoreReportProgressCode ((EFI_SOFTWARE_DXE_CORE
| EFI_SW_DXE_CORE_PC_HANDOFF_TO_NEXT
));
469 // Display any drivers that were not dispatched because dependency expression
470 // evaluated to false if this is a debug build
473 CoreDisplayDiscoveredNotDispatched ();
477 // Transfer control to the BDS Architectural Protocol
482 // BDS should never return
491 CoreEfiNotAvailableYetArg0 (
498 Place holder function until all the Boot Services and Runtime Services are available
506 EFI_NOT_AVAILABLE_YET
511 // This function should never be executed. If it does, then the architectural protocols
512 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
513 // DXE Core and all the Architectural Protocols are complete.
516 return EFI_NOT_AVAILABLE_YET
;
521 CoreEfiNotAvailableYetArg1 (
528 Place holder function until all the Boot Services and Runtime Services are available
536 EFI_NOT_AVAILABLE_YET
541 // This function should never be executed. If it does, then the architectural protocols
542 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
543 // DXE Core and all the Architectural Protocols are complete.
546 return EFI_NOT_AVAILABLE_YET
;
551 CoreEfiNotAvailableYetArg2 (
559 Place holder function until all the Boot Services and Runtime Services are available
569 EFI_NOT_AVAILABLE_YET
574 // This function should never be executed. If it does, then the architectural protocols
575 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
576 // DXE Core and all the Architectural Protocols are complete.
579 return EFI_NOT_AVAILABLE_YET
;
584 CoreEfiNotAvailableYetArg3 (
593 Place holder function until all the Boot Services and Runtime Services are available
605 EFI_NOT_AVAILABLE_YET
610 // This function should never be executed. If it does, then the architectural protocols
611 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
612 // DXE Core and all the Architectural Protocols are complete.
615 return EFI_NOT_AVAILABLE_YET
;
620 CoreEfiNotAvailableYetArg4 (
630 Place holder function until all the Boot Services and Runtime Services are available
644 EFI_NOT_AVAILABLE_YET
649 // This function should never be executed. If it does, then the architectural protocols
650 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
651 // DXE Core and all the Architectural Protocols are complete.
654 return EFI_NOT_AVAILABLE_YET
;
659 CoreEfiNotAvailableYetArg5 (
670 Place holder function until all the Boot Services and Runtime Services are available
686 EFI_NOT_AVAILABLE_YET
691 // This function should never be executed. If it does, then the architectural protocols
692 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
693 // DXE Core and all the Architectural Protocols are complete.
696 return EFI_NOT_AVAILABLE_YET
;
702 IN EFI_GUID
*ProtocolGuid
,
709 Searches for a Protocol Interface passed from PEI through a HOB
713 ProtocolGuid - The Protocol GUID to search for in the HOB List
715 Interface - A pointer to the interface for the Protocol GUID
719 EFI_SUCCESS - The Protocol GUID was found and its interface is returned in Interface
721 EFI_NOT_FOUND - The Protocol GUID was not found in the HOB List
725 EFI_HOB_GUID_TYPE
*GuidHob
;
728 GuidHob
= GetNextGuidHob (ProtocolGuid
, mHobStart
);
729 if (GuidHob
== NULL
) {
730 return EFI_NOT_FOUND
;
733 Buffer
= GET_GUID_HOB_DATA (GuidHob
);
734 ASSERT (Buffer
!= NULL
);
736 *Interface
= (VOID
*)(*(UINTN
*)(Buffer
));
744 IN OUT EFI_TABLE_HEADER
*Hdr
750 Calcualte the 32-bit CRC in a EFI table using the service provided by the
755 Hdr - Pointer to an EFI standard header
768 // If gBS->CalculateCrce32 () == CoreEfiNotAvailableYet () then
769 // Crc will come back as zero if we set it to zero here
772 gBS
->CalculateCrc32 ((UINT8
*)Hdr
, Hdr
->HeaderSize
, &Crc
);
780 CoreExitBootServices (
781 IN EFI_HANDLE ImageHandle
,
788 Terminates all boot services.
792 ImageHandle - Handle that identifies the exiting image.
794 MapKey -Key to the latest memory map.
798 EFI_SUCCESS - Boot Services terminated
799 EFI_INVALID_PARAMETER - MapKey is incorrect.
806 // Terminate memory services if the MapKey matches
808 Status
= CoreTerminateMemoryMap (MapKey
);
809 if (EFI_ERROR (Status
)) {
814 // Notify other drivers that we are exiting boot services.
816 CoreNotifySignalList (&gEfiEventExitBootServicesGuid
);
821 gTimer
->SetTimerPeriod (gTimer
, 0);
824 // Disable CPU Interrupts
826 gCpu
->DisableInterrupt (gCpu
);
829 // Report that ExitBootServices() has been called
831 // We are using gEfiDxeServicesTableGuid as the caller ID for Dxe Core
833 CoreReportProgressCode ((EFI_SOFTWARE_EFI_BOOT_SERVICE
| EFI_SW_BS_PC_EXIT_BOOT_SERVICES
));
836 // Clear the non-runtime values of the EFI System Table
838 gST
->BootServices
= NULL
;
840 gST
->ConsoleInHandle
= NULL
;
842 gST
->ConsoleOutHandle
= NULL
;
844 gST
->StandardErrorHandle
= NULL
;
847 // Recompute the 32-bit CRC of the EFI System Table
849 CalculateEfiHdrCrc (&gST
->Hdr
);
852 // Zero out the Boot Service Table
854 SetMem (gBS
, sizeof (EFI_BOOT_SERVICES
), 0);
858 // Update the AtRuntime field in Runtiem AP.
860 gRuntime
->AtRuntime
= TRUE
;
866 DxeMainUefiDecompressGetInfo (
867 IN EFI_DECOMPRESS_PROTOCOL
*This
,
869 IN UINT32 SourceSize
,
870 OUT UINT32
*DestinationSize
,
871 OUT UINT32
*ScratchSize
874 return UefiDecompressGetInfo (Source
, SourceSize
, DestinationSize
, ScratchSize
);
879 DxeMainUefiDecompress (
880 IN EFI_DECOMPRESS_PROTOCOL
*This
,
882 IN UINT32 SourceSize
,
883 IN OUT VOID
*Destination
,
884 IN UINT32 DestinationSize
,
885 IN OUT VOID
*Scratch
,
886 IN UINT32 ScratchSize
890 UINT32 TestDestinationSize
;
891 UINT32 TestScratchSize
;
893 Status
= UefiDecompressGetInfo (Source
, SourceSize
, &TestDestinationSize
, &TestScratchSize
);
894 if (EFI_ERROR (Status
)) {
898 if (ScratchSize
< TestScratchSize
|| DestinationSize
< TestDestinationSize
) {
899 return RETURN_INVALID_PARAMETER
;
902 return UefiDecompress (Source
, Destination
, Scratch
);
906 DxeMainTianoDecompressGetInfo (
907 IN EFI_TIANO_DECOMPRESS_PROTOCOL
*This
,
909 IN UINT32 SourceSize
,
910 OUT UINT32
*DestinationSize
,
911 OUT UINT32
*ScratchSize
914 return TianoDecompressGetInfo (Source
, SourceSize
, DestinationSize
, ScratchSize
);
919 DxeMainTianoDecompress (
920 IN EFI_TIANO_DECOMPRESS_PROTOCOL
*This
,
922 IN UINT32 SourceSize
,
923 IN OUT VOID
*Destination
,
924 IN UINT32 DestinationSize
,
925 IN OUT VOID
*Scratch
,
926 IN UINT32 ScratchSize
930 UINT32 TestDestinationSize
;
931 UINT32 TestScratchSize
;
933 Status
= TianoDecompressGetInfo (Source
, SourceSize
, &TestDestinationSize
, &TestScratchSize
);
934 if (EFI_ERROR (Status
)) {
938 if (ScratchSize
< TestScratchSize
|| DestinationSize
< TestDestinationSize
) {
939 return RETURN_INVALID_PARAMETER
;
942 return TianoDecompress (Source
, Destination
, Scratch
);
946 DxeMainCustomDecompressGetInfo (
947 IN EFI_CUSTOMIZED_DECOMPRESS_PROTOCOL
*This
,
949 IN UINT32 SourceSize
,
950 OUT UINT32
*DestinationSize
,
951 OUT UINT32
*ScratchSize
954 return CustomDecompressGetInfo (Source
, SourceSize
, DestinationSize
, ScratchSize
);
959 DxeMainCustomDecompress (
960 IN EFI_CUSTOMIZED_DECOMPRESS_PROTOCOL
*This
,
962 IN UINT32 SourceSize
,
963 IN OUT VOID
*Destination
,
964 IN UINT32 DestinationSize
,
965 IN OUT VOID
*Scratch
,
966 IN UINT32 ScratchSize
970 UINT32 TestDestinationSize
;
971 UINT32 TestScratchSize
;
973 Status
= CustomDecompressGetInfo (Source
, SourceSize
, &TestDestinationSize
, &TestScratchSize
);
974 if (EFI_ERROR (Status
)) {
978 if (ScratchSize
< TestScratchSize
|| DestinationSize
< TestDestinationSize
) {
979 return RETURN_INVALID_PARAMETER
;
982 return CustomDecompress (Source
, Destination
, Scratch
);