-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- DxeMain.c\r
-\r
-Abstract:\r
-\r
- DXE Core Main Entry Point\r
-\r
---*/\r
-\r
-#include <DxeMain.h>\r
-\r
-VOID\r
-EFIAPI\r
-DxeMain (\r
- IN VOID *HobStart\r
- );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-CoreEfiNotAvailableYetArg0 (\r
- VOID\r
- );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-CoreEfiNotAvailableYetArg1 (\r
- UINTN Arg1\r
- );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-CoreEfiNotAvailableYetArg2 (\r
- UINTN Arg1,\r
- UINTN Arg2\r
- );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-CoreEfiNotAvailableYetArg3 (\r
- UINTN Arg1,\r
- UINTN Arg2,\r
- UINTN Arg3\r
- );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-CoreEfiNotAvailableYetArg4 (\r
- UINTN Arg1,\r
- UINTN Arg2,\r
- UINTN Arg3,\r
- UINTN Arg4\r
- );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-CoreEfiNotAvailableYetArg5 (\r
- UINTN Arg1,\r
- UINTN Arg2,\r
- UINTN Arg3,\r
- UINTN Arg4,\r
- UINTN Arg5\r
- );\r
-\r
-EFI_STATUS\r
-CoreGetPeiProtocol (\r
- IN EFI_GUID *ProtocolGuid,\r
- IN VOID **Interface\r
- );\r
- \r
-EFI_STATUS\r
-DxeMainUefiDecompressGetInfo (\r
- IN EFI_DECOMPRESS_PROTOCOL *This,\r
- IN VOID *Source,\r
- IN UINT32 SourceSize,\r
- OUT UINT32 *DestinationSize,\r
- OUT UINT32 *ScratchSize\r
- );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-DxeMainUefiDecompress (\r
- IN EFI_DECOMPRESS_PROTOCOL *This,\r
- IN VOID *Source,\r
- IN UINT32 SourceSize,\r
- IN OUT VOID *Destination,\r
- IN UINT32 DestinationSize,\r
- IN OUT VOID *Scratch,\r
- IN UINT32 ScratchSize\r
- );\r
-\r
-EFI_STATUS\r
-DxeMainTianoDecompressGetInfo (\r
- IN EFI_TIANO_DECOMPRESS_PROTOCOL *This,\r
- IN VOID *Source,\r
- IN UINT32 SourceSize,\r
- OUT UINT32 *DestinationSize,\r
- OUT UINT32 *ScratchSize\r
- );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-DxeMainTianoDecompress (\r
- IN EFI_TIANO_DECOMPRESS_PROTOCOL *This,\r
- IN VOID *Source,\r
- IN UINT32 SourceSize,\r
- IN OUT VOID *Destination,\r
- IN UINT32 DestinationSize,\r
- IN OUT VOID *Scratch,\r
- IN UINT32 ScratchSize\r
- );\r
-\r
-EFI_STATUS\r
-DxeMainCustomDecompressGetInfo (\r
- IN EFI_CUSTOMIZED_DECOMPRESS_PROTOCOL *This,\r
- IN VOID *Source,\r
- IN UINT32 SourceSize,\r
- OUT UINT32 *DestinationSize,\r
- OUT UINT32 *ScratchSize\r
- );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-DxeMainCustomDecompress (\r
- IN EFI_CUSTOMIZED_DECOMPRESS_PROTOCOL *This,\r
- IN VOID *Source,\r
- IN UINT32 SourceSize,\r
- IN OUT VOID *Destination,\r
- IN UINT32 DestinationSize,\r
- IN OUT VOID *Scratch,\r
- IN UINT32 ScratchSize\r
- );\r
-\r
-//\r
-// DXE Core Global Variables for Protocols from PEI\r
-//\r
-EFI_HANDLE mDecompressHandle = NULL;\r
-EFI_PEI_PE_COFF_LOADER_PROTOCOL *gEfiPeiPeCoffLoader = NULL;\r
-\r
-//\r
-// DXE Core globals for Architecture Protocols\r
-//\r
-EFI_SECURITY_ARCH_PROTOCOL *gSecurity = NULL;\r
-EFI_CPU_ARCH_PROTOCOL *gCpu = NULL;\r
-EFI_METRONOME_ARCH_PROTOCOL *gMetronome = NULL;\r
-EFI_TIMER_ARCH_PROTOCOL *gTimer = NULL;\r
-EFI_BDS_ARCH_PROTOCOL *gBds = NULL;\r
-EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *gWatchdogTimer = NULL;\r
-EFI_RUNTIME_ARCH_PROTOCOL *gRuntime = NULL;\r
-\r
-//\r
-// BugBug: I'n not runtime, but is the PPI?\r
-//\r
-EFI_STATUS_CODE_PROTOCOL gStatusCodeInstance = {\r
- NULL\r
-};\r
-\r
-EFI_STATUS_CODE_PROTOCOL *gStatusCode = &gStatusCodeInstance;\r
-\r
-\r
-//\r
-// DXE Core Global used to update core loaded image protocol handle\r
-//\r
-EFI_GUID *gDxeCoreFileName;\r
-EFI_LOADED_IMAGE_PROTOCOL *gDxeCoreLoadedImage;\r
-\r
-\r
-\r
-//\r
-// DXE Core Module Variables\r
-//\r
-\r
-EFI_BOOT_SERVICES mBootServices = {\r
- {\r
- EFI_BOOT_SERVICES_SIGNATURE, // Signature\r
- EFI_BOOT_SERVICES_REVISION, // Revision\r
- sizeof (EFI_BOOT_SERVICES), // HeaderSize\r
- 0, // CRC32\r
- 0 // Reserved\r
- }, \r
- (EFI_RAISE_TPL) CoreRaiseTpl, // RaiseTPL\r
- (EFI_RESTORE_TPL) CoreRestoreTpl, // RestoreTPL\r
- (EFI_ALLOCATE_PAGES) CoreAllocatePages, // AllocatePages\r
- (EFI_FREE_PAGES) CoreFreePages, // FreePages\r
- (EFI_GET_MEMORY_MAP) CoreGetMemoryMap, // GetMemoryMap\r
- (EFI_ALLOCATE_POOL) CoreAllocatePool, // AllocatePool\r
- (EFI_FREE_POOL) CoreFreePool, // FreePool\r
- (EFI_CREATE_EVENT) CoreCreateEvent, // CreateEvent\r
- (EFI_SET_TIMER) CoreSetTimer, // SetTimer\r
- (EFI_WAIT_FOR_EVENT) CoreWaitForEvent, // WaitForEvent\r
- (EFI_SIGNAL_EVENT) CoreSignalEvent, // SignalEvent\r
- (EFI_CLOSE_EVENT) CoreCloseEvent, // CloseEvent\r
- (EFI_CHECK_EVENT) CoreCheckEvent, // CheckEvent\r
- (EFI_INSTALL_PROTOCOL_INTERFACE) CoreInstallProtocolInterface, // InstallProtocolInterface\r
- (EFI_REINSTALL_PROTOCOL_INTERFACE) CoreReinstallProtocolInterface, // ReinstallProtocolInterface\r
- (EFI_UNINSTALL_PROTOCOL_INTERFACE) CoreUninstallProtocolInterface, // UninstallProtocolInterface\r
- (EFI_HANDLE_PROTOCOL) CoreHandleProtocol, // HandleProtocol\r
- (VOID *) NULL, // Reserved\r
- (EFI_REGISTER_PROTOCOL_NOTIFY) CoreRegisterProtocolNotify, // RegisterProtocolNotify\r
- (EFI_LOCATE_HANDLE) CoreLocateHandle, // LocateHandle\r
- (EFI_LOCATE_DEVICE_PATH) CoreLocateDevicePath, // LocateDevicePath\r
- (EFI_INSTALL_CONFIGURATION_TABLE) CoreInstallConfigurationTable, // InstallConfigurationTable\r
- (EFI_IMAGE_LOAD) CoreLoadImage, // LoadImage\r
- (EFI_IMAGE_START) CoreStartImage, // StartImage\r
- (EFI_EXIT) CoreExit, // Exit\r
- (EFI_IMAGE_UNLOAD) CoreUnloadImage, // UnloadImage\r
- (EFI_EXIT_BOOT_SERVICES) CoreExitBootServices, // ExitBootServices\r
- (EFI_GET_NEXT_MONOTONIC_COUNT) CoreEfiNotAvailableYetArg1, // GetNextMonotonicCount\r
- (EFI_STALL) CoreStall, // Stall\r
- (EFI_SET_WATCHDOG_TIMER) CoreSetWatchdogTimer, // SetWatchdogTimer\r
- (EFI_CONNECT_CONTROLLER) CoreConnectController, // ConnectController\r
- (EFI_DISCONNECT_CONTROLLER) CoreDisconnectController, // DisconnectController\r
- (EFI_OPEN_PROTOCOL) CoreOpenProtocol, // OpenProtocol\r
- (EFI_CLOSE_PROTOCOL) CoreCloseProtocol, // CloseProtocol\r
- (EFI_OPEN_PROTOCOL_INFORMATION) CoreOpenProtocolInformation, // OpenProtocolInformation\r
- (EFI_PROTOCOLS_PER_HANDLE) CoreProtocolsPerHandle, // ProtocolsPerHandle\r
- (EFI_LOCATE_HANDLE_BUFFER) CoreLocateHandleBuffer, // LocateHandleBuffer\r
- (EFI_LOCATE_PROTOCOL) CoreLocateProtocol, // LocateProtocol\r
- (EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES) CoreInstallMultipleProtocolInterfaces, // InstallMultipleProtocolInterfaces\r
- (EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES) CoreUninstallMultipleProtocolInterfaces, // UninstallMultipleProtocolInterfaces\r
- (EFI_CALCULATE_CRC32) CoreEfiNotAvailableYetArg3, // CalculateCrc32\r
- (EFI_COPY_MEM) CopyMem, // CopyMem\r
- (EFI_SET_MEM) SetMem // SetMem\r
-#if (EFI_SPECIFICATION_VERSION >= 0x00020000)\r
- , \r
- (EFI_CREATE_EVENT_EX) CoreCreateEventEx // CreateEventEx\r
-#endif\r
-};\r
-\r
-EFI_DXE_SERVICES mDxeServices = {\r
- {\r
- EFI_DXE_SERVICES_SIGNATURE, // Signature\r
- EFI_DXE_SERVICES_REVISION, // Revision\r
- sizeof (EFI_DXE_SERVICES), // HeaderSize\r
- 0, // CRC32\r
- 0 // Reserved\r
- },\r
- (EFI_ADD_MEMORY_SPACE) CoreAddMemorySpace, // AddMemorySpace\r
- (EFI_ALLOCATE_MEMORY_SPACE) CoreAllocateMemorySpace, // AllocateMemorySpace\r
- (EFI_FREE_MEMORY_SPACE) CoreFreeMemorySpace, // FreeMemorySpace\r
- (EFI_REMOVE_MEMORY_SPACE) CoreRemoveMemorySpace, // RemoveMemorySpace\r
- (EFI_GET_MEMORY_SPACE_DESCRIPTOR) CoreGetMemorySpaceDescriptor, // GetMemorySpaceDescriptor\r
- (EFI_SET_MEMORY_SPACE_ATTRIBUTES) CoreSetMemorySpaceAttributes, // SetMemorySpaceAttributes\r
- (EFI_GET_MEMORY_SPACE_MAP) CoreGetMemorySpaceMap, // GetMemorySpaceMap\r
- (EFI_ADD_IO_SPACE) CoreAddIoSpace, // AddIoSpace\r
- (EFI_ALLOCATE_IO_SPACE) CoreAllocateIoSpace, // AllocateIoSpace\r
- (EFI_FREE_IO_SPACE) CoreFreeIoSpace, // FreeIoSpace\r
- (EFI_REMOVE_IO_SPACE) CoreRemoveIoSpace, // RemoveIoSpace\r
- (EFI_GET_IO_SPACE_DESCRIPTOR) CoreGetIoSpaceDescriptor, // GetIoSpaceDescriptor\r
- (EFI_GET_IO_SPACE_MAP) CoreGetIoSpaceMap, // GetIoSpaceMap\r
- (EFI_DISPATCH) CoreDispatcher, // Dispatch\r
- (EFI_SCHEDULE) CoreSchedule, // Schedule\r
- (EFI_TRUST) CoreTrust, // Trust\r
- (EFI_PROCESS_FIRMWARE_VOLUME) CoreProcessFirmwareVolume, // ProcessFirmwareVolume\r
-};\r
-\r
-EFI_SYSTEM_TABLE mEfiSystemTableTemplate = {\r
- {\r
- EFI_SYSTEM_TABLE_SIGNATURE, // Signature\r
- EFI_SYSTEM_TABLE_REVISION, // Revision\r
- sizeof (EFI_SYSTEM_TABLE), // HeaderSize\r
- 0, // CRC32\r
- 0 // Reserved\r
- },\r
- NULL, // FirmwareVendor\r
- 0, // FirmwareRevision\r
- NULL, // ConsoleInHandle\r
- NULL, // ConIn\r
- NULL, // ConsoleOutHandle\r
- NULL, // ConOut\r
- NULL, // StandardErrorHandle\r
- NULL, // StdErr\r
- NULL, // RuntimeServices\r
- &mBootServices, // BootServices\r
- 0, // NumberOfConfigurationTableEntries\r
- NULL // ConfigurationTable\r
-};\r
-\r
-EFI_RUNTIME_SERVICES mEfiRuntimeServicesTableTemplate = {\r
- {\r
- EFI_RUNTIME_SERVICES_SIGNATURE, // Signature\r
- EFI_RUNTIME_SERVICES_REVISION, // Revision\r
- sizeof (EFI_RUNTIME_SERVICES), // HeaderSize\r
- 0, // CRC32\r
- 0 // Reserved\r
- },\r
- (EFI_GET_TIME) CoreEfiNotAvailableYetArg2, // GetTime\r
- (EFI_SET_TIME) CoreEfiNotAvailableYetArg1, // SetTime\r
- (EFI_GET_WAKEUP_TIME) CoreEfiNotAvailableYetArg3, // GetWakeupTime\r
- (EFI_SET_WAKEUP_TIME) CoreEfiNotAvailableYetArg2, // SetWakeupTime\r
- (EFI_SET_VIRTUAL_ADDRESS_MAP) CoreEfiNotAvailableYetArg4, // SetVirtualAddressMap\r
- (EFI_CONVERT_POINTER) CoreEfiNotAvailableYetArg2, // ConvertPointer\r
- (EFI_GET_VARIABLE) CoreEfiNotAvailableYetArg5, // GetVariable\r
- (EFI_GET_NEXT_VARIABLE_NAME) CoreEfiNotAvailableYetArg3, // GetNextVariableName\r
- (EFI_SET_VARIABLE) CoreEfiNotAvailableYetArg5, // SetVariable\r
- (EFI_GET_NEXT_HIGH_MONO_COUNT) CoreEfiNotAvailableYetArg1, // GetNextHighMonotonicCount\r
- (EFI_RESET_SYSTEM) CoreEfiNotAvailableYetArg4 // ResetSystem \r
-#if ((EDK_RELEASE_VERSION != 0) && (EFI_SPECIFICATION_VERSION < 0x00020000))\r
- ,\r
- (TIANO_REPORT_STATUS_CODE) CoreEfiNotAvailableYetArg5 // ReportStatusCode\r
-#elif (EFI_SPECIFICATION_VERSION >= 0x00020000)\r
- ,\r
- (EFI_UPDATE_CAPSULE) CoreEfiNotAvailableYetArg3, // UpdateCapsule\r
- (EFI_QUERY_CAPSULE_CAPABILITIES) CoreEfiNotAvailableYetArg4, // QueryCapsuleCapabilities\r
- (EFI_QUERY_VARIABLE_INFO) CoreEfiNotAvailableYetArg4 // QueryVariableInfo\r
-#endif\r
-};\r
-\r
-//\r
-// DXE Core Global Variables for the EFI System Table, Boot Services Table, \r
-// DXE Services Table, and Runtime Services Table\r
-//\r
-EFI_BOOT_SERVICES *gBS = &mBootServices;\r
-EFI_DXE_SERVICES *gDS = &mDxeServices;\r
-EFI_SYSTEM_TABLE *gST = NULL;\r
-\r
-//\r
-// For debug initialize gRT to template. gRT must be allocated from RT memory\r
-// but gRT is used for ASSERT () and DEBUG () type macros so lets give it\r
-// a value that will not cause debug infrastructure to crash early on.\r
-//\r
-EFI_RUNTIME_SERVICES *gRT = &mEfiRuntimeServicesTableTemplate;\r
-EFI_HANDLE gDxeCoreImageHandle = NULL;\r
-\r
-VOID *mHobStart;\r
-\r
-//\r
-// EFI Decompress Protocol\r
-//\r
-EFI_DECOMPRESS_PROTOCOL gEfiDecompress = {\r
- DxeMainUefiDecompressGetInfo,\r
- DxeMainUefiDecompress\r
-};\r
-\r
-//\r
-// Tiano Decompress Protocol\r
-//\r
-EFI_TIANO_DECOMPRESS_PROTOCOL gEfiTianoDecompress = {\r
- DxeMainTianoDecompressGetInfo,\r
- DxeMainTianoDecompress\r
-};\r
-\r
-//\r
-// Customized Decompress Protocol\r
-//\r
-EFI_CUSTOMIZED_DECOMPRESS_PROTOCOL gEfiCustomizedDecompress = {\r
- DxeMainCustomDecompressGetInfo,\r
- DxeMainCustomDecompress\r
-};\r
-\r
-//\r
-// Main entry point to the DXE Core\r
-//\r
-VOID\r
-EFIAPI\r
-DxeMain (\r
- IN VOID *HobStart\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Main entry point to DXE Core.\r
-\r
-Arguments:\r
-\r
- HobStart - Pointer to the beginning of the HOB List from PEI\r
-\r
-Returns:\r
-\r
- This function should never return\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_PHYSICAL_ADDRESS MemoryBaseAddress;\r
- UINT64 MemoryLength;\r
-\r
-#ifdef EFI_DXE_PERFORMANCE\r
- UINT64 Tick;\r
-\r
- GetTimerValue (&Tick);\r
-#endif\r
-\r
- mHobStart = HobStart;\r
- \r
- //\r
- // Initialize Memory Services\r
- //\r
- CoreInitializeMemoryServices (&HobStart, &MemoryBaseAddress, &MemoryLength);\r
-\r
- //\r
- // Allocate the EFI System Table and EFI Runtime Service Table from EfiRuntimeServicesData\r
- // Use the templates to initialize the contents of the EFI System Table and EFI Runtime Services Table\r
- //\r
- gST = CoreAllocateRuntimeCopyPool (sizeof (EFI_SYSTEM_TABLE), &mEfiSystemTableTemplate);\r
- ASSERT (gST != NULL);\r
-\r
- gRT = CoreAllocateRuntimeCopyPool (sizeof (EFI_RUNTIME_SERVICES), &mEfiRuntimeServicesTableTemplate);\r
- ASSERT (gRT != NULL);\r
-\r
- gST->RuntimeServices = gRT;\r
- \r
- //\r
- // Start the Image Services.\r
- //\r
- Status = CoreInitializeImageServices (HobStart);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- //\r
- // Call constructor for all libraries\r
- //\r
- ProcessLibraryConstructorList (gDxeCoreImageHandle, gST);\r
-\r
- //\r
- // Initialize the Global Coherency Domain Services\r
- //\r
- Status = CoreInitializeGcdServices (&HobStart, MemoryBaseAddress, MemoryLength);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- //\r
- // Install the DXE Services Table into the EFI System Tables's Configuration Table\r
- //\r
- Status = CoreInstallConfigurationTable (&gEfiDxeServicesTableGuid, gDS);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- //\r
- // Install the HOB List into the EFI System Tables's Configuration Table\r
- //\r
- Status = CoreInstallConfigurationTable (&gEfiHobListGuid, HobStart);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- //\r
- // Install Memory Type Information Table into the EFI System Tables's Configuration Table\r
- //\r
- Status = CoreInstallConfigurationTable (&gEfiMemoryTypeInformationGuid, &gMemoryTypeInformation);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- //\r
- // Initialize the ReportStatusCode with PEI version, if availible\r
- //\r
- CoreGetPeiProtocol (&gEfiStatusCodeRuntimeProtocolGuid, (VOID **)&gStatusCode->ReportStatusCode);\r
-#if ((EDK_RELEASE_VERSION != 0) && (EFI_SPECIFICATION_VERSION < 0x00020000))\r
- gRT->ReportStatusCode = gStatusCode->ReportStatusCode;\r
-#endif\r
-\r
- //\r
- // Report Status Code here for DXE_ENTRY_POINT once it is available\r
- //\r
- CoreReportProgressCode ((EFI_SOFTWARE_DXE_CORE | EFI_SW_DXE_CORE_PC_ENTRY_POINT));\r
-\r
- //\r
- // Create the aligned system table pointer structure that is used by external\r
- // debuggers to locate the system table... Also, install debug image info\r
- // configuration table.\r
- //\r
- CoreInitializeDebugImageInfoTable ();\r
- CoreNewDebugImageInfoEntry (\r
- EFI_DEBUG_IMAGE_INFO_TYPE_NORMAL,\r
- gDxeCoreLoadedImage,\r
- gDxeCoreImageHandle\r
- );\r
-\r
- DEBUG ((EFI_D_INFO | EFI_D_LOAD, "HOBLIST address in DXE = 0x%08x\n", HobStart));\r
-\r
- //\r
- // Initialize the Event Services\r
- //\r
- Status = CoreInitializeEventServices ();\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- \r
- //\r
- // Get the Protocols that were passed in from PEI to DXE through GUIDed HOBs\r
- //\r
- // These Protocols are not architectural. This implementation is sharing code between \r
- // PEI and DXE in order to save FLASH space. These Protocols could also be implemented \r
- // as part of the DXE Core. However, that would also require the DXE Core to be ported \r
- // each time a different CPU is used, a different Decompression algorithm is used, or a \r
- // different Image type is used. By placing these Protocols in PEI, the DXE Core remains \r
- // generic, and only PEI and the Arch Protocols need to be ported from Platform to Platform, \r
- // and from CPU to CPU.\r
- //\r
-\r
- //\r
- // Publish the EFI, Tiano, and Custom Decompress protocols for use by other DXE components\r
- // \r
- Status = CoreInstallMultipleProtocolInterfaces (\r
- &mDecompressHandle,\r
- &gEfiDecompressProtocolGuid, &gEfiDecompress,\r
- &gEfiTianoDecompressProtocolGuid, &gEfiTianoDecompress,\r
- &gEfiCustomizedDecompressProtocolGuid, &gEfiCustomizedDecompress,\r
- NULL\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- gEfiPeiPeCoffLoader = GetPeCoffLoaderProtocol ();\r
- ASSERT (gEfiPeiPeCoffLoader != NULL);\r
-\r
- //\r
- // Register for the GUIDs of the Architectural Protocols, so the rest of the\r
- // EFI Boot Services and EFI Runtime Services tables can be filled in.\r
- //\r
- CoreNotifyOnArchProtocolInstallation ();\r
-\r
- //\r
- // Produce Firmware Volume Protocols, one for each FV in the HOB list.\r
- //\r
- Status = FwVolBlockDriverInit (gDxeCoreImageHandle, gST);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- Status = FwVolDriverInit (gDxeCoreImageHandle, gST);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- //\r
- // Produce the Section Extraction Protocol \r
- //\r
- Status = InitializeSectionExtraction (gDxeCoreImageHandle, gST);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- //\r
- // Initialize the DXE Dispatcher\r
- //\r
- PERF_START (0,"CoreInitializeDispatcher", "DxeMain", 0) ;\r
- CoreInitializeDispatcher ();\r
- PERF_END (0,"CoreInitializeDispatcher", "DxeMain", 0) ;\r
-\r
- //\r
- // Invoke the DXE Dispatcher\r
- //\r
- PERF_START (0, "CoreDispatcher", "DxeMain", 0);\r
- CoreDispatcher ();\r
- PERF_END (0, "CoreDispatcher", "DxeMain", 0);\r
-\r
- //\r
- // Display Architectural protocols that were not loaded if this is DEBUG build\r
- //\r
- DEBUG_CODE (\r
- CoreDisplayMissingArchProtocols ();\r
- );\r
- \r
- //\r
- // Assert if the Architectural Protocols are not present.\r
- //\r
- ASSERT_EFI_ERROR (CoreAllEfiServicesAvailable ());\r
-\r
- //\r
- // Report Status code before transfer control to BDS\r
- //\r
- CoreReportProgressCode ((EFI_SOFTWARE_DXE_CORE | EFI_SW_DXE_CORE_PC_HANDOFF_TO_NEXT));\r
- //\r
- // Display any drivers that were not dispatched because dependency expression\r
- // evaluated to false if this is a debug build\r
- //\r
- DEBUG_CODE (\r
- CoreDisplayDiscoveredNotDispatched ();\r
- );\r
-\r
- //\r
- // Transfer control to the BDS Architectural Protocol\r
- //\r
- gBds->Entry (gBds);\r
- \r
- //\r
- // BDS should never return\r
- //\r
- ASSERT (FALSE);\r
- CpuDeadLoop ();\r
-}\r
-\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-CoreEfiNotAvailableYetArg0 (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Place holder function until all the Boot Services and Runtime Services are available\r
-\r
-Arguments:\r
-\r
- None\r
-\r
-Returns:\r
-\r
- EFI_NOT_AVAILABLE_YET\r
-\r
---*/\r
-{\r
- //\r
- // This function should never be executed. If it does, then the architectural protocols\r
- // have not been designed correctly. The CpuBreakpoint () is commented out for now until the\r
- // DXE Core and all the Architectural Protocols are complete.\r
- //\r
-\r
- return EFI_NOT_AVAILABLE_YET;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-CoreEfiNotAvailableYetArg1 (\r
- UINTN Arg1\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Place holder function until all the Boot Services and Runtime Services are available\r
-\r
-Arguments:\r
-\r
- Arg1 - Undefined\r
-\r
-Returns:\r
-\r
- EFI_NOT_AVAILABLE_YET\r
-\r
---*/\r
-{\r
- //\r
- // This function should never be executed. If it does, then the architectural protocols\r
- // have not been designed correctly. The CpuBreakpoint () is commented out for now until the\r
- // DXE Core and all the Architectural Protocols are complete.\r
- //\r
-\r
- return EFI_NOT_AVAILABLE_YET;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-CoreEfiNotAvailableYetArg2 (\r
- UINTN Arg1,\r
- UINTN Arg2\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Place holder function until all the Boot Services and Runtime Services are available\r
-\r
-Arguments:\r
-\r
- Arg1 - Undefined\r
- \r
- Arg2 - Undefined\r
-\r
-Returns:\r
-\r
- EFI_NOT_AVAILABLE_YET\r
-\r
---*/\r
-{\r
- //\r
- // This function should never be executed. If it does, then the architectural protocols\r
- // have not been designed correctly. The CpuBreakpoint () is commented out for now until the\r
- // DXE Core and all the Architectural Protocols are complete.\r
- //\r
-\r
- return EFI_NOT_AVAILABLE_YET;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-CoreEfiNotAvailableYetArg3 (\r
- UINTN Arg1,\r
- UINTN Arg2,\r
- UINTN Arg3\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Place holder function until all the Boot Services and Runtime Services are available\r
-\r
-Arguments:\r
-\r
- Arg1 - Undefined\r
- \r
- Arg2 - Undefined\r
- \r
- Arg3 - Undefined\r
-\r
-Returns:\r
-\r
- EFI_NOT_AVAILABLE_YET\r
-\r
---*/\r
-{\r
- //\r
- // This function should never be executed. If it does, then the architectural protocols\r
- // have not been designed correctly. The CpuBreakpoint () is commented out for now until the\r
- // DXE Core and all the Architectural Protocols are complete.\r
- //\r
-\r
- return EFI_NOT_AVAILABLE_YET;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-CoreEfiNotAvailableYetArg4 (\r
- UINTN Arg1,\r
- UINTN Arg2,\r
- UINTN Arg3,\r
- UINTN Arg4\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Place holder function until all the Boot Services and Runtime Services are available\r
-\r
-Arguments:\r
-\r
- Arg1 - Undefined\r
- \r
- Arg2 - Undefined\r
- \r
- Arg3 - Undefined\r
- \r
- Arg4 - Undefined\r
-\r
-Returns:\r
-\r
- EFI_NOT_AVAILABLE_YET\r
-\r
---*/\r
-{\r
- //\r
- // This function should never be executed. If it does, then the architectural protocols\r
- // have not been designed correctly. The CpuBreakpoint () is commented out for now until the\r
- // DXE Core and all the Architectural Protocols are complete.\r
- //\r
-\r
- return EFI_NOT_AVAILABLE_YET;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-CoreEfiNotAvailableYetArg5 (\r
- UINTN Arg1,\r
- UINTN Arg2,\r
- UINTN Arg3,\r
- UINTN Arg4,\r
- UINTN Arg5\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Place holder function until all the Boot Services and Runtime Services are available\r
-\r
-Arguments:\r
-\r
- Arg1 - Undefined\r
- \r
- Arg2 - Undefined\r
- \r
- Arg3 - Undefined\r
- \r
- Arg4 - Undefined\r
- \r
- Arg5 - Undefined\r
-\r
-Returns:\r
-\r
- EFI_NOT_AVAILABLE_YET\r
-\r
---*/\r
-{\r
- //\r
- // This function should never be executed. If it does, then the architectural protocols\r
- // have not been designed correctly. The CpuBreakpoint () is commented out for now until the\r
- // DXE Core and all the Architectural Protocols are complete.\r
- //\r
-\r
- return EFI_NOT_AVAILABLE_YET;\r
-}\r
-\r
-\r
-EFI_STATUS\r
-CoreGetPeiProtocol (\r
- IN EFI_GUID *ProtocolGuid,\r
- IN VOID **Interface\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Searches for a Protocol Interface passed from PEI through a HOB\r
-\r
-Arguments:\r
-\r
- ProtocolGuid - The Protocol GUID to search for in the HOB List\r
-\r
- Interface - A pointer to the interface for the Protocol GUID\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - The Protocol GUID was found and its interface is returned in Interface\r
-\r
- EFI_NOT_FOUND - The Protocol GUID was not found in the HOB List\r
-\r
---*/\r
-{\r
- EFI_HOB_GUID_TYPE *GuidHob;\r
- VOID *Buffer;\r
-\r
- GuidHob = GetNextGuidHob (ProtocolGuid, mHobStart);\r
- if (GuidHob == NULL) {\r
- return EFI_NOT_FOUND;\r
- }\r
- \r
- Buffer = GET_GUID_HOB_DATA (GuidHob);\r
- ASSERT (Buffer != NULL);\r
-\r
- *Interface = (VOID *)(*(UINTN *)(Buffer));\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-\r
-VOID\r
-CalculateEfiHdrCrc (\r
- IN OUT EFI_TABLE_HEADER *Hdr\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Calcualte the 32-bit CRC in a EFI table using the service provided by the\r
- gRuntime service.\r
-\r
-Arguments:\r
-\r
- Hdr - Pointer to an EFI standard header\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-{\r
- UINT32 Crc;\r
-\r
- Hdr->CRC32 = 0;\r
- \r
- //\r
- // If gBS->CalculateCrce32 () == CoreEfiNotAvailableYet () then\r
- // Crc will come back as zero if we set it to zero here\r
- //\r
- Crc = 0;\r
- gBS->CalculateCrc32 ((UINT8 *)Hdr, Hdr->HeaderSize, &Crc);\r
- Hdr->CRC32 = Crc; \r
-}\r
-\r
-\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-CoreExitBootServices (\r
- IN EFI_HANDLE ImageHandle,\r
- IN UINTN MapKey\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- EFI 1.0 API to terminate Boot Services\r
-\r
-Arguments:\r
-\r
- ImageHandle - Handle that represents the identity of the calling image\r
-\r
- MapKey -Key to the latest memory map.\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - Boot Services terminated\r
- EFI_INVALID_PARAMETER - MapKey is incorrect.\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
-\r
- //\r
- // Terminate memory services if the MapKey matches\r
- //\r
- Status = CoreTerminateMemoryMap (MapKey);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- //\r
- // Notify other drivers that we are exiting boot services.\r
- //\r
- CoreNotifySignalList (&gEfiEventExitBootServicesGuid);\r
-\r
- //\r
- // Disable Timer\r
- //\r
- gTimer->SetTimerPeriod (gTimer, 0);\r
-\r
- //\r
- // Disable CPU Interrupts\r
- //\r
- gCpu->DisableInterrupt (gCpu);\r
-\r
- //\r
- // Register Runtime events with the Runtime Architectural Protocol\r
- //\r
- CoreShutdownEventServices ();\r
-\r
- //\r
- // Register Runtime images with the Runtime Architectural Protocol\r
- //\r
- CoreShutdownImageServices ();\r
-\r
- //\r
- // Report that ExitBootServices() has been called\r
- //\r
- // We are using gEfiDxeServicesTableGuid as the caller ID for Dxe Core\r
- //\r
- CoreReportProgressCode ((EFI_SOFTWARE_EFI_BOOT_SERVICE | EFI_SW_BS_PC_EXIT_BOOT_SERVICES));\r
-\r
- //\r
- // Clear the non-runtime values of the EFI System Table\r
- //\r
- gST->BootServices = NULL;\r
- gST->ConIn = NULL;\r
- gST->ConsoleInHandle = NULL;\r
- gST->ConOut = NULL;\r
- gST->ConsoleOutHandle = NULL;\r
- gST->StdErr = NULL;\r
- gST->StandardErrorHandle = NULL;\r
-\r
- //\r
- // Recompute the 32-bit CRC of the EFI System Table\r
- //\r
- CalculateEfiHdrCrc (&gST->Hdr);\r
-\r
- //\r
- // Zero out the Boot Service Table\r
- //\r
- SetMem (gBS, sizeof (EFI_BOOT_SERVICES), 0);\r
- gBS = NULL;\r
-\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-DxeMainUefiDecompressGetInfo (\r
- IN EFI_DECOMPRESS_PROTOCOL *This,\r
- IN VOID *Source,\r
- IN UINT32 SourceSize,\r
- OUT UINT32 *DestinationSize,\r
- OUT UINT32 *ScratchSize\r
- )\r
-{\r
- return UefiDecompressGetInfo (Source, SourceSize, DestinationSize, ScratchSize);\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-DxeMainUefiDecompress (\r
- IN EFI_DECOMPRESS_PROTOCOL *This,\r
- IN VOID *Source,\r
- IN UINT32 SourceSize,\r
- IN OUT VOID *Destination,\r
- IN UINT32 DestinationSize,\r
- IN OUT VOID *Scratch,\r
- IN UINT32 ScratchSize\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINT32 TestDestinationSize;\r
- UINT32 TestScratchSize;\r
-\r
- Status = UefiDecompressGetInfo (Source, SourceSize, &TestDestinationSize, &TestScratchSize);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- if (ScratchSize < TestScratchSize || DestinationSize < TestDestinationSize) {\r
- return RETURN_INVALID_PARAMETER;\r
- }\r
-\r
- return UefiDecompress (Source, Destination, Scratch);\r
-}\r
-\r
-EFI_STATUS\r
-DxeMainTianoDecompressGetInfo (\r
- IN EFI_TIANO_DECOMPRESS_PROTOCOL *This,\r
- IN VOID *Source,\r
- IN UINT32 SourceSize,\r
- OUT UINT32 *DestinationSize,\r
- OUT UINT32 *ScratchSize\r
- )\r
-{\r
- return TianoDecompressGetInfo (Source, SourceSize, DestinationSize, ScratchSize);\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-DxeMainTianoDecompress (\r
- IN EFI_TIANO_DECOMPRESS_PROTOCOL *This,\r
- IN VOID *Source,\r
- IN UINT32 SourceSize,\r
- IN OUT VOID *Destination,\r
- IN UINT32 DestinationSize,\r
- IN OUT VOID *Scratch,\r
- IN UINT32 ScratchSize\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINT32 TestDestinationSize;\r
- UINT32 TestScratchSize;\r
-\r
- Status = TianoDecompressGetInfo (Source, SourceSize, &TestDestinationSize, &TestScratchSize);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- if (ScratchSize < TestScratchSize || DestinationSize < TestDestinationSize) {\r
- return RETURN_INVALID_PARAMETER;\r
- }\r
-\r
- return TianoDecompress (Source, Destination, Scratch);\r
-}\r
-\r
-EFI_STATUS\r
-DxeMainCustomDecompressGetInfo (\r
- IN EFI_CUSTOMIZED_DECOMPRESS_PROTOCOL *This,\r
- IN VOID *Source,\r
- IN UINT32 SourceSize,\r
- OUT UINT32 *DestinationSize,\r
- OUT UINT32 *ScratchSize\r
- )\r
-{\r
- return CustomDecompressGetInfo (Source, SourceSize, DestinationSize, ScratchSize);\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-DxeMainCustomDecompress (\r
- IN EFI_CUSTOMIZED_DECOMPRESS_PROTOCOL *This,\r
- IN VOID *Source,\r
- IN UINT32 SourceSize,\r
- IN OUT VOID *Destination,\r
- IN UINT32 DestinationSize,\r
- IN OUT VOID *Scratch,\r
- IN UINT32 ScratchSize\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINT32 TestDestinationSize;\r
- UINT32 TestScratchSize;\r
-\r
- Status = CustomDecompressGetInfo (Source, SourceSize, &TestDestinationSize, &TestScratchSize);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- if (ScratchSize < TestScratchSize || DestinationSize < TestDestinationSize) {\r
- return RETURN_INVALID_PARAMETER;\r
- }\r
-\r
- return CustomDecompress (Source, Destination, Scratch);\r
-}\r
-\r
+/*++
+
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+Module Name:
+
+ DxeMain.c
+
+Abstract:
+
+ DXE Core Main Entry Point
+
+--*/
+
+#include <DxeMain.h>
+
+VOID
+EFIAPI
+DxeMain (
+ IN VOID *HobStart
+ );
+
+EFI_STATUS
+EFIAPI
+CoreEfiNotAvailableYetArg0 (
+ VOID
+ );
+
+EFI_STATUS
+EFIAPI
+CoreEfiNotAvailableYetArg1 (
+ UINTN Arg1
+ );
+
+EFI_STATUS
+EFIAPI
+CoreEfiNotAvailableYetArg2 (
+ UINTN Arg1,
+ UINTN Arg2
+ );
+
+EFI_STATUS
+EFIAPI
+CoreEfiNotAvailableYetArg3 (
+ UINTN Arg1,
+ UINTN Arg2,
+ UINTN Arg3
+ );
+
+EFI_STATUS
+EFIAPI
+CoreEfiNotAvailableYetArg4 (
+ UINTN Arg1,
+ UINTN Arg2,
+ UINTN Arg3,
+ UINTN Arg4
+ );
+
+EFI_STATUS
+EFIAPI
+CoreEfiNotAvailableYetArg5 (
+ UINTN Arg1,
+ UINTN Arg2,
+ UINTN Arg3,
+ UINTN Arg4,
+ UINTN Arg5
+ );
+
+EFI_STATUS
+CoreGetPeiProtocol (
+ IN EFI_GUID *ProtocolGuid,
+ IN VOID **Interface
+ );
+
+EFI_STATUS
+DxeMainUefiDecompressGetInfo (
+ IN EFI_DECOMPRESS_PROTOCOL *This,
+ IN VOID *Source,
+ IN UINT32 SourceSize,
+ OUT UINT32 *DestinationSize,
+ OUT UINT32 *ScratchSize
+ );
+
+EFI_STATUS
+EFIAPI
+DxeMainUefiDecompress (
+ IN EFI_DECOMPRESS_PROTOCOL *This,
+ IN VOID *Source,
+ IN UINT32 SourceSize,
+ IN OUT VOID *Destination,
+ IN UINT32 DestinationSize,
+ IN OUT VOID *Scratch,
+ IN UINT32 ScratchSize
+ );
+
+EFI_STATUS
+DxeMainTianoDecompressGetInfo (
+ IN EFI_TIANO_DECOMPRESS_PROTOCOL *This,
+ IN VOID *Source,
+ IN UINT32 SourceSize,
+ OUT UINT32 *DestinationSize,
+ OUT UINT32 *ScratchSize
+ );
+
+EFI_STATUS
+EFIAPI
+DxeMainTianoDecompress (
+ IN EFI_TIANO_DECOMPRESS_PROTOCOL *This,
+ IN VOID *Source,
+ IN UINT32 SourceSize,
+ IN OUT VOID *Destination,
+ IN UINT32 DestinationSize,
+ IN OUT VOID *Scratch,
+ IN UINT32 ScratchSize
+ );
+
+EFI_STATUS
+DxeMainCustomDecompressGetInfo (
+ IN EFI_CUSTOMIZED_DECOMPRESS_PROTOCOL *This,
+ IN VOID *Source,
+ IN UINT32 SourceSize,
+ OUT UINT32 *DestinationSize,
+ OUT UINT32 *ScratchSize
+ );
+
+EFI_STATUS
+EFIAPI
+DxeMainCustomDecompress (
+ IN EFI_CUSTOMIZED_DECOMPRESS_PROTOCOL *This,
+ IN VOID *Source,
+ IN UINT32 SourceSize,
+ IN OUT VOID *Destination,
+ IN UINT32 DestinationSize,
+ IN OUT VOID *Scratch,
+ IN UINT32 ScratchSize
+ );
+
+//
+// DXE Core Global Variables for Protocols from PEI
+//
+EFI_HANDLE mDecompressHandle = NULL;
+EFI_PEI_PE_COFF_LOADER_PROTOCOL *gEfiPeiPeCoffLoader = NULL;
+
+//
+// DXE Core globals for Architecture Protocols
+//
+EFI_SECURITY_ARCH_PROTOCOL *gSecurity = NULL;
+EFI_CPU_ARCH_PROTOCOL *gCpu = NULL;
+EFI_METRONOME_ARCH_PROTOCOL *gMetronome = NULL;
+EFI_TIMER_ARCH_PROTOCOL *gTimer = NULL;
+EFI_BDS_ARCH_PROTOCOL *gBds = NULL;
+EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *gWatchdogTimer = NULL;
+EFI_RUNTIME_ARCH_PROTOCOL *gRuntime = NULL;
+
+//
+// BugBug: I'n not runtime, but is the PPI?
+//
+EFI_STATUS_CODE_PROTOCOL gStatusCodeInstance = {
+ NULL
+};
+
+EFI_STATUS_CODE_PROTOCOL *gStatusCode = &gStatusCodeInstance;
+
+
+//
+// DXE Core Global used to update core loaded image protocol handle
+//
+EFI_GUID *gDxeCoreFileName;
+EFI_LOADED_IMAGE_PROTOCOL *gDxeCoreLoadedImage;
+
+
+
+//
+// DXE Core Module Variables
+//
+
+EFI_BOOT_SERVICES mBootServices = {
+ {
+ EFI_BOOT_SERVICES_SIGNATURE, // Signature
+ EFI_BOOT_SERVICES_REVISION, // Revision
+ sizeof (EFI_BOOT_SERVICES), // HeaderSize
+ 0, // CRC32
+ 0 // Reserved
+ },
+ (EFI_RAISE_TPL) CoreRaiseTpl, // RaiseTPL
+ (EFI_RESTORE_TPL) CoreRestoreTpl, // RestoreTPL
+ (EFI_ALLOCATE_PAGES) CoreAllocatePages, // AllocatePages
+ (EFI_FREE_PAGES) CoreFreePages, // FreePages
+ (EFI_GET_MEMORY_MAP) CoreGetMemoryMap, // GetMemoryMap
+ (EFI_ALLOCATE_POOL) CoreAllocatePool, // AllocatePool
+ (EFI_FREE_POOL) CoreFreePool, // FreePool
+ (EFI_CREATE_EVENT) CoreCreateEvent, // CreateEvent
+ (EFI_SET_TIMER) CoreSetTimer, // SetTimer
+ (EFI_WAIT_FOR_EVENT) CoreWaitForEvent, // WaitForEvent
+ (EFI_SIGNAL_EVENT) CoreSignalEvent, // SignalEvent
+ (EFI_CLOSE_EVENT) CoreCloseEvent, // CloseEvent
+ (EFI_CHECK_EVENT) CoreCheckEvent, // CheckEvent
+ (EFI_INSTALL_PROTOCOL_INTERFACE) CoreInstallProtocolInterface, // InstallProtocolInterface
+ (EFI_REINSTALL_PROTOCOL_INTERFACE) CoreReinstallProtocolInterface, // ReinstallProtocolInterface
+ (EFI_UNINSTALL_PROTOCOL_INTERFACE) CoreUninstallProtocolInterface, // UninstallProtocolInterface
+ (EFI_HANDLE_PROTOCOL) CoreHandleProtocol, // HandleProtocol
+ (VOID *) NULL, // Reserved
+ (EFI_REGISTER_PROTOCOL_NOTIFY) CoreRegisterProtocolNotify, // RegisterProtocolNotify
+ (EFI_LOCATE_HANDLE) CoreLocateHandle, // LocateHandle
+ (EFI_LOCATE_DEVICE_PATH) CoreLocateDevicePath, // LocateDevicePath
+ (EFI_INSTALL_CONFIGURATION_TABLE) CoreInstallConfigurationTable, // InstallConfigurationTable
+ (EFI_IMAGE_LOAD) CoreLoadImage, // LoadImage
+ (EFI_IMAGE_START) CoreStartImage, // StartImage
+ (EFI_EXIT) CoreExit, // Exit
+ (EFI_IMAGE_UNLOAD) CoreUnloadImage, // UnloadImage
+ (EFI_EXIT_BOOT_SERVICES) CoreExitBootServices, // ExitBootServices
+ (EFI_GET_NEXT_MONOTONIC_COUNT) CoreEfiNotAvailableYetArg1, // GetNextMonotonicCount
+ (EFI_STALL) CoreStall, // Stall
+ (EFI_SET_WATCHDOG_TIMER) CoreSetWatchdogTimer, // SetWatchdogTimer
+ (EFI_CONNECT_CONTROLLER) CoreConnectController, // ConnectController
+ (EFI_DISCONNECT_CONTROLLER) CoreDisconnectController, // DisconnectController
+ (EFI_OPEN_PROTOCOL) CoreOpenProtocol, // OpenProtocol
+ (EFI_CLOSE_PROTOCOL) CoreCloseProtocol, // CloseProtocol
+ (EFI_OPEN_PROTOCOL_INFORMATION) CoreOpenProtocolInformation, // OpenProtocolInformation
+ (EFI_PROTOCOLS_PER_HANDLE) CoreProtocolsPerHandle, // ProtocolsPerHandle
+ (EFI_LOCATE_HANDLE_BUFFER) CoreLocateHandleBuffer, // LocateHandleBuffer
+ (EFI_LOCATE_PROTOCOL) CoreLocateProtocol, // LocateProtocol
+ (EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES) CoreInstallMultipleProtocolInterfaces, // InstallMultipleProtocolInterfaces
+ (EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES) CoreUninstallMultipleProtocolInterfaces, // UninstallMultipleProtocolInterfaces
+ (EFI_CALCULATE_CRC32) CoreEfiNotAvailableYetArg3, // CalculateCrc32
+ (EFI_COPY_MEM) CopyMem, // CopyMem
+ (EFI_SET_MEM) SetMem // SetMem
+#if (EFI_SPECIFICATION_VERSION >= 0x00020000)
+ ,
+ (EFI_CREATE_EVENT_EX) CoreCreateEventEx // CreateEventEx
+#endif
+};
+
+EFI_DXE_SERVICES mDxeServices = {
+ {
+ EFI_DXE_SERVICES_SIGNATURE, // Signature
+ EFI_DXE_SERVICES_REVISION, // Revision
+ sizeof (EFI_DXE_SERVICES), // HeaderSize
+ 0, // CRC32
+ 0 // Reserved
+ },
+ (EFI_ADD_MEMORY_SPACE) CoreAddMemorySpace, // AddMemorySpace
+ (EFI_ALLOCATE_MEMORY_SPACE) CoreAllocateMemorySpace, // AllocateMemorySpace
+ (EFI_FREE_MEMORY_SPACE) CoreFreeMemorySpace, // FreeMemorySpace
+ (EFI_REMOVE_MEMORY_SPACE) CoreRemoveMemorySpace, // RemoveMemorySpace
+ (EFI_GET_MEMORY_SPACE_DESCRIPTOR) CoreGetMemorySpaceDescriptor, // GetMemorySpaceDescriptor
+ (EFI_SET_MEMORY_SPACE_ATTRIBUTES) CoreSetMemorySpaceAttributes, // SetMemorySpaceAttributes
+ (EFI_GET_MEMORY_SPACE_MAP) CoreGetMemorySpaceMap, // GetMemorySpaceMap
+ (EFI_ADD_IO_SPACE) CoreAddIoSpace, // AddIoSpace
+ (EFI_ALLOCATE_IO_SPACE) CoreAllocateIoSpace, // AllocateIoSpace
+ (EFI_FREE_IO_SPACE) CoreFreeIoSpace, // FreeIoSpace
+ (EFI_REMOVE_IO_SPACE) CoreRemoveIoSpace, // RemoveIoSpace
+ (EFI_GET_IO_SPACE_DESCRIPTOR) CoreGetIoSpaceDescriptor, // GetIoSpaceDescriptor
+ (EFI_GET_IO_SPACE_MAP) CoreGetIoSpaceMap, // GetIoSpaceMap
+ (EFI_DISPATCH) CoreDispatcher, // Dispatch
+ (EFI_SCHEDULE) CoreSchedule, // Schedule
+ (EFI_TRUST) CoreTrust, // Trust
+ (EFI_PROCESS_FIRMWARE_VOLUME) CoreProcessFirmwareVolume, // ProcessFirmwareVolume
+};
+
+EFI_SYSTEM_TABLE mEfiSystemTableTemplate = {
+ {
+ EFI_SYSTEM_TABLE_SIGNATURE, // Signature
+ EFI_SYSTEM_TABLE_REVISION, // Revision
+ sizeof (EFI_SYSTEM_TABLE), // HeaderSize
+ 0, // CRC32
+ 0 // Reserved
+ },
+ NULL, // FirmwareVendor
+ 0, // FirmwareRevision
+ NULL, // ConsoleInHandle
+ NULL, // ConIn
+ NULL, // ConsoleOutHandle
+ NULL, // ConOut
+ NULL, // StandardErrorHandle
+ NULL, // StdErr
+ NULL, // RuntimeServices
+ &mBootServices, // BootServices
+ 0, // NumberOfConfigurationTableEntries
+ NULL // ConfigurationTable
+};
+
+EFI_RUNTIME_SERVICES mEfiRuntimeServicesTableTemplate = {
+ {
+ EFI_RUNTIME_SERVICES_SIGNATURE, // Signature
+ EFI_RUNTIME_SERVICES_REVISION, // Revision
+ sizeof (EFI_RUNTIME_SERVICES), // HeaderSize
+ 0, // CRC32
+ 0 // Reserved
+ },
+ (EFI_GET_TIME) CoreEfiNotAvailableYetArg2, // GetTime
+ (EFI_SET_TIME) CoreEfiNotAvailableYetArg1, // SetTime
+ (EFI_GET_WAKEUP_TIME) CoreEfiNotAvailableYetArg3, // GetWakeupTime
+ (EFI_SET_WAKEUP_TIME) CoreEfiNotAvailableYetArg2, // SetWakeupTime
+ (EFI_SET_VIRTUAL_ADDRESS_MAP) CoreEfiNotAvailableYetArg4, // SetVirtualAddressMap
+ (EFI_CONVERT_POINTER) CoreEfiNotAvailableYetArg2, // ConvertPointer
+ (EFI_GET_VARIABLE) CoreEfiNotAvailableYetArg5, // GetVariable
+ (EFI_GET_NEXT_VARIABLE_NAME) CoreEfiNotAvailableYetArg3, // GetNextVariableName
+ (EFI_SET_VARIABLE) CoreEfiNotAvailableYetArg5, // SetVariable
+ (EFI_GET_NEXT_HIGH_MONO_COUNT) CoreEfiNotAvailableYetArg1, // GetNextHighMonotonicCount
+ (EFI_RESET_SYSTEM) CoreEfiNotAvailableYetArg4 // ResetSystem
+#if ((EDK_RELEASE_VERSION != 0) && (EFI_SPECIFICATION_VERSION < 0x00020000))
+ ,
+ (TIANO_REPORT_STATUS_CODE) CoreEfiNotAvailableYetArg5 // ReportStatusCode
+#elif (EFI_SPECIFICATION_VERSION >= 0x00020000)
+ ,
+ (EFI_UPDATE_CAPSULE) CoreEfiNotAvailableYetArg3, // UpdateCapsule
+ (EFI_QUERY_CAPSULE_CAPABILITIES) CoreEfiNotAvailableYetArg4, // QueryCapsuleCapabilities
+ (EFI_QUERY_VARIABLE_INFO) CoreEfiNotAvailableYetArg4 // QueryVariableInfo
+#endif
+};
+
+//
+// DXE Core Global Variables for the EFI System Table, Boot Services Table,
+// DXE Services Table, and Runtime Services Table
+//
+EFI_BOOT_SERVICES *gBS = &mBootServices;
+EFI_DXE_SERVICES *gDS = &mDxeServices;
+EFI_SYSTEM_TABLE *gST = NULL;
+
+//
+// For debug initialize gRT to template. gRT must be allocated from RT memory
+// but gRT is used for ASSERT () and DEBUG () type macros so lets give it
+// a value that will not cause debug infrastructure to crash early on.
+//
+EFI_RUNTIME_SERVICES *gRT = &mEfiRuntimeServicesTableTemplate;
+EFI_HANDLE gDxeCoreImageHandle = NULL;
+
+VOID *mHobStart;
+
+//
+// EFI Decompress Protocol
+//
+EFI_DECOMPRESS_PROTOCOL gEfiDecompress = {
+ DxeMainUefiDecompressGetInfo,
+ DxeMainUefiDecompress
+};
+
+//
+// Tiano Decompress Protocol
+//
+EFI_TIANO_DECOMPRESS_PROTOCOL gEfiTianoDecompress = {
+ DxeMainTianoDecompressGetInfo,
+ DxeMainTianoDecompress
+};
+
+//
+// Customized Decompress Protocol
+//
+EFI_CUSTOMIZED_DECOMPRESS_PROTOCOL gEfiCustomizedDecompress = {
+ DxeMainCustomDecompressGetInfo,
+ DxeMainCustomDecompress
+};
+
+//
+// Main entry point to the DXE Core
+//
+VOID
+EFIAPI
+DxeMain (
+ IN VOID *HobStart
+ )
+/*++
+
+Routine Description:
+
+ Main entry point to DXE Core.
+
+Arguments:
+
+ HobStart - Pointer to the beginning of the HOB List from PEI
+
+Returns:
+
+ This function should never return
+
+--*/
+{
+ EFI_STATUS Status;
+ EFI_PHYSICAL_ADDRESS MemoryBaseAddress;
+ UINT64 MemoryLength;
+
+#ifdef EFI_DXE_PERFORMANCE
+ UINT64 Tick;
+
+ GetTimerValue (&Tick);
+#endif
+
+ mHobStart = HobStart;
+
+ //
+ // Initialize Memory Services
+ //
+ CoreInitializeMemoryServices (&HobStart, &MemoryBaseAddress, &MemoryLength);
+
+ //
+ // Allocate the EFI System Table and EFI Runtime Service Table from EfiRuntimeServicesData
+ // Use the templates to initialize the contents of the EFI System Table and EFI Runtime Services Table
+ //
+ gST = CoreAllocateRuntimeCopyPool (sizeof (EFI_SYSTEM_TABLE), &mEfiSystemTableTemplate);
+ ASSERT (gST != NULL);
+
+ gRT = CoreAllocateRuntimeCopyPool (sizeof (EFI_RUNTIME_SERVICES), &mEfiRuntimeServicesTableTemplate);
+ ASSERT (gRT != NULL);
+
+ gST->RuntimeServices = gRT;
+
+ //
+ // Start the Image Services.
+ //
+ Status = CoreInitializeImageServices (HobStart);
+ ASSERT_EFI_ERROR (Status);
+
+ //
+ // Call constructor for all libraries
+ //
+ ProcessLibraryConstructorList (gDxeCoreImageHandle, gST);
+
+ //
+ // Initialize the Global Coherency Domain Services
+ //
+ Status = CoreInitializeGcdServices (&HobStart, MemoryBaseAddress, MemoryLength);
+ ASSERT_EFI_ERROR (Status);
+
+ //
+ // Install the DXE Services Table into the EFI System Tables's Configuration Table
+ //
+ Status = CoreInstallConfigurationTable (&gEfiDxeServicesTableGuid, gDS);
+ ASSERT_EFI_ERROR (Status);
+
+ //
+ // Install the HOB List into the EFI System Tables's Configuration Table
+ //
+ Status = CoreInstallConfigurationTable (&gEfiHobListGuid, HobStart);
+ ASSERT_EFI_ERROR (Status);
+
+ //
+ // Install Memory Type Information Table into the EFI System Tables's Configuration Table
+ //
+ Status = CoreInstallConfigurationTable (&gEfiMemoryTypeInformationGuid, &gMemoryTypeInformation);
+ ASSERT_EFI_ERROR (Status);
+
+ //
+ // Initialize the ReportStatusCode with PEI version, if availible
+ //
+ CoreGetPeiProtocol (&gEfiStatusCodeRuntimeProtocolGuid, (VOID **)&gStatusCode->ReportStatusCode);
+#if ((EDK_RELEASE_VERSION != 0) && (EFI_SPECIFICATION_VERSION < 0x00020000))
+ gRT->ReportStatusCode = gStatusCode->ReportStatusCode;
+#endif
+
+ //
+ // Report Status Code here for DXE_ENTRY_POINT once it is available
+ //
+ CoreReportProgressCode ((EFI_SOFTWARE_DXE_CORE | EFI_SW_DXE_CORE_PC_ENTRY_POINT));
+
+ //
+ // Create the aligned system table pointer structure that is used by external
+ // debuggers to locate the system table... Also, install debug image info
+ // configuration table.
+ //
+ CoreInitializeDebugImageInfoTable ();
+ CoreNewDebugImageInfoEntry (
+ EFI_DEBUG_IMAGE_INFO_TYPE_NORMAL,
+ gDxeCoreLoadedImage,
+ gDxeCoreImageHandle
+ );
+
+ DEBUG ((EFI_D_INFO | EFI_D_LOAD, "HOBLIST address in DXE = 0x%08x\n", HobStart));
+
+ //
+ // Initialize the Event Services
+ //
+ Status = CoreInitializeEventServices ();
+ ASSERT_EFI_ERROR (Status);
+
+
+ //
+ // Get the Protocols that were passed in from PEI to DXE through GUIDed HOBs
+ //
+ // These Protocols are not architectural. This implementation is sharing code between
+ // PEI and DXE in order to save FLASH space. These Protocols could also be implemented
+ // as part of the DXE Core. However, that would also require the DXE Core to be ported
+ // each time a different CPU is used, a different Decompression algorithm is used, or a
+ // different Image type is used. By placing these Protocols in PEI, the DXE Core remains
+ // generic, and only PEI and the Arch Protocols need to be ported from Platform to Platform,
+ // and from CPU to CPU.
+ //
+
+ //
+ // Publish the EFI, Tiano, and Custom Decompress protocols for use by other DXE components
+ //
+ Status = CoreInstallMultipleProtocolInterfaces (
+ &mDecompressHandle,
+ &gEfiDecompressProtocolGuid, &gEfiDecompress,
+ &gEfiTianoDecompressProtocolGuid, &gEfiTianoDecompress,
+ &gEfiCustomizedDecompressProtocolGuid, &gEfiCustomizedDecompress,
+ NULL
+ );
+ ASSERT_EFI_ERROR (Status);
+
+ gEfiPeiPeCoffLoader = GetPeCoffLoaderProtocol ();
+ ASSERT (gEfiPeiPeCoffLoader != NULL);
+
+ //
+ // Register for the GUIDs of the Architectural Protocols, so the rest of the
+ // EFI Boot Services and EFI Runtime Services tables can be filled in.
+ //
+ CoreNotifyOnArchProtocolInstallation ();
+
+ //
+ // Produce Firmware Volume Protocols, one for each FV in the HOB list.
+ //
+ Status = FwVolBlockDriverInit (gDxeCoreImageHandle, gST);
+ ASSERT_EFI_ERROR (Status);
+
+ Status = FwVolDriverInit (gDxeCoreImageHandle, gST);
+ ASSERT_EFI_ERROR (Status);
+
+ //
+ // Produce the Section Extraction Protocol
+ //
+ Status = InitializeSectionExtraction (gDxeCoreImageHandle, gST);
+ ASSERT_EFI_ERROR (Status);
+
+ //
+ // Initialize the DXE Dispatcher
+ //
+ PERF_START (0,"CoreInitializeDispatcher", "DxeMain", 0) ;
+ CoreInitializeDispatcher ();
+ PERF_END (0,"CoreInitializeDispatcher", "DxeMain", 0) ;
+
+ //
+ // Invoke the DXE Dispatcher
+ //
+ PERF_START (0, "CoreDispatcher", "DxeMain", 0);
+ CoreDispatcher ();
+ PERF_END (0, "CoreDispatcher", "DxeMain", 0);
+
+ //
+ // Display Architectural protocols that were not loaded if this is DEBUG build
+ //
+ DEBUG_CODE (
+ CoreDisplayMissingArchProtocols ();
+ );
+
+ //
+ // Assert if the Architectural Protocols are not present.
+ //
+ ASSERT_EFI_ERROR (CoreAllEfiServicesAvailable ());
+
+ //
+ // Report Status code before transfer control to BDS
+ //
+ CoreReportProgressCode ((EFI_SOFTWARE_DXE_CORE | EFI_SW_DXE_CORE_PC_HANDOFF_TO_NEXT));
+ //
+ // Display any drivers that were not dispatched because dependency expression
+ // evaluated to false if this is a debug build
+ //
+ DEBUG_CODE (
+ CoreDisplayDiscoveredNotDispatched ();
+ );
+
+ //
+ // Transfer control to the BDS Architectural Protocol
+ //
+ gBds->Entry (gBds);
+
+ //
+ // BDS should never return
+ //
+ ASSERT (FALSE);
+ CpuDeadLoop ();
+}
+
+
+EFI_STATUS
+EFIAPI
+CoreEfiNotAvailableYetArg0 (
+ VOID
+ )
+/*++
+
+Routine Description:
+
+ Place holder function until all the Boot Services and Runtime Services are available
+
+Arguments:
+
+ None
+
+Returns:
+
+ EFI_NOT_AVAILABLE_YET
+
+--*/
+{
+ //
+ // This function should never be executed. If it does, then the architectural protocols
+ // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
+ // DXE Core and all the Architectural Protocols are complete.
+ //
+
+ return EFI_NOT_AVAILABLE_YET;
+}
+
+EFI_STATUS
+EFIAPI
+CoreEfiNotAvailableYetArg1 (
+ UINTN Arg1
+ )
+/*++
+
+Routine Description:
+
+ Place holder function until all the Boot Services and Runtime Services are available
+
+Arguments:
+
+ Arg1 - Undefined
+
+Returns:
+
+ EFI_NOT_AVAILABLE_YET
+
+--*/
+{
+ //
+ // This function should never be executed. If it does, then the architectural protocols
+ // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
+ // DXE Core and all the Architectural Protocols are complete.
+ //
+
+ return EFI_NOT_AVAILABLE_YET;
+}
+
+EFI_STATUS
+EFIAPI
+CoreEfiNotAvailableYetArg2 (
+ UINTN Arg1,
+ UINTN Arg2
+ )
+/*++
+
+Routine Description:
+
+ Place holder function until all the Boot Services and Runtime Services are available
+
+Arguments:
+
+ Arg1 - Undefined
+
+ Arg2 - Undefined
+
+Returns:
+
+ EFI_NOT_AVAILABLE_YET
+
+--*/
+{
+ //
+ // This function should never be executed. If it does, then the architectural protocols
+ // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
+ // DXE Core and all the Architectural Protocols are complete.
+ //
+
+ return EFI_NOT_AVAILABLE_YET;
+}
+
+EFI_STATUS
+EFIAPI
+CoreEfiNotAvailableYetArg3 (
+ UINTN Arg1,
+ UINTN Arg2,
+ UINTN Arg3
+ )
+/*++
+
+Routine Description:
+
+ Place holder function until all the Boot Services and Runtime Services are available
+
+Arguments:
+
+ Arg1 - Undefined
+
+ Arg2 - Undefined
+
+ Arg3 - Undefined
+
+Returns:
+
+ EFI_NOT_AVAILABLE_YET
+
+--*/
+{
+ //
+ // This function should never be executed. If it does, then the architectural protocols
+ // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
+ // DXE Core and all the Architectural Protocols are complete.
+ //
+
+ return EFI_NOT_AVAILABLE_YET;
+}
+
+EFI_STATUS
+EFIAPI
+CoreEfiNotAvailableYetArg4 (
+ UINTN Arg1,
+ UINTN Arg2,
+ UINTN Arg3,
+ UINTN Arg4
+ )
+/*++
+
+Routine Description:
+
+ Place holder function until all the Boot Services and Runtime Services are available
+
+Arguments:
+
+ Arg1 - Undefined
+
+ Arg2 - Undefined
+
+ Arg3 - Undefined
+
+ Arg4 - Undefined
+
+Returns:
+
+ EFI_NOT_AVAILABLE_YET
+
+--*/
+{
+ //
+ // This function should never be executed. If it does, then the architectural protocols
+ // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
+ // DXE Core and all the Architectural Protocols are complete.
+ //
+
+ return EFI_NOT_AVAILABLE_YET;
+}
+
+EFI_STATUS
+EFIAPI
+CoreEfiNotAvailableYetArg5 (
+ UINTN Arg1,
+ UINTN Arg2,
+ UINTN Arg3,
+ UINTN Arg4,
+ UINTN Arg5
+ )
+/*++
+
+Routine Description:
+
+ Place holder function until all the Boot Services and Runtime Services are available
+
+Arguments:
+
+ Arg1 - Undefined
+
+ Arg2 - Undefined
+
+ Arg3 - Undefined
+
+ Arg4 - Undefined
+
+ Arg5 - Undefined
+
+Returns:
+
+ EFI_NOT_AVAILABLE_YET
+
+--*/
+{
+ //
+ // This function should never be executed. If it does, then the architectural protocols
+ // have not been designed correctly. The CpuBreakpoint () is commented out for now until the
+ // DXE Core and all the Architectural Protocols are complete.
+ //
+
+ return EFI_NOT_AVAILABLE_YET;
+}
+
+
+EFI_STATUS
+CoreGetPeiProtocol (
+ IN EFI_GUID *ProtocolGuid,
+ IN VOID **Interface
+ )
+/*++
+
+Routine Description:
+
+ Searches for a Protocol Interface passed from PEI through a HOB
+
+Arguments:
+
+ ProtocolGuid - The Protocol GUID to search for in the HOB List
+
+ Interface - A pointer to the interface for the Protocol GUID
+
+Returns:
+
+ EFI_SUCCESS - The Protocol GUID was found and its interface is returned in Interface
+
+ EFI_NOT_FOUND - The Protocol GUID was not found in the HOB List
+
+--*/
+{
+ EFI_HOB_GUID_TYPE *GuidHob;
+ VOID *Buffer;
+
+ GuidHob = GetNextGuidHob (ProtocolGuid, mHobStart);
+ if (GuidHob == NULL) {
+ return EFI_NOT_FOUND;
+ }
+
+ Buffer = GET_GUID_HOB_DATA (GuidHob);
+ ASSERT (Buffer != NULL);
+
+ *Interface = (VOID *)(*(UINTN *)(Buffer));
+
+ return EFI_SUCCESS;
+}
+
+
+VOID
+CalculateEfiHdrCrc (
+ IN OUT EFI_TABLE_HEADER *Hdr
+ )
+/*++
+
+Routine Description:
+
+ Calcualte the 32-bit CRC in a EFI table using the service provided by the
+ gRuntime service.
+
+Arguments:
+
+ Hdr - Pointer to an EFI standard header
+
+Returns:
+
+ None
+
+--*/
+{
+ UINT32 Crc;
+
+ Hdr->CRC32 = 0;
+
+ //
+ // If gBS->CalculateCrce32 () == CoreEfiNotAvailableYet () then
+ // Crc will come back as zero if we set it to zero here
+ //
+ Crc = 0;
+ gBS->CalculateCrc32 ((UINT8 *)Hdr, Hdr->HeaderSize, &Crc);
+ Hdr->CRC32 = Crc;
+}
+
+
+
+EFI_STATUS
+EFIAPI
+CoreExitBootServices (
+ IN EFI_HANDLE ImageHandle,
+ IN UINTN MapKey
+ )
+/*++
+
+Routine Description:
+
+ EFI 1.0 API to terminate Boot Services
+
+Arguments:
+
+ ImageHandle - Handle that represents the identity of the calling image
+
+ MapKey -Key to the latest memory map.
+
+Returns:
+
+ EFI_SUCCESS - Boot Services terminated
+ EFI_INVALID_PARAMETER - MapKey is incorrect.
+
+--*/
+{
+ EFI_STATUS Status;
+
+ //
+ // Terminate memory services if the MapKey matches
+ //
+ Status = CoreTerminateMemoryMap (MapKey);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ //
+ // Notify other drivers that we are exiting boot services.
+ //
+ CoreNotifySignalList (&gEfiEventExitBootServicesGuid);
+
+ //
+ // Disable Timer
+ //
+ gTimer->SetTimerPeriod (gTimer, 0);
+
+ //
+ // Disable CPU Interrupts
+ //
+ gCpu->DisableInterrupt (gCpu);
+
+ //
+ // Register Runtime events with the Runtime Architectural Protocol
+ //
+ CoreShutdownEventServices ();
+
+ //
+ // Register Runtime images with the Runtime Architectural Protocol
+ //
+ CoreShutdownImageServices ();
+
+ //
+ // Report that ExitBootServices() has been called
+ //
+ // We are using gEfiDxeServicesTableGuid as the caller ID for Dxe Core
+ //
+ CoreReportProgressCode ((EFI_SOFTWARE_EFI_BOOT_SERVICE | EFI_SW_BS_PC_EXIT_BOOT_SERVICES));
+
+ //
+ // Clear the non-runtime values of the EFI System Table
+ //
+ gST->BootServices = NULL;
+ gST->ConIn = NULL;
+ gST->ConsoleInHandle = NULL;
+ gST->ConOut = NULL;
+ gST->ConsoleOutHandle = NULL;
+ gST->StdErr = NULL;
+ gST->StandardErrorHandle = NULL;
+
+ //
+ // Recompute the 32-bit CRC of the EFI System Table
+ //
+ CalculateEfiHdrCrc (&gST->Hdr);
+
+ //
+ // Zero out the Boot Service Table
+ //
+ SetMem (gBS, sizeof (EFI_BOOT_SERVICES), 0);
+ gBS = NULL;
+
+ return Status;
+}
+
+EFI_STATUS
+DxeMainUefiDecompressGetInfo (
+ IN EFI_DECOMPRESS_PROTOCOL *This,
+ IN VOID *Source,
+ IN UINT32 SourceSize,
+ OUT UINT32 *DestinationSize,
+ OUT UINT32 *ScratchSize
+ )
+{
+ return UefiDecompressGetInfo (Source, SourceSize, DestinationSize, ScratchSize);
+}
+
+EFI_STATUS
+EFIAPI
+DxeMainUefiDecompress (
+ IN EFI_DECOMPRESS_PROTOCOL *This,
+ IN VOID *Source,
+ IN UINT32 SourceSize,
+ IN OUT VOID *Destination,
+ IN UINT32 DestinationSize,
+ IN OUT VOID *Scratch,
+ IN UINT32 ScratchSize
+ )
+{
+ EFI_STATUS Status;
+ UINT32 TestDestinationSize;
+ UINT32 TestScratchSize;
+
+ Status = UefiDecompressGetInfo (Source, SourceSize, &TestDestinationSize, &TestScratchSize);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ if (ScratchSize < TestScratchSize || DestinationSize < TestDestinationSize) {
+ return RETURN_INVALID_PARAMETER;
+ }
+
+ return UefiDecompress (Source, Destination, Scratch);
+}
+
+EFI_STATUS
+DxeMainTianoDecompressGetInfo (
+ IN EFI_TIANO_DECOMPRESS_PROTOCOL *This,
+ IN VOID *Source,
+ IN UINT32 SourceSize,
+ OUT UINT32 *DestinationSize,
+ OUT UINT32 *ScratchSize
+ )
+{
+ return TianoDecompressGetInfo (Source, SourceSize, DestinationSize, ScratchSize);
+}
+
+EFI_STATUS
+EFIAPI
+DxeMainTianoDecompress (
+ IN EFI_TIANO_DECOMPRESS_PROTOCOL *This,
+ IN VOID *Source,
+ IN UINT32 SourceSize,
+ IN OUT VOID *Destination,
+ IN UINT32 DestinationSize,
+ IN OUT VOID *Scratch,
+ IN UINT32 ScratchSize
+ )
+{
+ EFI_STATUS Status;
+ UINT32 TestDestinationSize;
+ UINT32 TestScratchSize;
+
+ Status = TianoDecompressGetInfo (Source, SourceSize, &TestDestinationSize, &TestScratchSize);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ if (ScratchSize < TestScratchSize || DestinationSize < TestDestinationSize) {
+ return RETURN_INVALID_PARAMETER;
+ }
+
+ return TianoDecompress (Source, Destination, Scratch);
+}
+
+EFI_STATUS
+DxeMainCustomDecompressGetInfo (
+ IN EFI_CUSTOMIZED_DECOMPRESS_PROTOCOL *This,
+ IN VOID *Source,
+ IN UINT32 SourceSize,
+ OUT UINT32 *DestinationSize,
+ OUT UINT32 *ScratchSize
+ )
+{
+ return CustomDecompressGetInfo (Source, SourceSize, DestinationSize, ScratchSize);
+}
+
+EFI_STATUS
+EFIAPI
+DxeMainCustomDecompress (
+ IN EFI_CUSTOMIZED_DECOMPRESS_PROTOCOL *This,
+ IN VOID *Source,
+ IN UINT32 SourceSize,
+ IN OUT VOID *Destination,
+ IN UINT32 DestinationSize,
+ IN OUT VOID *Scratch,
+ IN UINT32 ScratchSize
+ )
+{
+ EFI_STATUS Status;
+ UINT32 TestDestinationSize;
+ UINT32 TestScratchSize;
+
+ Status = CustomDecompressGetInfo (Source, SourceSize, &TestDestinationSize, &TestScratchSize);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ if (ScratchSize < TestScratchSize || DestinationSize < TestDestinationSize) {
+ return RETURN_INVALID_PARAMETER;
+ }
+
+ return CustomDecompress (Source, Destination, Scratch);
+}
+