/** @file MockSmmServicesTableLib.h
  Google Test mocks for SmmServicesTableLib

  Copyright (c) Microsoft Corporation.
  SPDX-License-Identifier: BSD-2-Clause-Patent
**/

#pragma once

#include <Library/GoogleTestLib.h>
#include <Library/FunctionMockLib.h>
extern "C" {
  #include <Uefi.h>
  #include <Library/SmmServicesTableLib.h>
}

//
// Declarations to handle usage of the SmmServicesTableLib by creating mock
//
struct MockSmmServicesTableLib {
  MOCK_INTERFACE_DECLARATION (MockSmmServicesTableLib);

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    gSmst_SmmAllocatePool,
    (
     IN  EFI_MEMORY_TYPE             PoolType,
     IN  UINTN                       Size,
     OUT VOID                        **Buffer
    )
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    gSmst_SmmFreePool,
    (
     IN  VOID                        *Buffer
    )
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    gSmst_SmmAllocatePages,
    (
     IN  EFI_ALLOCATE_TYPE           Type,
     IN  EFI_MEMORY_TYPE             MemoryType,
     IN  UINTN                       Pages,
     OUT EFI_PHYSICAL_ADDRESS        *Memory
    )
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    gSmst_SmmFreePages,
    (
     IN  EFI_PHYSICAL_ADDRESS        Memory,
     IN  UINTN                       Pages
    )
    );

  // MP service
  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    gSmst_SmmStartupThisAp,
    (
     IN     EFI_AP_PROCEDURE  Procedure,
     IN     UINTN             CpuNumber,
     IN OUT VOID              *ProcArguments OPTIONAL
    )
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    gSmst_SmmInstallProtocolInterface,
    (
     IN OUT EFI_HANDLE               *Handle,
     IN     EFI_GUID                 *Protocol,
     IN     EFI_INTERFACE_TYPE       InterfaceType,
     IN     VOID                     *Interface
    )
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    gSmst_SmmUninstallProtocolInterface,
    (
     IN EFI_HANDLE               Handle,
     IN EFI_GUID                 *Protocol,
     IN VOID                     *Interface
    )
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    gSmst_SmmHandleProtocol,
    (
     IN  EFI_HANDLE              Handle,
     IN  EFI_GUID                *Protocol,
     OUT VOID                    **Interface
    )
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    gSmst_SmmRegisterProtocolNotify,
    (
     IN  CONST EFI_GUID     *Protocol,
     IN  EFI_MM_NOTIFY_FN   Function,
     OUT VOID               **Registration
    )
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    gSmst_SmmLocateHandle,
    (
     IN     EFI_LOCATE_SEARCH_TYPE  SearchType,
     IN     EFI_GUID                *Protocol,
     IN     VOID                    *SearchKey,
     IN OUT UINTN                   *BufferSize,
     OUT    EFI_HANDLE              *Buffer
    )
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    gSmst_SmmLocateProtocol,
    (
     IN  EFI_GUID  *Protocol,
     IN  VOID      *Registration  OPTIONAL,
     OUT VOID      **Interface
    )
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    gSmst_SmiManage,
    (
     IN CONST EFI_GUID  *HandlerType,
     IN CONST VOID      *Context,
     IN OUT VOID        *CommBuffer,
     IN OUT UINTN       *CommBufferSize
    )
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    gSmst_SmmInterruptRegister,
    (
     IN  EFI_SMM_HANDLER_ENTRY_POINT2 Handler,
     IN  CONST EFI_GUID *HandlerType,
     OUT EFI_HANDLE    *DispatchHandle
    )
    );

  MOCK_FUNCTION_DECLARATION (
    EFI_STATUS,
    gSmst_SmmInterruptUnRegister,
    (
     IN EFI_HANDLE  DispatchHandle
    )
    );
};
