/** @file
  Instruction parsing support definitions.

  Copyright (C) 2020, Advanced Micro Devices, Inc. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef __INSTRUCTION_PARSING_H__
#define __INSTRUCTION_PARSING_H__

#include <Base.h>
#include <Uefi.h>

//
// Instruction REX prefix definition
//
typedef union {
  struct {
    UINT8    BitB : 1;
    UINT8    BitX : 1;
    UINT8    BitR : 1;
    UINT8    BitW : 1;
    UINT8    Rex  : 4;
  } Bits;

  UINT8    Uint8;
} INSTRUCTION_REX_PREFIX;

//
// Instruction ModRM definition
//
typedef union {
  struct {
    UINT8    Rm  : 3;
    UINT8    Reg : 3;
    UINT8    Mod : 2;
  } Bits;

  UINT8    Uint8;
} INSTRUCTION_MODRM;

//
// Instruction SIB definition
//
typedef union {
  struct {
    UINT8    Base  : 3;
    UINT8    Index : 3;
    UINT8    Scale : 2;
  } Bits;

  UINT8    Uint8;
} INSTRUCTION_SIB;

//
// Legacy Instruction Prefixes
//
#define OVERRIDE_SEGMENT_CS    0x2E
#define OVERRIDE_SEGMENT_DS    0x3E
#define OVERRIDE_SEGMENT_ES    0x26
#define OVERRIDE_SEGMENT_SS    0x36
#define OVERRIDE_SEGMENT_FS    0x64
#define OVERRIDE_SEGMENT_GS    0x65
#define OVERRIDE_OPERAND_SIZE  0x66
#define OVERRIDE_ADDRESS_SIZE  0x67
#define LOCK_PREFIX            0xF0
#define REPNZ_PREFIX           0xF2
#define REPZ_PREFIX            0xF3

//
// REX Prefixes
//
#define REX_PREFIX_START             0x40
#define REX_PREFIX_STOP              0x4F
#define REX_64BIT_OPERAND_SIZE_MASK  0x08

//
// Two-byte Opcode Flag
//
#define TWO_BYTE_OPCODE_ESCAPE  0x0F

#endif
