/** @file
  Emulator Thunk to abstract OS services from pure EFI code

  Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
  Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef __EMU_THUNK_PPI_H__
#define __EMU_THUNK_PPI_H__

#define EMU_THUNK_PPI_GUID  \
 { 0xB958B78C, 0x1D3E, 0xEE40, { 0x8B, 0xF4, 0xF0, 0x63, 0x2D, 0x06, 0x39, 0x16 } }

/*++

Routine Description:
  This service is called from Index == 0 until it returns EFI_UNSUPPORTED.
  It allows discontinuous memory regions to be supported by the emulator.

Arguments:
  Index      - Which memory region to use
  MemoryBase - Return Base address of memory region
  MemorySize - Return size in bytes of the memory region

Returns:
  EFI_SUCCESS - If memory region was mapped
  EFI_UNSUPPORTED - If Index is not supported

**/
typedef
EFI_STATUS
(EFIAPI *EMU_PEI_AUTOSCAN)(
  IN  UINTN                 Index,
  OUT EFI_PHYSICAL_ADDRESS  *MemoryBase,
  OUT UINT64                *MemorySize
  );

/*++

Routine Description:
  Return the FD Size and base address. Since the FD is loaded from a
  file into host memory only the SEC will know it's address.

Arguments:
  Index  - Which FD, starts at zero.
  FdSize - Size of the FD in bytes
  FdBase - Start address of the FD. Assume it points to an FV Header
  FixUp  - Difference between actual FD address and build address

Returns:
  EFI_SUCCESS     - Return the Base address and size of the FV
  EFI_UNSUPPORTED - Index does nto map to an FD in the system

**/
typedef
EFI_STATUS
(EFIAPI *EMU_PEI_FD_INFORMATION)(
  IN     UINTN                  Index,
  IN OUT EFI_PHYSICAL_ADDRESS   *FdBase,
  IN OUT UINT64                 *FdSize,
  IN OUT EFI_PHYSICAL_ADDRESS   *FixUp
  );

/*++

Routine Description:
  Export of EMU_THUNK_PROTOCOL from the SEC.

Returns:
  EFI_SUCCESS - Data returned

**/
typedef
VOID *
(EFIAPI *EMU_PEI_THUNK_INTERFACE)(
  VOID
  );

/*++

Routine Description:
  Loads and relocates a PE/COFF image into memory.

Arguments:
  Pe32Data         - The base address of the PE/COFF file that is to be loaded and relocated
  ImageAddress     - The base address of the relocated PE/COFF image
  ImageSize        - The size of the relocated PE/COFF image
  EntryPoint       - The entry point of the relocated PE/COFF image

Returns:
  EFI_SUCCESS   - The file was loaded and relocated
  EFI_OUT_OF_RESOURCES - There was not enough memory to load and relocate the PE/COFF file

**/
typedef
EFI_STATUS
(EFIAPI *EMU_PEI_LOAD_FILE)(
  VOID                  *Pe32Data,
  EFI_PHYSICAL_ADDRESS  *ImageAddress,
  UINT64                *ImageSize,
  EFI_PHYSICAL_ADDRESS  *EntryPoint
  );

typedef struct {
  EMU_PEI_AUTOSCAN           MemoryAutoScan;
  EMU_PEI_FD_INFORMATION     FirmwareDevices;
  EMU_PEI_THUNK_INTERFACE    Thunk;
  INTN                       Argc;
  CHAR8                      **Argv;
  CHAR8                      **Envp;
  UINTN                      PersistentMemorySize;
  UINT8                      PersistentMemory[0];
} EMU_THUNK_PPI;

extern EFI_GUID  gEmuThunkPpiGuid;

#endif
