2 DXE Core Main Entry Point
4 Copyright (c) 2006 - 2008, Intel Corporation. <BR>
5 All rights reserved. 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 Global used to update core loaded image protocol handle
35 EFI_GUID
*gDxeCoreFileName
;
36 EFI_LOADED_IMAGE_PROTOCOL
*gDxeCoreLoadedImage
;
39 // BugBug: I'n not runtime, but is the PPI?
41 EFI_STATUS_CODE_PROTOCOL gStatusCodeInstance
= {
45 EFI_STATUS_CODE_PROTOCOL
*gStatusCode
= &gStatusCodeInstance
;
48 // DXE Core Module Variables
51 EFI_BOOT_SERVICES mBootServices
= {
53 EFI_BOOT_SERVICES_SIGNATURE
, // Signature
54 EFI_BOOT_SERVICES_REVISION
, // Revision
55 sizeof (EFI_BOOT_SERVICES
), // HeaderSize
59 (EFI_RAISE_TPL
) CoreRaiseTpl
, // RaiseTPL
60 (EFI_RESTORE_TPL
) CoreRestoreTpl
, // RestoreTPL
61 (EFI_ALLOCATE_PAGES
) CoreAllocatePages
, // AllocatePages
62 (EFI_FREE_PAGES
) CoreFreePages
, // FreePages
63 (EFI_GET_MEMORY_MAP
) CoreGetMemoryMap
, // GetMemoryMap
64 (EFI_ALLOCATE_POOL
) CoreAllocatePool
, // AllocatePool
65 (EFI_FREE_POOL
) CoreFreePool
, // FreePool
66 (EFI_CREATE_EVENT
) CoreCreateEvent
, // CreateEvent
67 (EFI_SET_TIMER
) CoreSetTimer
, // SetTimer
68 (EFI_WAIT_FOR_EVENT
) CoreWaitForEvent
, // WaitForEvent
69 (EFI_SIGNAL_EVENT
) CoreSignalEvent
, // SignalEvent
70 (EFI_CLOSE_EVENT
) CoreCloseEvent
, // CloseEvent
71 (EFI_CHECK_EVENT
) CoreCheckEvent
, // CheckEvent
72 (EFI_INSTALL_PROTOCOL_INTERFACE
) CoreInstallProtocolInterface
, // InstallProtocolInterface
73 (EFI_REINSTALL_PROTOCOL_INTERFACE
) CoreReinstallProtocolInterface
, // ReinstallProtocolInterface
74 (EFI_UNINSTALL_PROTOCOL_INTERFACE
) CoreUninstallProtocolInterface
, // UninstallProtocolInterface
75 (EFI_HANDLE_PROTOCOL
) CoreHandleProtocol
, // HandleProtocol
76 (VOID
*) NULL
, // Reserved
77 (EFI_REGISTER_PROTOCOL_NOTIFY
) CoreRegisterProtocolNotify
, // RegisterProtocolNotify
78 (EFI_LOCATE_HANDLE
) CoreLocateHandle
, // LocateHandle
79 (EFI_LOCATE_DEVICE_PATH
) CoreLocateDevicePath
, // LocateDevicePath
80 (EFI_INSTALL_CONFIGURATION_TABLE
) CoreInstallConfigurationTable
, // InstallConfigurationTable
81 (EFI_IMAGE_LOAD
) CoreLoadImage
, // LoadImage
82 (EFI_IMAGE_START
) CoreStartImage
, // StartImage
83 (EFI_EXIT
) CoreExit
, // Exit
84 (EFI_IMAGE_UNLOAD
) CoreUnloadImage
, // UnloadImage
85 (EFI_EXIT_BOOT_SERVICES
) CoreExitBootServices
, // ExitBootServices
86 (EFI_GET_NEXT_MONOTONIC_COUNT
) CoreEfiNotAvailableYetArg1
, // GetNextMonotonicCount
87 (EFI_STALL
) CoreStall
, // Stall
88 (EFI_SET_WATCHDOG_TIMER
) CoreSetWatchdogTimer
, // SetWatchdogTimer
89 (EFI_CONNECT_CONTROLLER
) CoreConnectController
, // ConnectController
90 (EFI_DISCONNECT_CONTROLLER
) CoreDisconnectController
, // DisconnectController
91 (EFI_OPEN_PROTOCOL
) CoreOpenProtocol
, // OpenProtocol
92 (EFI_CLOSE_PROTOCOL
) CoreCloseProtocol
, // CloseProtocol
93 (EFI_OPEN_PROTOCOL_INFORMATION
) CoreOpenProtocolInformation
, // OpenProtocolInformation
94 (EFI_PROTOCOLS_PER_HANDLE
) CoreProtocolsPerHandle
, // ProtocolsPerHandle
95 (EFI_LOCATE_HANDLE_BUFFER
) CoreLocateHandleBuffer
, // LocateHandleBuffer
96 (EFI_LOCATE_PROTOCOL
) CoreLocateProtocol
, // LocateProtocol
97 (EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES
) CoreInstallMultipleProtocolInterfaces
, // InstallMultipleProtocolInterfaces
98 (EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES
) CoreUninstallMultipleProtocolInterfaces
, // UninstallMultipleProtocolInterfaces
99 (EFI_CALCULATE_CRC32
) CoreEfiNotAvailableYetArg3
, // CalculateCrc32
100 (EFI_COPY_MEM
) CopyMem
, // CopyMem
101 (EFI_SET_MEM
) SetMem
, // SetMem
102 (EFI_CREATE_EVENT_EX
) CoreCreateEventEx
// CreateEventEx
105 EFI_DXE_SERVICES mDxeServices
= {
107 DXE_SERVICES_SIGNATURE
, // Signature
108 DXE_SERVICES_REVISION
, // Revision
109 sizeof (DXE_SERVICES
), // HeaderSize
113 (EFI_ADD_MEMORY_SPACE
) CoreAddMemorySpace
, // AddMemorySpace
114 (EFI_ALLOCATE_MEMORY_SPACE
) CoreAllocateMemorySpace
, // AllocateMemorySpace
115 (EFI_FREE_MEMORY_SPACE
) CoreFreeMemorySpace
, // FreeMemorySpace
116 (EFI_REMOVE_MEMORY_SPACE
) CoreRemoveMemorySpace
, // RemoveMemorySpace
117 (EFI_GET_MEMORY_SPACE_DESCRIPTOR
) CoreGetMemorySpaceDescriptor
, // GetMemorySpaceDescriptor
118 (EFI_SET_MEMORY_SPACE_ATTRIBUTES
) CoreSetMemorySpaceAttributes
, // SetMemorySpaceAttributes
119 (EFI_GET_MEMORY_SPACE_MAP
) CoreGetMemorySpaceMap
, // GetMemorySpaceMap
120 (EFI_ADD_IO_SPACE
) CoreAddIoSpace
, // AddIoSpace
121 (EFI_ALLOCATE_IO_SPACE
) CoreAllocateIoSpace
, // AllocateIoSpace
122 (EFI_FREE_IO_SPACE
) CoreFreeIoSpace
, // FreeIoSpace
123 (EFI_REMOVE_IO_SPACE
) CoreRemoveIoSpace
, // RemoveIoSpace
124 (EFI_GET_IO_SPACE_DESCRIPTOR
) CoreGetIoSpaceDescriptor
, // GetIoSpaceDescriptor
125 (EFI_GET_IO_SPACE_MAP
) CoreGetIoSpaceMap
, // GetIoSpaceMap
126 (EFI_DISPATCH
) CoreDispatcher
, // Dispatch
127 (EFI_SCHEDULE
) CoreSchedule
, // Schedule
128 (EFI_TRUST
) CoreTrust
, // Trust
129 (EFI_PROCESS_FIRMWARE_VOLUME
) CoreProcessFirmwareVolume
, // ProcessFirmwareVolume
132 EFI_SYSTEM_TABLE mEfiSystemTableTemplate
= {
134 EFI_SYSTEM_TABLE_SIGNATURE
, // Signature
135 EFI_SYSTEM_TABLE_REVISION
, // Revision
136 sizeof (EFI_SYSTEM_TABLE
), // HeaderSize
140 NULL
, // FirmwareVendor
141 0, // FirmwareRevision
142 NULL
, // ConsoleInHandle
144 NULL
, // ConsoleOutHandle
146 NULL
, // StandardErrorHandle
148 NULL
, // RuntimeServices
149 &mBootServices
, // BootServices
150 0, // NumberOfConfigurationTableEntries
151 NULL
// ConfigurationTable
154 EFI_RUNTIME_SERVICES mEfiRuntimeServicesTableTemplate
= {
156 EFI_RUNTIME_SERVICES_SIGNATURE
, // Signature
157 EFI_RUNTIME_SERVICES_REVISION
, // Revision
158 sizeof (EFI_RUNTIME_SERVICES
), // HeaderSize
162 (EFI_GET_TIME
) CoreEfiNotAvailableYetArg2
, // GetTime
163 (EFI_SET_TIME
) CoreEfiNotAvailableYetArg1
, // SetTime
164 (EFI_GET_WAKEUP_TIME
) CoreEfiNotAvailableYetArg3
, // GetWakeupTime
165 (EFI_SET_WAKEUP_TIME
) CoreEfiNotAvailableYetArg2
, // SetWakeupTime
166 (EFI_SET_VIRTUAL_ADDRESS_MAP
) CoreEfiNotAvailableYetArg4
, // SetVirtualAddressMap
167 (EFI_CONVERT_POINTER
) CoreEfiNotAvailableYetArg2
, // ConvertPointer
168 (EFI_GET_VARIABLE
) CoreEfiNotAvailableYetArg5
, // GetVariable
169 (EFI_GET_NEXT_VARIABLE_NAME
) CoreEfiNotAvailableYetArg3
, // GetNextVariableName
170 (EFI_SET_VARIABLE
) CoreEfiNotAvailableYetArg5
, // SetVariable
171 (EFI_GET_NEXT_HIGH_MONO_COUNT
) CoreEfiNotAvailableYetArg1
, // GetNextHighMonotonicCount
172 (EFI_RESET_SYSTEM
) CoreEfiNotAvailableYetArg4
, // ResetSystem
173 (EFI_UPDATE_CAPSULE
) CoreEfiNotAvailableYetArg3
, // UpdateCapsule
174 (EFI_QUERY_CAPSULE_CAPABILITIES
) CoreEfiNotAvailableYetArg4
, // QueryCapsuleCapabilities
175 (EFI_QUERY_VARIABLE_INFO
) CoreEfiNotAvailableYetArg4
// QueryVariableInfo
178 EFI_RUNTIME_ARCH_PROTOCOL gRuntimeTemplate
= {
179 INITIALIZE_LIST_HEAD_VARIABLE (gRuntimeTemplate
.ImageHead
),
180 INITIALIZE_LIST_HEAD_VARIABLE (gRuntimeTemplate
.EventHead
),
183 // Make sure Size != sizeof (EFI_MEMORY_DESCRIPTOR). This will
184 // prevent people from having pointer math bugs in their code.
185 // now you have to use *DescriptorSize to make things work.
187 sizeof (EFI_MEMORY_DESCRIPTOR
) + sizeof (UINT64
) - (sizeof (EFI_MEMORY_DESCRIPTOR
) % sizeof (UINT64
)),
188 EFI_MEMORY_DESCRIPTOR_VERSION
,
196 EFI_RUNTIME_ARCH_PROTOCOL
*gRuntime
= &gRuntimeTemplate
;
199 // DXE Core Global Variables for the EFI System Table, Boot Services Table,
200 // DXE Services Table, and Runtime Services Table
202 EFI_DXE_SERVICES
*gDxeCoreDS
= &mDxeServices
;
203 EFI_SYSTEM_TABLE
*gDxeCoreST
= NULL
;
206 // For debug initialize gDxeCoreRT to template. gDxeCoreRT must be allocated from RT memory
207 // but gDxeCoreRT is used for ASSERT () and DEBUG () type macros so lets give it
208 // a value that will not cause debug infrastructure to crash early on.
210 EFI_RUNTIME_SERVICES
*gDxeCoreRT
= &mEfiRuntimeServicesTableTemplate
;
211 EFI_HANDLE gDxeCoreImageHandle
= NULL
;
215 // EFI Decompress Protocol
217 EFI_DECOMPRESS_PROTOCOL gEfiDecompress
= {
218 DxeMainUefiDecompressGetInfo
,
219 DxeMainUefiDecompress
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
;
245 // Initialize Memory Services
247 CoreInitializeMemoryServices (&HobStart
, &MemoryBaseAddress
, &MemoryLength
);
250 // Allocate the EFI System Table and EFI Runtime Service Table from EfiRuntimeServicesData
251 // Use the templates to initialize the contents of the EFI System Table and EFI Runtime Services Table
253 gDxeCoreST
= AllocateRuntimeCopyPool (sizeof (EFI_SYSTEM_TABLE
), &mEfiSystemTableTemplate
);
254 ASSERT (gDxeCoreST
!= NULL
);
256 gDxeCoreRT
= AllocateRuntimeCopyPool (sizeof (EFI_RUNTIME_SERVICES
), &mEfiRuntimeServicesTableTemplate
);
257 ASSERT (gDxeCoreRT
!= NULL
);
259 gDxeCoreST
->RuntimeServices
= gDxeCoreRT
;
262 // Start the Image Services.
264 Status
= CoreInitializeImageServices (HobStart
);
265 ASSERT_EFI_ERROR (Status
);
268 // Call constructor for all libraries
270 ProcessLibraryConstructorList (gDxeCoreImageHandle
, gDxeCoreST
);
271 PERF_END (0,PEI_TOK
, NULL
, 0) ;
272 PERF_START (0,DXE_TOK
, NULL
, 0) ;
275 // Initialize the Global Coherency Domain Services
277 Status
= CoreInitializeGcdServices (&HobStart
, MemoryBaseAddress
, MemoryLength
);
278 ASSERT_EFI_ERROR (Status
);
281 // Install the DXE Services Table into the EFI System Tables's Configuration Table
283 Status
= CoreInstallConfigurationTable (&gEfiDxeServicesTableGuid
, gDxeCoreDS
);
284 ASSERT_EFI_ERROR (Status
);
287 // Install the HOB List into the EFI System Tables's Configuration Table
289 Status
= CoreInstallConfigurationTable (&gEfiHobListGuid
, HobStart
);
290 ASSERT_EFI_ERROR (Status
);
293 // Install Memory Type Information Table into the EFI System Tables's Configuration Table
295 Status
= CoreInstallConfigurationTable (&gEfiMemoryTypeInformationGuid
, &gMemoryTypeInformation
);
296 ASSERT_EFI_ERROR (Status
);
299 // Initialize the ReportStatusCode with PEI version, if available
301 CoreGetPeiProtocol (&gEfiStatusCodeRuntimeProtocolGuid
, (VOID
**) &gStatusCode
->ReportStatusCode
);
304 // Report Status Code here for DXE_ENTRY_POINT once it is available
308 FixedPcdGet32(PcdStatusCodeValueDxeCoreEntry
)
312 // Create the aligned system table pointer structure that is used by external
313 // debuggers to locate the system table... Also, install debug image info
314 // configuration table.
316 CoreInitializeDebugImageInfoTable ();
317 CoreNewDebugImageInfoEntry (
318 EFI_DEBUG_IMAGE_INFO_TYPE_NORMAL
,
323 DEBUG ((DEBUG_INFO
| DEBUG_LOAD
, "HOBLIST address in DXE = 0x%p\n", HobStart
));
326 // Initialize the Event Services
328 Status
= CoreInitializeEventServices ();
329 ASSERT_EFI_ERROR (Status
);
333 // Get the Protocols that were passed in from PEI to DXE through GUIDed HOBs
335 // These Protocols are not architectural. This implementation is sharing code between
336 // PEI and DXE in order to save FLASH space. These Protocols could also be implemented
337 // as part of the DXE Core. However, that would also require the DXE Core to be ported
338 // each time a different CPU is used, a different Decompression algorithm is used, or a
339 // different Image type is used. By placing these Protocols in PEI, the DXE Core remains
340 // generic, and only PEI and the Arch Protocols need to be ported from Platform to Platform,
341 // and from CPU to CPU.
345 // Publish the EFI, Tiano, and Custom Decompress protocols for use by other DXE components
347 Status
= CoreInstallMultipleProtocolInterfaces (
349 &gEfiDecompressProtocolGuid
, &gEfiDecompress
,
352 ASSERT_EFI_ERROR (Status
);
355 // Register for the GUIDs of the Architectural Protocols, so the rest of the
356 // EFI Boot Services and EFI Runtime Services tables can be filled in.
358 CoreNotifyOnArchProtocolInstallation ();
361 // Produce Firmware Volume Protocols, one for each FV in the HOB list.
363 Status
= FwVolBlockDriverInit (gDxeCoreImageHandle
, gDxeCoreST
);
364 ASSERT_EFI_ERROR (Status
);
366 Status
= FwVolDriverInit (gDxeCoreImageHandle
, gDxeCoreST
);
367 ASSERT_EFI_ERROR (Status
);
370 // Produce the Section Extraction Protocol
372 Status
= InitializeSectionExtraction (gDxeCoreImageHandle
, gDxeCoreST
);
373 ASSERT_EFI_ERROR (Status
);
376 // Initialize the DXE Dispatcher
378 PERF_START (0,"CoreInitializeDispatcher", "DxeMain", 0) ;
379 CoreInitializeDispatcher ();
380 PERF_END (0,"CoreInitializeDispatcher", "DxeMain", 0) ;
383 // Invoke the DXE Dispatcher
385 PERF_START (0, "CoreDispatcher", "DxeMain", 0);
387 PERF_END (0, "CoreDispatcher", "DxeMain", 0);
390 // Display Architectural protocols that were not loaded if this is DEBUG build
393 CoreDisplayMissingArchProtocols ();
397 // Assert if the Architectural Protocols are not present.
399 ASSERT_EFI_ERROR (CoreAllEfiServicesAvailable ());
402 // Report Status code before transfer control to BDS
406 FixedPcdGet32 (PcdStatusCodeValueDxeCoreHandoffToBds
)
410 // Display any drivers that were not dispatched because dependency expression
411 // evaluated to false if this is a debug build
414 CoreDisplayDiscoveredNotDispatched ();
418 // Transfer control to the BDS Architectural Protocol
423 // BDS should never return
432 Place holder function until all the Boot Services and Runtime Services are
435 @return EFI_NOT_AVAILABLE_YET
440 CoreEfiNotAvailableYetArg0 (
445 // This function should never be executed. If it does, then the architectural protocols
446 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
447 // DXE Core and all the Architectural Protocols are complete.
450 return EFI_NOT_AVAILABLE_YET
;
455 Place holder function until all the Boot Services and Runtime Services are
458 @param Arg1 Undefined
460 @return EFI_NOT_AVAILABLE_YET
465 CoreEfiNotAvailableYetArg1 (
470 // This function should never be executed. If it does, then the architectural protocols
471 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
472 // DXE Core and all the Architectural Protocols are complete.
475 return EFI_NOT_AVAILABLE_YET
;
480 Place holder function until all the Boot Services and Runtime Services are available.
482 @param Arg1 Undefined
483 @param Arg2 Undefined
485 @return EFI_NOT_AVAILABLE_YET
490 CoreEfiNotAvailableYetArg2 (
496 // This function should never be executed. If it does, then the architectural protocols
497 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
498 // DXE Core and all the Architectural Protocols are complete.
501 return EFI_NOT_AVAILABLE_YET
;
506 Place holder function until all the Boot Services and Runtime Services are available.
508 @param Arg1 Undefined
509 @param Arg2 Undefined
510 @param Arg3 Undefined
512 @return EFI_NOT_AVAILABLE_YET
517 CoreEfiNotAvailableYetArg3 (
524 // This function should never be executed. If it does, then the architectural protocols
525 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
526 // DXE Core and all the Architectural Protocols are complete.
529 return EFI_NOT_AVAILABLE_YET
;
534 Place holder function until all the Boot Services and Runtime Services are available.
536 @param Arg1 Undefined
537 @param Arg2 Undefined
538 @param Arg3 Undefined
539 @param Arg4 Undefined
541 @return EFI_NOT_AVAILABLE_YET
546 CoreEfiNotAvailableYetArg4 (
554 // This function should never be executed. If it does, then the architectural protocols
555 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
556 // DXE Core and all the Architectural Protocols are complete.
559 return EFI_NOT_AVAILABLE_YET
;
564 Place holder function until all the Boot Services and Runtime Services are available.
566 @param Arg1 Undefined
567 @param Arg2 Undefined
568 @param Arg3 Undefined
569 @param Arg4 Undefined
570 @param Arg5 Undefined
572 @return EFI_NOT_AVAILABLE_YET
577 CoreEfiNotAvailableYetArg5 (
586 // This function should never be executed. If it does, then the architectural protocols
587 // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
588 // DXE Core and all the Architectural Protocols are complete.
591 return EFI_NOT_AVAILABLE_YET
;
597 Searches for a Protocol Interface passed from PEI through a HOB.
599 @param ProtocolGuid The Protocol GUID to search for in the HOB List
600 @param Interface A pointer to the interface for the Protocol GUID
602 @retval EFI_SUCCESS The Protocol GUID was found and its interface is
603 returned in Interface
604 @retval EFI_NOT_FOUND The Protocol GUID was not found in the HOB List
609 IN EFI_GUID
*ProtocolGuid
,
613 EFI_HOB_GUID_TYPE
*GuidHob
;
616 GuidHob
= GetFirstGuidHob (ProtocolGuid
);
617 if (GuidHob
== NULL
) {
618 return EFI_NOT_FOUND
;
621 Buffer
= GET_GUID_HOB_DATA (GuidHob
);
622 ASSERT (Buffer
!= NULL
);
624 *Interface
= (VOID
*)(*(UINTN
*)(Buffer
));
632 Calcualte the 32-bit CRC in a EFI table using the service provided by the
635 @param Hdr Pointer to an EFI standard header
640 IN OUT EFI_TABLE_HEADER
*Hdr
648 // If gBS->CalculateCrce32 () == CoreEfiNotAvailableYet () then
649 // Crc will come back as zero if we set it to zero here
652 gBS
->CalculateCrc32 ((UINT8
*)Hdr
, Hdr
->HeaderSize
, &Crc
);
660 Terminates all boot services.
662 @param ImageHandle Handle that identifies the exiting image.
663 @param MapKey Key to the latest memory map.
665 @retval EFI_SUCCESS Boot Services terminated
666 @retval EFI_INVALID_PARAMETER MapKey is incorrect.
671 CoreExitBootServices (
672 IN EFI_HANDLE ImageHandle
,
677 EFI_STATUS StatusTemp
;
678 EFI_TCG_PLATFORM_PROTOCOL
*TcgPlatformProtocol
;
681 // Measure invocation of ExitBootServices,
682 // which is defined by TCG_EFI_Platform_1_20_Final Specification
684 TcgPlatformProtocol
= NULL
;
685 Status
= CoreLocateProtocol (
686 &gEfiTcgPlatformProtocolGuid
,
688 (VOID
**) &TcgPlatformProtocol
690 if (!EFI_ERROR (Status
)) {
691 Status
= TcgPlatformProtocol
->MeasureAction (EFI_EXIT_BOOT_SERVICES_INVOCATION
);
692 ASSERT_EFI_ERROR (Status
);
696 // Terminate memory services if the MapKey matches
698 Status
= CoreTerminateMemoryMap (MapKey
);
699 if (EFI_ERROR (Status
)) {
701 // Measure failure of ExitBootServices
703 if (TcgPlatformProtocol
!= NULL
) {
704 StatusTemp
= TcgPlatformProtocol
->MeasureAction (EFI_EXIT_BOOT_SERVICES_FAILED
);
705 ASSERT_EFI_ERROR (StatusTemp
);
712 // Notify other drivers that we are exiting boot services.
714 CoreNotifySignalList (&gEfiEventExitBootServicesGuid
);
719 gTimer
->SetTimerPeriod (gTimer
, 0);
722 // Disable CPU Interrupts
724 gCpu
->DisableInterrupt (gCpu
);
727 // Report that ExitBootServices() has been called
731 FixedPcdGet32 (PcdStatusCodeValueBootServiceExit
)
735 // Clear the non-runtime values of the EFI System Table
737 gDxeCoreST
->BootServices
= NULL
;
738 gDxeCoreST
->ConIn
= NULL
;
739 gDxeCoreST
->ConsoleInHandle
= NULL
;
740 gDxeCoreST
->ConOut
= NULL
;
741 gDxeCoreST
->ConsoleOutHandle
= NULL
;
742 gDxeCoreST
->StdErr
= NULL
;
743 gDxeCoreST
->StandardErrorHandle
= NULL
;
746 // Recompute the 32-bit CRC of the EFI System Table
748 CalculateEfiHdrCrc (&gDxeCoreST
->Hdr
);
751 // Zero out the Boot Service Table
753 ZeroMem (gBS
, sizeof (EFI_BOOT_SERVICES
));
757 // Update the AtRuntime field in Runtiem AP.
759 gRuntime
->AtRuntime
= TRUE
;
762 // Measure success of ExitBootServices
764 if (TcgPlatformProtocol
!= NULL
) {
765 StatusTemp
= TcgPlatformProtocol
->MeasureAction (EFI_EXIT_BOOT_SERVICES_SUCCEEDED
);
766 ASSERT_EFI_ERROR (StatusTemp
);
774 Given a compressed source buffer, this function retrieves the size of the
775 uncompressed buffer and the size of the scratch buffer required to decompress
776 the compressed source buffer.
778 The GetInfo() function retrieves the size of the uncompressed buffer and the
779 temporary scratch buffer required to decompress the buffer specified by Source
780 and SourceSize. If the size of the uncompressed buffer or the size of the
781 scratch buffer cannot be determined from the compressed data specified by
782 Source and SourceData, then EFI_INVALID_PARAMETER is returned. Otherwise, the
783 size of the uncompressed buffer is returned in DestinationSize, the size of
784 the scratch buffer is returned in ScratchSize, and EFI_SUCCESS is returned.
785 The GetInfo() function does not have scratch buffer available to perform a
786 thorough checking of the validity of the source data. It just retrieves the
787 "Original Size" field from the beginning bytes of the source data and output
788 it as DestinationSize. And ScratchSize is specific to the decompression
791 @param This A pointer to the EFI_DECOMPRESS_PROTOCOL instance.
792 @param Source The source buffer containing the compressed data.
793 @param SourceSize The size, in bytes, of the source buffer.
794 @param DestinationSize A pointer to the size, in bytes, of the
795 uncompressed buffer that will be generated when the
796 compressed buffer specified by Source and
797 SourceSize is decompressed.
798 @param ScratchSize A pointer to the size, in bytes, of the scratch
799 buffer that is required to decompress the
800 compressed buffer specified by Source and
803 @retval EFI_SUCCESS The size of the uncompressed data was returned in
804 DestinationSize and the size of the scratch buffer
805 was returned in ScratchSize.
806 @retval EFI_INVALID_PARAMETER The size of the uncompressed data or the size of
807 the scratch buffer cannot be determined from the
808 compressed data specified by Source and
814 DxeMainUefiDecompressGetInfo (
815 IN EFI_DECOMPRESS_PROTOCOL
*This
,
817 IN UINT32 SourceSize
,
818 OUT UINT32
*DestinationSize
,
819 OUT UINT32
*ScratchSize
822 if (Source
== NULL
|| DestinationSize
== NULL
|| ScratchSize
== NULL
) {
823 return EFI_INVALID_PARAMETER
;
825 return UefiDecompressGetInfo (Source
, SourceSize
, DestinationSize
, ScratchSize
);
830 Decompresses a compressed source buffer.
832 The Decompress() function extracts decompressed data to its original form.
833 This protocol is designed so that the decompression algorithm can be
834 implemented without using any memory services. As a result, the Decompress()
835 Function is not allowed to call AllocatePool() or AllocatePages() in its
836 implementation. It is the caller's responsibility to allocate and free the
837 Destination and Scratch buffers.
838 If the compressed source data specified by Source and SourceSize is
839 sucessfully decompressed into Destination, then EFI_SUCCESS is returned. If
840 the compressed source data specified by Source and SourceSize is not in a
841 valid compressed data format, then EFI_INVALID_PARAMETER is returned.
843 @param This A pointer to the EFI_DECOMPRESS_PROTOCOL instance.
844 @param Source The source buffer containing the compressed data.
845 @param SourceSize SourceSizeThe size of source data.
846 @param Destination On output, the destination buffer that contains
847 the uncompressed data.
848 @param DestinationSize The size of the destination buffer. The size of
849 the destination buffer needed is obtained from
850 EFI_DECOMPRESS_PROTOCOL.GetInfo().
851 @param Scratch A temporary scratch buffer that is used to perform
853 @param ScratchSize The size of scratch buffer. The size of the
854 scratch buffer needed is obtained from GetInfo().
856 @retval EFI_SUCCESS Decompression completed successfully, and the
857 uncompressed buffer is returned in Destination.
858 @retval EFI_INVALID_PARAMETER The source buffer specified by Source and
859 SourceSize is corrupted (not in a valid
865 DxeMainUefiDecompress (
866 IN EFI_DECOMPRESS_PROTOCOL
*This
,
868 IN UINT32 SourceSize
,
869 IN OUT VOID
*Destination
,
870 IN UINT32 DestinationSize
,
871 IN OUT VOID
*Scratch
,
872 IN UINT32 ScratchSize
876 UINT32 TestDestinationSize
;
877 UINT32 TestScratchSize
;
879 if (Source
== NULL
|| Destination
== NULL
|| Scratch
== NULL
) {
880 return EFI_INVALID_PARAMETER
;
883 Status
= UefiDecompressGetInfo (Source
, SourceSize
, &TestDestinationSize
, &TestScratchSize
);
884 if (EFI_ERROR (Status
)) {
888 if (ScratchSize
< TestScratchSize
|| DestinationSize
< TestDestinationSize
) {
889 return RETURN_INVALID_PARAMETER
;
892 return UefiDecompress (Source
, Destination
, Scratch
);