Path: blob/master/dep/zydis/include/Zydis/Internal/SharedData.h
4219 views
/***************************************************************************************************12Zyan Disassembler Library (Zydis)34Original Author : Florian Bernd56* Permission is hereby granted, free of charge, to any person obtaining a copy7* of this software and associated documentation files (the "Software"), to deal8* in the Software without restriction, including without limitation the rights9* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell10* copies of the Software, and to permit persons to whom the Software is11* furnished to do so, subject to the following conditions:12*13* The above copyright notice and this permission notice shall be included in all14* copies or substantial portions of the Software.15*16* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR17* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,18* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE19* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER20* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,21* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE22* SOFTWARE.2324***************************************************************************************************/2526#ifndef ZYDIS_INTERNAL_SHAREDDATA_H27#define ZYDIS_INTERNAL_SHAREDDATA_H2829#include <Zycore/Defines.h>30#include <Zydis/Mnemonic.h>31#include <Zydis/Register.h>32#include <Zydis/SharedTypes.h>33#include <Zydis/DecoderTypes.h>3435#ifdef __cplusplus36extern "C" {37#endif3839/* ============================================================================================== */40/* Enums and types */41/* ============================================================================================== */4243// MSVC does not like types other than (un-)signed int for bit-fields44#ifdef ZYAN_MSVC45# pragma warning(push)46# pragma warning(disable:4214)47#endif4849#pragma pack(push, 1)5051/* ---------------------------------------------------------------------------------------------- */52/* Operand definition */53/* ---------------------------------------------------------------------------------------------- */5455/**56* Defines the `ZydisSemanticOperandType` enum.57*/58typedef enum ZydisSemanticOperandType_59{60ZYDIS_SEMANTIC_OPTYPE_UNUSED,61ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG,62ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM,63ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_IMM1,64ZYDIS_SEMANTIC_OPTYPE_GPR8,65ZYDIS_SEMANTIC_OPTYPE_GPR16,66ZYDIS_SEMANTIC_OPTYPE_GPR32,67ZYDIS_SEMANTIC_OPTYPE_GPR64,68ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64,69ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64,70ZYDIS_SEMANTIC_OPTYPE_GPR16_32_32,71ZYDIS_SEMANTIC_OPTYPE_GPR_ASZ,72ZYDIS_SEMANTIC_OPTYPE_FPR,73ZYDIS_SEMANTIC_OPTYPE_MMX,74ZYDIS_SEMANTIC_OPTYPE_XMM,75ZYDIS_SEMANTIC_OPTYPE_YMM,76ZYDIS_SEMANTIC_OPTYPE_ZMM,77ZYDIS_SEMANTIC_OPTYPE_TMM,78ZYDIS_SEMANTIC_OPTYPE_BND,79ZYDIS_SEMANTIC_OPTYPE_SREG,80ZYDIS_SEMANTIC_OPTYPE_CR,81ZYDIS_SEMANTIC_OPTYPE_DR,82ZYDIS_SEMANTIC_OPTYPE_MASK,83ZYDIS_SEMANTIC_OPTYPE_MEM,84ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX,85ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY,86ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ,87ZYDIS_SEMANTIC_OPTYPE_IMM,88ZYDIS_SEMANTIC_OPTYPE_REL,89ZYDIS_SEMANTIC_OPTYPE_PTR,90ZYDIS_SEMANTIC_OPTYPE_AGEN,91ZYDIS_SEMANTIC_OPTYPE_MOFFS,92ZYDIS_SEMANTIC_OPTYPE_MIB,9394/**95* Maximum value of this enum.96*/97ZYDIS_SEMANTIC_OPTYPE_MAX_VALUE = ZYDIS_SEMANTIC_OPTYPE_MIB,98/**99* The minimum number of bits required to represent all values of this enum.100*/101ZYDIS_SEMANTIC_OPTYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_SEMANTIC_OPTYPE_MAX_VALUE)102} ZydisSemanticOperandType;103104/* ---------------------------------------------------------------------------------------------- */105106/**107* Defines the `ZydisInternalElementType` enum.108*/109typedef enum ZydisInternalElementType_110{111ZYDIS_IELEMENT_TYPE_INVALID,112ZYDIS_IELEMENT_TYPE_VARIABLE,113ZYDIS_IELEMENT_TYPE_STRUCT,114ZYDIS_IELEMENT_TYPE_INT,115ZYDIS_IELEMENT_TYPE_UINT,116ZYDIS_IELEMENT_TYPE_INT1,117ZYDIS_IELEMENT_TYPE_INT8,118ZYDIS_IELEMENT_TYPE_INT16,119ZYDIS_IELEMENT_TYPE_INT32,120ZYDIS_IELEMENT_TYPE_INT64,121ZYDIS_IELEMENT_TYPE_UINT8,122ZYDIS_IELEMENT_TYPE_UINT16,123ZYDIS_IELEMENT_TYPE_UINT32,124ZYDIS_IELEMENT_TYPE_UINT64,125ZYDIS_IELEMENT_TYPE_UINT128,126ZYDIS_IELEMENT_TYPE_UINT256,127ZYDIS_IELEMENT_TYPE_FLOAT16,128ZYDIS_IELEMENT_TYPE_FLOAT16X2,129ZYDIS_IELEMENT_TYPE_FLOAT32,130ZYDIS_IELEMENT_TYPE_FLOAT64,131ZYDIS_IELEMENT_TYPE_FLOAT80,132ZYDIS_IELEMENT_TYPE_BCD80,133ZYDIS_IELEMENT_TYPE_CC3,134ZYDIS_IELEMENT_TYPE_CC5,135136/**137* Maximum value of this enum.138*/139ZYDIS_IELEMENT_TYPE_MAX_VALUE = ZYDIS_IELEMENT_TYPE_CC5,140/**141* The minimum number of bits required to represent all values of this enum.142*/143ZYDIS_IELEMENT_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IELEMENT_TYPE_MAX_VALUE)144} ZydisInternalElementType;145146/* ---------------------------------------------------------------------------------------------- */147148/**149* Defines the `ZydisImplicitRegisterType` enum.150*/151typedef enum ZydisImplicitRegisterType_152{153// TODO: Rename OSZ|ASZ|SSZ_154ZYDIS_IMPLREG_TYPE_STATIC,155ZYDIS_IMPLREG_TYPE_GPR_OSZ,156ZYDIS_IMPLREG_TYPE_GPR_ASZ,157ZYDIS_IMPLREG_TYPE_IP_ASZ,158ZYDIS_IMPLREG_TYPE_IP_SSZ,159ZYDIS_IMPLREG_TYPE_GPR_SSZ,160ZYDIS_IMPLREG_TYPE_FLAGS_SSZ,161162/**163* Maximum value of this enum.164*/165ZYDIS_IMPLREG_TYPE_MAX_VALUE = ZYDIS_IMPLREG_TYPE_FLAGS_SSZ,166/**167* The minimum number of bits required to represent all values of this enum.168*/169ZYDIS_IMPLREG_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IMPLREG_TYPE_MAX_VALUE)170} ZydisImplicitRegisterType;171172/* ---------------------------------------------------------------------------------------------- */173174/**175* Defines the `ZydisImplicitMemBase` enum.176*/177typedef enum ZydisImplicitMemBase_178{179// TODO: Rename OSZ|ASZ|SSZ_180ZYDIS_IMPLMEM_BASE_AGPR_REG,181ZYDIS_IMPLMEM_BASE_AGPR_RM,182ZYDIS_IMPLMEM_BASE_AAX,183ZYDIS_IMPLMEM_BASE_ADX,184ZYDIS_IMPLMEM_BASE_ABX,185ZYDIS_IMPLMEM_BASE_ASI,186ZYDIS_IMPLMEM_BASE_ADI,187ZYDIS_IMPLMEM_BASE_SSP,188ZYDIS_IMPLMEM_BASE_SBP,189190/**191* Maximum value of this enum.192*/193ZYDIS_IMPLMEM_BASE_MAX_VALUE = ZYDIS_IMPLMEM_BASE_SBP,194/**195* The minimum number of bits required to represent all values of this enum.196*/197ZYDIS_IMPLMEM_BASE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IMPLMEM_BASE_MAX_VALUE)198} ZydisImplicitMemBase;199200/* ---------------------------------------------------------------------------------------------- */201202// MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct203// enum types204ZYAN_STATIC_ASSERT(ZYDIS_SEMANTIC_OPTYPE_REQUIRED_BITS <= 8);205ZYAN_STATIC_ASSERT(ZYDIS_OPERAND_VISIBILITY_REQUIRED_BITS <= 8);206ZYAN_STATIC_ASSERT(ZYDIS_OPERAND_ACTION_REQUIRED_BITS <= 8);207ZYAN_STATIC_ASSERT(ZYDIS_IELEMENT_TYPE_REQUIRED_BITS <= 8);208ZYAN_STATIC_ASSERT(ZYDIS_OPERAND_ENCODING_REQUIRED_BITS <= 8);209ZYAN_STATIC_ASSERT(ZYDIS_IMPLREG_TYPE_REQUIRED_BITS <= 8);210ZYAN_STATIC_ASSERT(ZYDIS_REGISTER_REQUIRED_BITS <= 16);211ZYAN_STATIC_ASSERT(ZYDIS_IMPLMEM_BASE_REQUIRED_BITS <= 8);212213/**214* Defines the `ZydisOperandDefinition` struct.215*/216typedef struct ZydisOperandDefinition_217{218ZyanU8 type ZYAN_BITFIELD(ZYDIS_SEMANTIC_OPTYPE_REQUIRED_BITS);219ZyanU8 visibility ZYAN_BITFIELD(ZYDIS_OPERAND_VISIBILITY_REQUIRED_BITS);220ZyanU8 actions ZYAN_BITFIELD(ZYDIS_OPERAND_ACTION_REQUIRED_BITS);221ZyanU16 size[3];222ZyanU8 element_type ZYAN_BITFIELD(ZYDIS_IELEMENT_TYPE_REQUIRED_BITS);223union224{225ZyanU8 encoding ZYAN_BITFIELD(ZYDIS_OPERAND_ENCODING_REQUIRED_BITS);226struct227{228ZyanU8 type ZYAN_BITFIELD(ZYDIS_IMPLREG_TYPE_REQUIRED_BITS);229union230{231ZyanU16 reg ZYAN_BITFIELD(ZYDIS_REGISTER_REQUIRED_BITS);232ZyanU8 id ZYAN_BITFIELD(6);233} reg;234} reg;235struct236{237ZyanU8 seg ZYAN_BITFIELD(3);238ZyanU8 base ZYAN_BITFIELD(ZYDIS_IMPLMEM_BASE_REQUIRED_BITS);239} mem;240} op;241ZyanBool is_multisource4 ZYAN_BITFIELD(1);242ZyanBool ignore_seg_override ZYAN_BITFIELD(1);243} ZydisOperandDefinition;244245/* ---------------------------------------------------------------------------------------------- */246/* Instruction definition */247/* ---------------------------------------------------------------------------------------------- */248249/**250* Defines the `ZydisReadWriteAction` enum.251*/252typedef enum ZydisReadWriteAction_253{254ZYDIS_RW_ACTION_NONE,255ZYDIS_RW_ACTION_READ,256ZYDIS_RW_ACTION_WRITE,257ZYDIS_RW_ACTION_READWRITE,258259/**260* Maximum value of this enum.261*/262ZYDIS_RW_ACTION_MAX_VALUE = ZYDIS_RW_ACTION_READWRITE,263/**264* The minimum number of bits required to represent all values of this enum.265*/266ZYDIS_RW_ACTION_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_RW_ACTION_MAX_VALUE)267} ZydisReadWriteAction;268269/* ---------------------------------------------------------------------------------------------- */270271/**272* Defines the `ZydisInternalVectorLength` enum.273*/274typedef enum ZydisInternalVectorLength_275{276ZYDIS_IVECTOR_LENGTH_DEFAULT,277ZYDIS_IVECTOR_LENGTH_FIXED_128,278ZYDIS_IVECTOR_LENGTH_FIXED_256,279ZYDIS_IVECTOR_LENGTH_FIXED_512,280281/**282* Maximum value of this enum.283*/284ZYDIS_IVECTOR_LENGTH_MAX_VALUE = ZYDIS_IVECTOR_LENGTH_FIXED_512,285/**286* The minimum number of bits required to represent all values of this enum.287*/288ZYDIS_IVECTOR_LENGTH_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IVECTOR_LENGTH_MAX_VALUE)289} ZydisInternalVectorLength;290291/* ---------------------------------------------------------------------------------------------- */292293/**294* Defines the `ZydisInternalElementSize` enum.295*/296typedef enum ZydisInternalElementSize_297{298ZYDIS_IELEMENT_SIZE_INVALID,299ZYDIS_IELEMENT_SIZE_8,300ZYDIS_IELEMENT_SIZE_16,301ZYDIS_IELEMENT_SIZE_32,302ZYDIS_IELEMENT_SIZE_64,303ZYDIS_IELEMENT_SIZE_128,304305/**306* Maximum value of this enum.307*/308ZYDIS_IELEMENT_SIZE_MAX_VALUE = ZYDIS_IELEMENT_SIZE_128,309/**310* The minimum number of bits required to represent all values of this enum.311*/312ZYDIS_IELEMENT_SIZE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IELEMENT_SIZE_MAX_VALUE)313} ZydisInternalElementSize;314315/* ---------------------------------------------------------------------------------------------- */316317/**318* Defines the `ZydisEVEXFunctionality` enum.319*/320typedef enum ZydisEVEXFunctionality_321{322ZYDIS_EVEX_FUNC_INVALID,323/**324* `EVEX.b` enables broadcast functionality.325*/326ZYDIS_EVEX_FUNC_BC,327/**328* `EVEX.b` enables embedded-rounding functionality.329*/330ZYDIS_EVEX_FUNC_RC,331/**332* `EVEX.b` enables sae functionality.333*/334ZYDIS_EVEX_FUNC_SAE,335336/**337* Maximum value of this enum.338*/339ZYDIS_EVEX_FUNC_MAX_VALUE = ZYDIS_EVEX_FUNC_SAE,340/**341* The minimum number of bits required to represent all values of this enum.342*/343ZYDIS_EVEX_FUNC_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_EVEX_FUNC_MAX_VALUE)344} ZydisEVEXFunctionality;345346/* ---------------------------------------------------------------------------------------------- */347348/**349* Defines the `ZydisEVEXTupleType` enum.350*/351typedef enum ZydisEVEXTupleType_352{353ZYDIS_TUPLETYPE_INVALID,354/**355* Full Vector356*/357ZYDIS_TUPLETYPE_FV,358/**359* Half Vector360*/361ZYDIS_TUPLETYPE_HV,362/**363* Full Vector Mem364*/365ZYDIS_TUPLETYPE_FVM,366/**367* Tuple1 Scalar368*/369ZYDIS_TUPLETYPE_T1S,370/**371* Tuple1 Fixed372*/373ZYDIS_TUPLETYPE_T1F,374/**375* Tuple1 4x32376*/377ZYDIS_TUPLETYPE_T1_4X,378/**379* Gather / Scatter380*/381ZYDIS_TUPLETYPE_GSCAT,382/**383* Tuple2384*/385ZYDIS_TUPLETYPE_T2,386/**387* Tuple4388*/389ZYDIS_TUPLETYPE_T4,390/**391* Tuple8392*/393ZYDIS_TUPLETYPE_T8,394/**395* Half Mem396*/397ZYDIS_TUPLETYPE_HVM,398/**399* QuarterMem400*/401ZYDIS_TUPLETYPE_QVM,402/**403* OctMem404*/405ZYDIS_TUPLETYPE_OVM,406/**407* Mem128408*/409ZYDIS_TUPLETYPE_M128,410/**411* MOVDDUP412*/413ZYDIS_TUPLETYPE_DUP,414/**415* Quarter of the vector-length.416*/417ZYDIS_TUPLETYPE_QUARTER,418419/**420* Maximum value of this enum.421*/422ZYDIS_TUPLETYPE_MAX_VALUE = ZYDIS_TUPLETYPE_QUARTER,423/**424* The minimum number of bits required to represent all values of this enum.425*/426ZYDIS_TUPLETYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_TUPLETYPE_MAX_VALUE)427} ZydisEVEXTupleType;428429/* ---------------------------------------------------------------------------------------------- */430431/**432* Defines the `ZydisMVEXFunctionality` enum.433*/434typedef enum ZydisMVEXFunctionality_435{436/**437* The `MVEX.SSS` value is ignored.438*/439ZYDIS_MVEX_FUNC_IGNORED,440/**441* `MVEX.SSS` must be `000b`.442*/443ZYDIS_MVEX_FUNC_INVALID,444/**445* `MVEX.SSS` controls embedded-rounding functionality.446*/447ZYDIS_MVEX_FUNC_RC,448/**449* `MVEX.SSS` controls sae functionality.450*/451ZYDIS_MVEX_FUNC_SAE,452/**453* No special operation (32bit float elements).454*/455ZYDIS_MVEX_FUNC_F_32,456/**457* No special operation (32bit uint elements).458*/459ZYDIS_MVEX_FUNC_I_32,460/**461* No special operation (64bit float elements).462*/463ZYDIS_MVEX_FUNC_F_64,464/**465* No special operation (64bit uint elements).466*/467ZYDIS_MVEX_FUNC_I_64,468/**469* Sf32(reg) or Si32(reg).470*/471ZYDIS_MVEX_FUNC_SWIZZLE_32,472/**473* Sf64(reg) or Si64(reg).474*/475ZYDIS_MVEX_FUNC_SWIZZLE_64,476/**477* Sf32(mem).478*/479ZYDIS_MVEX_FUNC_SF_32,480/**481* Sf32(mem) broadcast only.482*/483ZYDIS_MVEX_FUNC_SF_32_BCST,484/**485* Sf32(mem) broadcast 4to16 only.486*/487ZYDIS_MVEX_FUNC_SF_32_BCST_4TO16,488/**489* Sf64(mem).490*/491ZYDIS_MVEX_FUNC_SF_64,492/**493* Si32(mem).494*/495ZYDIS_MVEX_FUNC_SI_32,496/**497* Si32(mem) broadcast only.498*/499ZYDIS_MVEX_FUNC_SI_32_BCST,500/**501* Si32(mem) broadcast 4to16 only.502*/503ZYDIS_MVEX_FUNC_SI_32_BCST_4TO16,504/**505* Si64(mem).506*/507ZYDIS_MVEX_FUNC_SI_64,508/**509* Uf32.510*/511ZYDIS_MVEX_FUNC_UF_32,512/**513* Uf64.514*/515ZYDIS_MVEX_FUNC_UF_64,516/**517* Ui32.518*/519ZYDIS_MVEX_FUNC_UI_32,520/**521* Ui64.522*/523ZYDIS_MVEX_FUNC_UI_64,524/**525* Df32.526*/527ZYDIS_MVEX_FUNC_DF_32,528/**529* Df64.530*/531ZYDIS_MVEX_FUNC_DF_64,532/**533* Di32.534*/535ZYDIS_MVEX_FUNC_DI_32,536/**537* Di64.538*/539ZYDIS_MVEX_FUNC_DI_64,540541/**542* Maximum value of this enum.543*/544ZYDIS_MVEX_FUNC_MAX_VALUE = ZYDIS_MVEX_FUNC_DI_64,545/**546* The minimum number of bits required to represent all values of this enum.547*/548ZYDIS_MVEX_FUNC_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MVEX_FUNC_MAX_VALUE)549} ZydisMVEXFunctionality;550551/* ---------------------------------------------------------------------------------------------- */552553/**554* Defines the `ZydisVEXStaticBroadcast` enum.555*/556typedef enum ZydisVEXStaticBroadcast557{558ZYDIS_VEX_STATIC_BROADCAST_NONE,559ZYDIS_VEX_STATIC_BROADCAST_1_TO_2,560ZYDIS_VEX_STATIC_BROADCAST_1_TO_4,561ZYDIS_VEX_STATIC_BROADCAST_1_TO_8,562ZYDIS_VEX_STATIC_BROADCAST_1_TO_16,563ZYDIS_VEX_STATIC_BROADCAST_1_TO_32,564ZYDIS_VEX_STATIC_BROADCAST_2_TO_4,565566/**567* Maximum value of this enum.568*/569ZYDIS_VEX_STATIC_BROADCAST_MAX_VALUE = ZYDIS_VEX_STATIC_BROADCAST_2_TO_4,570/**571* The minimum number of bits required to represent all values of this enum.572*/573ZYDIS_VEX_STATIC_BROADCAST_REQUIRED_BITS =574ZYAN_BITS_TO_REPRESENT(ZYDIS_VEX_STATIC_BROADCAST_MAX_VALUE)575} ZydisVEXStaticBroadcast;576577/* ---------------------------------------------------------------------------------------------- */578579/**580* Defines the `ZydisEVEXStaticBroadcast` enum.581*/582typedef enum ZydisEVEXStaticBroadcast_583{584ZYDIS_EVEX_STATIC_BROADCAST_NONE,585ZYDIS_EVEX_STATIC_BROADCAST_1_TO_2,586ZYDIS_EVEX_STATIC_BROADCAST_1_TO_4,587ZYDIS_EVEX_STATIC_BROADCAST_1_TO_8,588ZYDIS_EVEX_STATIC_BROADCAST_1_TO_16,589ZYDIS_EVEX_STATIC_BROADCAST_1_TO_32,590ZYDIS_EVEX_STATIC_BROADCAST_1_TO_64,591ZYDIS_EVEX_STATIC_BROADCAST_2_TO_4,592ZYDIS_EVEX_STATIC_BROADCAST_2_TO_8,593ZYDIS_EVEX_STATIC_BROADCAST_2_TO_16,594ZYDIS_EVEX_STATIC_BROADCAST_4_TO_8,595ZYDIS_EVEX_STATIC_BROADCAST_4_TO_16,596ZYDIS_EVEX_STATIC_BROADCAST_8_TO_16,597598/**599* Maximum value of this enum.600*/601ZYDIS_EVEX_STATIC_BROADCAST_MAX_VALUE = ZYDIS_EVEX_STATIC_BROADCAST_8_TO_16,602/**603* The minimum number of bits required to represent all values of this enum.604*/605ZYDIS_EVEX_STATIC_BROADCAST_REQUIRED_BITS =606ZYAN_BITS_TO_REPRESENT(ZYDIS_EVEX_STATIC_BROADCAST_MAX_VALUE)607} ZydisEVEXStaticBroadcast;608609/* ---------------------------------------------------------------------------------------------- */610611/**612* Defines the `ZydisMVEXStaticBroadcast` enum.613*/614typedef enum ZydisMVEXStaticBroadcast_615{616ZYDIS_MVEX_STATIC_BROADCAST_NONE,617ZYDIS_MVEX_STATIC_BROADCAST_1_TO_8,618ZYDIS_MVEX_STATIC_BROADCAST_1_TO_16,619ZYDIS_MVEX_STATIC_BROADCAST_4_TO_8,620ZYDIS_MVEX_STATIC_BROADCAST_4_TO_16,621622/**623* Maximum value of this enum.624*/625ZYDIS_MVEX_STATIC_BROADCAST_MAX_VALUE = ZYDIS_MVEX_STATIC_BROADCAST_4_TO_16,626/**627* The minimum number of bits required to represent all values of this enum.628*/629ZYDIS_MVEX_STATIC_BROADCAST_REQUIRED_BITS =630ZYAN_BITS_TO_REPRESENT(ZYDIS_MVEX_STATIC_BROADCAST_MAX_VALUE)631} ZydisMVEXStaticBroadcast;632633/* ---------------------------------------------------------------------------------------------- */634635/**636* Defines the `ZydisMaskPolicy` enum.637*/638typedef enum ZydisMaskPolicy_639{640ZYDIS_MASK_POLICY_INVALID,641/**642* The instruction accepts mask-registers other than the default-mask (K0), but643* does not require them.644*/645ZYDIS_MASK_POLICY_ALLOWED,646/**647* The instruction requires a mask-register other than the default-mask (K0).648*/649ZYDIS_MASK_POLICY_REQUIRED,650/**651* The instruction does not allow a mask-register other than the default-mask (K0).652*/653ZYDIS_MASK_POLICY_FORBIDDEN,654655/**656* Maximum value of this enum.657*/658ZYDIS_MASK_POLICY_MAX_VALUE = ZYDIS_MASK_POLICY_FORBIDDEN,659/**660* The minimum number of bits required to represent all values of this enum.661*/662ZYDIS_MASK_POLICY_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MASK_POLICY_MAX_VALUE)663} ZydisMaskPolicy;664665/* ---------------------------------------------------------------------------------------------- */666667/**668* Defines the `ZydisMaskOverride` enum.669*/670typedef enum ZydisMaskOverride_671{672ZYDIS_MASK_OVERRIDE_DEFAULT,673ZYDIS_MASK_OVERRIDE_ZEROING,674ZYDIS_MASK_OVERRIDE_CONTROL,675676/**677* Maximum value of this enum.678*/679ZYDIS_MASK_OVERRIDE_MAX_VALUE = ZYDIS_MASK_OVERRIDE_CONTROL,680/**681* The minimum number of bits required to represent all values of this enum.682*/683ZYDIS_MASK_OVERRIDE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MASK_OVERRIDE_MAX_VALUE)684} ZydisMaskOverride;685686/* ---------------------------------------------------------------------------------------------- */687688#define ZYDIS_OPDEF_REQUIRED_BITS \689ZYAN_MAX(ZYDIS_REGKIND_REQUIRED_BITS, ZYDIS_MEMOP_TYPE_REQUIRED_BITS + 1) + 1690691#define ZYDIS_OPDEF_GET_REG(operand_definition) \692((operand_definition) & ((1 << ZYDIS_REGKIND_REQUIRED_BITS ) - 1))693694#define ZYDIS_OPDEF_GET_MEM(operand_definition) \695((operand_definition) & ((1 << ZYDIS_MEMOP_TYPE_REQUIRED_BITS) - 1))696697#define ZYDIS_OPDEF_GET_REG_HIGH_BIT(operand_definition) \698(((operand_definition) >> ZYDIS_REGKIND_REQUIRED_BITS ) & 0x01)699700#define ZYDIS_OPDEF_GET_MEM_HIGH_BIT(operand_definition) \701(((operand_definition) >> ZYDIS_MEMOP_TYPE_REQUIRED_BITS) & 0x01)702703// MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct704// enum types705ZYAN_STATIC_ASSERT(ZYDIS_MNEMONIC_REQUIRED_BITS <= 16);706ZYAN_STATIC_ASSERT(ZYDIS_CATEGORY_REQUIRED_BITS <= 8);707ZYAN_STATIC_ASSERT(ZYDIS_ISA_SET_REQUIRED_BITS <= 8);708ZYAN_STATIC_ASSERT(ZYDIS_ISA_EXT_REQUIRED_BITS <= 8);709ZYAN_STATIC_ASSERT(ZYDIS_BRANCH_TYPE_REQUIRED_BITS <= 8);710ZYAN_STATIC_ASSERT(ZYDIS_EXCEPTION_CLASS_REQUIRED_BITS <= 8);711ZYAN_STATIC_ASSERT(ZYDIS_OPDEF_REQUIRED_BITS <= 8);712ZYAN_STATIC_ASSERT(ZYDIS_RW_ACTION_REQUIRED_BITS <= 8);713714#ifndef ZYDIS_MINIMAL_MODE715# define ZYDIS_INSTRUCTION_DEFINITION_BASE \716ZyanU16 mnemonic ZYAN_BITFIELD(ZYDIS_MNEMONIC_REQUIRED_BITS); \717ZyanU8 operand_count ZYAN_BITFIELD( 4); \718ZyanU8 operand_count_visible ZYAN_BITFIELD( 3); \719ZyanU16 operand_reference ZYAN_BITFIELD(15); \720ZyanU8 operand_size_map ZYAN_BITFIELD( 3); \721ZyanU8 address_size_map ZYAN_BITFIELD( 2); \722ZyanU8 flags_reference ZYAN_BITFIELD( 7); \723ZyanBool requires_protected_mode ZYAN_BITFIELD( 1); \724ZyanBool no_compat_mode ZYAN_BITFIELD( 1); \725ZyanU8 category ZYAN_BITFIELD(ZYDIS_CATEGORY_REQUIRED_BITS); \726ZyanU8 isa_set ZYAN_BITFIELD(ZYDIS_ISA_SET_REQUIRED_BITS); \727ZyanU8 isa_ext ZYAN_BITFIELD(ZYDIS_ISA_EXT_REQUIRED_BITS); \728ZyanU8 branch_type ZYAN_BITFIELD(ZYDIS_BRANCH_TYPE_REQUIRED_BITS); \729ZyanU8 exception_class ZYAN_BITFIELD(ZYDIS_EXCEPTION_CLASS_REQUIRED_BITS); \730ZyanU8 op_reg ZYAN_BITFIELD(ZYDIS_OPDEF_REQUIRED_BITS); \731ZyanU8 op_rm ZYAN_BITFIELD(ZYDIS_OPDEF_REQUIRED_BITS); \732ZyanU8 cpu_state ZYAN_BITFIELD(ZYDIS_RW_ACTION_REQUIRED_BITS); \733ZyanU8 fpu_state ZYAN_BITFIELD(ZYDIS_RW_ACTION_REQUIRED_BITS); \734ZyanU8 xmm_state ZYAN_BITFIELD(ZYDIS_RW_ACTION_REQUIRED_BITS); \735ZyanBool accepts_segment ZYAN_BITFIELD( 1)736#else737# define ZYDIS_INSTRUCTION_DEFINITION_BASE \738ZyanU16 mnemonic ZYAN_BITFIELD(ZYDIS_MNEMONIC_REQUIRED_BITS); \739ZyanU8 operand_size_map ZYAN_BITFIELD( 3); \740ZyanU8 address_size_map ZYAN_BITFIELD( 2); \741ZyanBool requires_protected_mode ZYAN_BITFIELD( 1); \742ZyanBool no_compat_mode ZYAN_BITFIELD( 1); \743ZyanU8 op_reg ZYAN_BITFIELD(ZYDIS_OPDEF_REQUIRED_BITS); \744ZyanU8 op_rm ZYAN_BITFIELD(ZYDIS_OPDEF_REQUIRED_BITS)745#endif746747#define ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR \748ZYDIS_INSTRUCTION_DEFINITION_BASE; \749ZyanU8 op_ndsndd ZYAN_BITFIELD(ZYDIS_OPDEF_REQUIRED_BITS)750751#define ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR_INTEL \752ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR; \753ZyanBool is_gather ZYAN_BITFIELD( 1); \754ZyanBool no_source_dest_match ZYAN_BITFIELD( 1); \755ZyanBool no_source_source_match ZYAN_BITFIELD( 1) // TODO: Could be moved to VEX756757/**758* Defines the `ZydisInstructionDefinition` struct.759*/760typedef struct ZydisInstructionDefinition_761{762ZYDIS_INSTRUCTION_DEFINITION_BASE;763} ZydisInstructionDefinition;764765/**766* Defines the `ZydisInstructionDefinitionLEGACY` struct.767*/768typedef struct ZydisInstructionDefinitionLEGACY_769{770ZYDIS_INSTRUCTION_DEFINITION_BASE;771#ifndef ZYDIS_MINIMAL_MODE772ZyanBool is_privileged ZYAN_BITFIELD( 1);773#endif774ZyanBool accepts_LOCK ZYAN_BITFIELD( 1);775#ifndef ZYDIS_MINIMAL_MODE776ZyanBool accepts_REP ZYAN_BITFIELD( 1);777ZyanBool accepts_REPEREPZ ZYAN_BITFIELD( 1);778ZyanBool accepts_REPNEREPNZ ZYAN_BITFIELD( 1);779ZyanBool accepts_BOUND ZYAN_BITFIELD( 1);780ZyanBool accepts_XACQUIRE ZYAN_BITFIELD( 1);781ZyanBool accepts_XRELEASE ZYAN_BITFIELD( 1);782ZyanBool accepts_NOTRACK ZYAN_BITFIELD( 1);783ZyanBool accepts_hle_without_lock ZYAN_BITFIELD( 1);784ZyanBool accepts_branch_hints ZYAN_BITFIELD( 1);785#endif786} ZydisInstructionDefinitionLEGACY;787788/**789* Defines the `ZydisInstructionDefinition3DNOW` struct.790*/791typedef struct ZydisInstructionDefinition3DNOW_792{793ZYDIS_INSTRUCTION_DEFINITION_BASE;794} ZydisInstructionDefinition3DNOW;795796/**797* Defines the `ZydisInstructionDefinitionXOP` struct.798*/799typedef struct ZydisInstructionDefinitionXOP_800{801ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR;802} ZydisInstructionDefinitionXOP;803804// MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct805// enum types806ZYAN_STATIC_ASSERT(ZYDIS_VEX_STATIC_BROADCAST_REQUIRED_BITS <= 8);807808/**809* Defines the `ZydisInstructionDefinitionVEX` struct.810*/811typedef struct ZydisInstructionDefinitionVEX_812{813ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR_INTEL;814#ifndef ZYDIS_MINIMAL_MODE815ZyanU8 broadcast ZYAN_BITFIELD(ZYDIS_VEX_STATIC_BROADCAST_REQUIRED_BITS);816#endif817} ZydisInstructionDefinitionVEX;818819#ifndef ZYDIS_DISABLE_AVX512820821// MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct822// enum types823ZYAN_STATIC_ASSERT(ZYDIS_IVECTOR_LENGTH_REQUIRED_BITS <= 8);824ZYAN_STATIC_ASSERT(ZYDIS_TUPLETYPE_REQUIRED_BITS <= 8);825ZYAN_STATIC_ASSERT(ZYDIS_IELEMENT_SIZE_REQUIRED_BITS <= 8);826ZYAN_STATIC_ASSERT(ZYDIS_EVEX_FUNC_REQUIRED_BITS <= 8);827ZYAN_STATIC_ASSERT(ZYDIS_MASK_POLICY_REQUIRED_BITS <= 8);828ZYAN_STATIC_ASSERT(ZYDIS_MASK_OVERRIDE_REQUIRED_BITS <= 8);829ZYAN_STATIC_ASSERT(ZYDIS_EVEX_STATIC_BROADCAST_REQUIRED_BITS <= 8);830831/**832* Defines the `ZydisInstructionDefinitionEVEX` struct.833*/834typedef struct ZydisInstructionDefinitionEVEX_835{836ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR_INTEL;837#ifndef ZYDIS_MINIMAL_MODE838ZyanU8 vector_length ZYAN_BITFIELD(ZYDIS_IVECTOR_LENGTH_REQUIRED_BITS);839ZyanU8 tuple_type ZYAN_BITFIELD(ZYDIS_TUPLETYPE_REQUIRED_BITS);840ZyanU8 element_size ZYAN_BITFIELD(ZYDIS_IELEMENT_SIZE_REQUIRED_BITS);841ZyanU8 functionality ZYAN_BITFIELD(ZYDIS_EVEX_FUNC_REQUIRED_BITS);842#endif843ZyanU8 mask_policy ZYAN_BITFIELD(ZYDIS_MASK_POLICY_REQUIRED_BITS);844ZyanBool accepts_zero_mask ZYAN_BITFIELD( 1);845#ifndef ZYDIS_MINIMAL_MODE846ZyanU8 mask_override ZYAN_BITFIELD(ZYDIS_MASK_OVERRIDE_REQUIRED_BITS);847ZyanU8 broadcast ZYAN_BITFIELD(ZYDIS_EVEX_STATIC_BROADCAST_REQUIRED_BITS);848#endif849} ZydisInstructionDefinitionEVEX;850#endif851852#ifndef ZYDIS_DISABLE_KNC853854// MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct855// enum types856ZYAN_STATIC_ASSERT(ZYDIS_MVEX_FUNC_REQUIRED_BITS <= 8);857ZYAN_STATIC_ASSERT(ZYDIS_MASK_POLICY_REQUIRED_BITS <= 8);858ZYAN_STATIC_ASSERT(ZYDIS_MVEX_STATIC_BROADCAST_REQUIRED_BITS <= 8);859860/**861* Defines the `ZydisInstructionDefinitionMVEX` struct.862*/863typedef struct ZydisInstructionDefinitionMVEX_864{865ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR_INTEL;866ZyanU8 functionality ZYAN_BITFIELD(ZYDIS_MVEX_FUNC_REQUIRED_BITS);867ZyanU8 mask_policy ZYAN_BITFIELD(ZYDIS_MASK_POLICY_REQUIRED_BITS);868#ifndef ZYDIS_MINIMAL_MODE869ZyanBool has_element_granularity ZYAN_BITFIELD( 1);870ZyanU8 broadcast ZYAN_BITFIELD(ZYDIS_MVEX_STATIC_BROADCAST_REQUIRED_BITS);871#endif872} ZydisInstructionDefinitionMVEX;873#endif874875/* ---------------------------------------------------------------------------------------------- */876877#pragma pack(pop)878879#ifdef ZYAN_MSVC880# pragma warning(pop)881#endif882883/* ---------------------------------------------------------------------------------------------- */884/* Accessed CPU/FPU flags */885/* ---------------------------------------------------------------------------------------------- */886887/*888* Contains information about the CPU/FPU flags accessed by an instruction.889*890* We don't want this struct to be packed! A pointer to the individual members will be used by the891* `ZydisDecodedInstruction` struct.892*/893typedef struct ZydisDefinitionAccessedFlags_894{895ZydisAccessedFlags cpu_flags;896ZydisAccessedFlags fpu_flags;897} ZydisDefinitionAccessedFlags;898899/* ---------------------------------------------------------------------------------------------- */900901/* ============================================================================================== */902/* Functions */903/* ============================================================================================== */904905/* ---------------------------------------------------------------------------------------------- */906/* Instruction definition */907/* ---------------------------------------------------------------------------------------------- */908909/**910* Returns the instruction-definition with the given `encoding` and `id`.911*912* @param encoding The instruction-encoding.913* @param id The definition-id.914* @param definition A pointer to the variable that receives a pointer to the instruction-915* definition.916*/917ZYDIS_NO_EXPORT void ZydisGetInstructionDefinition(ZydisInstructionEncoding encoding,918ZyanU16 id, const ZydisInstructionDefinition** definition);919920/* ---------------------------------------------------------------------------------------------- */921/* Operand definition */922/* ---------------------------------------------------------------------------------------------- */923924#ifndef ZYDIS_MINIMAL_MODE925/**926* Returns the the operand-definitions for the given instruction-`definition`.927*928* @param definition A pointer to the instruction-definition.929*930* @return A pointer to the first operand definition of the instruction, or `ZYAN_NULL`.931*/932ZYDIS_NO_EXPORT const ZydisOperandDefinition* ZydisGetOperandDefinitions(933const ZydisInstructionDefinition* definition);934#endif935936/* ---------------------------------------------------------------------------------------------- */937/* Element info */938/* ---------------------------------------------------------------------------------------------- */939940#ifndef ZYDIS_MINIMAL_MODE941/**942* Returns the actual type and size of an internal element-type.943*944* @param element The internal element type.945* @param type The actual element type.946* @param size The element size.947*/948ZYDIS_NO_EXPORT void ZydisGetElementInfo(ZydisInternalElementType element, ZydisElementType* type,949ZydisElementSize* size);950#endif951952/* ---------------------------------------------------------------------------------------------- */953/* Accessed CPU flags */954/* ---------------------------------------------------------------------------------------------- */955956#ifndef ZYDIS_MINIMAL_MODE957/**958* Returns the the operand-definitions for the given instruction-`definition`.959*960* @param definition A pointer to the instruction-definition.961* @param flags A pointer to the variable that receives the `ZydisDefinitionAccessedFlags`962* struct.963*964* @return `ZYAN_TRUE`, if the instruction accesses any flags, or `ZYAN_FALSE`, if not.965*/966ZYDIS_NO_EXPORT ZyanBool ZydisGetAccessedFlags(const ZydisInstructionDefinition* definition,967const ZydisDefinitionAccessedFlags** flags);968#endif969970/* ---------------------------------------------------------------------------------------------- */971972/* ============================================================================================== */973974#ifdef __cplusplus975}976#endif977978#endif /* ZYDIS_INTERNAL_SHAREDDATA_H */979980981