/** @file
Header file for Elf convert solution

Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>

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

**/

#pragma once

#include "elf_common.h"
#include "elf32.h"
#include "elf64.h"

//
// Externally defined variables
//
extern UINT32   mCoffOffset;
extern CHAR8    *mInImageName;
extern UINT32   mImageTimeStamp;
extern UINT8    *mCoffFile;
extern UINT32   mTableOffset;
extern UINT32   mOutImageType;
extern UINT32   mFileBufferSize;
extern BOOLEAN  mExportFlag;

//
// Common EFI specific data.
//
#define ELF_HII_SECTION_NAME     ".hii"
#define ELF_STRTAB_SECTION_NAME  ".strtab"
#define MAX_COFF_ALIGNMENT       0x10000
#define ELF_SYMBOL_SECTION_NAME  ".symtab"

//
// Platform Runtime Mechanism (PRM) specific data.
//
#define PRM_MODULE_EXPORT_SYMBOL_NUM  256

// <to-do> to include PRM header directly once PrmPkg is in main repo
#define PRM_HANDLER_NAME_MAXIMUM_LENGTH  128

#define PRM_MODULE_EXPORT_DESCRIPTOR_NAME       "PrmModuleExportDescriptor"
#define PRM_MODULE_EXPORT_DESCRIPTOR_SIGNATURE  SIGNATURE_64 ('P', 'R', 'M', '_', 'M', 'E', 'D', 'T')
#define PRM_MODULE_EXPORT_REVISION              0x0

//
// Platform Runtime Mechanism (PRM) Export Descriptor Structures
//
#pragma pack(push, 1)

typedef struct {
  EFI_GUID    PrmHandlerGuid;
  CHAR8       PrmHandlerName[PRM_HANDLER_NAME_MAXIMUM_LENGTH];
} PRM_HANDLER_EXPORT_DESCRIPTOR_STRUCT;

typedef struct {
  UINT64      Signature;
  UINT16      Revision;
  UINT16      NumberPrmHandlers;
  EFI_GUID    PlatformGuid;
  EFI_GUID    ModuleGuid;
} PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT_HEADER;

typedef struct {
  PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT_HEADER    Header;
  PRM_HANDLER_EXPORT_DESCRIPTOR_STRUCT          PrmHandlerExportDescriptors[1];
} PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT;

#pragma pack(pop)

//
// Filter Types
//
typedef enum {
  SECTION_TEXT,
  SECTION_HII,
  SECTION_DATA,
  SECTION_SYMBOL
} SECTION_FILTER_TYPES;

//
// FunctionTable
//
typedef struct {
  VOID    (*ScanSections)(
    );
  BOOLEAN (*WriteSections)(
    SECTION_FILTER_TYPES  FilterType
    );
  VOID    (*WriteRelocations)(
    );
  VOID    (*WriteDebug)(
    );
  VOID    (*WriteExport)(
    );
  VOID    (*SetImageSize)(
    );
  VOID    (*CleanUp)(
    );
} ELF_FUNCTION_TABLE;

//
// Common functions
//
VOID
CoffAddFixup (
  UINT32  Offset,
  UINT8   Type
  );

VOID
CoffAddFixupEntry (
  UINT16  Val
  );

VOID
CreateSectionHeader (
  const CHAR8  *Name,
  UINT32       Offset,
  UINT32       Size,
  UINT32       Flags
  );
