/** @file MockSmmServicesTableLib.cpp
  Google Test mocks for SmmServicesTableLib

  Copyright (c) Microsoft Corporation.
  SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include <GoogleTest/Library/MockSmmServicesTableLib.h>

MOCK_INTERFACE_DEFINITION (MockSmmServicesTableLib);

MOCK_FUNCTION_DEFINITION (MockSmmServicesTableLib, gSmst_SmmAllocatePool, 3, EFIAPI);
MOCK_FUNCTION_DEFINITION (MockSmmServicesTableLib, gSmst_SmmFreePool, 1, EFIAPI);
MOCK_FUNCTION_DEFINITION (MockSmmServicesTableLib, gSmst_SmmAllocatePages, 4, EFIAPI);
MOCK_FUNCTION_DEFINITION (MockSmmServicesTableLib, gSmst_SmmFreePages, 2, EFIAPI);
MOCK_FUNCTION_DEFINITION (MockSmmServicesTableLib, gSmst_SmmStartupThisAp, 3, EFIAPI);
MOCK_FUNCTION_DEFINITION (MockSmmServicesTableLib, gSmst_SmmInstallProtocolInterface, 4, EFIAPI);
MOCK_FUNCTION_DEFINITION (MockSmmServicesTableLib, gSmst_SmmUninstallProtocolInterface, 3, EFIAPI);
MOCK_FUNCTION_DEFINITION (MockSmmServicesTableLib, gSmst_SmmHandleProtocol, 3, EFIAPI);
MOCK_FUNCTION_DEFINITION (MockSmmServicesTableLib, gSmst_SmmRegisterProtocolNotify, 3, EFIAPI);
MOCK_FUNCTION_DEFINITION (MockSmmServicesTableLib, gSmst_SmmLocateHandle, 5, EFIAPI);
MOCK_FUNCTION_DEFINITION (MockSmmServicesTableLib, gSmst_SmmLocateProtocol, 3, EFIAPI);
MOCK_FUNCTION_DEFINITION (MockSmmServicesTableLib, gSmst_SmiManage, 4, EFIAPI);
MOCK_FUNCTION_DEFINITION (MockSmmServicesTableLib, gSmst_SmmInterruptRegister, 3, EFIAPI);
MOCK_FUNCTION_DEFINITION (MockSmmServicesTableLib, gSmst_SmmInterruptUnRegister, 1, EFIAPI);

static EFI_SMM_SYSTEM_TABLE2  LocalSmst = {
  {                                    // EFI_TABLE_HEADER
    0,
    0,
    0,
    0,
    0
  },
  NULL,                                // SmmFirmwareVendor
  0,                                   // SmmFirmwareRevision
  NULL,                                // EFI_SMM_INSTALL_CONFIGURATION_TABLE2
  {                                    // EFI_SMM_CPU_IO2_PROTOCOL
    {
      NULL,
      NULL
    },
    {
      NULL,
      NULL
    }
  },
  gSmst_SmmAllocatePool,               // EFI_ALLOCATE_POOL
  gSmst_SmmFreePool,                   // EFI_FREE_POOL
  gSmst_SmmAllocatePages,              // EFI_ALLOCATE_PAGES
  gSmst_SmmFreePages,                  // EFI_FREE_PAGES
  gSmst_SmmStartupThisAp,              // EFI_SMM_STARTUP_THIS_AP
  0,                                   // CurrentlyExecutingCpu
  0,                                   // NumberOfCpus
  NULL,                                // CpuSaveStateSize
  NULL,                                // CpuSaveState
  0,                                   // NumberOfTableEntries
  NULL,                                // EFI_CONFIGURATION_TABLE
  gSmst_SmmInstallProtocolInterface,   // EFI_INSTALL_PROTOCOL_INTERFACE
  gSmst_SmmUninstallProtocolInterface, // EFI_UNINSTALL_PROTOCOL_INTERFACE
  gSmst_SmmHandleProtocol,             // EFI_HANDLE_PROTOCOL
  gSmst_SmmRegisterProtocolNotify,     // EFI_SMM_REGISTER_PROTOCOL_NOTIFY
  gSmst_SmmLocateHandle,               // EFI_LOCATE_HANDLE
  gSmst_SmmLocateProtocol,             // EFI_LOCATE_PROTOCOL
  gSmst_SmiManage,                     // EFI_SMM_INTERRUPT_MANAGE
  gSmst_SmmInterruptRegister,          // EFI_SMM_INTERRUPT_REGISTER
  gSmst_SmmInterruptUnRegister         // EFI_SMM_INTERRUPT_UNREGISTER
};

extern "C" {
  EFI_SMM_SYSTEM_TABLE2  *gSmst = &LocalSmst;
}
