| /** @file | |
| This library supports a Boot Services table library implementation that allows code dependent | |
| upon UefiBootServicesTableLib to operate in an isolated execution environment such as within | |
| the context of a host-based unit test framework. | |
| The unit test should initialize the Boot Services database with any required elements | |
| (e.g. protocols, events, handles, etc.) prior to the services being invoked by code under test. | |
| It is strongly recommended to clean any global databases (e.g. protocol, event, handles, etc.) after | |
| every unit test so the tests execute in a predictable manner from a clean state. | |
| Copyright (c) Microsoft Corporation | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #include "UnitTestUefiBootServicesTableLib.h" | |
| EFI_HANDLE gImageHandle = NULL; | |
| EFI_SYSTEM_TABLE *gST = NULL; | |
| STATIC 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)UnitTestRaiseTpl, // RaiseTPL | |
| (EFI_RESTORE_TPL)UnitTestRestoreTpl, // RestoreTPL | |
| (EFI_ALLOCATE_PAGES)UnitTestAllocatePages, // AllocatePages | |
| (EFI_FREE_PAGES)UnitTestFreePages, // FreePages | |
| (EFI_GET_MEMORY_MAP)UnitTestGetMemoryMap, // GetMemoryMap | |
| (EFI_ALLOCATE_POOL)UnitTestAllocatePool, // AllocatePool | |
| (EFI_FREE_POOL)UnitTestFreePool, // FreePool | |
| (EFI_CREATE_EVENT)UnitTestCreateEvent, // CreateEvent | |
| (EFI_SET_TIMER)UnitTestSetTimer, // SetTimer | |
| (EFI_WAIT_FOR_EVENT)UnitTestWaitForEvent, // WaitForEvent | |
| (EFI_SIGNAL_EVENT)UnitTestSignalEvent, // SignalEvent | |
| (EFI_CLOSE_EVENT)UnitTestCloseEvent, // CloseEvent | |
| (EFI_CHECK_EVENT)UnitTestCheckEvent, // CheckEvent | |
| (EFI_INSTALL_PROTOCOL_INTERFACE)UnitTestInstallProtocolInterface, // InstallProtocolInterface | |
| (EFI_REINSTALL_PROTOCOL_INTERFACE)UnitTestReinstallProtocolInterface, // ReinstallProtocolInterface | |
| (EFI_UNINSTALL_PROTOCOL_INTERFACE)UnitTestUninstallProtocolInterface, // UninstallProtocolInterface | |
| (EFI_HANDLE_PROTOCOL)UnitTestHandleProtocol, // HandleProtocol | |
| (VOID *)NULL, // Reserved | |
| (EFI_REGISTER_PROTOCOL_NOTIFY)UnitTestRegisterProtocolNotify, // RegisterProtocolNotify | |
| (EFI_LOCATE_HANDLE)UnitTestLocateHandle, // LocateHandle | |
| (EFI_LOCATE_DEVICE_PATH)UnitTestLocateDevicePath, // LocateDevicePath | |
| (EFI_INSTALL_CONFIGURATION_TABLE)UnitTestInstallConfigurationTable, // InstallConfigurationTable | |
| (EFI_IMAGE_LOAD)UnitTestLoadImage, // LoadImage | |
| (EFI_IMAGE_START)UnitTestStartImage, // StartImage | |
| (EFI_EXIT)UnitTestExit, // Exit | |
| (EFI_IMAGE_UNLOAD)UnitTestUnloadImage, // UnloadImage | |
| (EFI_EXIT_BOOT_SERVICES)UnitTestExitBootServices, // ExitBootServices | |
| (EFI_GET_NEXT_MONOTONIC_COUNT)UnitTestGetNextMonotonicCount, // GetNextMonotonicCount | |
| (EFI_STALL)UnitTestStall, // Stall | |
| (EFI_SET_WATCHDOG_TIMER)UnitTestSetWatchdogTimer, // SetWatchdogTimer | |
| (EFI_CONNECT_CONTROLLER)UnitTestConnectController, // ConnectController | |
| (EFI_DISCONNECT_CONTROLLER)UnitTestDisconnectController, // DisconnectController | |
| (EFI_OPEN_PROTOCOL)UnitTestOpenProtocol, // OpenProtocol | |
| (EFI_CLOSE_PROTOCOL)UnitTestCloseProtocol, // CloseProtocol | |
| (EFI_OPEN_PROTOCOL_INFORMATION)UnitTestOpenProtocolInformation, // OpenProtocolInformation | |
| (EFI_PROTOCOLS_PER_HANDLE)UnitTestProtocolsPerHandle, // ProtocolsPerHandle | |
| (EFI_LOCATE_HANDLE_BUFFER)UnitTestLocateHandleBuffer, // LocateHandleBuffer | |
| (EFI_LOCATE_PROTOCOL)UnitTestLocateProtocol, // LocateProtocol | |
| (EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES)UnitTestInstallMultipleProtocolInterfaces, // InstallMultipleProtocolInterfaces | |
| (EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES)UnitTestUninstallMultipleProtocolInterfaces, // UninstallMultipleProtocolInterfaces | |
| (EFI_CALCULATE_CRC32)UnitTestCalculateCrc32, // CalculateCrc32 | |
| (EFI_COPY_MEM)CopyMem, // CopyMem | |
| (EFI_SET_MEM)SetMem, // SetMem | |
| (EFI_CREATE_EVENT_EX)UnitTestCreateEventEx // CreateEventEx | |
| }; | |
| EFI_BOOT_SERVICES *gBS = &mBootServices; | |
| /** | |
| The constructor function caches the pointer of Boot Services Table. | |
| The constructor function caches the pointer of Boot Services Table through System Table. | |
| It will ASSERT() if the pointer of System Table is NULL. | |
| It will ASSERT() if the pointer of Boot Services Table is NULL. | |
| It will always return EFI_SUCCESS. | |
| @param ImageHandle The firmware allocated handle for the EFI image. | |
| @param SystemTable A pointer to the EFI System Table. | |
| @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| UnitTestUefiBootServicesTableLibConstructor ( | |
| IN EFI_HANDLE ImageHandle, | |
| IN EFI_SYSTEM_TABLE *SystemTable | |
| ) | |
| { | |
| // | |
| // Cache the Image Handle | |
| // | |
| gImageHandle = ImageHandle; | |
| ASSERT (gImageHandle != NULL); | |
| // | |
| // Cache pointer to the EFI System Table | |
| // | |
| // Note: The system table is not implemented | |
| gST = NULL; | |
| // | |
| // Cache pointer to the EFI Boot Services Table | |
| // | |
| gBS = SystemTable->BootServices; | |
| ASSERT (gBS != NULL); | |
| return EFI_SUCCESS; | |
| } |