/* prefix.h diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com Copyright (C) 2003-2016 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ #ifndef PREFIX_H #define PREFIX_H #include "config.h" #include "decoder.h" /* Specifies the type of the extension prefix, such as: REX, 2 bytes VEX, 3 bytes VEX. */ typedef enum {PET_NONE = 0, PET_REX, PET_VEX2BYTES, PET_VEX3BYTES} _PrefixExtType; /* Specifies an index into a table of prefixes by their type. */ typedef enum {PFXIDX_NONE = -1, PFXIDX_REX, PFXIDX_LOREP, PFXIDX_SEG, PFXIDX_OP_SIZE, PFXIDX_ADRS, PFXIDX_MAX} _PrefixIndexer; /* * This holds the prefixes state for the current instruction we decode. * decodedPrefixes includes all specific prefixes that the instruction got. * start is a pointer to the first prefix to take into account. * last is a pointer to the last byte we scanned. * Other pointers are used to keep track of prefixes positions and help us know if they appeared already and where. */ typedef struct { _iflags decodedPrefixes, usedPrefixes; const uint8_t *start, *last, *vexPos, *rexPos; _PrefixExtType prefixExtType; uint16_t unusedPrefixesMask; /* Indicates whether the operand size prefix (0x66) was used as a mandatory prefix. */ int isOpSizeMandatory; /* If VEX prefix is used, store the VEX.vvvv field. */ unsigned int vexV; /* The fields B/X/R/W/L of REX and VEX are stored together in this byte. */ unsigned int vrex; /* !! Make sure pfxIndexer is LAST! Otherwise memset won't work well with it. !! */ /* Holds the offset to the prefix byte by its type. */ int pfxIndexer[PFXIDX_MAX]; } _PrefixState; /* * Intel supports 6 types of prefixes, whereas AMD supports 5 types (lock is seperated from rep/nz). * REX is the fifth prefix type, this time I'm based on AMD64. * VEX is the 6th, though it can't be repeated. */ #define MAX_PREFIXES (5) int prefixes_is_valid(unsigned int ch, _DecodeType dt); void prefixes_ignore(_PrefixState* ps, _PrefixIndexer pi); void prefixes_ignore_all(_PrefixState* ps); uint16_t prefixes_set_unused_mask(_PrefixState* ps); void prefixes_decode(const uint8_t* code, int codeLen, _PrefixState* ps, _DecodeType dt); void prefixes_use_segment(_iflags defaultSeg, _PrefixState* ps, _DecodeType dt, _DInst* di); #endif /* PREFIX_H */