DisasmInternal.h revision 82655936c9195f9f0f39aebb478115ffca8c0a55
77b1a2d8b5dbe2c0b5200794914239fee3c8ee5dvboxsync/* $Id$ */
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync/** @file
77b1a2d8b5dbe2c0b5200794914239fee3c8ee5dvboxsync * VBox disassembler - Internal header.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync */
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync/*
bbede9c189def47a9880f0ffb03c0c230c774185vboxsync * Copyright (C) 2006-2012 Oracle Corporation
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync *
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * available from http://www.virtualbox.org. This file is free software;
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync */
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync#ifndef ___DisasmInternal_h___
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync#define ___DisasmInternal_h___
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#include <VBox/types.h>
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#include <VBox/dis.h>
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync/** @defgroup grp_dis_int Internals.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * @ingroup grp_dis
662d52947eeb3fc8fca3b23991a5eee47077f896vboxsync * @{
da957c069c2a3c582fe265ff88170ce4c42b499dvboxsync */
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync/** @name Index into g_apfnCalcSize and g_apfnFullDisasm.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * @{ */
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#define IDX_ParseNop 0
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#define IDX_ParseModRM 1
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#define IDX_UseModRM 2
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#define IDX_ParseImmByte 3
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync#define IDX_ParseImmBRel 4
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#define IDX_ParseImmUshort 5
efff36b306e370346025647a158689021df2e1d1vboxsync#define IDX_ParseImmV 6
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#define IDX_ParseImmVRel 7
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync#define IDX_ParseImmAddr 8
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#define IDX_ParseFixedReg 9
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#define IDX_ParseImmUlong 10
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#define IDX_ParseImmQword 11
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync#define IDX_ParseTwoByteEsc 12
efff36b306e370346025647a158689021df2e1d1vboxsync#define IDX_ParseImmGrpl 13
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#define IDX_ParseShiftGrp2 14
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#define IDX_ParseGrp3 15
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#define IDX_ParseGrp4 16
efff36b306e370346025647a158689021df2e1d1vboxsync#define IDX_ParseGrp5 17
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#define IDX_Parse3DNow 18
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#define IDX_ParseGrp6 19
efff36b306e370346025647a158689021df2e1d1vboxsync#define IDX_ParseGrp7 20
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#define IDX_ParseGrp8 21
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#define IDX_ParseGrp9 22
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#define IDX_ParseGrp10 23
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#define IDX_ParseGrp12 24
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#define IDX_ParseGrp13 25
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#define IDX_ParseGrp14 26
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync#define IDX_ParseGrp15 27
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#define IDX_ParseGrp16 28
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#define IDX_ParseModFence 29
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#define IDX_ParseYv 30
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#define IDX_ParseYb 31
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#define IDX_ParseXv 32
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#define IDX_ParseXb 33
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#define IDX_ParseEscFP 34
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#define IDX_ParseNopPause 35
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#define IDX_ParseImmByteSX 36
0abd77741a608f6c41c8dfcd4781b8b84adf1044vboxsync#define IDX_ParseImmZ 37
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#define IDX_ParseThreeByteEsc4 38
9496f2d398b49813176939d7a339ae513d5175efvboxsync#define IDX_ParseThreeByteEsc5 39
9496f2d398b49813176939d7a339ae513d5175efvboxsync#define IDX_ParseImmAddrF 40
9496f2d398b49813176939d7a339ae513d5175efvboxsync#define IDX_ParseMax (IDX_ParseImmAddrF+1)
9496f2d398b49813176939d7a339ae513d5175efvboxsync/** @} */
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync/** @name Opcode maps.
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync * @{ */
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsyncextern const DISOPCODE g_InvalidOpcode[1];
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsyncextern const DISOPCODE g_aOneByteMapX86[256];
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsyncextern const DISOPCODE g_aOneByteMapX64[256];
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsyncextern const DISOPCODE g_aTwoByteMapX86[256];
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync/** Two byte opcode map with prefix 0x66 */
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsyncextern const DISOPCODE g_aTwoByteMapX86_PF66[256];
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync/** Two byte opcode map with prefix 0xF2 */
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsyncextern const DISOPCODE g_aTwoByteMapX86_PFF2[256];
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync/** Two byte opcode map with prefix 0xF3 */
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsyncextern const DISOPCODE g_aTwoByteMapX86_PFF3[256];
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync/** Three byte opcode map (0xF 0x38) */
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsyncextern PCDISOPCODE const g_apThreeByteMapX86_0F38[16];
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync/** Three byte opcode map with prefix 0x66 (0xF 0x38) */
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsyncextern PCDISOPCODE const g_apThreeByteMapX86_660F38[16];
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync/** Three byte opcode map with prefix 0xF2 (0xF 0x38) */
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsyncextern PCDISOPCODE const g_apThreeByteMapX86_F20F38[16];
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync/** Three byte opcode map with prefix 0x66 (0xF 0x3A) */
bbede9c189def47a9880f0ffb03c0c230c774185vboxsyncextern PCDISOPCODE const g_apThreeByteMapX86_660F3A[16];
bbede9c189def47a9880f0ffb03c0c230c774185vboxsync/** @} */
bbede9c189def47a9880f0ffb03c0c230c774185vboxsync
bbede9c189def47a9880f0ffb03c0c230c774185vboxsync/** @name Opcode extensions (Group tables)
bbede9c189def47a9880f0ffb03c0c230c774185vboxsync * @{ */
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsyncextern const DISOPCODE g_aMapX86_Group1[8*4];
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsyncextern const DISOPCODE g_aMapX86_Group2[8*6];
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsyncextern const DISOPCODE g_aMapX86_Group3[8*2];
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsyncextern const DISOPCODE g_aMapX86_Group4[8];
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsyncextern const DISOPCODE g_aMapX86_Group5[8];
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsyncextern const DISOPCODE g_aMapX86_Group6[8];
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsyncextern const DISOPCODE g_aMapX86_Group7_mem[8];
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsyncextern const DISOPCODE g_aMapX86_Group7_mod11_rm000[8];
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsyncextern const DISOPCODE g_aMapX86_Group7_mod11_rm001[8];
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsyncextern const DISOPCODE g_aMapX86_Group8[8];
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsyncextern const DISOPCODE g_aMapX86_Group9[8];
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsyncextern const DISOPCODE g_aMapX86_Group10[8];
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsyncextern const DISOPCODE g_aMapX86_Group11[8*2];
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsyncextern const DISOPCODE g_aMapX86_Group12[8*2];
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsyncextern const DISOPCODE g_aMapX86_Group13[8*2];
9496f2d398b49813176939d7a339ae513d5175efvboxsyncextern const DISOPCODE g_aMapX86_Group14[8*2];
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsyncextern const DISOPCODE g_aMapX86_Group15_mem[8];
9496f2d398b49813176939d7a339ae513d5175efvboxsyncextern const DISOPCODE g_aMapX86_Group15_mod11_rm000[8];
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsyncextern const DISOPCODE g_aMapX86_Group16[8];
9496f2d398b49813176939d7a339ae513d5175efvboxsyncextern const DISOPCODE g_aMapX86_NopPause[2];
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync/** @} */
9496f2d398b49813176939d7a339ae513d5175efvboxsync
21029597fc4b76d0db0c9542daee201447281781vboxsync/** 3DNow! map (0x0F 0x0F prefix) */
21029597fc4b76d0db0c9542daee201447281781vboxsyncextern const DISOPCODE g_aTwoByteMapX86_3DNow[256];
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync/** Floating point opcodes starting with escape byte 0xDF
9496f2d398b49813176939d7a339ae513d5175efvboxsync * @{ */
9496f2d398b49813176939d7a339ae513d5175efvboxsyncextern const DISOPCODE g_aMapX86_EscF0_Low[8];
9496f2d398b49813176939d7a339ae513d5175efvboxsyncextern const DISOPCODE g_aMapX86_EscF0_High[16*4];
9496f2d398b49813176939d7a339ae513d5175efvboxsyncextern const DISOPCODE g_aMapX86_EscF1_Low[8];
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsyncextern const DISOPCODE g_aMapX86_EscF1_High[16*4];
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsyncextern const DISOPCODE g_aMapX86_EscF2_Low[8];
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsyncextern const DISOPCODE g_aMapX86_EscF2_High[16*4];
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsyncextern const DISOPCODE g_aMapX86_EscF3_Low[8];
9496f2d398b49813176939d7a339ae513d5175efvboxsyncextern const DISOPCODE g_aMapX86_EscF3_High[16*4];
9496f2d398b49813176939d7a339ae513d5175efvboxsyncextern const DISOPCODE g_aMapX86_EscF4_Low[8];
9496f2d398b49813176939d7a339ae513d5175efvboxsyncextern const DISOPCODE g_aMapX86_EscF4_High[16*4];
9496f2d398b49813176939d7a339ae513d5175efvboxsyncextern const DISOPCODE g_aMapX86_EscF5_Low[8];
9c149a2789022f5011e88fb62f02a1cc8068e88fvboxsyncextern const DISOPCODE g_aMapX86_EscF5_High[16*4];
9c149a2789022f5011e88fb62f02a1cc8068e88fvboxsyncextern const DISOPCODE g_aMapX86_EscF6_Low[8];
9496f2d398b49813176939d7a339ae513d5175efvboxsyncextern const DISOPCODE g_aMapX86_EscF6_High[16*4];
9496f2d398b49813176939d7a339ae513d5175efvboxsyncextern const DISOPCODE g_aMapX86_EscF7_Low[8];
9496f2d398b49813176939d7a339ae513d5175efvboxsyncextern const DISOPCODE g_aMapX86_EscF7_High[16*4];
9496f2d398b49813176939d7a339ae513d5175efvboxsync
9496f2d398b49813176939d7a339ae513d5175efvboxsyncextern PCDISOPCODE g_paMapX86_FP_Low[8];
9496f2d398b49813176939d7a339ae513d5175efvboxsyncextern PCDISOPCODE g_paMapX86_FP_High[8];
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync/** @} */
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync/** @def OP
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * Wrapper which initializes an OPCODE.
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync * We must use this so that we can exclude unused fields in order
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * to save precious bytes in the GC version.
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync *
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * @internal
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync */
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync#ifndef DIS_CORE_ONLY
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync# define OP(pszOpcode, idxParse1, idxParse2, idxParse3, opcode, param1, param2, param3, optype) \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync { pszOpcode, idxParse1, idxParse2, idxParse3, 0, opcode, param1, param2, param3, optype }
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync#else
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync# define OP(pszOpcode, idxParse1, idxParse2, idxParse3, opcode, param1, param2, param3, optype) \
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync { idxParse1, idxParse2, idxParse3, 0, opcode, param1, param2, param3, optype }
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync#endif
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsyncsize_t disFormatBytes(PCDISCPUSTATE pCpu, char *pszDst, size_t cchDst, uint32_t fFlags);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync/** @} */
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync#endif
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync