dis.h revision 2e65d8da6ef2ef03491ebb4c3f065f10dd912b36
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** @file
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * DIS - The VirtualBox Disassembler.
b736c553dbde2c3b2533c93c57d9b7f07714371cvboxsync */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/*
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Copyright (C) 2006-2012 Oracle Corporation
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync *
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * available from http://www.virtualbox.org. This file is free software;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * you can redistribute it and/or modify it under the terms of the GNU
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * General Public License (GPL) as published by the Free Software
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync *
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * The contents of this file may alternatively be used under the terms
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * of the Common Development and Distribution License Version 1.0
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * VirtualBox OSE distribution, in which case the provisions of the
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * CDDL are applicable instead of those of the GPL.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync *
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * You may elect to license modified versions of this file under the
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * terms and conditions of either the GPL or the CDDL or both.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#ifndef ___VBox_dis_h
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define ___VBox_dis_h
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#include <VBox/types.h>
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#include <VBox/disopcode.h>
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#include <iprt/assert.h>
d544fe535c163a24bf8cd831b39264da292b8adfvboxsync
d544fe535c163a24bf8cd831b39264da292b8adfvboxsync
d544fe535c163a24bf8cd831b39264da292b8adfvboxsyncRT_C_DECLS_BEGIN
d544fe535c163a24bf8cd831b39264da292b8adfvboxsync
d544fe535c163a24bf8cd831b39264da292b8adfvboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/**
174e1d5b2d6b6d7c92271d7fcc070c6d0cc92312vboxsync * CPU mode flags (DISSTATE::mode).
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync */
d544fe535c163a24bf8cd831b39264da292b8adfvboxsynctypedef enum DISCPUMODE
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync{
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync DISCPUMODE_INVALID = 0,
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync DISCPUMODE_16BIT,
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync DISCPUMODE_32BIT,
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync DISCPUMODE_64BIT,
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** hack forcing the size of the enum to 32-bits. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync DISCPUMODE_MAKE_32BIT_HACK = 0x7fffffff
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync} DISCPUMODE;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** @name Prefix byte flags (DISSTATE::fPrefix).
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @{
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISPREFIX_NONE UINT8_C(0x00)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** non-default address size. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISPREFIX_ADDRSIZE UINT8_C(0x01)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** non-default operand size. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISPREFIX_OPSIZE UINT8_C(0x02)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** lock prefix. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISPREFIX_LOCK UINT8_C(0x04)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** segment prefix. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISPREFIX_SEG UINT8_C(0x08)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** rep(e) prefix (not a prefix, but we'll treat is as one). */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISPREFIX_REP UINT8_C(0x10)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** rep(e) prefix (not a prefix, but we'll treat is as one). */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISPREFIX_REPNE UINT8_C(0x20)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** REX prefix (64 bits) */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISPREFIX_REX UINT8_C(0x40)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** @} */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** @name 64 bits prefix byte flags (DISSTATE::fRexPrefix).
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Requires VBox/disopcode.h.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @{
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISPREFIX_REX_OP_2_FLAGS(a) (a - OP_PARM_REX_START)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISPREFIX_REX_FLAGS DISPREFIX_REX_OP_2_FLAGS(OP_PARM_REX)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISPREFIX_REX_FLAGS_B DISPREFIX_REX_OP_2_FLAGS(OP_PARM_REX_B)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISPREFIX_REX_FLAGS_X DISPREFIX_REX_OP_2_FLAGS(OP_PARM_REX_X)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISPREFIX_REX_FLAGS_XB DISPREFIX_REX_OP_2_FLAGS(OP_PARM_REX_XB)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISPREFIX_REX_FLAGS_R DISPREFIX_REX_OP_2_FLAGS(OP_PARM_REX_R)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISPREFIX_REX_FLAGS_RB DISPREFIX_REX_OP_2_FLAGS(OP_PARM_REX_RB)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISPREFIX_REX_FLAGS_RX DISPREFIX_REX_OP_2_FLAGS(OP_PARM_REX_RX)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISPREFIX_REX_FLAGS_RXB DISPREFIX_REX_OP_2_FLAGS(OP_PARM_REX_RXB)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISPREFIX_REX_FLAGS_W DISPREFIX_REX_OP_2_FLAGS(OP_PARM_REX_W)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISPREFIX_REX_FLAGS_WB DISPREFIX_REX_OP_2_FLAGS(OP_PARM_REX_WB)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISPREFIX_REX_FLAGS_WX DISPREFIX_REX_OP_2_FLAGS(OP_PARM_REX_WX)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISPREFIX_REX_FLAGS_WXB DISPREFIX_REX_OP_2_FLAGS(OP_PARM_REX_WXB)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISPREFIX_REX_FLAGS_WR DISPREFIX_REX_OP_2_FLAGS(OP_PARM_REX_WR)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISPREFIX_REX_FLAGS_WRB DISPREFIX_REX_OP_2_FLAGS(OP_PARM_REX_WRB)
9474d83dcac691984017f8255821b95ec7642804vboxsync#define DISPREFIX_REX_FLAGS_WRX DISPREFIX_REX_OP_2_FLAGS(OP_PARM_REX_WRX)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISPREFIX_REX_FLAGS_WRXB DISPREFIX_REX_OP_2_FLAGS(OP_PARM_REX_WRXB)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** @} */
9474d83dcac691984017f8255821b95ec7642804vboxsync
9474d83dcac691984017f8255821b95ec7642804vboxsync/** @name Operand type (DISOPCODE::fOpType).
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @{
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync */
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync#define DISOPTYPE_INVALID RT_BIT_32(0)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISOPTYPE_HARMLESS RT_BIT_32(1)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISOPTYPE_CONTROLFLOW RT_BIT_32(2)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISOPTYPE_POTENTIALLY_DANGEROUS RT_BIT_32(3)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISOPTYPE_DANGEROUS RT_BIT_32(4)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISOPTYPE_PORTIO RT_BIT_32(5)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISOPTYPE_PRIVILEGED RT_BIT_32(6)
9474d83dcac691984017f8255821b95ec7642804vboxsync#define DISOPTYPE_PRIVILEGED_NOTRAP RT_BIT_32(7)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISOPTYPE_UNCOND_CONTROLFLOW RT_BIT_32(8)
9474d83dcac691984017f8255821b95ec7642804vboxsync#define DISOPTYPE_RELATIVE_CONTROLFLOW RT_BIT_32(9)
9474d83dcac691984017f8255821b95ec7642804vboxsync#define DISOPTYPE_COND_CONTROLFLOW RT_BIT_32(10)
9474d83dcac691984017f8255821b95ec7642804vboxsync#define DISOPTYPE_INTERRUPT RT_BIT_32(11)
9474d83dcac691984017f8255821b95ec7642804vboxsync#define DISOPTYPE_ILLEGAL RT_BIT_32(12)
9474d83dcac691984017f8255821b95ec7642804vboxsync#define DISOPTYPE_RRM_DANGEROUS RT_BIT_32(14) /**< Some additional dangerous ones when recompiling raw r0. */
9474d83dcac691984017f8255821b95ec7642804vboxsync#define DISOPTYPE_RRM_DANGEROUS_16 RT_BIT_32(15) /**< Some additional dangerous ones when recompiling 16-bit raw r0. */
9474d83dcac691984017f8255821b95ec7642804vboxsync#define DISOPTYPE_RRM_MASK (DISOPTYPE_RRM_DANGEROUS | DISOPTYPE_RRM_DANGEROUS_16)
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync#define DISOPTYPE_INHIBIT_IRQS RT_BIT_32(16) /**< Will or can inhibit irqs (sti, pop ss, mov ss) */
9474d83dcac691984017f8255821b95ec7642804vboxsync#define DISOPTYPE_PORTIO_READ RT_BIT_32(17)
9474d83dcac691984017f8255821b95ec7642804vboxsync#define DISOPTYPE_PORTIO_WRITE RT_BIT_32(18)
9474d83dcac691984017f8255821b95ec7642804vboxsync#define DISOPTYPE_INVALID_64 RT_BIT_32(19) /**< Invalid in 64 bits mode */
9474d83dcac691984017f8255821b95ec7642804vboxsync#define DISOPTYPE_ONLY_64 RT_BIT_32(20) /**< Only valid in 64 bits mode */
9474d83dcac691984017f8255821b95ec7642804vboxsync#define DISOPTYPE_DEFAULT_64_OP_SIZE RT_BIT_32(21) /**< Default 64 bits operand size */
9474d83dcac691984017f8255821b95ec7642804vboxsync#define DISOPTYPE_FORCED_64_OP_SIZE RT_BIT_32(22) /**< Forced 64 bits operand size; regardless of prefix bytes */
9474d83dcac691984017f8255821b95ec7642804vboxsync#define DISOPTYPE_REXB_EXTENDS_OPREG RT_BIT_32(23) /**< REX.B extends the register field in the opcode byte */
9474d83dcac691984017f8255821b95ec7642804vboxsync#define DISOPTYPE_MOD_FIXED_11 RT_BIT_32(24) /**< modrm.mod is always 11b */
9474d83dcac691984017f8255821b95ec7642804vboxsync#define DISOPTYPE_FORCED_32_OP_SIZE_X86 RT_BIT_32(25) /**< Forced 32 bits operand size; regardless of prefix bytes (only in 16 & 32 bits mode!) */
9474d83dcac691984017f8255821b95ec7642804vboxsync#define DISOPTYPE_ALL UINT32_C(0xffffffff)
9474d83dcac691984017f8255821b95ec7642804vboxsync/** @} */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** @name Parameter usage flags.
666e2c9af6a34f7a05d8069a11194756312f5be6vboxsync * @{
666e2c9af6a34f7a05d8069a11194756312f5be6vboxsync */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISUSE_BASE RT_BIT_64(0)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISUSE_INDEX RT_BIT_64(1)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISUSE_SCALE RT_BIT_64(2)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISUSE_REG_GEN8 RT_BIT_64(3)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISUSE_REG_GEN16 RT_BIT_64(4)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISUSE_REG_GEN32 RT_BIT_64(5)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISUSE_REG_GEN64 RT_BIT_64(6)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISUSE_REG_FP RT_BIT_64(7)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISUSE_REG_MMX RT_BIT_64(8)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISUSE_REG_XMM RT_BIT_64(9)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISUSE_REG_CR RT_BIT_64(10)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISUSE_REG_DBG RT_BIT_64(11)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISUSE_REG_SEG RT_BIT_64(12)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISUSE_REG_TEST RT_BIT_64(13)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISUSE_DISPLACEMENT8 RT_BIT_64(14)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISUSE_DISPLACEMENT16 RT_BIT_64(15)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISUSE_DISPLACEMENT32 RT_BIT_64(16)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISUSE_DISPLACEMENT64 RT_BIT_64(17)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISUSE_RIPDISPLACEMENT32 RT_BIT_64(18)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISUSE_IMMEDIATE8 RT_BIT_64(19)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISUSE_IMMEDIATE8_REL RT_BIT_64(20)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISUSE_IMMEDIATE16 RT_BIT_64(21)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISUSE_IMMEDIATE16_REL RT_BIT_64(22)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISUSE_IMMEDIATE32 RT_BIT_64(23)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISUSE_IMMEDIATE32_REL RT_BIT_64(24)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISUSE_IMMEDIATE64 RT_BIT_64(25)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISUSE_IMMEDIATE64_REL RT_BIT_64(26)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISUSE_IMMEDIATE_ADDR_0_32 RT_BIT_64(27)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISUSE_IMMEDIATE_ADDR_16_32 RT_BIT_64(28)
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync#define DISUSE_IMMEDIATE_ADDR_0_16 RT_BIT_64(29)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISUSE_IMMEDIATE_ADDR_16_16 RT_BIT_64(30)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** DS:ESI */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISUSE_POINTER_DS_BASED RT_BIT_64(31)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** ES:EDI */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISUSE_POINTER_ES_BASED RT_BIT_64(32)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISUSE_IMMEDIATE16_SX8 RT_BIT_64(33)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISUSE_IMMEDIATE32_SX8 RT_BIT_64(34)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISUSE_IMMEDIATE64_SX8 RT_BIT_64(36)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** Mask of immediate use flags. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISUSE_IMMEDIATE ( DISUSE_IMMEDIATE8 \
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync | DISUSE_IMMEDIATE16 \
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync | DISUSE_IMMEDIATE32 \
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync | DISUSE_IMMEDIATE64 \
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync | DISUSE_IMMEDIATE8_REL \
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync | DISUSE_IMMEDIATE16_REL \
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync | DISUSE_IMMEDIATE32_REL \
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync | DISUSE_IMMEDIATE64_REL \
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync | DISUSE_IMMEDIATE_ADDR_0_32 \
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync | DISUSE_IMMEDIATE_ADDR_16_32 \
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync | DISUSE_IMMEDIATE_ADDR_0_16 \
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync | DISUSE_IMMEDIATE_ADDR_16_16 \
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync | DISUSE_IMMEDIATE16_SX8 \
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync | DISUSE_IMMEDIATE32_SX8 \
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync | DISUSE_IMMEDIATE64_SX8)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** Check if the use flags indicates an effective address. */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISUSE_IS_EFFECTIVE_ADDR(a_fUseFlags) (!!( (a_fUseFlags) \
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync & ( DISUSE_BASE \
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync | DISUSE_INDEX \
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync | DISUSE_DISPLACEMENT32 \
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync | DISUSE_DISPLACEMENT64 \
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync | DISUSE_DISPLACEMENT16 \
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync | DISUSE_DISPLACEMENT8 \
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync | DISUSE_RIPDISPLACEMENT32) ))
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** @} */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** @name 64-bit general register indexes.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * This matches the AMD64 register encoding. It is found used in
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * DISOPPARAM::Base.idxGenReg and DISOPPARAM::Index.idxGenReg.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @note Safe to assume same values as the 16-bit and 32-bit general registers.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @{
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_RAX UINT8_C(0)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_RCX UINT8_C(1)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_RDX UINT8_C(2)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_RBX UINT8_C(3)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_RSP UINT8_C(4)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_RBP UINT8_C(5)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_RSI UINT8_C(6)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_RDI UINT8_C(7)
a438caaf732f7839dc66b4f8dad672527845a003vboxsync#define DISGREG_R8 UINT8_C(8)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_R9 UINT8_C(9)
a438caaf732f7839dc66b4f8dad672527845a003vboxsync#define DISGREG_R10 UINT8_C(10)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_R11 UINT8_C(11)
a438caaf732f7839dc66b4f8dad672527845a003vboxsync#define DISGREG_R12 UINT8_C(12)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_R13 UINT8_C(13)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_R14 UINT8_C(14)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_R15 UINT8_C(15)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** @} */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** @name 32-bit general register indexes.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * This matches the AMD64 register encoding. It is found used in
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * DISOPPARAM::Base.idxGenReg and DISOPPARAM::Index.idxGenReg.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @note Safe to assume same values as the 16-bit and 64-bit general registers.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @{
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_EAX UINT8_C(0)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_ECX UINT8_C(1)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_EDX UINT8_C(2)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_EBX UINT8_C(3)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_ESP UINT8_C(4)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_EBP UINT8_C(5)
a438caaf732f7839dc66b4f8dad672527845a003vboxsync#define DISGREG_ESI UINT8_C(6)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_EDI UINT8_C(7)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_R8D UINT8_C(8)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_R9D UINT8_C(9)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_R10D UINT8_C(10)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_R11D UINT8_C(11)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_R12D UINT8_C(12)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_R13D UINT8_C(13)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_R14D UINT8_C(14)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_R15D UINT8_C(15)
9474d83dcac691984017f8255821b95ec7642804vboxsync/** @} */
9474d83dcac691984017f8255821b95ec7642804vboxsync
9474d83dcac691984017f8255821b95ec7642804vboxsync/** @name 16-bit general register indexes.
9474d83dcac691984017f8255821b95ec7642804vboxsync * This matches the AMD64 register encoding. It is found used in
69891f8dd7430725700b34d2c6b0222c69c69c53vboxsync * DISOPPARAM::Base.idxGenReg and DISOPPARAM::Index.idxGenReg.
9474d83dcac691984017f8255821b95ec7642804vboxsync * @note Safe to assume same values as the 32-bit and 64-bit general registers.
9474d83dcac691984017f8255821b95ec7642804vboxsync * @{
9474d83dcac691984017f8255821b95ec7642804vboxsync */
9474d83dcac691984017f8255821b95ec7642804vboxsync#define DISGREG_AX UINT8_C(0)
9474d83dcac691984017f8255821b95ec7642804vboxsync#define DISGREG_CX UINT8_C(1)
9474d83dcac691984017f8255821b95ec7642804vboxsync#define DISGREG_DX UINT8_C(2)
9474d83dcac691984017f8255821b95ec7642804vboxsync#define DISGREG_BX UINT8_C(3)
9474d83dcac691984017f8255821b95ec7642804vboxsync#define DISGREG_SP UINT8_C(4)
9474d83dcac691984017f8255821b95ec7642804vboxsync#define DISGREG_BP UINT8_C(5)
9474d83dcac691984017f8255821b95ec7642804vboxsync#define DISGREG_SI UINT8_C(6)
9474d83dcac691984017f8255821b95ec7642804vboxsync#define DISGREG_DI UINT8_C(7)
9474d83dcac691984017f8255821b95ec7642804vboxsync#define DISGREG_R8W UINT8_C(8)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_R9W UINT8_C(9)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISGREG_R10W UINT8_C(10)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISGREG_R11W UINT8_C(11)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISGREG_R12W UINT8_C(12)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISGREG_R13W UINT8_C(13)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISGREG_R14W UINT8_C(14)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISGREG_R15W UINT8_C(15)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** @} */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** @name 8-bit general register indexes.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * This mostly (?) matches the AMD64 register encoding. It is found used in
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * DISOPPARAM::Base.idxGenReg and DISOPPARAM::Index.idxGenReg.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @{
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_AL UINT8_C(0)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_CL UINT8_C(1)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_DL UINT8_C(2)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_BL UINT8_C(3)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_AH UINT8_C(4)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_CH UINT8_C(5)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISGREG_DH UINT8_C(6)
d544fe535c163a24bf8cd831b39264da292b8adfvboxsync#define DISGREG_BH UINT8_C(7)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISGREG_R8B UINT8_C(8)
d544fe535c163a24bf8cd831b39264da292b8adfvboxsync#define DISGREG_R9B UINT8_C(9)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISGREG_R10B UINT8_C(10)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISGREG_R11B UINT8_C(11)
d544fe535c163a24bf8cd831b39264da292b8adfvboxsync#define DISGREG_R12B UINT8_C(12)
d544fe535c163a24bf8cd831b39264da292b8adfvboxsync#define DISGREG_R13B UINT8_C(13)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISGREG_R14B UINT8_C(14)
d544fe535c163a24bf8cd831b39264da292b8adfvboxsync#define DISGREG_R15B UINT8_C(15)
d544fe535c163a24bf8cd831b39264da292b8adfvboxsync#define DISGREG_SPL UINT8_C(16)
d544fe535c163a24bf8cd831b39264da292b8adfvboxsync#define DISGREG_BPL UINT8_C(17)
d544fe535c163a24bf8cd831b39264da292b8adfvboxsync#define DISGREG_SIL UINT8_C(18)
d544fe535c163a24bf8cd831b39264da292b8adfvboxsync#define DISGREG_DIL UINT8_C(19)
d544fe535c163a24bf8cd831b39264da292b8adfvboxsync/** @} */
d544fe535c163a24bf8cd831b39264da292b8adfvboxsync
d544fe535c163a24bf8cd831b39264da292b8adfvboxsync/** @name Segment registerindexes.
d544fe535c163a24bf8cd831b39264da292b8adfvboxsync * This matches the AMD64 register encoding. It is found used in
d544fe535c163a24bf8cd831b39264da292b8adfvboxsync * DISOPPARAM::Base.idxSegReg.
d544fe535c163a24bf8cd831b39264da292b8adfvboxsync * @{
d544fe535c163a24bf8cd831b39264da292b8adfvboxsync */
d544fe535c163a24bf8cd831b39264da292b8adfvboxsynctypedef enum
d544fe535c163a24bf8cd831b39264da292b8adfvboxsync{
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync DISSELREG_ES = 0,
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync DISSELREG_CS = 1,
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync DISSELREG_SS = 2,
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync DISSELREG_DS = 3,
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync DISSELREG_FS = 4,
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync DISSELREG_GS = 5,
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync /** End of the valid register index values. */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync DISSELREG_END,
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync /** The usual 32-bit paranoia. */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync DIS_SEGREG_32BIT_HACK = 0x7fffffff
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync} DISSELREG;
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** @} */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** @name FPU register indexes.
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * This matches the AMD64 register encoding. It is found used in
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * DISOPPARAM::Base.idxFpuReg.
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * @{
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISFPREG_ST0 UINT8_C(0)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISFPREG_ST1 UINT8_C(1)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISFPREG_ST2 UINT8_C(2)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISFPREG_ST3 UINT8_C(3)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISFPREG_ST4 UINT8_C(4)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISFPREG_ST5 UINT8_C(5)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISFPREG_ST6 UINT8_C(6)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISFPREG_ST7 UINT8_C(7)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** @} */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** @name Control register indexes.
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * This matches the AMD64 register encoding. It is found used in
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * DISOPPARAM::Base.idxCtrlReg.
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * @{
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISCREG_CR0 UINT8_C(0)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISCREG_CR1 UINT8_C(1)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISCREG_CR2 UINT8_C(2)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISCREG_CR3 UINT8_C(3)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISCREG_CR4 UINT8_C(4)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISCREG_CR8 UINT8_C(8)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** @} */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** @name Debug register indexes.
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * This matches the AMD64 register encoding. It is found used in
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * DISOPPARAM::Base.idxDbgReg.
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * @{
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISDREG_DR0 UINT8_C(0)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISDREG_DR1 UINT8_C(1)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISDREG_DR2 UINT8_C(2)
666e2c9af6a34f7a05d8069a11194756312f5be6vboxsync#define DISDREG_DR3 UINT8_C(3)
666e2c9af6a34f7a05d8069a11194756312f5be6vboxsync#define DISDREG_DR4 UINT8_C(4)
666e2c9af6a34f7a05d8069a11194756312f5be6vboxsync#define DISDREG_DR5 UINT8_C(5)
666e2c9af6a34f7a05d8069a11194756312f5be6vboxsync#define DISDREG_DR6 UINT8_C(6)
666e2c9af6a34f7a05d8069a11194756312f5be6vboxsync#define DISDREG_DR7 UINT8_C(7)
666e2c9af6a34f7a05d8069a11194756312f5be6vboxsync/** @} */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** @name MMX register indexes.
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * This matches the AMD64 register encoding. It is found used in
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * DISOPPARAM::Base.idxMmxReg.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @{
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISMREG_MMX0 UINT8_C(0)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISMREG_MMX1 UINT8_C(1)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISMREG_MMX2 UINT8_C(2)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISMREG_MMX3 UINT8_C(3)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISMREG_MMX4 UINT8_C(4)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISMREG_MMX5 UINT8_C(5)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISMREG_MMX6 UINT8_C(6)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#define DISMREG_MMX7 UINT8_C(7)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** @} */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** @name SSE register indexes.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * This matches the AMD64 register encoding. It is found used in
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * DISOPPARAM::Base.idxXmmReg.
9c77b083e2ca3a9b509faa9789072f2527422e22vboxsync * @{
174e1d5b2d6b6d7c92271d7fcc070c6d0cc92312vboxsync */
230bd8589bba39933ac5ec21482d6186d675e604vboxsync#define DISXREG_XMM0 UINT8_C(0)
174e1d5b2d6b6d7c92271d7fcc070c6d0cc92312vboxsync#define DISXREG_XMM1 UINT8_C(1)
174e1d5b2d6b6d7c92271d7fcc070c6d0cc92312vboxsync#define DISXREG_XMM2 UINT8_C(2)
230bd8589bba39933ac5ec21482d6186d675e604vboxsync#define DISXREG_XMM3 UINT8_C(3)
9c77b083e2ca3a9b509faa9789072f2527422e22vboxsync#define DISXREG_XMM4 UINT8_C(4)
174e1d5b2d6b6d7c92271d7fcc070c6d0cc92312vboxsync#define DISXREG_XMM5 UINT8_C(5)
174e1d5b2d6b6d7c92271d7fcc070c6d0cc92312vboxsync#define DISXREG_XMM6 UINT8_C(6)
174e1d5b2d6b6d7c92271d7fcc070c6d0cc92312vboxsync#define DISXREG_XMM7 UINT8_C(7)
174e1d5b2d6b6d7c92271d7fcc070c6d0cc92312vboxsync/** @} */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
9c77b083e2ca3a9b509faa9789072f2527422e22vboxsync
174e1d5b2d6b6d7c92271d7fcc070c6d0cc92312vboxsync/**
9c77b083e2ca3a9b509faa9789072f2527422e22vboxsync * Opcode parameter (operand) details.
174e1d5b2d6b6d7c92271d7fcc070c6d0cc92312vboxsync */
174e1d5b2d6b6d7c92271d7fcc070c6d0cc92312vboxsynctypedef struct DISOPPARAM
174e1d5b2d6b6d7c92271d7fcc070c6d0cc92312vboxsync{
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** A combination of DISUSE_XXX. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint64_t fUse;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Immediate value or address, applicable if any of the flags included in
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * DISUSE_IMMEDIATE are set in fUse. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint64_t uValue;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Disposition. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync union
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync {
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** 64-bit displacement, applicable if DISUSE_DISPLACEMENT64 is set in fUse. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync int64_t i64;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint64_t u64;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** 32-bit displacement, applicable if DISUSE_DISPLACEMENT32 or
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * DISUSE_RIPDISPLACEMENT32 is set in fUse. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync int32_t i32;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint32_t u32;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** 16-bit displacement, applicable if DISUSE_DISPLACEMENT16 is set in fUse. */
50ba3040a0c2b77a195a8239e3572d0036e4b86dvboxsync int32_t i16;
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync uint32_t u16;
50ba3040a0c2b77a195a8239e3572d0036e4b86dvboxsync /** 8-bit displacement, applicable if DISUSE_DISPLACEMENT8 is set in fUse. */
50ba3040a0c2b77a195a8239e3572d0036e4b86dvboxsync int32_t i8;
50ba3040a0c2b77a195a8239e3572d0036e4b86dvboxsync uint32_t u8;
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync } uDisp;
50ba3040a0c2b77a195a8239e3572d0036e4b86dvboxsync /** The base register from ModR/M or SIB, applicable if DISUSE_BASE is
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * set in fUse. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync union
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync {
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** General register index (DISGREG_XXX), applicable if DISUSE_REG_GEN8,
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * DISUSE_REG_GEN16, DISUSE_REG_GEN32 or DISUSE_REG_GEN64 is set in fUse. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t idxGenReg;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** FPU stack register index (DISFPREG_XXX), applicable if DISUSE_REG_FP is
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * set in fUse. 1:1 indexes. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t idxFpuReg;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** MMX register index (DISMREG_XXX), applicable if DISUSE_REG_MMX is
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * set in fUse. 1:1 indexes. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t idxMmxReg;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** SSE register index (DISXREG_XXX), applicable if DISUSE_REG_XMM is
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * set in fUse. 1:1 indexes. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t idxXmmReg;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Segment register index (DISSELREG_XXX), applicable if DISUSE_REG_SEG is
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * set in fUse. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t idxSegReg;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Test register, TR0-TR7, present on early IA32 CPUs, applicable if
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * DISUSE_REG_TEST is set in fUse. No index defines for these. */
9474d83dcac691984017f8255821b95ec7642804vboxsync uint8_t idxTestReg;
9474d83dcac691984017f8255821b95ec7642804vboxsync /** Control register index (DISCREG_XXX), applicable if DISUSE_REG_CR is
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * set in fUse. 1:1 indexes. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t idxCtrlReg;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Debug register index (DISDREG_XXX), applicable if DISUSE_REG_DBG is
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * set in fUse. 1:1 indexes. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t idxDbgReg;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync } Base;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** The SIB index register meaning, applicable if DISUSE_INDEX is
da769a9c0c94bad4a9c3bd895ea53837b58dc4d4vboxsync * set in fUse. */
da769a9c0c94bad4a9c3bd895ea53837b58dc4d4vboxsync union
da769a9c0c94bad4a9c3bd895ea53837b58dc4d4vboxsync {
da769a9c0c94bad4a9c3bd895ea53837b58dc4d4vboxsync /** General register index (DISGREG_XXX), applicable if DISUSE_REG_GEN8,
da769a9c0c94bad4a9c3bd895ea53837b58dc4d4vboxsync * DISUSE_REG_GEN16, DISUSE_REG_GEN32 or DISUSE_REG_GEN64 is set in fUse. */
da769a9c0c94bad4a9c3bd895ea53837b58dc4d4vboxsync uint8_t idxGenReg;
da769a9c0c94bad4a9c3bd895ea53837b58dc4d4vboxsync } Index;
da769a9c0c94bad4a9c3bd895ea53837b58dc4d4vboxsync /** 2, 4 or 8, if DISUSE_SCALE is set in fUse. */
da769a9c0c94bad4a9c3bd895ea53837b58dc4d4vboxsync uint8_t uScale;
da769a9c0c94bad4a9c3bd895ea53837b58dc4d4vboxsync /** Parameter size. */
da769a9c0c94bad4a9c3bd895ea53837b58dc4d4vboxsync uint8_t cb;
da769a9c0c94bad4a9c3bd895ea53837b58dc4d4vboxsync /** Copy of the corresponding DISOPCODE::fParam1 / DISOPCODE::fParam2 /
da769a9c0c94bad4a9c3bd895ea53837b58dc4d4vboxsync * DISOPCODE::fParam3. */
da769a9c0c94bad4a9c3bd895ea53837b58dc4d4vboxsync uint32_t fParam;
da769a9c0c94bad4a9c3bd895ea53837b58dc4d4vboxsync} DISOPPARAM;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncAssertCompileSize(DISOPPARAM, 32);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** Pointer to opcode parameter. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsynctypedef DISOPPARAM *PDISOPPARAM;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** Pointer to opcode parameter. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsynctypedef const DISOPPARAM *PCDISOPPARAM;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/**
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Opcode descriptor.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsynctypedef struct DISOPCODE
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync{
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#ifndef DIS_CORE_ONLY
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync const char *pszOpcode;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#endif
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Parameter \#1 parser index. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t idxParse1;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Parameter \#2 parser index. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t idxParse2;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Parameter \#3 parser index. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t idxParse3;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Unused padding. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t uUnused;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** The opcode identifier. This DIS specific, @see grp_dis_opcodes and
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * VBox/disopcode.h. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint16_t uOpcode;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Parameter \#1 info, @see grp_dis_opparam. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint16_t fParam1;
74407ed9ebae51fb7a33c31f2965f7e105a626ebvboxsync /** Parameter \#2 info, @see grp_dis_opparam. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint16_t fParam2;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Parameter \#3 info, @see grp_dis_opparam. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint16_t fParam3;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Operand type flags, DISOPTYPE_XXX. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint32_t fOpType;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync} DISOPCODE;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** Pointer to const opcode. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsynctypedef const struct DISOPCODE *PCDISOPCODE;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/**
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Callback for reading instruction bytes.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync *
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @returns VBox status code, bytes in DISSTATE::abInstr and byte count in
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * DISSTATE::cbCachedInstr.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param pDis Pointer to the disassembler state. The user
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * argument can be found in DISSTATE::pvUser if needed.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param offInstr The offset relative to the start of the instruction.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync *
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * To get the source address, add this to
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * DISSTATE::uInstrAddr.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync *
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * To calculate the destination buffer address, use it
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * as an index into DISSTATE::abInstr.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync *
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param cbMinRead The minimum number of bytes to read.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param cbMaxRead The maximum number of bytes that may be read.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsynctypedef DECLCALLBACK(int) FNDISREADBYTES(PDISSTATE pDis, uint8_t offInstr, uint8_t cbMinRead, uint8_t cbMaxRead);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** Pointer to a opcode byte reader. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsynctypedef FNDISREADBYTES *PFNDISREADBYTES;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** Parser callback.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @remark no DECLCALLBACK() here because it's considered to be internal and
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * there is no point in enforcing CDECL. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsynctypedef size_t FNDISPARSE(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** Pointer to a disassembler parser function. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsynctypedef FNDISPARSE *PFNDISPARSE;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** Pointer to a const disassembler parser function pointer. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsynctypedef PFNDISPARSE const *PCPFNDISPARSE;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/**
c307f0d7384bfc4d19d2290a28be89868f02f42avboxsync * The diassembler state and result.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsynctypedef struct DISSTATE
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync{
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** The number of valid bytes in abInstr. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t cbCachedInstr;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** SIB fields. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync union
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync {
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Bitfield view */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync struct
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync {
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t Base;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t Index;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t Scale;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync } Bits;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync } SIB;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** ModRM fields. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync union
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync {
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Bitfield view */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync struct
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync {
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t Rm;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t Reg;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t Mod;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync } Bits;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync } ModRM;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** The CPU mode (DISCPUMODE). */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t uCpuMode;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** The addressing mode (DISCPUMODE). */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t uAddrMode;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** The operand mode (DISCPUMODE). */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t uOpMode;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Per instruction prefix settings. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t fPrefix;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** REX prefix value (64 bits only). */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t fRexPrefix;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Segment prefix value (DISSELREG). */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t idxSegPrefix;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Last prefix byte (for SSE2 extension tables). */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t bLastPrefix;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Last significan opcode byte of instruction. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t bOpCode;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** The size of the prefix bytes. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t cbPrefix;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** The instruction size. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t cbInstr;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Unused bytes. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t abUnused[3];
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Internal: instruction filter */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint32_t fFilter;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Internal: pointer to disassembly function table */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync PCPFNDISPARSE pfnDisasmFnTable;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#if ARCH_BITS == 32
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint32_t uPtrPadding1;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#endif
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Pointer to the current instruction. */
c307f0d7384bfc4d19d2290a28be89868f02f42avboxsync PCDISOPCODE pCurInstr;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#if ARCH_BITS == 32
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint32_t uPtrPadding2;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#endif
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** The instruction bytes. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint8_t abInstr[16];
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** SIB displacment. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync int32_t i32SibDisp;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Return code set by a worker function like the opcode bytes readers. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync int32_t rc;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** The address of the instruction. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTUINTPTR uInstrAddr;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Optional read function */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync PFNDISREADBYTES pfnReadBytes;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#if ARCH_BITS == 32
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint32_t uPadding3;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#endif
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** User data supplied as an argument to the APIs. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync void *pvUser;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#if ARCH_BITS == 32
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint32_t uPadding4;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync#endif
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Parameters. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync DISOPPARAM Param1;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync DISOPPARAM Param2;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync DISOPPARAM Param3;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync} DISSTATE;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncAssertCompileSize(DISSTATE, 0xb8);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** @deprecated Use DISSTATE and change Cpu and DisState to Dis. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsynctypedef DISSTATE DISCPUSTATE;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncDISDECL(int) DISInstrToStr(void const *pvInstr, DISCPUMODE enmCpuMode,
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync PDISSTATE pDis, uint32_t *pcbInstr, char *pszOutput, size_t cbOutput);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncDISDECL(int) DISInstrToStrWithReader(RTUINTPTR uInstrAddr, DISCPUMODE enmCpuMode, PFNDISREADBYTES pfnReadBytes, void *pvUser,
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync PDISSTATE pDis, uint32_t *pcbInstr, char *pszOutput, size_t cbOutput);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncDISDECL(int) DISInstrToStrEx(RTUINTPTR uInstrAddr, DISCPUMODE enmCpuMode,
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync PFNDISREADBYTES pfnReadBytes, void *pvUser, uint32_t uFilter,
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync PDISSTATE pDis, uint32_t *pcbInstr, char *pszOutput, size_t cbOutput);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync
0b07f19b2d822b86714ed48e3581477a046f1c79vboxsyncDISDECL(int) DISInstr(void const *pvInstr, DISCPUMODE enmCpuMode, PDISSTATE pDis, uint32_t *pcbInstr);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncDISDECL(int) DISInstrWithReader(RTUINTPTR uInstrAddr, DISCPUMODE enmCpuMode, PFNDISREADBYTES pfnReadBytes, void *pvUser,
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync PDISSTATE pDis, uint32_t *pcbInstr);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncDISDECL(int) DISInstrEx(RTUINTPTR uInstrAddr, DISCPUMODE enmCpuMode, uint32_t uFilter,
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync PFNDISREADBYTES pfnReadBytes, void *pvUser,
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync PDISSTATE pDis, uint32_t *pcbInstr);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncDISDECL(int) DISInstrWithPrefetchedBytes(RTUINTPTR uInstrAddr, DISCPUMODE enmCpuMode, uint32_t fFilter,
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync void const *pvPrefetched, size_t cbPretched,
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync PFNDISREADBYTES pfnReadBytes, void *pvUser,
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync PDISSTATE pDis, uint32_t *pcbInstr);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncDISDECL(int) DISGetParamSize(PCDISSTATE pDis, PCDISOPPARAM pParam);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncDISDECL(DISSELREG) DISDetectSegReg(PCDISSTATE pDis, PCDISOPPARAM pParam);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncDISDECL(uint8_t) DISQuerySegPrefixByte(PCDISSTATE pDis);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** @name Flags returned by DISQueryParamVal (DISQPVPARAMVAL::flags).
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * @{
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISQPV_FLAG_8 UINT8_C(0x01)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISQPV_FLAG_16 UINT8_C(0x02)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISQPV_FLAG_32 UINT8_C(0x04)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISQPV_FLAG_64 UINT8_C(0x08)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISQPV_FLAG_FARPTR16 UINT8_C(0x10)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISQPV_FLAG_FARPTR32 UINT8_C(0x20)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** @} */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** @name Types returned by DISQueryParamVal (DISQPVPARAMVAL::flags).
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * @{ */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISQPV_TYPE_REGISTER UINT8_C(1)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISQPV_TYPE_ADDRESS UINT8_C(2)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DISQPV_TYPE_IMMEDIATE UINT8_C(3)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** @} */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsynctypedef struct
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync{
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync union
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync {
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync uint8_t val8;
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync uint16_t val16;
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync uint32_t val32;
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync uint64_t val64;
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync struct
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync {
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync uint16_t sel;
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync uint32_t offset;
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync } farptr;
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync } val;
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync uint8_t type;
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync uint8_t size;
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync uint8_t flags;
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync} DISQPVPARAMVAL;
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** Pointer to opcode parameter value. */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsynctypedef DISQPVPARAMVAL *PDISQPVPARAMVAL;
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
666e2c9af6a34f7a05d8069a11194756312f5be6vboxsync/** Indicates which parameter DISQueryParamVal should operate on. */
666e2c9af6a34f7a05d8069a11194756312f5be6vboxsynctypedef enum DISQPVWHICH
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync{
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync DISQPVWHICH_DST = 1,
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync DISQPVWHICH_SRC,
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync DISQPVWHAT_32_BIT_HACK = 0x7fffffff
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync} DISQPVWHICH;
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncDISDECL(int) DISQueryParamVal(PCPUMCTXCORE pCtx, PCDISSTATE pDis, PCDISOPPARAM pParam, PDISQPVPARAMVAL pParamVal, DISQPVWHICH parmtype);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncDISDECL(int) DISQueryParamRegPtr(PCPUMCTXCORE pCtx, PCDISSTATE pDis, PCDISOPPARAM pParam, void **ppReg, size_t *pcbSize);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncDISDECL(int) DISFetchReg8(PCCPUMCTXCORE pCtx, unsigned reg8, uint8_t *pVal);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncDISDECL(int) DISFetchReg16(PCCPUMCTXCORE pCtx, unsigned reg16, uint16_t *pVal);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncDISDECL(int) DISFetchReg32(PCCPUMCTXCORE pCtx, unsigned reg32, uint32_t *pVal);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncDISDECL(int) DISFetchReg64(PCCPUMCTXCORE pCtx, unsigned reg64, uint64_t *pVal);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncDISDECL(int) DISFetchRegSeg(PCCPUMCTXCORE pCtx, DISSELREG sel, RTSEL *pVal);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncDISDECL(int) DISFetchRegSegEx(PCCPUMCTXCORE pCtx, DISSELREG sel, RTSEL *pVal, PCPUMSELREGHID *ppSelHidReg);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncDISDECL(int) DISWriteReg8(PCPUMCTXCORE pRegFrame, unsigned reg8, uint8_t val8);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncDISDECL(int) DISWriteReg16(PCPUMCTXCORE pRegFrame, unsigned reg32, uint16_t val16);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncDISDECL(int) DISWriteReg32(PCPUMCTXCORE pRegFrame, unsigned reg32, uint32_t val32);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncDISDECL(int) DISWriteReg64(PCPUMCTXCORE pRegFrame, unsigned reg64, uint64_t val64);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncDISDECL(int) DISWriteRegSeg(PCPUMCTXCORE pCtx, DISSELREG sel, RTSEL val);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncDISDECL(int) DISPtrReg8(PCPUMCTXCORE pCtx, unsigned reg8, uint8_t **ppReg);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncDISDECL(int) DISPtrReg16(PCPUMCTXCORE pCtx, unsigned reg16, uint16_t **ppReg);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncDISDECL(int) DISPtrReg32(PCPUMCTXCORE pCtx, unsigned reg32, uint32_t **ppReg);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncDISDECL(int) DISPtrReg64(PCPUMCTXCORE pCtx, unsigned reg64, uint64_t **ppReg);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/**
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * Try resolve an address into a symbol name.
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync *
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * For use with DISFormatYasmEx(), DISFormatMasmEx() and DISFormatGasEx().
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync *
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * @returns VBox status code.
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * @retval VINF_SUCCESS on success, pszBuf contains the full symbol name.
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * @retval VINF_BUFFER_OVERFLOW if pszBuf is too small the symbol name. The
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * content of pszBuf is truncated and zero terminated.
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * @retval VERR_SYMBOL_NOT_FOUND if no matching symbol was found for the address.
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync *
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * @param pDis Pointer to the disassembler CPU state.
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * @param u32Sel The selector value. Use DIS_FMT_SEL_IS_REG, DIS_FMT_SEL_GET_VALUE,
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * DIS_FMT_SEL_GET_REG to access this.
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * @param uAddress The segment address.
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * @param pszBuf Where to store the symbol name
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * @param cchBuf The size of the buffer.
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * @param poff If not a perfect match, then this is where the offset from the return
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * symbol to the specified address is returned.
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * @param pvUser The user argument.
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsynctypedef DECLCALLBACK(int) FNDISGETSYMBOL(PCDISSTATE pDis, uint32_t u32Sel, RTUINTPTR uAddress, char *pszBuf, size_t cchBuf, RTINTPTR *poff, void *pvUser);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** Pointer to a FNDISGETSYMBOL(). */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsynctypedef FNDISGETSYMBOL *PFNDISGETSYMBOL;
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/**
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * Checks if the FNDISGETSYMBOL argument u32Sel is a register or not.
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DIS_FMT_SEL_IS_REG(u32Sel) ( !!((u32Sel) & RT_BIT(31)) )
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/**
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * Extracts the selector value from the FNDISGETSYMBOL argument u32Sel.
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * @returns Selector value.
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DIS_FMT_SEL_GET_VALUE(u32Sel) ( (RTSEL)(u32Sel) )
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/**
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * Extracts the register number from the FNDISGETSYMBOL argument u32Sel.
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * @returns USE_REG_CS, USE_REG_SS, USE_REG_DS, USE_REG_ES, USE_REG_FS or USE_REG_FS.
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DIS_FMT_SEL_GET_REG(u32Sel) ( ((u32Sel) >> 16) & 0xf )
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** @internal */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DIS_FMT_SEL_FROM_REG(uReg) ( ((uReg) << 16) | RT_BIT(31) | 0xffff )
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** @internal */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DIS_FMT_SEL_FROM_VALUE(Sel) ( (Sel) & 0xffff )
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** @name Flags for use with DISFormatYasmEx(), DISFormatMasmEx() and DISFormatGasEx().
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * @{
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** Put the address to the right. */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DIS_FMT_FLAGS_ADDR_RIGHT RT_BIT_32(0)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** Put the address to the left. */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DIS_FMT_FLAGS_ADDR_LEFT RT_BIT_32(1)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** Put the address in comments.
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * For some assemblers this implies placing it to the right. */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DIS_FMT_FLAGS_ADDR_COMMENT RT_BIT_32(2)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** Put the instruction bytes to the right of the disassembly. */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DIS_FMT_FLAGS_BYTES_RIGHT RT_BIT_32(3)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** Put the instruction bytes to the left of the disassembly. */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DIS_FMT_FLAGS_BYTES_LEFT RT_BIT_32(4)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** Put the instruction bytes in comments.
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * For some assemblers this implies placing the bytes to the right. */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DIS_FMT_FLAGS_BYTES_COMMENT RT_BIT_32(5)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** Put the bytes in square brackets. */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DIS_FMT_FLAGS_BYTES_BRACKETS RT_BIT_32(6)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** Put spaces between the bytes. */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DIS_FMT_FLAGS_BYTES_SPACED RT_BIT_32(7)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** Display the relative +/- offset of branch instructions that uses relative addresses,
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * and put the target address in parenthesis. */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DIS_FMT_FLAGS_RELATIVE_BRANCH RT_BIT_32(8)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** Strict assembly. The assembly should, when ever possible, make the
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * assembler reproduce the exact same binary. (Refers to the yasm
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * strict keyword.) */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DIS_FMT_FLAGS_STRICT RT_BIT_32(9)
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** Checks if the given flags are a valid combination. */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#define DIS_FMT_FLAGS_IS_VALID(fFlags) \
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync ( !((fFlags) & ~UINT32_C(0x000003ff)) \
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync && ((fFlags) & (DIS_FMT_FLAGS_ADDR_RIGHT | DIS_FMT_FLAGS_ADDR_LEFT)) != (DIS_FMT_FLAGS_ADDR_RIGHT | DIS_FMT_FLAGS_ADDR_LEFT) \
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync && ( !((fFlags) & DIS_FMT_FLAGS_ADDR_COMMENT) \
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync || (fFlags & (DIS_FMT_FLAGS_ADDR_RIGHT | DIS_FMT_FLAGS_ADDR_LEFT)) ) \
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync && ((fFlags) & (DIS_FMT_FLAGS_BYTES_RIGHT | DIS_FMT_FLAGS_BYTES_LEFT)) != (DIS_FMT_FLAGS_BYTES_RIGHT | DIS_FMT_FLAGS_BYTES_LEFT) \
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync && ( !((fFlags) & (DIS_FMT_FLAGS_BYTES_COMMENT | DIS_FMT_FLAGS_BYTES_BRACKETS)) \
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync || (fFlags & (DIS_FMT_FLAGS_BYTES_RIGHT | DIS_FMT_FLAGS_BYTES_LEFT)) ) \
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync )
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** @} */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncDISDECL(size_t) DISFormatYasm( PCDISSTATE pDis, char *pszBuf, size_t cchBuf);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncDISDECL(size_t) DISFormatYasmEx(PCDISSTATE pDis, char *pszBuf, size_t cchBuf, uint32_t fFlags, PFNDISGETSYMBOL pfnGetSymbol, void *pvUser);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncDISDECL(size_t) DISFormatMasm( PCDISSTATE pDis, char *pszBuf, size_t cchBuf);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncDISDECL(size_t) DISFormatMasmEx(PCDISSTATE pDis, char *pszBuf, size_t cchBuf, uint32_t fFlags, PFNDISGETSYMBOL pfnGetSymbol, void *pvUser);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncDISDECL(size_t) DISFormatGas( PCDISSTATE pDis, char *pszBuf, size_t cchBuf);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncDISDECL(size_t) DISFormatGasEx( PCDISSTATE pDis, char *pszBuf, size_t cchBuf, uint32_t fFlags, PFNDISGETSYMBOL pfnGetSymbol, void *pvUser);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync/** @todo DISAnnotate(PCDISSTATE pDis, char *pszBuf, size_t cchBuf, register
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync * reader, memory reader); */
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncDISDECL(bool) DISFormatYasmIsOddEncoding(PDISSTATE pDis);
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsyncRT_C_DECLS_END
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync#endif
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync
97566036db1dc1dba46ed21be4e147c728fd1027vboxsync