2 DXE Core Main Entry Point
4 Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 // DXE Core Global Variables for Protocols from PEI
20 EFI_HANDLE mDecompressHandle
= NULL
;
23 // DXE Core globals for Architecture Protocols
25 EFI_SECURITY_ARCH_PROTOCOL
*gSecurity
= NULL
;
26 EFI_CPU_ARCH_PROTOCOL
*gCpu
= NULL
;
27 EFI_METRONOME_ARCH_PROTOCOL
*gMetronome
= NULL
;
28 EFI_TIMER_ARCH_PROTOCOL
*gTimer
= NULL
;
29 EFI_BDS_ARCH_PROTOCOL
*gBds
= NULL
;
30 EFI_WATCHDOG_TIMER_ARCH_PROTOCOL
*gWatchdogTimer
= NULL
;
33 // DXE Core globals for optional protocol dependencies
35 EFI_SMM_BASE2_PROTOCOL
*gSmmBase2
= NULL
;
38 // DXE Core Global used to update core loaded image protocol handle
40 EFI_GUID
*gDxeCoreFileName
;
41 EFI_LOADED_IMAGE_PROTOCOL
*gDxeCoreLoadedImage
;
44 // DXE Core Module Variables
46 EFI_BOOT_SERVICES mBootServices
= {
48 EFI_BOOT_SERVICES_SIGNATURE
, // Signature
49 EFI_BOOT_SERVICES_REVISION
, // Revision
50 sizeof (EFI_BOOT_SERVICES
), // HeaderSize
54 (EFI_RAISE_TPL
) CoreRaiseTpl
, // RaiseTPL
55 (EFI_RESTORE_TPL
) CoreRestoreTpl
, // RestoreTPL
56 (EFI_ALLOCATE_PAGES
) CoreAllocatePages
, // AllocatePages
57 (EFI_FREE_PAGES
) CoreFreePages
, // FreePages
58 (EFI_GET_MEMORY_MAP
) CoreGetMemoryMap
, // GetMemoryMap
59 (EFI_ALLOCATE_POOL
) CoreAllocatePool
, // AllocatePool
60 (EFI_FREE_POOL
) CoreFreePool
, // FreePool
61 (EFI_CREATE_EVENT
) CoreCreateEvent
, // CreateEvent
62 (EFI_SET_TIMER
) CoreSetTimer
, // SetTimer
63 (EFI_WAIT_FOR_EVENT
) CoreWaitForEvent
, // WaitForEvent
64 (EFI_SIGNAL_EVENT
) CoreSignalEvent
, // SignalEvent
65 (EFI_CLOSE_EVENT
) CoreCloseEvent
, // CloseEvent
66 (EFI_CHECK_EVENT
) CoreCheckEvent
, // CheckEvent
67 (EFI_INSTALL_PROTOCOL_INTERFACE
) CoreInstallProtocolInterface
, // InstallProtocolInterface
68 (EFI_REINSTALL_PROTOCOL_INTERFACE
) CoreReinstallProtocolInterface
, // ReinstallProtocolInterface
69 (EFI_UNINSTALL_PROTOCOL_INTERFACE
) CoreUninstallProtocolInterface
, // UninstallProtocolInterface
70 (EFI_HANDLE_PROTOCOL
) CoreHandleProtocol
, // HandleProtocol
71 (VOID
*) NULL
, // Reserved
72 (EFI_REGISTER_PROTOCOL_NOTIFY
) CoreRegisterProtocolNotify
, // RegisterProtocolNotify
73 (EFI_LOCATE_HANDLE
) CoreLocateHandle
, // LocateHandle
74 (EFI_LOCATE_DEVICE_PATH
) CoreLocateDevicePath
, // LocateDevicePath
75 (EFI_INSTALL_CONFIGURATION_TABLE
) CoreInstallConfigurationTable
, // InstallConfigurationTable
76 (EFI_IMAGE_LOAD
) CoreLoadImage
, // LoadImage
77 (EFI_IMAGE_START
) CoreStartImage
, // StartImage
78 (EFI_EXIT
) CoreExit
, // Exit
79 (EFI_IMAGE_UNLOAD
) CoreUnloadImage
, // UnloadImage
80 (EFI_EXIT_BOOT_SERVICES
) CoreExitBootServices
, // ExitBootServices
81 (EFI_GET_NEXT_MONOTONIC_COUNT
) CoreEfiNotAvailableYetArg1
, // GetNextMonotonicCount
82 (EFI_STALL
) CoreStall
, // Stall
83 (EFI_SET_WATCHDOG_TIMER
) CoreSetWatchdogTimer
, // SetWatchdogTimer
84 (EFI_CONNECT_CONTROLLER
) CoreConnectController
, // ConnectController
85 (EFI_DISCONNECT_CONTROLLER
) CoreDisconnectController
, // DisconnectController
86 (EFI_OPEN_PROTOCOL
) CoreOpenProtocol
, // OpenProtocol
87 (EFI_CLOSE_PROTOCOL
) CoreCloseProtocol
, // CloseProtocol
88 (EFI_OPEN_PROTOCOL_INFORMATION
) CoreOpenProtocolInformation
, // OpenProtocolInformation
89 (EFI_PROTOCOLS_PER_HANDLE
) CoreProtocolsPerHandle
, // ProtocolsPerHandle
90 (EFI_LOCATE_HANDLE_BUFFER
) CoreLocateHandleBuffer
, // LocateHandleBuffer
91 (EFI_LOCATE_PROTOCOL
) CoreLocateProtocol
, // LocateProtocol
92 (EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES
) CoreInstallMultipleProtocolInterfaces
, // InstallMultipleProtocolInterfaces
93 (EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES
) CoreUninstallMultipleProtocolInterfaces
, // UninstallMultipleProtocolInterfaces
94 (EFI_CALCULATE_CRC32
) CoreEfiNotAvailableYetArg3
, // CalculateCrc32
95 (EFI_COPY_MEM
) CopyMem
, // CopyMem
96 (EFI_SET_MEM
) SetMem
, // SetMem
97 (EFI_CREATE_EVENT_EX
) CoreCreateEventEx
// CreateEventEx
100 EFI_DXE_SERVICES mDxeServices
= {
102 DXE_SERVICES_SIGNATURE
, // Signature
103 DXE_SERVICES_REVISION
, // Revision
104 sizeof (DXE_SERVICES
), // HeaderSize
108 (EFI_ADD_MEMORY_SPACE
) CoreAddMemorySpace
, // AddMemorySpace
109 (EFI_ALLOCATE_MEMORY_SPACE
) CoreAllocateMemorySpace
, // AllocateMemorySpace
110 (EFI_FREE_MEMORY_SPACE
) CoreFreeMemorySpace
, // FreeMemorySpace
111 (EFI_REMOVE_MEMORY_SPACE
) CoreRemoveMemorySpace
, // RemoveMemorySpace
112 (EFI_GET_MEMORY_SPACE_DESCRIPTOR
) CoreGetMemorySpaceDescriptor
, // GetMemorySpaceDescriptor
113 (EFI_SET_MEMORY_SPACE_ATTRIBUTES
) CoreSetMemorySpaceAttributes
, // SetMemorySpaceAttributes
114 (EFI_GET_MEMORY_SPACE_MAP
) CoreGetMemorySpaceMap
, // GetMemorySpaceMap
115 (EFI_ADD_IO_SPACE
) CoreAddIoSpace
, // AddIoSpace
116 (EFI_ALLOCATE_IO_SPACE
) CoreAllocateIoSpace
, // AllocateIoSpace
117 (EFI_FREE_IO_SPACE
) CoreFreeIoSpace
, // FreeIoSpace
118 (EFI_REMOVE_IO_SPACE
) CoreRemoveIoSpace
, // RemoveIoSpace
119 (EFI_GET_IO_SPACE_DESCRIPTOR
) CoreGetIoSpaceDescriptor
, // GetIoSpaceDescriptor
120 (EFI_GET_IO_SPACE_MAP
) CoreGetIoSpaceMap
, // GetIoSpaceMap
121 (EFI_DISPATCH
) CoreDispatcher
, // Dispatch
122 (EFI_SCHEDULE
) CoreSchedule
, // Schedule
123 (EFI_TRUST
) CoreTrust
, // Trust
124 (EFI_PROCESS_FIRMWARE_VOLUME
) CoreProcessFirmwareVolume
, // ProcessFirmwareVolume
127 EFI_SYSTEM_TABLE mEfiSystemTableTemplate
= {
129 EFI_SYSTEM_TABLE_SIGNATURE
, // Signature
130 EFI_SYSTEM_TABLE_REVISION
, // Revision
131 sizeof (EFI_SYSTEM_TABLE
), // HeaderSize
135 NULL
, // FirmwareVendor
136 0, // FirmwareRevision
137 NULL
, // ConsoleInHandle
139 NULL
, // ConsoleOutHandle
141 NULL
, // StandardErrorHandle
143 NULL
, // RuntimeServices
144 &mBootServices
, // BootServices
145 0, // NumberOfConfigurationTableEntries
146 NULL
// ConfigurationTable
149 EFI_RUNTIME_SERVICES mEfiRuntimeServicesTableTemplate
= {
151 EFI_RUNTIME_SERVICES_SIGNATURE
, // Signature
152 EFI_RUNTIME_SERVICES_REVISION
, // Revision
153 sizeof (EFI_RUNTIME_SERVICES
), // HeaderSize
157 (EFI_GET_TIME
) CoreEfiNotAvailableYetArg2
, // GetTime
158 (EFI_SET_TIME
) CoreEfiNotAvailableYetArg1
, // SetTime
159 (EFI_GET_WAKEUP_TIME
) CoreEfiNotAvailableYetArg3
, // GetWakeupTime
160 (EFI_SET_WAKEUP_TIME
) CoreEfiNotAvailableYetArg2
, // SetWakeupTime
161 (EFI_SET_VIRTUAL_ADDRESS_MAP
) CoreEfiNotAvailableYetArg4
, // SetVirtualAddressMap
162 (EFI_CONVERT_POINTER
) CoreEfiNotAvailableYetArg2
, // ConvertPointer
163 (EFI_GET_VARIABLE
) CoreEfiNotAvailableYetArg5
, // GetVariable
164 (EFI_GET_NEXT_VARIABLE_NAME
) CoreEfiNotAvailableYetArg3
, // GetNextVariableName
165 (EFI_SET_VARIABLE
) CoreEfiNotAvailableYetArg5
, // SetVariable
166 (EFI_GET_NEXT_HIGH_MONO_COUNT
) CoreEfiNotAvailableYetArg1
, // GetNextHighMonotonicCount
167 (EFI_RESET_SYSTEM
) CoreEfiNotAvailableYetArg4
, // ResetSystem
168 (EFI_UPDATE_CAPSULE
) CoreEfiNotAvailableYetArg3
, // UpdateCapsule
169 (EFI_QUERY_CAPSULE_CAPABILITIES
) CoreEfiNotAvailableYetArg4
, // QueryCapsuleCapabilities
170 (EFI_QUERY_VARIABLE_INFO
) CoreEfiNotAvailableYetArg4
// QueryVariableInfo
173 EFI_RUNTIME_ARCH_PROTOCOL gRuntimeTemplate
= {
174 INITIALIZE_LIST_HEAD_VARIABLE (gRuntimeTemplate
.ImageHead
),
175 INITIALIZE_LIST_HEAD_VARIABLE (gRuntimeTemplate
.EventHead
),
178 // Make sure Size != sizeof (EFI_MEMORY_DESCRIPTOR). This will
179 // prevent people from having pointer math bugs in their code.
180 // now you have to use *DescriptorSize to make things work.
182 sizeof (EFI_MEMORY_DESCRIPTOR
) + sizeof (UINT64
) - (sizeof (EFI_MEMORY_DESCRIPTOR
) % sizeof (UINT64
)),
183 EFI_MEMORY_DESCRIPTOR_VERSION
,
191 EFI_RUNTIME_ARCH_PROTOCOL
*gRuntime
= &gRuntimeTemplate
;
194 // DXE Core Global Variables for the EFI System Table, Boot Services Table,
195 // DXE Services Table, and Runtime Services Table
197 EFI_DXE_SERVICES
*gDxeCoreDS
= &mDxeServices
;
198 EFI_SYSTEM_TABLE
*gDxeCoreST
= NULL
;
201 // For debug initialize gDxeCoreRT to template. gDxeCoreRT must be allocated from RT memory
202 // but gDxeCoreRT is used for ASSERT () and DEBUG () type macros so lets give it
203 // a value that will not cause debug infrastructure to crash early on.
205 EFI_RUNTIME_SERVICES
*gDxeCoreRT
= &mEfiRuntimeServicesTableTemplate
;
206 EFI_HANDLE gDxeCoreImageHandle
= NULL
;
210 // EFI Decompress Protocol
212 EFI_DECOMPRESS_PROTOCOL gEfiDecompress
= {
213 DxeMainUefiDecompressGetInfo
,
214 DxeMainUefiDecompress
218 // For Loading modules at fixed address feature, the configuration table is to cache the top address below which to load
219 // Runtime code&boot time code
221 GLOBAL_REMOVE_IF_UNREFERENCED EFI_LOAD_FIXED_ADDRESS_CONFIGURATION_TABLE gLoadModuleAtFixAddressConfigurationTable
= {0, 0};
223 // Main entry point to the DXE Core
227 Main entry point to DXE Core.
229 @param HobStart Pointer to the beginning of the HOB List from PEI.
231 @return This function should never return.
241 EFI_PHYSICAL_ADDRESS MemoryBaseAddress
;
243 PE_COFF_LOADER_IMAGE_CONTEXT ImageContext
;
246 // Setup the default exception handlers
248 SetupCpuExceptionHandlers ();
251 // Initialize Debug Agent to support source level debug in DXE phase
253 InitializeDebugAgent (DEBUG_AGENT_INIT_DXE_CORE
, HobStart
, NULL
);
256 // Initialize Memory Services
258 CoreInitializeMemoryServices (&HobStart
, &MemoryBaseAddress
, &MemoryLength
);
261 // Allocate the EFI System Table and EFI Runtime Service Table from EfiRuntimeServicesData
262 // Use the templates to initialize the contents of the EFI System Table and EFI Runtime Services Table
264 gDxeCoreST
= AllocateRuntimeCopyPool (sizeof (EFI_SYSTEM_TABLE
), &mEfiSystemTableTemplate
);
265 ASSERT (gDxeCoreST
!= NULL
);
267 gDxeCoreRT
= AllocateRuntimeCopyPool (sizeof (EFI_RUNTIME_SERVICES
), &mEfiRuntimeServicesTableTemplate
);
268 ASSERT (gDxeCoreRT
!= NULL
);
270 gDxeCoreST
->RuntimeServices
= gDxeCoreRT
;
273 // Start the Image Services.
275 Status
= CoreInitializeImageServices (HobStart
);
276 ASSERT_EFI_ERROR (Status
);
279 // Call constructor for all libraries
281 ProcessLibraryConstructorList (gDxeCoreImageHandle
, gDxeCoreST
);
282 PERF_END (NULL
,"PEI", NULL
, 0) ;
283 PERF_START (NULL
,"DXE", NULL
, 0) ;
286 // Report DXE Core image information to the PE/COFF Extra Action Library
288 ImageContext
.ImageAddress
= (EFI_PHYSICAL_ADDRESS
)(UINTN
)gDxeCoreLoadedImage
->ImageBase
;
289 ImageContext
.PdbPointer
= PeCoffLoaderGetPdbPointer ((VOID
*) (UINTN
) ImageContext
.ImageAddress
);
290 PeCoffLoaderRelocateImageExtraAction (&ImageContext
);
293 // Initialize the Global Coherency Domain Services
295 Status
= CoreInitializeGcdServices (&HobStart
, MemoryBaseAddress
, MemoryLength
);
296 ASSERT_EFI_ERROR (Status
);
299 // Install the DXE Services Table into the EFI System Tables's Configuration Table
301 Status
= CoreInstallConfigurationTable (&gEfiDxeServicesTableGuid
, gDxeCoreDS
);
302 ASSERT_EFI_ERROR (Status
);
305 // Install the HOB List into the EFI System Tables's Configuration Table
307 Status
= CoreInstallConfigurationTable (&gEfiHobListGuid
, HobStart
);
308 ASSERT_EFI_ERROR (Status
);
311 // Install Memory Type Information Table into the EFI System Tables's Configuration Table
313 Status
= CoreInstallConfigurationTable (&gEfiMemoryTypeInformationGuid
, &gMemoryTypeInformation
);
314 ASSERT_EFI_ERROR (Status
);
317 // If Loading modules At fixed address feature is enabled, install Load moduels at fixed address
318 // Configuration Table so that user could easily to retrieve the top address to load Dxe and PEI
319 // Code and Tseg base to load SMM driver.
321 if (PcdGet64(PcdLoadModuleAtFixAddressEnable
) != 0) {
322 Status
= CoreInstallConfigurationTable (&gLoadFixedAddressConfigurationTableGuid
, &gLoadModuleAtFixAddressConfigurationTable
);
323 ASSERT_EFI_ERROR (Status
);
326 // Report Status Code here for DXE_ENTRY_POINT once it is available
330 (EFI_SOFTWARE_DXE_CORE
| EFI_SW_DXE_CORE_PC_ENTRY_POINT
)
334 // Create the aligned system table pointer structure that is used by external
335 // debuggers to locate the system table... Also, install debug image info
336 // configuration table.
338 CoreInitializeDebugImageInfoTable ();
339 CoreNewDebugImageInfoEntry (
340 EFI_DEBUG_IMAGE_INFO_TYPE_NORMAL
,
345 DEBUG ((DEBUG_INFO
| DEBUG_LOAD
, "HOBLIST address in DXE = 0x%p\n", HobStart
));
348 EFI_PEI_HOB_POINTERS Hob
;
350 for (Hob
.Raw
= HobStart
; !END_OF_HOB_LIST(Hob
); Hob
.Raw
= GET_NEXT_HOB(Hob
)) {
351 if (GET_HOB_TYPE (Hob
) == EFI_HOB_TYPE_MEMORY_ALLOCATION
) {
352 DEBUG ((DEBUG_INFO
| DEBUG_LOAD
, "Memory Allocation 0x%08x 0x%0lx - 0x%0lx\n", \
353 Hob
.MemoryAllocation
->AllocDescriptor
.MemoryType
, \
354 Hob
.MemoryAllocation
->AllocDescriptor
.MemoryBaseAddress
, \
355 Hob
.MemoryAllocation
->AllocDescriptor
.MemoryBaseAddress
+ Hob
.MemoryAllocation
->AllocDescriptor
.MemoryLength
- 1));
358 for (Hob
.Raw
= HobStart
; !END_OF_HOB_LIST(Hob
); Hob
.Raw
= GET_NEXT_HOB(Hob
)) {
359 if (GET_HOB_TYPE (Hob
) == EFI_HOB_TYPE_FV2
) {
360 DEBUG ((DEBUG_INFO
| DEBUG_LOAD
, "FV2 Hob 0x%0lx - 0x%0lx\n", Hob
.FirmwareVolume2
->BaseAddress
, Hob
.FirmwareVolume2
->BaseAddress
+ Hob
.FirmwareVolume2
->Length
- 1));
361 } else if (GET_HOB_TYPE (Hob
) == EFI_HOB_TYPE_FV
) {
362 DEBUG ((DEBUG_INFO
| DEBUG_LOAD
, "FV Hob 0x%0lx - 0x%0lx\n", Hob
.FirmwareVolume
->BaseAddress
, Hob
.FirmwareVolume
->BaseAddress
+ Hob
.FirmwareVolume2
->Length
- 1));
368 // Initialize the Event Services
370 Status
= CoreInitializeEventServices ();
371 ASSERT_EFI_ERROR (Status
);
375 // Get the Protocols that were passed in from PEI to DXE through GUIDed HOBs
377 // These Protocols are not architectural. This implementation is sharing code between
378 // PEI and DXE in order to save FLASH space. These Protocols could also be implemented
379 // as part of the DXE Core. However, that would also require the DXE Core to be ported
380 // each time a different CPU is used, a different Decompression algorithm is used, or a
381 // different Image type is used. By placing these Protocols in PEI, the DXE Core remains
382 // generic, and only PEI and the Arch Protocols need to be ported from Platform to Platform,
383 // and from CPU to CPU.
387 // Publish the EFI, Tiano, and Custom Decompress protocols for use by other DXE components
389 Status
= CoreInstallMultipleProtocolInterfaces (
391 &gEfiDecompressProtocolGuid
, &gEfiDecompress
,
394 ASSERT_EFI_ERROR (Status
);
397 // Register for the GUIDs of the Architectural Protocols, so the rest of the
398 // EFI Boot Services and EFI Runtime Services tables can be filled in.
399 // Also register for the GUIDs of optional protocols.
401 CoreNotifyOnProtocolInstallation ();
404 // Produce Firmware Volume Protocols, one for each FV in the HOB list.
406 Status
= FwVolBlockDriverInit (gDxeCoreImageHandle
, gDxeCoreST
);
407 ASSERT_EFI_ERROR (Status
);
409 Status
= FwVolDriverInit (gDxeCoreImageHandle
, gDxeCoreST
);
410 ASSERT_EFI_ERROR (Status
);
413 // Produce the Section Extraction Protocol
415 Status
= InitializeSectionExtraction (gDxeCoreImageHandle
, gDxeCoreST
);
416 ASSERT_EFI_ERROR (Status
);
419 // Initialize the DXE Dispatcher
421 PERF_START (NULL
,"CoreInitializeDispatcher", "DxeMain", 0) ;
422 CoreInitializeDispatcher ();
423 PERF_END (NULL
,"CoreInitializeDispatcher", "DxeMain", 0) ;
426 // Invoke the DXE Dispatcher
428 PERF_START (NULL
, "CoreDispatcher", "DxeMain", 0);
430 PERF_END (NULL
, "CoreDispatcher", "DxeMain", 0);
433 // Display Architectural protocols that were not loaded if this is DEBUG build
436 CoreDisplayMissingArchProtocols ();
440 // Display any drivers that were not dispatched because dependency expression
441 // evaluated to false if this is a debug build
444 CoreDisplayDiscoveredNotDispatched ();
448 // Assert if the Architectural Protocols are not present.
450 ASSERT_EFI_ERROR (CoreAllEfiServicesAvailable ());
453 // Report Status code before transfer control to BDS
457 (EFI_SOFTWARE_DXE_CORE
| EFI_SW_DXE_CORE_PC_HANDOFF_TO_NEXT
)
461 // Transfer control to the BDS Architectural Protocol
466 // BDS should never return
475 Place holder function until all the Boot Services and Runtime Services are
478 @return EFI_NOT_AVAILABLE_YET
483 CoreEfiNotAvailableYetArg0 (
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 Place holder function until all the Boot Services and Runtime Services are
501 @param Arg1 Undefined
503 @return EFI_NOT_AVAILABLE_YET
508 CoreEfiNotAvailableYetArg1 (
513 // This function should never be executed. If it does, then the architectural protocols
514 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
515 // DXE Core and all the Architectural Protocols are complete.
518 return EFI_NOT_AVAILABLE_YET
;
523 Place holder function until all the Boot Services and Runtime Services are available.
525 @param Arg1 Undefined
526 @param Arg2 Undefined
528 @return EFI_NOT_AVAILABLE_YET
533 CoreEfiNotAvailableYetArg2 (
539 // This function should never be executed. If it does, then the architectural protocols
540 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
541 // DXE Core and all the Architectural Protocols are complete.
544 return EFI_NOT_AVAILABLE_YET
;
549 Place holder function until all the Boot Services and Runtime Services are available.
551 @param Arg1 Undefined
552 @param Arg2 Undefined
553 @param Arg3 Undefined
555 @return EFI_NOT_AVAILABLE_YET
560 CoreEfiNotAvailableYetArg3 (
567 // This function should never be executed. If it does, then the architectural protocols
568 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
569 // DXE Core and all the Architectural Protocols are complete.
572 return EFI_NOT_AVAILABLE_YET
;
577 Place holder function until all the Boot Services and Runtime Services are available.
579 @param Arg1 Undefined
580 @param Arg2 Undefined
581 @param Arg3 Undefined
582 @param Arg4 Undefined
584 @return EFI_NOT_AVAILABLE_YET
589 CoreEfiNotAvailableYetArg4 (
597 // This function should never be executed. If it does, then the architectural protocols
598 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
599 // DXE Core and all the Architectural Protocols are complete.
602 return EFI_NOT_AVAILABLE_YET
;
607 Place holder function until all the Boot Services and Runtime Services are available.
609 @param Arg1 Undefined
610 @param Arg2 Undefined
611 @param Arg3 Undefined
612 @param Arg4 Undefined
613 @param Arg5 Undefined
615 @return EFI_NOT_AVAILABLE_YET
620 CoreEfiNotAvailableYetArg5 (
629 // This function should never be executed. If it does, then the architectural protocols
630 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
631 // DXE Core and all the Architectural Protocols are complete.
634 return EFI_NOT_AVAILABLE_YET
;
639 Calcualte the 32-bit CRC in a EFI table using the service provided by the
642 @param Hdr Pointer to an EFI standard header
647 IN OUT EFI_TABLE_HEADER
*Hdr
655 // If gBS->CalculateCrce32 () == CoreEfiNotAvailableYet () then
656 // Crc will come back as zero if we set it to zero here
659 gBS
->CalculateCrc32 ((UINT8
*)Hdr
, Hdr
->HeaderSize
, &Crc
);
665 Terminates all boot services.
667 @param ImageHandle Handle that identifies the exiting image.
668 @param MapKey Key to the latest memory map.
670 @retval EFI_SUCCESS Boot Services terminated
671 @retval EFI_INVALID_PARAMETER MapKey is incorrect.
676 CoreExitBootServices (
677 IN EFI_HANDLE ImageHandle
,
686 gTimer
->SetTimerPeriod (gTimer
, 0);
689 // Terminate memory services if the MapKey matches
691 Status
= CoreTerminateMemoryMap (MapKey
);
692 if (EFI_ERROR (Status
)) {
697 // Notify other drivers that we are exiting boot services.
699 CoreNotifySignalList (&gEfiEventExitBootServicesGuid
);
702 // Disable interrupt of Debug timer.
704 SaveAndSetDebugTimerInterrupt (FALSE
);
707 // Disable CPU Interrupts
709 gCpu
->DisableInterrupt (gCpu
);
712 // Report that ExitBootServices() has been called
716 (EFI_SOFTWARE_EFI_BOOT_SERVICE
| EFI_SW_BS_PC_EXIT_BOOT_SERVICES
)
720 // Clear the non-runtime values of the EFI System Table
722 gDxeCoreST
->BootServices
= NULL
;
723 gDxeCoreST
->ConIn
= NULL
;
724 gDxeCoreST
->ConsoleInHandle
= NULL
;
725 gDxeCoreST
->ConOut
= NULL
;
726 gDxeCoreST
->ConsoleOutHandle
= NULL
;
727 gDxeCoreST
->StdErr
= NULL
;
728 gDxeCoreST
->StandardErrorHandle
= NULL
;
731 // Recompute the 32-bit CRC of the EFI System Table
733 CalculateEfiHdrCrc (&gDxeCoreST
->Hdr
);
736 // Zero out the Boot Service Table
738 ZeroMem (gBS
, sizeof (EFI_BOOT_SERVICES
));
742 // Update the AtRuntime field in Runtiem AP.
744 gRuntime
->AtRuntime
= TRUE
;
751 Given a compressed source buffer, this function retrieves the size of the
752 uncompressed buffer and the size of the scratch buffer required to decompress
753 the compressed source buffer.
755 The GetInfo() function retrieves the size of the uncompressed buffer and the
756 temporary scratch buffer required to decompress the buffer specified by Source
757 and SourceSize. If the size of the uncompressed buffer or the size of the
758 scratch buffer cannot be determined from the compressed data specified by
759 Source and SourceData, then EFI_INVALID_PARAMETER is returned. Otherwise, the
760 size of the uncompressed buffer is returned in DestinationSize, the size of
761 the scratch buffer is returned in ScratchSize, and EFI_SUCCESS is returned.
762 The GetInfo() function does not have scratch buffer available to perform a
763 thorough checking of the validity of the source data. It just retrieves the
764 "Original Size" field from the beginning bytes of the source data and output
765 it as DestinationSize. And ScratchSize is specific to the decompression
768 @param This A pointer to the EFI_DECOMPRESS_PROTOCOL instance.
769 @param Source The source buffer containing the compressed data.
770 @param SourceSize The size, in bytes, of the source buffer.
771 @param DestinationSize A pointer to the size, in bytes, of the
772 uncompressed buffer that will be generated when the
773 compressed buffer specified by Source and
774 SourceSize is decompressed.
775 @param ScratchSize A pointer to the size, in bytes, of the scratch
776 buffer that is required to decompress the
777 compressed buffer specified by Source and
780 @retval EFI_SUCCESS The size of the uncompressed data was returned in
781 DestinationSize and the size of the scratch buffer
782 was returned in ScratchSize.
783 @retval EFI_INVALID_PARAMETER The size of the uncompressed data or the size of
784 the scratch buffer cannot be determined from the
785 compressed data specified by Source and
791 DxeMainUefiDecompressGetInfo (
792 IN EFI_DECOMPRESS_PROTOCOL
*This
,
794 IN UINT32 SourceSize
,
795 OUT UINT32
*DestinationSize
,
796 OUT UINT32
*ScratchSize
799 if (Source
== NULL
|| DestinationSize
== NULL
|| ScratchSize
== NULL
) {
800 return EFI_INVALID_PARAMETER
;
802 return UefiDecompressGetInfo (Source
, SourceSize
, DestinationSize
, ScratchSize
);
807 Decompresses a compressed source buffer.
809 The Decompress() function extracts decompressed data to its original form.
810 This protocol is designed so that the decompression algorithm can be
811 implemented without using any memory services. As a result, the Decompress()
812 Function is not allowed to call AllocatePool() or AllocatePages() in its
813 implementation. It is the caller's responsibility to allocate and free the
814 Destination and Scratch buffers.
815 If the compressed source data specified by Source and SourceSize is
816 sucessfully decompressed into Destination, then EFI_SUCCESS is returned. If
817 the compressed source data specified by Source and SourceSize is not in a
818 valid compressed data format, then EFI_INVALID_PARAMETER is returned.
820 @param This A pointer to the EFI_DECOMPRESS_PROTOCOL instance.
821 @param Source The source buffer containing the compressed data.
822 @param SourceSize SourceSizeThe size of source data.
823 @param Destination On output, the destination buffer that contains
824 the uncompressed data.
825 @param DestinationSize The size of the destination buffer. The size of
826 the destination buffer needed is obtained from
827 EFI_DECOMPRESS_PROTOCOL.GetInfo().
828 @param Scratch A temporary scratch buffer that is used to perform
830 @param ScratchSize The size of scratch buffer. The size of the
831 scratch buffer needed is obtained from GetInfo().
833 @retval EFI_SUCCESS Decompression completed successfully, and the
834 uncompressed buffer is returned in Destination.
835 @retval EFI_INVALID_PARAMETER The source buffer specified by Source and
836 SourceSize is corrupted (not in a valid
842 DxeMainUefiDecompress (
843 IN EFI_DECOMPRESS_PROTOCOL
*This
,
845 IN UINT32 SourceSize
,
846 IN OUT VOID
*Destination
,
847 IN UINT32 DestinationSize
,
848 IN OUT VOID
*Scratch
,
849 IN UINT32 ScratchSize
853 UINT32 TestDestinationSize
;
854 UINT32 TestScratchSize
;
856 if (Source
== NULL
|| Destination
== NULL
|| Scratch
== NULL
) {
857 return EFI_INVALID_PARAMETER
;
860 Status
= UefiDecompressGetInfo (Source
, SourceSize
, &TestDestinationSize
, &TestScratchSize
);
861 if (EFI_ERROR (Status
)) {
865 if (ScratchSize
< TestScratchSize
|| DestinationSize
< TestDestinationSize
) {
866 return RETURN_INVALID_PARAMETER
;
869 return UefiDecompress (Source
, Destination
, Scratch
);