/** @file

  Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
  Copyright (c) 2011 - 2019, Intel Corporation. All rights reserved.<BR>

  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef _GASKET_H_
#define _GASKET_H_

//
// EMU_THUNK_PROTOCOL gaskets (EFIAPI to UNIX ABI)
//

UINTN
EFIAPI
GasketSecWriteStdErr (
  IN UINT8     *Buffer,
  IN UINTN     NumberOfBytes
  );

EFI_STATUS
EFIAPI
GasketSecConfigStdIn (
  VOID
  );

UINTN
EFIAPI
GasketSecWriteStdOut (
  IN UINT8     *Buffer,
  IN UINTN     NumberOfBytes
  );

UINTN
EFIAPI
GasketSecReadStdIn (
  IN UINT8     *Buffer,
  IN UINTN     NumberOfBytes
  );

BOOLEAN
EFIAPI
GasketSecPollStdIn (
  VOID
  );

VOID *
EFIAPI
GasketSecMalloc (
  IN  UINTN Size
  );

VOID *
EFIAPI
GasketSecValloc (
  IN  UINTN Size
  );

BOOLEAN
EFIAPI
GasketSecFree (
  IN  VOID *Ptr
  );


RETURN_STATUS
EFIAPI
GasketSecPeCoffGetEntryPoint (
  IN     VOID  *Pe32Data,
  IN OUT VOID  **EntryPoint
  );

VOID
EFIAPI
GasketSecPeCoffRelocateImageExtraAction (
  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext
  );

VOID
EFIAPI
GasketSecPeCoffUnloadImageExtraAction (
  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext
  );

VOID
EFIAPI
GasketSecSetTimer (
  IN  UINT64                  PeriodMs,
  IN  EMU_SET_TIMER_CALLBACK  CallBack
  );

VOID
EFIAPI
GasketSecEnableInterrupt (
  VOID
  );

VOID
EFIAPI
GasketSecDisableInterrupt (
  VOID
  );

UINT64
EFIAPI
GasketQueryPerformanceFrequency (
  VOID
  );

UINT64
EFIAPI
GasketQueryPerformanceCounter (
  VOID
  );


VOID
EFIAPI
GasketSecSleep (
  IN  UINT64 Nanoseconds
  );

VOID
EFIAPI
GasketSecCpuSleep (
  VOID
  );

VOID
EFIAPI
GasketSecExit (
  UINTN   Status
  );

VOID
EFIAPI
GasketSecGetTime (
  OUT  EFI_TIME               *Time,
  OUT EFI_TIME_CAPABILITIES   *Capabilities OPTIONAL
  );

VOID
EFIAPI
GasketSecSetTime (
  IN  EFI_TIME               *Time
  );

EFI_STATUS
EFIAPI
GasketSecGetNextProtocol (
  IN  BOOLEAN                 EmuBusDriver,
  OUT EMU_IO_THUNK_PROTOCOL   **Instance  OPTIONAL
  );


// PPIs produced by SEC


EFI_STATUS
EFIAPI
GasketSecUnixPeiAutoScan (
  IN  UINTN                 Index,
  OUT EFI_PHYSICAL_ADDRESS  *MemoryBase,
  OUT UINT64                *MemorySize
  );

VOID *
EFIAPI
GasketSecEmuThunkAddress (
  VOID
  );


EFI_STATUS
EFIAPI
GasketSecUnixUnixFwhAddress (
  IN OUT UINT64                *FwhSize,
  IN OUT EFI_PHYSICAL_ADDRESS  *FwhBase
  );



//
// Reverse (UNIX to EFIAPI) gaskets
//

typedef
void
(EFIAPI *CALL_BACK) (
  UINT64 Delta
  );

UINTN
ReverseGasketUint64 (
  UINTN  CallBack,
  UINT64 a
  );

UINTN
ReverseGasketUint64Uint64 (
  VOID      *CallBack,
  VOID      *Context,
  VOID      *Key
  );

//
// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL
//


EFI_STATUS
EFIAPI
GasketX11Size (
  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo,
  UINT32 Width,
  UINT32 Height
  );

EFI_STATUS
EFIAPI
GasketX11CheckKey (
  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo
  );

EFI_STATUS
EFIAPI
GasketX11GetKey (
  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo,
  EFI_KEY_DATA                 *key
  );

EFI_STATUS
EFIAPI
GasketX11KeySetState (
  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsWindowsIo,
  EFI_KEY_TOGGLE_STATE          *KeyToggleState
  );

EFI_STATUS
EFIAPI
GasketX11RegisterKeyNotify (
  IN EMU_GRAPHICS_WINDOW_PROTOCOL                         *GraphicsWindowsIo,
  IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK     MakeCallBack,
  IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK     BreakCallBack,
  IN VOID                                                 *Context
  );


EFI_STATUS
EFIAPI
GasketX11Blt (
  IN  EMU_GRAPHICS_WINDOW_PROTOCOL            *GraphicsWindows,
  IN  EFI_UGA_PIXEL                           *BltBuffer OPTIONAL,
  IN  EFI_UGA_BLT_OPERATION                   BltOperation,
  IN  EMU_GRAPHICS_WINDOWS__BLT_ARGS          *Args
  );

EFI_STATUS
EFIAPI
GasketX11CheckPointer (
  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo
  );

EFI_STATUS
EFIAPI
GasketX11GetPointerState (
  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindowsIo,
  EFI_SIMPLE_POINTER_STATE *state
  );

EFI_STATUS
EFIAPI
GasketX11GraphicsWindowOpen (
  IN  EMU_IO_THUNK_PROTOCOL   *This
  );

EFI_STATUS
EFIAPI
GasketX11GraphicsWindowClose (
  IN  EMU_IO_THUNK_PROTOCOL   *This
  );

// Pthreads

UINTN
EFIAPI
GasketPthreadMutexLock (
  IN VOID *Mutex
  );



UINTN
EFIAPI
GasketPthreadMutexUnLock (
  IN VOID *Mutex
  );


UINTN
EFIAPI
GasketPthreadMutexTryLock (
  IN VOID *Mutex
  );


VOID *
EFIAPI
GasketPthreadMutexInit (
  IN VOID
  );


UINTN
EFIAPI
GasketPthreadMutexDestroy (
  IN VOID *Mutex
  );


UINTN
EFIAPI
GasketPthreadCreate (
  IN  VOID                      *Thread,
  IN  VOID                      *Attribute,
  IN  THREAD_THUNK_THREAD_ENTRY Start,
  IN  VOID                      *Context
  );

VOID
EFIAPI
GasketPthreadExit (
  IN VOID *ValuePtr
  );


UINTN
EFIAPI
GasketPthreadSelf (
  VOID
  );

EFI_STATUS
EFIAPI
GasketPthreadOpen (
  IN  EMU_IO_THUNK_PROTOCOL   *This
  );

EFI_STATUS
EFIAPI
GasketPthreadClose (
  IN  EMU_IO_THUNK_PROTOCOL   *This
  );


// PosixFileSystem

EFI_STATUS
EFIAPI
GasketPosixOpenVolume (
  IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL    *This,
  OUT EFI_FILE_PROTOCOL                 **Root
  );

EFI_STATUS
EFIAPI
GasketPosixFileOpen (
  IN EFI_FILE_PROTOCOL        *This,
  OUT EFI_FILE_PROTOCOL       **NewHandle,
  IN CHAR16                   *FileName,
  IN UINT64                   OpenMode,
  IN UINT64                   Attributes
  );

EFI_STATUS
EFIAPI
GasketPosixFileCLose (
  IN EFI_FILE_PROTOCOL  *This
  );

EFI_STATUS
EFIAPI
GasketPosixFileDelete (
  IN EFI_FILE_PROTOCOL  *This
  );

EFI_STATUS
EFIAPI
GasketPosixFileRead (
  IN EFI_FILE_PROTOCOL        *This,
  IN OUT UINTN                *BufferSize,
  OUT VOID                    *Buffer
  );

EFI_STATUS
EFIAPI
GasketPosixFileWrite (
  IN EFI_FILE_PROTOCOL        *This,
  IN OUT UINTN                *BufferSize,
  IN VOID                     *Buffer
  );

EFI_STATUS
EFIAPI
GasketPosixFileSetPossition (
  IN EFI_FILE_PROTOCOL        *This,
  IN UINT64                   Position
  );

EFI_STATUS
EFIAPI
GasketPosixFileGetPossition (
  IN EFI_FILE_PROTOCOL        *This,
  OUT UINT64                  *Position
  );

EFI_STATUS
EFIAPI
GasketPosixFileGetInfo (
  IN EFI_FILE_PROTOCOL        *This,
  IN EFI_GUID                 *InformationType,
  IN OUT UINTN                *BufferSize,
  OUT VOID                    *Buffer
  );

EFI_STATUS
EFIAPI
GasketPosixFileSetInfo (
  IN EFI_FILE_PROTOCOL        *This,
  IN EFI_GUID                 *InformationType,
  IN UINTN                    BufferSize,
  IN VOID                     *Buffer
  );

EFI_STATUS
EFIAPI
GasketPosixFileFlush (
  IN EFI_FILE_PROTOCOL  *This
  );

EFI_STATUS
EFIAPI
GasketPosixFileSystmeThunkOpen (
  IN  EMU_IO_THUNK_PROTOCOL   *This
  );

EFI_STATUS
EFIAPI
GasketPosixFileSystmeThunkClose (
  IN  EMU_IO_THUNK_PROTOCOL   *This
  );

EFI_STATUS
EFIAPI
GasketEmuBlockIoReset (
  IN EMU_BLOCK_IO_PROTOCOL    *This,
  IN BOOLEAN                  ExtendedVerification
  );

EFI_STATUS
EFIAPI
GasketEmuBlockIoReadBlocks (
  IN     EMU_BLOCK_IO_PROTOCOL  *This,
  IN     UINT32                 MediaId,
  IN     EFI_LBA                LBA,
  IN OUT EFI_BLOCK_IO2_TOKEN    *Token,
  IN     UINTN                  BufferSize,
     OUT VOID                   *Buffer
  );

EFI_STATUS
EFIAPI
GasketEmuBlockIoWriteBlocks (
  IN     EMU_BLOCK_IO_PROTOCOL  *This,
  IN     UINT32                 MediaId,
  IN     EFI_LBA                LBA,
  IN OUT EFI_BLOCK_IO2_TOKEN    *Token,
  IN     UINTN                  BufferSize,
  IN     VOID                   *Buffer
  );

EFI_STATUS
EFIAPI
GasketEmuBlockIoFlushBlocks (
  IN     EMU_BLOCK_IO_PROTOCOL    *This,
  IN OUT EFI_BLOCK_IO2_TOKEN      *Token
  );

EFI_STATUS
EFIAPI
GasketEmuBlockIoCreateMapping (
  IN     EMU_BLOCK_IO_PROTOCOL    *This,
  IN     EFI_BLOCK_IO_MEDIA       *Media
  );

EFI_STATUS
EFIAPI
GasketBlockIoThunkOpen (
  IN  EMU_IO_THUNK_PROTOCOL   *This
  );

EFI_STATUS
EFIAPI
GasketBlockIoThunkClose (
  IN  EMU_IO_THUNK_PROTOCOL   *This
  );

EFI_STATUS
EFIAPI
GasketSnpThunkOpen (
  IN  EMU_IO_THUNK_PROTOCOL   *This
  );

EFI_STATUS
EFIAPI
GasketSnpThunkClose (
  IN  EMU_IO_THUNK_PROTOCOL   *This
  );

EFI_STATUS
EFIAPI
GasketSnpCreateMapping (
  IN     EMU_SNP_PROTOCOL         *This,
  IN     EFI_SIMPLE_NETWORK_MODE  *Media
  );

EFI_STATUS
EFIAPI
GasketSnpStart (
  IN EMU_SNP_PROTOCOL  *This
  );

EFI_STATUS
EFIAPI
GasketSnpStop (
  IN EMU_SNP_PROTOCOL  *This
  );

EFI_STATUS
EFIAPI
GasketSnpInitialize (
  IN EMU_SNP_PROTOCOL                    *This,
  IN UINTN                               ExtraRxBufferSize  OPTIONAL,
  IN UINTN                               ExtraTxBufferSize  OPTIONAL
  );

EFI_STATUS
EFIAPI
GasketSnpReset (
  IN EMU_SNP_PROTOCOL   *This,
  IN BOOLEAN            ExtendedVerification
  );

EFI_STATUS
EFIAPI
GasketSnpShutdown (
  IN EMU_SNP_PROTOCOL  *This
  );

EFI_STATUS
EFIAPI
GasketSnpReceiveFilters (
  IN EMU_SNP_PROTOCOL                             *This,
  IN UINT32                                       Enable,
  IN UINT32                                       Disable,
  IN BOOLEAN                                      ResetMCastFilter,
  IN UINTN                                        MCastFilterCnt     OPTIONAL,
  IN EFI_MAC_ADDRESS                              *MCastFilter OPTIONAL
  );

EFI_STATUS
EFIAPI
GasketSnpStationAddress (
  IN EMU_SNP_PROTOCOL            *This,
  IN BOOLEAN                     Reset,
  IN EFI_MAC_ADDRESS             *New OPTIONAL
  );

EFI_STATUS
EFIAPI
GasketSnpStatistics (
  IN EMU_SNP_PROTOCOL                     *This,
  IN BOOLEAN                              Reset,
  IN OUT UINTN                            *StatisticsSize   OPTIONAL,
  OUT EFI_NETWORK_STATISTICS              *StatisticsTable  OPTIONAL
  );

EFI_STATUS
EFIAPI
GasketSnpMCastIpToMac (
  IN EMU_SNP_PROTOCOL                     *This,
  IN BOOLEAN                              IPv6,
  IN EFI_IP_ADDRESS                       *IP,
  OUT EFI_MAC_ADDRESS                     *MAC
  );

EFI_STATUS
EFIAPI
GasketSnpNvData (
  IN EMU_SNP_PROTOCOL                     *This,
  IN BOOLEAN                              ReadWrite,
  IN UINTN                                Offset,
  IN UINTN                                BufferSize,
  IN OUT VOID                             *Buffer
  );

EFI_STATUS
EFIAPI
GasketSnpGetStatus (
  IN EMU_SNP_PROTOCOL                     *This,
  OUT UINT32                              *InterruptStatus OPTIONAL,
  OUT VOID                                **TxBuf OPTIONAL
  );

EFI_STATUS
EFIAPI
GasketSnpTransmit (
  IN EMU_SNP_PROTOCOL                     *This,
  IN UINTN                                HeaderSize,
  IN UINTN                                BufferSize,
  IN VOID                                 *Buffer,
  IN EFI_MAC_ADDRESS                      *SrcAddr  OPTIONAL,
  IN EFI_MAC_ADDRESS                      *DestAddr OPTIONAL,
  IN UINT16                               *Protocol OPTIONAL
  );

EFI_STATUS
EFIAPI
GasketSnpReceive (
  IN EMU_SNP_PROTOCOL                     *This,
  OUT UINTN                               *HeaderSize OPTIONAL,
  IN OUT UINTN                            *BufferSize,
  OUT VOID                                *Buffer,
  OUT EFI_MAC_ADDRESS                     *SrcAddr    OPTIONAL,
  OUT EFI_MAC_ADDRESS                     *DestAddr   OPTIONAL,
  OUT UINT16                              *Protocol   OPTIONAL
  );


#endif


