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