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
32 CoreEfiNotAvailableYetArg0 (
38 CoreEfiNotAvailableYetArg1 (
44 CoreEfiNotAvailableYetArg2 (
51 CoreEfiNotAvailableYetArg3 (
59 CoreEfiNotAvailableYetArg4 (
68 CoreEfiNotAvailableYetArg5 (
78 IN EFI_GUID
*ProtocolGuid
,
83 DxeMainUefiDecompressGetInfo (
84 IN EFI_DECOMPRESS_PROTOCOL
*This
,
87 OUT UINT32
*DestinationSize
,
88 OUT UINT32
*ScratchSize
93 DxeMainUefiDecompress (
94 IN EFI_DECOMPRESS_PROTOCOL
*This
,
97 IN OUT VOID
*Destination
,
98 IN UINT32 DestinationSize
,
100 IN UINT32 ScratchSize
104 DxeMainTianoDecompressGetInfo (
105 IN EFI_TIANO_DECOMPRESS_PROTOCOL
*This
,
107 IN UINT32 SourceSize
,
108 OUT UINT32
*DestinationSize
,
109 OUT UINT32
*ScratchSize
114 DxeMainTianoDecompress (
115 IN EFI_TIANO_DECOMPRESS_PROTOCOL
*This
,
117 IN UINT32 SourceSize
,
118 IN OUT VOID
*Destination
,
119 IN UINT32 DestinationSize
,
120 IN OUT VOID
*Scratch
,
121 IN UINT32 ScratchSize
125 DxeMainCustomDecompressGetInfo (
126 IN EFI_CUSTOMIZED_DECOMPRESS_PROTOCOL
*This
,
128 IN UINT32 SourceSize
,
129 OUT UINT32
*DestinationSize
,
130 OUT UINT32
*ScratchSize
135 DxeMainCustomDecompress (
136 IN EFI_CUSTOMIZED_DECOMPRESS_PROTOCOL
*This
,
138 IN UINT32 SourceSize
,
139 IN OUT VOID
*Destination
,
140 IN UINT32 DestinationSize
,
141 IN OUT VOID
*Scratch
,
142 IN UINT32 ScratchSize
146 // DXE Core Global Variables for Protocols from PEI
148 EFI_HANDLE mDecompressHandle
= NULL
;
149 EFI_PEI_PE_COFF_LOADER_PROTOCOL
*gEfiPeiPeCoffLoader
= NULL
;
152 // DXE Core globals for Architecture Protocols
154 EFI_SECURITY_ARCH_PROTOCOL
*gSecurity
= NULL
;
155 EFI_CPU_ARCH_PROTOCOL
*gCpu
= NULL
;
156 EFI_METRONOME_ARCH_PROTOCOL
*gMetronome
= NULL
;
157 EFI_TIMER_ARCH_PROTOCOL
*gTimer
= NULL
;
158 EFI_BDS_ARCH_PROTOCOL
*gBds
= NULL
;
159 EFI_WATCHDOG_TIMER_ARCH_PROTOCOL
*gWatchdogTimer
= NULL
;
160 EFI_RUNTIME_ARCH_PROTOCOL
*gRuntime
= NULL
;
163 // BugBug: I'n not runtime, but is the PPI?
165 EFI_STATUS_CODE_PROTOCOL gStatusCodeInstance
= {
169 EFI_STATUS_CODE_PROTOCOL
*gStatusCode
= &gStatusCodeInstance
;
173 // DXE Core Global used to update core loaded image protocol handle
175 EFI_GUID
*gDxeCoreFileName
;
176 EFI_LOADED_IMAGE_PROTOCOL
*gDxeCoreLoadedImage
;
181 // DXE Core Module Variables
184 EFI_BOOT_SERVICES mBootServices
= {
186 EFI_BOOT_SERVICES_SIGNATURE
, // Signature
187 EFI_BOOT_SERVICES_REVISION
, // Revision
188 sizeof (EFI_BOOT_SERVICES
), // HeaderSize
192 (EFI_RAISE_TPL
) CoreRaiseTpl
, // RaiseTPL
193 (EFI_RESTORE_TPL
) CoreRestoreTpl
, // RestoreTPL
194 (EFI_ALLOCATE_PAGES
) CoreAllocatePages
, // AllocatePages
195 (EFI_FREE_PAGES
) CoreFreePages
, // FreePages
196 (EFI_GET_MEMORY_MAP
) CoreGetMemoryMap
, // GetMemoryMap
197 (EFI_ALLOCATE_POOL
) CoreAllocatePool
, // AllocatePool
198 (EFI_FREE_POOL
) CoreFreePool
, // FreePool
199 (EFI_CREATE_EVENT
) CoreCreateEvent
, // CreateEvent
200 (EFI_SET_TIMER
) CoreSetTimer
, // SetTimer
201 (EFI_WAIT_FOR_EVENT
) CoreWaitForEvent
, // WaitForEvent
202 (EFI_SIGNAL_EVENT
) CoreSignalEvent
, // SignalEvent
203 (EFI_CLOSE_EVENT
) CoreCloseEvent
, // CloseEvent
204 (EFI_CHECK_EVENT
) CoreCheckEvent
, // CheckEvent
205 (EFI_INSTALL_PROTOCOL_INTERFACE
) CoreInstallProtocolInterface
, // InstallProtocolInterface
206 (EFI_REINSTALL_PROTOCOL_INTERFACE
) CoreReinstallProtocolInterface
, // ReinstallProtocolInterface
207 (EFI_UNINSTALL_PROTOCOL_INTERFACE
) CoreUninstallProtocolInterface
, // UninstallProtocolInterface
208 (EFI_HANDLE_PROTOCOL
) CoreHandleProtocol
, // HandleProtocol
209 (VOID
*) NULL
, // Reserved
210 (EFI_REGISTER_PROTOCOL_NOTIFY
) CoreRegisterProtocolNotify
, // RegisterProtocolNotify
211 (EFI_LOCATE_HANDLE
) CoreLocateHandle
, // LocateHandle
212 (EFI_LOCATE_DEVICE_PATH
) CoreLocateDevicePath
, // LocateDevicePath
213 (EFI_INSTALL_CONFIGURATION_TABLE
) CoreInstallConfigurationTable
, // InstallConfigurationTable
214 (EFI_IMAGE_LOAD
) CoreLoadImage
, // LoadImage
215 (EFI_IMAGE_START
) CoreStartImage
, // StartImage
216 (EFI_EXIT
) CoreExit
, // Exit
217 (EFI_IMAGE_UNLOAD
) CoreUnloadImage
, // UnloadImage
218 (EFI_EXIT_BOOT_SERVICES
) CoreExitBootServices
, // ExitBootServices
219 (EFI_GET_NEXT_MONOTONIC_COUNT
) CoreEfiNotAvailableYetArg1
, // GetNextMonotonicCount
220 (EFI_STALL
) CoreStall
, // Stall
221 (EFI_SET_WATCHDOG_TIMER
) CoreSetWatchdogTimer
, // SetWatchdogTimer
222 (EFI_CONNECT_CONTROLLER
) CoreConnectController
, // ConnectController
223 (EFI_DISCONNECT_CONTROLLER
) CoreDisconnectController
, // DisconnectController
224 (EFI_OPEN_PROTOCOL
) CoreOpenProtocol
, // OpenProtocol
225 (EFI_CLOSE_PROTOCOL
) CoreCloseProtocol
, // CloseProtocol
226 (EFI_OPEN_PROTOCOL_INFORMATION
) CoreOpenProtocolInformation
, // OpenProtocolInformation
227 (EFI_PROTOCOLS_PER_HANDLE
) CoreProtocolsPerHandle
, // ProtocolsPerHandle
228 (EFI_LOCATE_HANDLE_BUFFER
) CoreLocateHandleBuffer
, // LocateHandleBuffer
229 (EFI_LOCATE_PROTOCOL
) CoreLocateProtocol
, // LocateProtocol
230 (EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES
) CoreInstallMultipleProtocolInterfaces
, // InstallMultipleProtocolInterfaces
231 (EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES
) CoreUninstallMultipleProtocolInterfaces
, // UninstallMultipleProtocolInterfaces
232 (EFI_CALCULATE_CRC32
) CoreEfiNotAvailableYetArg3
, // CalculateCrc32
233 (EFI_COPY_MEM
) CopyMem
, // CopyMem
234 (EFI_SET_MEM
) SetMem
// SetMem
235 #if (EFI_SPECIFICATION_VERSION >= 0x00020000)
237 (EFI_CREATE_EVENT_EX
) CoreCreateEventEx
// CreateEventEx
241 EFI_DXE_SERVICES mDxeServices
= {
243 EFI_DXE_SERVICES_SIGNATURE
, // Signature
244 EFI_DXE_SERVICES_REVISION
, // Revision
245 sizeof (EFI_DXE_SERVICES
), // HeaderSize
249 (EFI_ADD_MEMORY_SPACE
) CoreAddMemorySpace
, // AddMemorySpace
250 (EFI_ALLOCATE_MEMORY_SPACE
) CoreAllocateMemorySpace
, // AllocateMemorySpace
251 (EFI_FREE_MEMORY_SPACE
) CoreFreeMemorySpace
, // FreeMemorySpace
252 (EFI_REMOVE_MEMORY_SPACE
) CoreRemoveMemorySpace
, // RemoveMemorySpace
253 (EFI_GET_MEMORY_SPACE_DESCRIPTOR
) CoreGetMemorySpaceDescriptor
, // GetMemorySpaceDescriptor
254 (EFI_SET_MEMORY_SPACE_ATTRIBUTES
) CoreSetMemorySpaceAttributes
, // SetMemorySpaceAttributes
255 (EFI_GET_MEMORY_SPACE_MAP
) CoreGetMemorySpaceMap
, // GetMemorySpaceMap
256 (EFI_ADD_IO_SPACE
) CoreAddIoSpace
, // AddIoSpace
257 (EFI_ALLOCATE_IO_SPACE
) CoreAllocateIoSpace
, // AllocateIoSpace
258 (EFI_FREE_IO_SPACE
) CoreFreeIoSpace
, // FreeIoSpace
259 (EFI_REMOVE_IO_SPACE
) CoreRemoveIoSpace
, // RemoveIoSpace
260 (EFI_GET_IO_SPACE_DESCRIPTOR
) CoreGetIoSpaceDescriptor
, // GetIoSpaceDescriptor
261 (EFI_GET_IO_SPACE_MAP
) CoreGetIoSpaceMap
, // GetIoSpaceMap
262 (EFI_DISPATCH
) CoreDispatcher
, // Dispatch
263 (EFI_SCHEDULE
) CoreSchedule
, // Schedule
264 (EFI_TRUST
) CoreTrust
, // Trust
265 (EFI_PROCESS_FIRMWARE_VOLUME
) CoreProcessFirmwareVolume
, // ProcessFirmwareVolume
268 EFI_SYSTEM_TABLE mEfiSystemTableTemplate
= {
270 EFI_SYSTEM_TABLE_SIGNATURE
, // Signature
271 EFI_SYSTEM_TABLE_REVISION
, // Revision
272 sizeof (EFI_SYSTEM_TABLE
), // HeaderSize
276 NULL
, // FirmwareVendor
277 0, // FirmwareRevision
278 NULL
, // ConsoleInHandle
280 NULL
, // ConsoleOutHandle
282 NULL
, // StandardErrorHandle
284 NULL
, // RuntimeServices
285 &mBootServices
, // BootServices
286 0, // NumberOfConfigurationTableEntries
287 NULL
// ConfigurationTable
290 EFI_RUNTIME_SERVICES mEfiRuntimeServicesTableTemplate
= {
292 EFI_RUNTIME_SERVICES_SIGNATURE
, // Signature
293 EFI_RUNTIME_SERVICES_REVISION
, // Revision
294 sizeof (EFI_RUNTIME_SERVICES
), // HeaderSize
298 (EFI_GET_TIME
) CoreEfiNotAvailableYetArg2
, // GetTime
299 (EFI_SET_TIME
) CoreEfiNotAvailableYetArg1
, // SetTime
300 (EFI_GET_WAKEUP_TIME
) CoreEfiNotAvailableYetArg3
, // GetWakeupTime
301 (EFI_SET_WAKEUP_TIME
) CoreEfiNotAvailableYetArg2
, // SetWakeupTime
302 (EFI_SET_VIRTUAL_ADDRESS_MAP
) CoreEfiNotAvailableYetArg4
, // SetVirtualAddressMap
303 (EFI_CONVERT_POINTER
) CoreEfiNotAvailableYetArg2
, // ConvertPointer
304 (EFI_GET_VARIABLE
) CoreEfiNotAvailableYetArg5
, // GetVariable
305 (EFI_GET_NEXT_VARIABLE_NAME
) CoreEfiNotAvailableYetArg3
, // GetNextVariableName
306 (EFI_SET_VARIABLE
) CoreEfiNotAvailableYetArg5
, // SetVariable
307 (EFI_GET_NEXT_HIGH_MONO_COUNT
) CoreEfiNotAvailableYetArg1
, // GetNextHighMonotonicCount
308 (EFI_RESET_SYSTEM
) CoreEfiNotAvailableYetArg4
// ResetSystem
309 #if ((EDK_RELEASE_VERSION != 0) && (EFI_SPECIFICATION_VERSION < 0x00020000))
311 (TIANO_REPORT_STATUS_CODE
) CoreEfiNotAvailableYetArg5
// ReportStatusCode
312 #elif (EFI_SPECIFICATION_VERSION >= 0x00020000)
314 (EFI_UPDATE_CAPSULE
) CoreEfiNotAvailableYetArg3
, // UpdateCapsule
315 (EFI_QUERY_CAPSULE_CAPABILITIES
) CoreEfiNotAvailableYetArg4
, // QueryCapsuleCapabilities
316 (EFI_QUERY_VARIABLE_INFO
) CoreEfiNotAvailableYetArg4
// QueryVariableInfo
321 // DXE Core Global Variables for the EFI System Table, Boot Services Table,
322 // DXE Services Table, and Runtime Services Table
324 EFI_BOOT_SERVICES
*gBS
= &mBootServices
;
325 EFI_DXE_SERVICES
*gDS
= &mDxeServices
;
326 EFI_SYSTEM_TABLE
*gST
= NULL
;
329 // For debug initialize gRT to template. gRT must be allocated from RT memory
330 // but gRT is used for ASSERT () and DEBUG () type macros so lets give it
331 // a value that will not cause debug infrastructure to crash early on.
333 EFI_RUNTIME_SERVICES
*gRT
= &mEfiRuntimeServicesTableTemplate
;
334 EFI_HANDLE gDxeCoreImageHandle
= NULL
;
339 // EFI Decompress Protocol
341 EFI_DECOMPRESS_PROTOCOL gEfiDecompress
= {
342 DxeMainUefiDecompressGetInfo
,
343 DxeMainUefiDecompress
347 // Tiano Decompress Protocol
349 EFI_TIANO_DECOMPRESS_PROTOCOL gEfiTianoDecompress
= {
350 DxeMainTianoDecompressGetInfo
,
351 DxeMainTianoDecompress
355 // Customized Decompress Protocol
357 EFI_CUSTOMIZED_DECOMPRESS_PROTOCOL gEfiCustomizedDecompress
= {
358 DxeMainCustomDecompressGetInfo
,
359 DxeMainCustomDecompress
363 // Main entry point to the DXE Core
374 Main entry point to DXE Core.
378 HobStart - Pointer to the beginning of the HOB List from PEI
382 This function should never return
387 EFI_PHYSICAL_ADDRESS MemoryBaseAddress
;
390 #ifdef EFI_DXE_PERFORMANCE
393 GetTimerValue (&Tick
);
396 mHobStart
= HobStart
;
399 // Initialize Memory Services
401 CoreInitializeMemoryServices (&HobStart
, &MemoryBaseAddress
, &MemoryLength
);
404 // Allocate the EFI System Table and EFI Runtime Service Table from EfiRuntimeServicesData
405 // Use the templates to initialize the contents of the EFI System Table and EFI Runtime Services Table
407 gST
= CoreAllocateRuntimeCopyPool (sizeof (EFI_SYSTEM_TABLE
), &mEfiSystemTableTemplate
);
408 ASSERT (gST
!= NULL
);
410 gRT
= CoreAllocateRuntimeCopyPool (sizeof (EFI_RUNTIME_SERVICES
), &mEfiRuntimeServicesTableTemplate
);
411 ASSERT (gRT
!= NULL
);
413 gST
->RuntimeServices
= gRT
;
416 // Start the Image Services.
418 Status
= CoreInitializeImageServices (HobStart
);
419 ASSERT_EFI_ERROR (Status
);
422 // Call constructor for all libraries
424 ProcessLibraryConstructorList (gDxeCoreImageHandle
, gST
);
427 // Initialize the Global Coherency Domain Services
429 Status
= CoreInitializeGcdServices (&HobStart
, MemoryBaseAddress
, MemoryLength
);
430 ASSERT_EFI_ERROR (Status
);
433 // Install the DXE Services Table into the EFI System Tables's Configuration Table
435 Status
= CoreInstallConfigurationTable (&gEfiDxeServicesTableGuid
, gDS
);
436 ASSERT_EFI_ERROR (Status
);
439 // Install the HOB List into the EFI System Tables's Configuration Table
441 Status
= CoreInstallConfigurationTable (&gEfiHobListGuid
, HobStart
);
442 ASSERT_EFI_ERROR (Status
);
445 // Install Memory Type Information Table into the EFI System Tables's Configuration Table
447 Status
= CoreInstallConfigurationTable (&gEfiMemoryTypeInformationGuid
, &gMemoryTypeInformation
);
448 ASSERT_EFI_ERROR (Status
);
451 // Initialize the ReportStatusCode with PEI version, if availible
453 CoreGetPeiProtocol (&gEfiStatusCodeRuntimeProtocolGuid
, (VOID
**)&gStatusCode
->ReportStatusCode
);
454 #if ((EDK_RELEASE_VERSION != 0) && (EFI_SPECIFICATION_VERSION < 0x00020000))
455 gRT
->ReportStatusCode
= gStatusCode
->ReportStatusCode
;
459 // Report Status Code here for DXE_ENTRY_POINT once it is available
461 CoreReportProgressCode ((EFI_SOFTWARE_DXE_CORE
| EFI_SW_DXE_CORE_PC_ENTRY_POINT
));
464 // Create the aligned system table pointer structure that is used by external
465 // debuggers to locate the system table... Also, install debug image info
466 // configuration table.
468 CoreInitializeDebugImageInfoTable ();
469 CoreNewDebugImageInfoEntry (
470 EFI_DEBUG_IMAGE_INFO_TYPE_NORMAL
,
475 DEBUG ((EFI_D_INFO
| EFI_D_LOAD
, "HOBLIST address in DXE = 0x%08x\n", HobStart
));
478 // Initialize the Event Services
480 Status
= CoreInitializeEventServices ();
481 ASSERT_EFI_ERROR (Status
);
485 // Get the Protocols that were passed in from PEI to DXE through GUIDed HOBs
487 // These Protocols are not architectural. This implementation is sharing code between
488 // PEI and DXE in order to save FLASH space. These Protocols could also be implemented
489 // as part of the DXE Core. However, that would also require the DXE Core to be ported
490 // each time a different CPU is used, a different Decompression algorithm is used, or a
491 // different Image type is used. By placing these Protocols in PEI, the DXE Core remains
492 // generic, and only PEI and the Arch Protocols need to be ported from Platform to Platform,
493 // and from CPU to CPU.
497 // Publish the EFI, Tiano, and Custom Decompress protocols for use by other DXE components
499 Status
= CoreInstallMultipleProtocolInterfaces (
501 &gEfiDecompressProtocolGuid
, &gEfiDecompress
,
502 &gEfiTianoDecompressProtocolGuid
, &gEfiTianoDecompress
,
503 &gEfiCustomizedDecompressProtocolGuid
, &gEfiCustomizedDecompress
,
506 ASSERT_EFI_ERROR (Status
);
508 gEfiPeiPeCoffLoader
= GetPeCoffLoaderProtocol ();
509 ASSERT (gEfiPeiPeCoffLoader
!= NULL
);
512 // Register for the GUIDs of the Architectural Protocols, so the rest of the
513 // EFI Boot Services and EFI Runtime Services tables can be filled in.
515 CoreNotifyOnArchProtocolInstallation ();
518 // Produce Firmware Volume Protocols, one for each FV in the HOB list.
520 Status
= FwVolBlockDriverInit (gDxeCoreImageHandle
, gST
);
521 ASSERT_EFI_ERROR (Status
);
523 Status
= FwVolDriverInit (gDxeCoreImageHandle
, gST
);
524 ASSERT_EFI_ERROR (Status
);
527 // Produce the Section Extraction Protocol
529 Status
= InitializeSectionExtraction (gDxeCoreImageHandle
, gST
);
530 ASSERT_EFI_ERROR (Status
);
533 // Initialize the DXE Dispatcher
535 PERF_START (0,"CoreInitializeDispatcher", "DxeMain", 0) ;
536 CoreInitializeDispatcher ();
537 PERF_END (0,"CoreInitializeDispatcher", "DxeMain", 0) ;
540 // Invoke the DXE Dispatcher
542 PERF_START (0, "CoreDispatcher", "DxeMain", 0);
544 PERF_END (0, "CoreDispatcher", "DxeMain", 0);
547 // Display Architectural protocols that were not loaded if this is DEBUG build
550 CoreDisplayMissingArchProtocols ();
554 // Assert if the Architectural Protocols are not present.
556 ASSERT_EFI_ERROR (CoreAllEfiServicesAvailable ());
559 // Report Status code before transfer control to BDS
561 CoreReportProgressCode ((EFI_SOFTWARE_DXE_CORE
| EFI_SW_DXE_CORE_PC_HANDOFF_TO_NEXT
));
563 // Display any drivers that were not dispatched because dependency expression
564 // evaluated to false if this is a debug build
567 CoreDisplayDiscoveredNotDispatched ();
571 // Transfer control to the BDS Architectural Protocol
576 // BDS should never return
585 CoreEfiNotAvailableYetArg0 (
592 Place holder function until all the Boot Services and Runtime Services are available
600 EFI_NOT_AVAILABLE_YET
605 // This function should never be executed. If it does, then the architectural protocols
606 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
607 // DXE Core and all the Architectural Protocols are complete.
610 return EFI_NOT_AVAILABLE_YET
;
615 CoreEfiNotAvailableYetArg1 (
622 Place holder function until all the Boot Services and Runtime Services are available
630 EFI_NOT_AVAILABLE_YET
635 // This function should never be executed. If it does, then the architectural protocols
636 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
637 // DXE Core and all the Architectural Protocols are complete.
640 return EFI_NOT_AVAILABLE_YET
;
645 CoreEfiNotAvailableYetArg2 (
653 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
;
678 CoreEfiNotAvailableYetArg3 (
687 Place holder function until all the Boot Services and Runtime Services are available
699 EFI_NOT_AVAILABLE_YET
704 // This function should never be executed. If it does, then the architectural protocols
705 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
706 // DXE Core and all the Architectural Protocols are complete.
709 return EFI_NOT_AVAILABLE_YET
;
714 CoreEfiNotAvailableYetArg4 (
724 Place holder function until all the Boot Services and Runtime Services are available
738 EFI_NOT_AVAILABLE_YET
743 // This function should never be executed. If it does, then the architectural protocols
744 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
745 // DXE Core and all the Architectural Protocols are complete.
748 return EFI_NOT_AVAILABLE_YET
;
753 CoreEfiNotAvailableYetArg5 (
764 Place holder function until all the Boot Services and Runtime Services are available
780 EFI_NOT_AVAILABLE_YET
785 // This function should never be executed. If it does, then the architectural protocols
786 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
787 // DXE Core and all the Architectural Protocols are complete.
790 return EFI_NOT_AVAILABLE_YET
;
796 IN EFI_GUID
*ProtocolGuid
,
803 Searches for a Protocol Interface passed from PEI through a HOB
807 ProtocolGuid - The Protocol GUID to search for in the HOB List
809 Interface - A pointer to the interface for the Protocol GUID
813 EFI_SUCCESS - The Protocol GUID was found and its interface is returned in Interface
815 EFI_NOT_FOUND - The Protocol GUID was not found in the HOB List
819 EFI_HOB_GUID_TYPE
*GuidHob
;
822 GuidHob
= GetNextGuidHob (ProtocolGuid
, mHobStart
);
823 if (GuidHob
== NULL
) {
824 return EFI_NOT_FOUND
;
827 Buffer
= GET_GUID_HOB_DATA (GuidHob
);
828 ASSERT (Buffer
!= NULL
);
830 *Interface
= (VOID
*)(*(UINTN
*)(Buffer
));
838 IN OUT EFI_TABLE_HEADER
*Hdr
844 Calcualte the 32-bit CRC in a EFI table using the service provided by the
849 Hdr - Pointer to an EFI standard header
862 // If gBS->CalculateCrce32 () == CoreEfiNotAvailableYet () then
863 // Crc will come back as zero if we set it to zero here
866 gBS
->CalculateCrc32 ((UINT8
*)Hdr
, Hdr
->HeaderSize
, &Crc
);
874 CoreExitBootServices (
875 IN EFI_HANDLE ImageHandle
,
882 EFI 1.0 API to terminate Boot Services
886 ImageHandle - Handle that represents the identity of the calling image
888 MapKey -Key to the latest memory map.
892 EFI_SUCCESS - Boot Services terminated
893 EFI_INVALID_PARAMETER - MapKey is incorrect.
900 // Terminate memory services if the MapKey matches
902 Status
= CoreTerminateMemoryMap (MapKey
);
903 if (EFI_ERROR (Status
)) {
908 // Notify other drivers that we are exiting boot services.
910 CoreNotifySignalList (&gEfiEventExitBootServicesGuid
);
915 gTimer
->SetTimerPeriod (gTimer
, 0);
918 // Disable CPU Interrupts
920 gCpu
->DisableInterrupt (gCpu
);
923 // Register Runtime events with the Runtime Architectural Protocol
925 CoreShutdownEventServices ();
928 // Register Runtime images with the Runtime Architectural Protocol
930 CoreShutdownImageServices ();
933 // Report that ExitBootServices() has been called
935 // We are using gEfiDxeServicesTableGuid as the caller ID for Dxe Core
937 CoreReportProgressCode ((EFI_SOFTWARE_EFI_BOOT_SERVICE
| EFI_SW_BS_PC_EXIT_BOOT_SERVICES
));
940 // Clear the non-runtime values of the EFI System Table
942 gST
->BootServices
= NULL
;
944 gST
->ConsoleInHandle
= NULL
;
946 gST
->ConsoleOutHandle
= NULL
;
948 gST
->StandardErrorHandle
= NULL
;
951 // Recompute the 32-bit CRC of the EFI System Table
953 CalculateEfiHdrCrc (&gST
->Hdr
);
956 // Zero out the Boot Service Table
958 SetMem (gBS
, sizeof (EFI_BOOT_SERVICES
), 0);
965 DxeMainUefiDecompressGetInfo (
966 IN EFI_DECOMPRESS_PROTOCOL
*This
,
968 IN UINT32 SourceSize
,
969 OUT UINT32
*DestinationSize
,
970 OUT UINT32
*ScratchSize
973 return UefiDecompressGetInfo (Source
, SourceSize
, DestinationSize
, ScratchSize
);
978 DxeMainUefiDecompress (
979 IN EFI_DECOMPRESS_PROTOCOL
*This
,
981 IN UINT32 SourceSize
,
982 IN OUT VOID
*Destination
,
983 IN UINT32 DestinationSize
,
984 IN OUT VOID
*Scratch
,
985 IN UINT32 ScratchSize
989 UINT32 TestDestinationSize
;
990 UINT32 TestScratchSize
;
992 Status
= UefiDecompressGetInfo (Source
, SourceSize
, &TestDestinationSize
, &TestScratchSize
);
993 if (EFI_ERROR (Status
)) {
997 if (ScratchSize
< TestScratchSize
|| DestinationSize
< TestDestinationSize
) {
998 return RETURN_INVALID_PARAMETER
;
1001 return UefiDecompress (Source
, Destination
, Scratch
);
1005 DxeMainTianoDecompressGetInfo (
1006 IN EFI_TIANO_DECOMPRESS_PROTOCOL
*This
,
1008 IN UINT32 SourceSize
,
1009 OUT UINT32
*DestinationSize
,
1010 OUT UINT32
*ScratchSize
1013 return TianoDecompressGetInfo (Source
, SourceSize
, DestinationSize
, ScratchSize
);
1018 DxeMainTianoDecompress (
1019 IN EFI_TIANO_DECOMPRESS_PROTOCOL
*This
,
1021 IN UINT32 SourceSize
,
1022 IN OUT VOID
*Destination
,
1023 IN UINT32 DestinationSize
,
1024 IN OUT VOID
*Scratch
,
1025 IN UINT32 ScratchSize
1029 UINT32 TestDestinationSize
;
1030 UINT32 TestScratchSize
;
1032 Status
= TianoDecompressGetInfo (Source
, SourceSize
, &TestDestinationSize
, &TestScratchSize
);
1033 if (EFI_ERROR (Status
)) {
1037 if (ScratchSize
< TestScratchSize
|| DestinationSize
< TestDestinationSize
) {
1038 return RETURN_INVALID_PARAMETER
;
1041 return TianoDecompress (Source
, Destination
, Scratch
);
1045 DxeMainCustomDecompressGetInfo (
1046 IN EFI_CUSTOMIZED_DECOMPRESS_PROTOCOL
*This
,
1048 IN UINT32 SourceSize
,
1049 OUT UINT32
*DestinationSize
,
1050 OUT UINT32
*ScratchSize
1053 return CustomDecompressGetInfo (Source
, SourceSize
, DestinationSize
, ScratchSize
);
1058 DxeMainCustomDecompress (
1059 IN EFI_CUSTOMIZED_DECOMPRESS_PROTOCOL
*This
,
1061 IN UINT32 SourceSize
,
1062 IN OUT VOID
*Destination
,
1063 IN UINT32 DestinationSize
,
1064 IN OUT VOID
*Scratch
,
1065 IN UINT32 ScratchSize
1069 UINT32 TestDestinationSize
;
1070 UINT32 TestScratchSize
;
1072 Status
= CustomDecompressGetInfo (Source
, SourceSize
, &TestDestinationSize
, &TestScratchSize
);
1073 if (EFI_ERROR (Status
)) {
1077 if (ScratchSize
< TestScratchSize
|| DestinationSize
< TestDestinationSize
) {
1078 return RETURN_INVALID_PARAMETER
;
1081 return CustomDecompress (Source
, Destination
, Scratch
);