/** @file
Copyright (c) 2007, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef _EFI_EDB_DISASM_SUPPORT_H_
#define _EFI_EDB_DISASM_SUPPORT_H_
#include 
#define EDB_BYTECODE_NUMBER_IN_LINE  5
#ifdef EFI32
#define EDB_PRINT_ADDRESS_FORMAT  L"%08x: "
#else
// To use 012l instead of 016l because space is not enough
#define EDB_PRINT_ADDRESS_FORMAT  L"%012lx: "
#endif
#define OPCODE_MAX  0x40
#define EDB_INSTRUCTION_NAME_MAX_LENGTH     10
#define EDB_INSTRUCTION_NAME_MAX_SIZE       (EDB_INSTRUCTION_NAME_MAX_LENGTH * sizeof(CHAR16))
#define EDB_INSTRUCTION_CONTENT_MAX_LENGTH  30
#define EDB_INSTRUCTION_CONTENT_MAX_SIZE    (EDB_INSTRUCTION_CONTENT_MAX_LENGTH * sizeof(CHAR16))
/**
  Set offset for Instruction name and content.
  @param  InstructionNameOffset     - Instruction name offset
  @param  InstructionContentOffset  - Instruction content offset
**/
VOID
EdbSetOffset (
  IN UINTN  InstructionNameOffset,
  IN UINTN  InstructionContentOffset
  );
/**
  Pre instruction string construction.
  @return Instruction string
**/
CHAR16 *
EdbPreInstructionString (
  VOID
  );
/**
  Post instruction string construction.
  @return Instruction string
**/
CHAR16 *
EdbPostInstructionString (
  VOID
  );
/**
  Print the instruction name.
  @param  Name - instruction name
  @return Instruction name offset
**/
UINTN
EdbPrintInstructionName (
  IN CHAR16  *Name
  );
/**
  Get Sign, NaturalUnits, and ConstantUnits of the WORD data.
  @param  Data16        - WORD data
  @param  NaturalUnits  - Natural Units of the WORD
  @param  ConstantUnits - Constant Units of the WORD
  @return Sign value of WORD
**/
BOOLEAN
EdbGetNaturalIndex16 (
  IN  UINT16  Data16,
  OUT UINTN   *NaturalUnits,
  OUT UINTN   *ConstantUnits
  );
/**
  Get Sign, NaturalUnits, and ConstantUnits of the DWORD data.
  @param  Data32        - DWORD data
  @param  NaturalUnits  - Natural Units of the DWORD
  @param  ConstantUnits - Constant Units of the DWORD
  @return Sign value of DWORD
**/
BOOLEAN
EdbGetNaturalIndex32 (
  IN  UINT32  Data32,
  OUT UINTN   *NaturalUnits,
  OUT UINTN   *ConstantUnits
  );
/**
  Get Sign, NaturalUnits, and ConstantUnits of the QWORD data.
  @param  Data64        - QWORD data
  @param  NaturalUnits  - Natural Units of the QWORD
  @param  ConstantUnits - Constant Units of the QWORD
  @return Sign value of QWORD
**/
BOOLEAN
EdbGetNaturalIndex64 (
  IN  UINT64  Data64,
  OUT UINT64  *NaturalUnits,
  OUT UINT64  *ConstantUnits
  );
/**
  Print the hexical WORD raw index data to instruction content.
  @param  Data16 - WORD data
  @return Instruction content offset
**/
UINTN
EdbPrintRawIndexData16 (
  IN UINT16  Data16
  );
/**
  Print the hexical DWORD raw index data to instruction content.
  @param  Data32 - DWORD data
  @return Instruction content offset
**/
UINTN
EdbPrintRawIndexData32 (
  IN UINT32  Data32
  );
/**
  Print the hexical QWORD raw index data to instruction content.
  @param  Data64 - QWORD data
  @return Instruction content offset
**/
UINTN
EdbPrintRawIndexData64 (
  IN UINT64  Data64
  );
/**
  Print register 1 in operands.
  @param  Operands - instruction operands
  @return Instruction content offset
**/
UINTN
EdbPrintRegister1 (
  IN UINT8  Operands
  );
/**
  Print register 2 in operands.
  @param  Operands - instruction operands
  @return Instruction content offset
**/
UINTN
EdbPrintRegister2 (
  IN UINT8  Operands
  );
/**
  Print dedicated register 1 in operands.
  @param Operands - instruction operands
  @return Instruction content offset
**/
UINTN
EdbPrintDedicatedRegister1 (
  IN UINT8  Operands
  );
/**
  Print dedicated register 2 in operands.
  @param  Operands - instruction operands
  @return Instruction content offset
**/
UINTN
EdbPrintDedicatedRegister2 (
  IN UINT8  Operands
  );
/**
  Print the hexical UINTN index data to instruction content.
  @param  Sign          - Signed bit of UINTN data
  @param  NaturalUnits  - natural units of UINTN data
  @param  ConstantUnits - natural units of UINTN data
  @return Instruction content offset
**/
UINTN
EdbPrintIndexData (
  IN BOOLEAN  Sign,
  IN UINTN    NaturalUnits,
  IN UINTN    ConstantUnits
  );
