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
;
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 // This Tiano extension was removed when UEFI 2.0 support was added.
312 // It's now just a protocol.
315 (EFI_REPORT_STATUS_CODE
) CoreEfiNotAvailableYetArg5
// ReportStatusCode
316 #elif (EFI_SPECIFICATION_VERSION >= 0x00020000)
318 // New runtime services added by UEFI 2.0
321 (EFI_UPDATE_CAPSULE
) CoreEfiNotAvailableYetArg3
, // UpdateCapsule
322 (EFI_QUERY_CAPSULE_CAPABILITIES
) CoreEfiNotAvailableYetArg4
, // QueryCapsuleCapabilities
323 (EFI_QUERY_VARIABLE_INFO
) CoreEfiNotAvailableYetArg4
// QueryVariableInfo
327 EFI_RUNTIME_ARCH_PROTOCOL gRuntimeTemplate
= {
328 INITIALIZE_LIST_HEAD_VARIABLE (gRuntimeTemplate
.ImageHead
),
329 INITIALIZE_LIST_HEAD_VARIABLE (gRuntimeTemplate
.EventHead
),
332 // Make sure Size != sizeof (EFI_MEMORY_DESCRIPTOR). This will
333 // prevent people from having pointer math bugs in their code.
334 // now you have to use *DescriptorSize to make things work.
336 sizeof (EFI_MEMORY_DESCRIPTOR
) + sizeof (UINT64
) - (sizeof (EFI_MEMORY_DESCRIPTOR
) % sizeof (UINT64
)),
337 EFI_MEMORY_DESCRIPTOR_VERSION
,
345 EFI_RUNTIME_ARCH_PROTOCOL
*gRuntime
= &gRuntimeTemplate
;
348 // DXE Core Global Variables for the EFI System Table, Boot Services Table,
349 // DXE Services Table, and Runtime Services Table
351 EFI_BOOT_SERVICES
*gBS
= &mBootServices
;
352 EFI_DXE_SERVICES
*gDS
= &mDxeServices
;
353 EFI_SYSTEM_TABLE
*gST
= NULL
;
356 // For debug initialize gRT to template. gRT must be allocated from RT memory
357 // but gRT is used for ASSERT () and DEBUG () type macros so lets give it
358 // a value that will not cause debug infrastructure to crash early on.
360 EFI_RUNTIME_SERVICES
*gRT
= &mEfiRuntimeServicesTableTemplate
;
361 EFI_HANDLE gDxeCoreImageHandle
= NULL
;
366 // EFI Decompress Protocol
368 EFI_DECOMPRESS_PROTOCOL gEfiDecompress
= {
369 DxeMainUefiDecompressGetInfo
,
370 DxeMainUefiDecompress
374 // Tiano Decompress Protocol
376 EFI_TIANO_DECOMPRESS_PROTOCOL gEfiTianoDecompress
= {
377 DxeMainTianoDecompressGetInfo
,
378 DxeMainTianoDecompress
382 // Customized Decompress Protocol
384 EFI_CUSTOMIZED_DECOMPRESS_PROTOCOL gEfiCustomizedDecompress
= {
385 DxeMainCustomDecompressGetInfo
,
386 DxeMainCustomDecompress
390 // Main entry point to the DXE Core
401 Main entry point to DXE Core.
405 HobStart - Pointer to the beginning of the HOB List from PEI
409 This function should never return
414 EFI_PHYSICAL_ADDRESS MemoryBaseAddress
;
417 mHobStart
= HobStart
;
420 // Initialize Memory Services
422 CoreInitializeMemoryServices (&HobStart
, &MemoryBaseAddress
, &MemoryLength
);
425 // Allocate the EFI System Table and EFI Runtime Service Table from EfiRuntimeServicesData
426 // Use the templates to initialize the contents of the EFI System Table and EFI Runtime Services Table
428 gST
= CoreAllocateRuntimeCopyPool (sizeof (EFI_SYSTEM_TABLE
), &mEfiSystemTableTemplate
);
429 ASSERT (gST
!= NULL
);
431 gRT
= CoreAllocateRuntimeCopyPool (sizeof (EFI_RUNTIME_SERVICES
), &mEfiRuntimeServicesTableTemplate
);
432 ASSERT (gRT
!= NULL
);
434 gST
->RuntimeServices
= gRT
;
437 // Start the Image Services.
439 Status
= CoreInitializeImageServices (HobStart
);
440 ASSERT_EFI_ERROR (Status
);
443 // Call constructor for all libraries
445 ProcessLibraryConstructorList (gDxeCoreImageHandle
, gST
);
446 PERF_END (0,PEI_TOK
, NULL
, 0) ;
447 PERF_START (0,DXE_TOK
, NULL
, 0) ;
450 // Initialize the Global Coherency Domain Services
452 Status
= CoreInitializeGcdServices (&HobStart
, MemoryBaseAddress
, MemoryLength
);
453 ASSERT_EFI_ERROR (Status
);
456 // Install the DXE Services Table into the EFI System Tables's Configuration Table
458 Status
= CoreInstallConfigurationTable (&gEfiDxeServicesTableGuid
, gDS
);
459 ASSERT_EFI_ERROR (Status
);
462 // Install the HOB List into the EFI System Tables's Configuration Table
464 Status
= CoreInstallConfigurationTable (&gEfiHobListGuid
, HobStart
);
465 ASSERT_EFI_ERROR (Status
);
468 // Install Memory Type Information Table into the EFI System Tables's Configuration Table
470 Status
= CoreInstallConfigurationTable (&gEfiMemoryTypeInformationGuid
, &gMemoryTypeInformation
);
471 ASSERT_EFI_ERROR (Status
);
474 // Initialize the ReportStatusCode with PEI version, if availible
476 CoreGetPeiProtocol (&gEfiStatusCodeRuntimeProtocolGuid
, (VOID
**)&gStatusCode
->ReportStatusCode
);
477 #if ((EDK_RELEASE_VERSION != 0) && (EFI_SPECIFICATION_VERSION < 0x00020000))
479 // This Tiano extension was removed when UEFI 2.0 support was added.
480 // It's now just a protocol.
482 gRT
->ReportStatusCode
= gStatusCode
->ReportStatusCode
;
486 // Report Status Code here for DXE_ENTRY_POINT once it is available
488 CoreReportProgressCode ((EFI_SOFTWARE_DXE_CORE
| EFI_SW_DXE_CORE_PC_ENTRY_POINT
));
491 // Create the aligned system table pointer structure that is used by external
492 // debuggers to locate the system table... Also, install debug image info
493 // configuration table.
495 CoreInitializeDebugImageInfoTable ();
496 CoreNewDebugImageInfoEntry (
497 EFI_DEBUG_IMAGE_INFO_TYPE_NORMAL
,
502 DEBUG ((EFI_D_INFO
| EFI_D_LOAD
, "HOBLIST address in DXE = 0x%08x\n", HobStart
));
505 // Initialize the Event Services
507 Status
= CoreInitializeEventServices ();
508 ASSERT_EFI_ERROR (Status
);
512 // Get the Protocols that were passed in from PEI to DXE through GUIDed HOBs
514 // These Protocols are not architectural. This implementation is sharing code between
515 // PEI and DXE in order to save FLASH space. These Protocols could also be implemented
516 // as part of the DXE Core. However, that would also require the DXE Core to be ported
517 // each time a different CPU is used, a different Decompression algorithm is used, or a
518 // different Image type is used. By placing these Protocols in PEI, the DXE Core remains
519 // generic, and only PEI and the Arch Protocols need to be ported from Platform to Platform,
520 // and from CPU to CPU.
524 // Publish the EFI, Tiano, and Custom Decompress protocols for use by other DXE components
526 Status
= CoreInstallMultipleProtocolInterfaces (
528 &gEfiDecompressProtocolGuid
, &gEfiDecompress
,
529 &gEfiTianoDecompressProtocolGuid
, &gEfiTianoDecompress
,
530 &gEfiCustomizedDecompressProtocolGuid
, &gEfiCustomizedDecompress
,
533 ASSERT_EFI_ERROR (Status
);
535 gEfiPeiPeCoffLoader
= GetPeCoffLoaderProtocol ();
536 ASSERT (gEfiPeiPeCoffLoader
!= NULL
);
539 // Register for the GUIDs of the Architectural Protocols, so the rest of the
540 // EFI Boot Services and EFI Runtime Services tables can be filled in.
542 CoreNotifyOnArchProtocolInstallation ();
545 // Produce Firmware Volume Protocols, one for each FV in the HOB list.
547 Status
= FwVolBlockDriverInit (gDxeCoreImageHandle
, gST
);
548 ASSERT_EFI_ERROR (Status
);
550 Status
= FwVolDriverInit (gDxeCoreImageHandle
, gST
);
551 ASSERT_EFI_ERROR (Status
);
554 // Produce the Section Extraction Protocol
556 Status
= InitializeSectionExtraction (gDxeCoreImageHandle
, gST
);
557 ASSERT_EFI_ERROR (Status
);
560 // Initialize the DXE Dispatcher
562 PERF_START (0,"CoreInitializeDispatcher", "DxeMain", 0) ;
563 CoreInitializeDispatcher ();
564 PERF_END (0,"CoreInitializeDispatcher", "DxeMain", 0) ;
567 // Invoke the DXE Dispatcher
569 PERF_START (0, "CoreDispatcher", "DxeMain", 0);
571 PERF_END (0, "CoreDispatcher", "DxeMain", 0);
574 // Display Architectural protocols that were not loaded if this is DEBUG build
577 CoreDisplayMissingArchProtocols ();
581 // Assert if the Architectural Protocols are not present.
583 ASSERT_EFI_ERROR (CoreAllEfiServicesAvailable ());
586 // Report Status code before transfer control to BDS
588 CoreReportProgressCode ((EFI_SOFTWARE_DXE_CORE
| EFI_SW_DXE_CORE_PC_HANDOFF_TO_NEXT
));
590 // Display any drivers that were not dispatched because dependency expression
591 // evaluated to false if this is a debug build
594 CoreDisplayDiscoveredNotDispatched ();
598 // Transfer control to the BDS Architectural Protocol
603 // BDS should never return
612 CoreEfiNotAvailableYetArg0 (
619 Place holder function until all the Boot Services and Runtime Services are available
627 EFI_NOT_AVAILABLE_YET
632 // This function should never be executed. If it does, then the architectural protocols
633 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
634 // DXE Core and all the Architectural Protocols are complete.
637 return EFI_NOT_AVAILABLE_YET
;
642 CoreEfiNotAvailableYetArg1 (
649 Place holder function until all the Boot Services and Runtime Services are available
657 EFI_NOT_AVAILABLE_YET
662 // This function should never be executed. If it does, then the architectural protocols
663 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
664 // DXE Core and all the Architectural Protocols are complete.
667 return EFI_NOT_AVAILABLE_YET
;
672 CoreEfiNotAvailableYetArg2 (
680 Place holder function until all the Boot Services and Runtime Services are available
690 EFI_NOT_AVAILABLE_YET
695 // This function should never be executed. If it does, then the architectural protocols
696 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
697 // DXE Core and all the Architectural Protocols are complete.
700 return EFI_NOT_AVAILABLE_YET
;
705 CoreEfiNotAvailableYetArg3 (
714 Place holder function until all the Boot Services and Runtime Services are available
726 EFI_NOT_AVAILABLE_YET
731 // This function should never be executed. If it does, then the architectural protocols
732 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
733 // DXE Core and all the Architectural Protocols are complete.
736 return EFI_NOT_AVAILABLE_YET
;
741 CoreEfiNotAvailableYetArg4 (
751 Place holder function until all the Boot Services and Runtime Services are available
765 EFI_NOT_AVAILABLE_YET
770 // This function should never be executed. If it does, then the architectural protocols
771 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
772 // DXE Core and all the Architectural Protocols are complete.
775 return EFI_NOT_AVAILABLE_YET
;
780 CoreEfiNotAvailableYetArg5 (
791 Place holder function until all the Boot Services and Runtime Services are available
807 EFI_NOT_AVAILABLE_YET
812 // This function should never be executed. If it does, then the architectural protocols
813 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
814 // DXE Core and all the Architectural Protocols are complete.
817 return EFI_NOT_AVAILABLE_YET
;
823 IN EFI_GUID
*ProtocolGuid
,
830 Searches for a Protocol Interface passed from PEI through a HOB
834 ProtocolGuid - The Protocol GUID to search for in the HOB List
836 Interface - A pointer to the interface for the Protocol GUID
840 EFI_SUCCESS - The Protocol GUID was found and its interface is returned in Interface
842 EFI_NOT_FOUND - The Protocol GUID was not found in the HOB List
846 EFI_HOB_GUID_TYPE
*GuidHob
;
849 GuidHob
= GetNextGuidHob (ProtocolGuid
, mHobStart
);
850 if (GuidHob
== NULL
) {
851 return EFI_NOT_FOUND
;
854 Buffer
= GET_GUID_HOB_DATA (GuidHob
);
855 ASSERT (Buffer
!= NULL
);
857 *Interface
= (VOID
*)(*(UINTN
*)(Buffer
));
865 IN OUT EFI_TABLE_HEADER
*Hdr
871 Calcualte the 32-bit CRC in a EFI table using the service provided by the
876 Hdr - Pointer to an EFI standard header
889 // If gBS->CalculateCrce32 () == CoreEfiNotAvailableYet () then
890 // Crc will come back as zero if we set it to zero here
893 gBS
->CalculateCrc32 ((UINT8
*)Hdr
, Hdr
->HeaderSize
, &Crc
);
901 CoreExitBootServices (
902 IN EFI_HANDLE ImageHandle
,
909 Terminates all boot services.
913 ImageHandle - Handle that identifies the exiting image.
915 MapKey -Key to the latest memory map.
919 EFI_SUCCESS - Boot Services terminated
920 EFI_INVALID_PARAMETER - MapKey is incorrect.
927 // Terminate memory services if the MapKey matches
929 Status
= CoreTerminateMemoryMap (MapKey
);
930 if (EFI_ERROR (Status
)) {
935 // Notify other drivers that we are exiting boot services.
937 CoreNotifySignalList (&gEfiEventExitBootServicesGuid
);
942 gTimer
->SetTimerPeriod (gTimer
, 0);
945 // Disable CPU Interrupts
947 gCpu
->DisableInterrupt (gCpu
);
950 // Report that ExitBootServices() has been called
952 // We are using gEfiDxeServicesTableGuid as the caller ID for Dxe Core
954 CoreReportProgressCode ((EFI_SOFTWARE_EFI_BOOT_SERVICE
| EFI_SW_BS_PC_EXIT_BOOT_SERVICES
));
957 // Clear the non-runtime values of the EFI System Table
959 gST
->BootServices
= NULL
;
961 gST
->ConsoleInHandle
= NULL
;
963 gST
->ConsoleOutHandle
= NULL
;
965 gST
->StandardErrorHandle
= NULL
;
968 // Recompute the 32-bit CRC of the EFI System Table
970 CalculateEfiHdrCrc (&gST
->Hdr
);
973 // Zero out the Boot Service Table
975 SetMem (gBS
, sizeof (EFI_BOOT_SERVICES
), 0);
979 // Update the AtRuntime field in Runtiem AP.
981 gRuntime
->AtRuntime
= TRUE
;
987 DxeMainUefiDecompressGetInfo (
988 IN EFI_DECOMPRESS_PROTOCOL
*This
,
990 IN UINT32 SourceSize
,
991 OUT UINT32
*DestinationSize
,
992 OUT UINT32
*ScratchSize
995 return UefiDecompressGetInfo (Source
, SourceSize
, DestinationSize
, ScratchSize
);
1000 DxeMainUefiDecompress (
1001 IN EFI_DECOMPRESS_PROTOCOL
*This
,
1003 IN UINT32 SourceSize
,
1004 IN OUT VOID
*Destination
,
1005 IN UINT32 DestinationSize
,
1006 IN OUT VOID
*Scratch
,
1007 IN UINT32 ScratchSize
1011 UINT32 TestDestinationSize
;
1012 UINT32 TestScratchSize
;
1014 Status
= UefiDecompressGetInfo (Source
, SourceSize
, &TestDestinationSize
, &TestScratchSize
);
1015 if (EFI_ERROR (Status
)) {
1019 if (ScratchSize
< TestScratchSize
|| DestinationSize
< TestDestinationSize
) {
1020 return RETURN_INVALID_PARAMETER
;
1023 return UefiDecompress (Source
, Destination
, Scratch
);
1027 DxeMainTianoDecompressGetInfo (
1028 IN EFI_TIANO_DECOMPRESS_PROTOCOL
*This
,
1030 IN UINT32 SourceSize
,
1031 OUT UINT32
*DestinationSize
,
1032 OUT UINT32
*ScratchSize
1035 return TianoDecompressGetInfo (Source
, SourceSize
, DestinationSize
, ScratchSize
);
1040 DxeMainTianoDecompress (
1041 IN EFI_TIANO_DECOMPRESS_PROTOCOL
*This
,
1043 IN UINT32 SourceSize
,
1044 IN OUT VOID
*Destination
,
1045 IN UINT32 DestinationSize
,
1046 IN OUT VOID
*Scratch
,
1047 IN UINT32 ScratchSize
1051 UINT32 TestDestinationSize
;
1052 UINT32 TestScratchSize
;
1054 Status
= TianoDecompressGetInfo (Source
, SourceSize
, &TestDestinationSize
, &TestScratchSize
);
1055 if (EFI_ERROR (Status
)) {
1059 if (ScratchSize
< TestScratchSize
|| DestinationSize
< TestDestinationSize
) {
1060 return RETURN_INVALID_PARAMETER
;
1063 return TianoDecompress (Source
, Destination
, Scratch
);
1067 DxeMainCustomDecompressGetInfo (
1068 IN EFI_CUSTOMIZED_DECOMPRESS_PROTOCOL
*This
,
1070 IN UINT32 SourceSize
,
1071 OUT UINT32
*DestinationSize
,
1072 OUT UINT32
*ScratchSize
1075 return CustomDecompressGetInfo (Source
, SourceSize
, DestinationSize
, ScratchSize
);
1080 DxeMainCustomDecompress (
1081 IN EFI_CUSTOMIZED_DECOMPRESS_PROTOCOL
*This
,
1083 IN UINT32 SourceSize
,
1084 IN OUT VOID
*Destination
,
1085 IN UINT32 DestinationSize
,
1086 IN OUT VOID
*Scratch
,
1087 IN UINT32 ScratchSize
1091 UINT32 TestDestinationSize
;
1092 UINT32 TestScratchSize
;
1094 Status
= CustomDecompressGetInfo (Source
, SourceSize
, &TestDestinationSize
, &TestScratchSize
);
1095 if (EFI_ERROR (Status
)) {
1099 if (ScratchSize
< TestScratchSize
|| DestinationSize
< TestDestinationSize
) {
1100 return RETURN_INVALID_PARAMETER
;
1103 return CustomDecompress (Source
, Destination
, Scratch
);