]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UnitTestFrameworkPkg/Library/UnitTestUefiBootServicesTableLib/UnitTestUefiBootServicesTableLib.c
UnitTestFrameworkPkg: Add UnitTestUefiBootServicesTableLib
[mirror_edk2.git] / UnitTestFrameworkPkg / Library / UnitTestUefiBootServicesTableLib / UnitTestUefiBootServicesTableLib.c
diff --git a/UnitTestFrameworkPkg/Library/UnitTestUefiBootServicesTableLib/UnitTestUefiBootServicesTableLib.c b/UnitTestFrameworkPkg/Library/UnitTestUefiBootServicesTableLib/UnitTestUefiBootServicesTableLib.c
new file mode 100644 (file)
index 0000000..a6fc13e
--- /dev/null
@@ -0,0 +1,119 @@
+/** @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