/**
  Print the hexical QWORD index data to instruction content.
  @param  Sign          - Signed bit of QWORD data
  @param  NaturalUnits  - natural units of QWORD data
  @param  ConstantUnits - natural units of QWORD data
  @return Instruction content offset
**/
UINTN
EdbPrintIndexData64 (
  IN BOOLEAN  Sign,
  IN UINT64   NaturalUnits,
  IN UINT64   ConstantUnits
  );
/**
  Print the hexical BYTE immediate data to instruction content.
  @param  Data - BYTE data
  @return Instruction content offset
**/
UINTN
EdbPrintImmData8 (
  IN UINT8  Data
  );
/**
  Print the hexical WORD immediate data to instruction content.
  @param  Data - WORD data
  @return Instruction content offset
**/
UINTN
EdbPrintImmData16 (
  IN UINT16  Data
  );
/**
  Print the hexical DWORD immediate data to instruction content.
  @param  Data - DWORD data
  @return Instruction content offset
**/
UINTN
EdbPrintImmData32 (
  IN UINT32  Data
  );
/**
  Print the hexical QWORD immediate data to instruction content.
  @param  Data - QWORD data
  @return Instruction content offset
**/
UINTN
EdbPrintImmData64 (
  IN UINT64  Data
  );
/**
  Print the decimal UINTN immediate data to instruction content.
  @param  Data - UINTN data
  @return Instruction content offset
**/
UINTN
EdbPrintImmDatan (
  IN UINTN  Data
  );
/**
  Print the decimal QWORD immediate data to instruction content.
  @param  Data64 - QWORD data
  @return Instruction content offset
**/
UINTN
EdbPrintImmData64n (
  IN UINT64  Data64
  );
/**
  Print the hexical BYTE to instruction content.
  @param  Data8 - BYTE data
  @return Instruction content offset
**/
UINTN
EdbPrintData8 (
  IN UINT8  Data8
  );
/**
  Print the hexical WORD to instruction content.
  @param  Data16 - WORD data
  @return Instruction content offset
**/
UINTN
EdbPrintData16 (
  IN UINT16  Data16
  );
/**
  Print the hexical DWORD to instruction content.
  @param  Data32 - DWORD data
  @return Instruction content offset
**/
UINTN
EdbPrintData32 (
  IN UINT32  Data32
  );
/**
  Print the hexical QWORD to instruction content.
  @param  Data64 - QWORD data
  @return Instruction content offset
**/
UINTN
EdbPrintData64 (
  IN UINT64  Data64
  );
/**
  Print the decimal unsigned UINTN to instruction content.
  @param  Data - unsigned UINTN data
  @return Instruction content offset
**/
UINTN
EdbPrintDatan (
  IN UINTN  Data
  );
/**
  Print the decimal unsigned QWORD to instruction content.
  @param  Data64 - unsigned QWORD data
  @return Instruction content offset
**/
UINTN
EdbPrintData64n (
  IN UINT64  Data64
  );
/**
  Print the decimal signed BYTE to instruction content.
  @param  Data8 - signed BYTE data
  @return Instruction content offset
**/
UINTN
EdbPrintData8s (
  IN UINT8  Data8
  );
/**
  Print the decimal signed WORD to instruction content.
  @param  Data16 - signed WORD data
  @return Instruction content offset
**/
UINTN
EdbPrintData16s (
  IN UINT16  Data16
  );
/**
  Print the decimal signed DWORD to instruction content.
  @param  Data32 - signed DWORD data
  @return Instruction content offset
**/
UINTN
EdbPrintData32s (
  IN UINT32  Data32
  );
/**
  Print the decimal signed QWORD to instruction content.
  @param  Data64 - signed QWORD data
  @return Instruction content offset
**/
UINTN
EdbPrintData64s (
  IN UINT64  Data64
  );
/**
  Print the comma to instruction content.
  @return Instruction content offset
**/
UINTN
EdbPrintComma (
  VOID
  );
/**
  Find the symbol string according to address, then print it.
  @param  Address - instruction address
  @retval 1 - symbol string is found and printed
  @retval 0 - symbol string not found
**/
UINTN
EdbFindAndPrintSymbol (
  IN UINTN  Address
  );
/**
  Print the EBC byte code.
  @param  InstructionAddress - instruction address
  @param  InstructionNumber  - instruction number
**/
VOID
EdbPrintRaw (
  IN EFI_PHYSICAL_ADDRESS  InstructionAddress,
  IN UINTN                 InstructionNumber
  );
/**
  Print the EBC asm code.
  @param  DebuggerPrivate - EBC Debugger private data structure
  @param  SystemContext   - EBC system context.
  @retval EFI_SUCCESS - show disasm successfully
**/
EFI_STATUS
EdbShowDisasm (
  IN     EFI_DEBUGGER_PRIVATE_DATA  *DebuggerPrivate,
  IN     EFI_SYSTEM_CONTEXT         SystemContext
  );
/**
  Get register value according to the system context, and register index.
  @param  SystemContext   - EBC system context.
  @param  Index           - EBC register index
  @return register value
**/
UINT64
GetRegisterValue (
  IN     EFI_SYSTEM_CONTEXT  SystemContext,
  IN     UINT8               Index
  );
#endif