Minor refactorings and bugfixes

- Added the `ZYDIS_ATTRIB_HAS_MVEX` attribute
- Updated attribute macro values
- Changed size of `ZydisDecodeGranularity` from 32-bit to 8-bit
This commit is contained in:
flobernd 2017-09-09 14:16:54 +02:00
parent 5914abc0be
commit fec4116ad6
3 changed files with 60 additions and 58 deletions

View File

@ -48,7 +48,7 @@ extern "C" {
/** /**
* @brief Defines the @c ZydisDecodeGranularity datatype. * @brief Defines the @c ZydisDecodeGranularity datatype.
*/ */
typedef uint32_t ZydisDecodeGranularity; typedef uint8_t ZydisDecodeGranularity;
/** /**
* @brief Decoder modes defining how granular the instruction should be decoded. * @brief Decoder modes defining how granular the instruction should be decoded.
@ -83,7 +83,7 @@ typedef struct ZydisDecoder_
{ {
ZydisMachineMode machineMode; ZydisMachineMode machineMode;
ZydisAddressWidth addressWidth; ZydisAddressWidth addressWidth;
ZydisDecodeGranularity decodeGranularity; ZydisDecodeGranularity granularity;
} ZydisDecoder; } ZydisDecoder;
/* ---------------------------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------------------------------- */
@ -110,12 +110,12 @@ ZYDIS_EXPORT ZydisStatus ZydisDecoderInit(ZydisDecoder* decoder, ZydisMachineMod
* @param decoder A pointer to the @c ZydisDecoder instance. * @param decoder A pointer to the @c ZydisDecoder instance.
* @param machineMode The machine mode. * @param machineMode The machine mode.
* @param addressWidth The address width. * @param addressWidth The address width.
* @param decodeGranularity The decode granularity. * @param granularity The decode granularity.
* *
* @return A zydis status code. * @return A zydis status code.
*/ */
ZYDIS_EXPORT ZydisStatus ZydisDecoderInitEx(ZydisDecoder* decoder, ZydisMachineMode machineMode, ZYDIS_EXPORT ZydisStatus ZydisDecoderInitEx(ZydisDecoder* decoder, ZydisMachineMode machineMode,
ZydisAddressWidth addressWidth, ZydisDecodeGranularity decodeGranularity); ZydisAddressWidth addressWidth, ZydisDecodeGranularity granularity);
/** /**
* @brief Decodes the instruction in the given input @c buffer. * @brief Decodes the instruction in the given input @c buffer.

View File

@ -177,171 +177,173 @@ typedef struct ZydisDecodedOperand_
*/ */
typedef uint64_t ZydisInstructionAttributes; typedef uint64_t ZydisInstructionAttributes;
// TODO: Update values
/** /**
* @brief The instruction has the ModRM byte. * @brief The instruction has the ModRM byte.
*/ */
#define ZYDIS_ATTRIB_HAS_MODRM 0x0000000000000001 #define ZYDIS_ATTRIB_HAS_MODRM 0x0000000000000001 // (1 << 0)
/** /**
* @brief The instruction has the SUB byte. * @brief The instruction has the SUB byte.
*/ */
#define ZYDIS_ATTRIB_HAS_SIB 0x0000000000000002 #define ZYDIS_ATTRIB_HAS_SIB 0x0000000000000002 // (1 << 1)
/** /**
* @brief The instruction has the REX prefix. * @brief The instruction has the REX prefix.
*/ */
#define ZYDIS_ATTRIB_HAS_REX 0x0000000000000004 #define ZYDIS_ATTRIB_HAS_REX 0x0000000000000004 // (1 << 2)
/** /**
* @brief The instruction has the XOP prefix. * @brief The instruction has the XOP prefix.
*/ */
#define ZYDIS_ATTRIB_HAS_XOP 0x0000000000000008 #define ZYDIS_ATTRIB_HAS_XOP 0x0000000000000008 // (1 << 3)
/** /**
* @brief The instruction has the VEX prefix. * @brief The instruction has the VEX prefix.
*/ */
#define ZYDIS_ATTRIB_HAS_VEX 0x0000000000000010 #define ZYDIS_ATTRIB_HAS_VEX 0x0000000000000010 // (1 << 4)
/** /**
* @brief The instruction has the EVEX prefix. * @brief The instruction has the EVEX prefix.
*/ */
#define ZYDIS_ATTRIB_HAS_EVEX 0x0000000000000020 #define ZYDIS_ATTRIB_HAS_EVEX 0x0000000000000020 // (1 << 5)
/**
* @brief The instruction has the MVEX prefix.
*/
#define ZYDIS_ATTRIB_HAS_MVEX 0x0000000000000040 // (1 << 6)
/** /**
* @brief The instruction has one or more operands with position-relative offsets. * @brief The instruction has one or more operands with position-relative offsets.
*/ */
#define ZYDIS_ATTRIB_IS_RELATIVE 0x0000000000000040 #define ZYDIS_ATTRIB_IS_RELATIVE 0x0000000000000080 // (1 << 7)
/** /**
* @brief The instruction is privileged. * @brief The instruction is privileged.
* *
* Priviliged instructions are any instructions that require a current ring level below 3. * Priviliged instructions are any instructions that require a current ring level below 3.
*/ */
#define ZYDIS_ATTRIB_IS_PRIVILEGED 0x0000000000000080 #define ZYDIS_ATTRIB_IS_PRIVILEGED 0x0000000000000100 // (1 << 8)
/** /**
* @brief The instruction accepts the lock prefix (0xF0). * @brief The instruction accepts the lock prefix (0xF0).
*/ */
#define ZYDIS_ATTRIB_ACCEPTS_LOCK 0x0000000000000100 #define ZYDIS_ATTRIB_ACCEPTS_LOCK 0x0000000000000200 // (1 << 9)
/** /**
* @brief The instruction accepts the rep prefix (0xF3). * @brief The instruction accepts the rep prefix (0xF3).
*/ */
#define ZYDIS_ATTRIB_ACCEPTS_REP 0x0000000000000200 #define ZYDIS_ATTRIB_ACCEPTS_REP 0x0000000000000400 // (1 << 10)
/** /**
* @brief The instruction accepts the repe/repz prefix (0xF3). * @brief The instruction accepts the repe/repz prefix (0xF3).
*/ */
#define ZYDIS_ATTRIB_ACCEPTS_REPE 0x0000000000000400 #define ZYDIS_ATTRIB_ACCEPTS_REPE 0x0000000000000800 // (1 << 11)
/** /**
* @brief The instruction accepts the repe/repz prefix (0xF3). * @brief The instruction accepts the repe/repz prefix (0xF3).
*/ */
#define ZYDIS_ATTRIB_ACCEPTS_REPZ 0x0000000000000400 #define ZYDIS_ATTRIB_ACCEPTS_REPZ 0x0000000000000800 // (1 << 11)
/** /**
* @brief The instruction accepts the repne/repnz prefix (0xF2). * @brief The instruction accepts the repne/repnz prefix (0xF2).
*/ */
#define ZYDIS_ATTRIB_ACCEPTS_REPNE 0x0000000000000800 #define ZYDIS_ATTRIB_ACCEPTS_REPNE 0x0000000000001000 // (1 << 12)
/** /**
* @brief The instruction accepts the repne/repnz prefix (0xF2). * @brief The instruction accepts the repne/repnz prefix (0xF2).
*/ */
#define ZYDIS_ATTRIB_ACCEPTS_REPNZ 0x0000000000000800 #define ZYDIS_ATTRIB_ACCEPTS_REPNZ 0x0000000000001000 // (1 << 12)
/** /**
* @brief The instruction accepts the bound prefix (0xF2). * @brief The instruction accepts the bound prefix (0xF2).
*/ */
#define ZYDIS_ATTRIB_ACCEPTS_BOUND 0x0000000000001000 #define ZYDIS_ATTRIB_ACCEPTS_BOUND 0x0000000000002000 // (1 << 13)
/** /**
* @brief The instruction accepts the xacquire prefix (0xF2). * @brief The instruction accepts the xacquire prefix (0xF2).
*/ */
#define ZYDIS_ATTRIB_ACCEPTS_XACQUIRE 0x0000000000002000 #define ZYDIS_ATTRIB_ACCEPTS_XACQUIRE 0x0000000000004000 // (1 << 14)
/** /**
* @brief The instruction accepts the xrelease prefix (0xF3). * @brief The instruction accepts the xrelease prefix (0xF3).
*/ */
#define ZYDIS_ATTRIB_ACCEPTS_XRELEASE 0x0000000000004000 #define ZYDIS_ATTRIB_ACCEPTS_XRELEASE 0x0000000000008000 // (1 << 15)
/** /**
* @brief The instruction accepts the xacquire/xrelease prefixes (0xF2, 0xF3) without the * @brief The instruction accepts the xacquire/xrelease prefixes (0xF2, 0xF3) without the
* lock-prefix (0x0F). * lock-prefix (0x0F).
*/ */
#define ZYDIS_ATTRIB_ACCEPTS_HLE_WITHOUT_LOCK 0x0000000000008000 #define ZYDIS_ATTRIB_ACCEPTS_HLE_WITHOUT_LOCK 0x0000000000010000 // (1 << 16)
/** /**
* @brief The instruction accepts branch hints (0x2E, 0x3E). * @brief The instruction accepts branch hints (0x2E, 0x3E).
*/ */
#define ZYDIS_ATTRIB_ACCEPTS_BRANCH_HINTS 0x0000000000010000 #define ZYDIS_ATTRIB_ACCEPTS_BRANCH_HINTS 0x0000000000020000 // (1 << 17)
/** /**
* @brief The instruction accepts segment prefixes (0x2E, 0x36, 0x3E, 0x26, 0x64, 0x65). * @brief The instruction accepts segment prefixes (0x2E, 0x36, 0x3E, 0x26, 0x64, 0x65).
*/ */
#define ZYDIS_ATTRIB_ACCEPTS_SEGMENT 0x0000000000020000 #define ZYDIS_ATTRIB_ACCEPTS_SEGMENT 0x0000000000040000 // (1 << 18)
/** /**
* @brief The instruction has the lock prefix (0xF0). * @brief The instruction has the lock prefix (0xF0).
*/ */
#define ZYDIS_ATTRIB_HAS_LOCK 0x0000000000100000 #define ZYDIS_ATTRIB_HAS_LOCK 0x0000000000080000 // (1 << 19)
/** /**
* @brief The instruction has the rep prefix (0xF3). * @brief The instruction has the rep prefix (0xF3).
*/ */
#define ZYDIS_ATTRIB_HAS_REP 0x0000000000200000 #define ZYDIS_ATTRIB_HAS_REP 0x0000000000100000 // (1 << 20)
/** /**
* @brief The instruction has the repe/repz prefix (0xF3). * @brief The instruction has the repe/repz prefix (0xF3).
*/ */
#define ZYDIS_ATTRIB_HAS_REPE 0x0000000000400000 #define ZYDIS_ATTRIB_HAS_REPE 0x0000000000200000 // (1 << 21)
/** /**
* @brief The instruction has the repe/repz prefix (0xF3). * @brief The instruction has the repe/repz prefix (0xF3).
*/ */
#define ZYDIS_ATTRIB_HAS_REPZ 0x0000000000400000 #define ZYDIS_ATTRIB_HAS_REPZ 0x0000000000200000 // (1 << 21)
/** /**
* @brief The instruction has the repne/repnz prefix (0xF2). * @brief The instruction has the repne/repnz prefix (0xF2).
*/ */
#define ZYDIS_ATTRIB_HAS_REPNE 0x0000000000800000 #define ZYDIS_ATTRIB_HAS_REPNE 0x0000000000400000 // (1 << 22)
/** /**
* @brief The instruction has the repne/repnz prefix (0xF2). * @brief The instruction has the repne/repnz prefix (0xF2).
*/ */
#define ZYDIS_ATTRIB_HAS_REPNZ 0x0000000000800000 #define ZYDIS_ATTRIB_HAS_REPNZ 0x0000000000400000 // (1 << 22)
/** /**
* @brief The instruction has the bound prefix (0xF2). * @brief The instruction has the bound prefix (0xF2).
*/ */
#define ZYDIS_ATTRIB_HAS_BOUND 0x0000000001000000 #define ZYDIS_ATTRIB_HAS_BOUND 0x0000000000800000 // (1 << 23)
/** /**
* @brief The instruction has the xacquire prefix (0xF2). * @brief The instruction has the xacquire prefix (0xF2).
*/ */
#define ZYDIS_ATTRIB_HAS_XACQUIRE 0x0000000002000000 #define ZYDIS_ATTRIB_HAS_XACQUIRE 0x0000000001000000 // (1 << 24)
/** /**
* @brief The instruction has the xrelease prefix (0xF3). * @brief The instruction has the xrelease prefix (0xF3).
*/ */
#define ZYDIS_ATTRIB_HAS_XRELEASE 0x0000000004000000 #define ZYDIS_ATTRIB_HAS_XRELEASE 0x0000000002000000 // (1 << 25)
/** /**
* @brief The instruction has the branch-not-taken hint (0x2E). * @brief The instruction has the branch-not-taken hint (0x2E).
*/ */
#define ZYDIS_ATTRIB_HAS_BRANCH_NOT_TAKEN 0x0000000008000000 #define ZYDIS_ATTRIB_HAS_BRANCH_NOT_TAKEN 0x0000000004000000 // (1 << 26)
/** /**
* @brief The instruction has the branch-taken hint (0x3E). * @brief The instruction has the branch-taken hint (0x3E).
*/ */
#define ZYDIS_ATTRIB_HAS_BRANCH_TAKEN 0x0000000010000000 #define ZYDIS_ATTRIB_HAS_BRANCH_TAKEN 0x0000000008000000 // (1 << 27)
/** /**
* @brief The instruction has a segment modifier. * @brief The instruction has a segment modifier.
*/ */
#define ZYDIS_ATTRIB_HAS_SEGMENT 0x00000007E0000000 #define ZYDIS_ATTRIB_HAS_SEGMENT 0x00000003F0000000
/** /**
* @brief The instruction has the CS segment modifier (0x2E). * @brief The instruction has the CS segment modifier (0x2E).
*/ */
#define ZYDIS_ATTRIB_HAS_SEGMENT_CS 0x0000000020000000 #define ZYDIS_ATTRIB_HAS_SEGMENT_CS 0x0000000010000000 // (1 << 28)
/** /**
* @brief The instruction has the SS segment modifier (0x36). * @brief The instruction has the SS segment modifier (0x36).
*/ */
#define ZYDIS_ATTRIB_HAS_SEGMENT_SS 0x0000000040000000 #define ZYDIS_ATTRIB_HAS_SEGMENT_SS 0x0000000020000000 // (1 << 29)
/** /**
* @brief The instruction has the DS segment modifier (0x3E). * @brief The instruction has the DS segment modifier (0x3E).
*/ */
#define ZYDIS_ATTRIB_HAS_SEGMENT_DS 0x0000000080000000 #define ZYDIS_ATTRIB_HAS_SEGMENT_DS 0x0000000040000000 // (1 << 30)
/** /**
* @brief The instruction has the ES segment modifier (0x26). * @brief The instruction has the ES segment modifier (0x26).
*/ */
#define ZYDIS_ATTRIB_HAS_SEGMENT_ES 0x0000000100000000 #define ZYDIS_ATTRIB_HAS_SEGMENT_ES 0x0000000080000000 // (1 << 31)
/** /**
* @brief The instruction has the FS segment modifier (0x64). * @brief The instruction has the FS segment modifier (0x64).
*/ */
#define ZYDIS_ATTRIB_HAS_SEGMENT_FS 0x0000000200000000 #define ZYDIS_ATTRIB_HAS_SEGMENT_FS 0x0000000100000000 // (1 << 32)
/** /**
* @brief The instruction has the GS segment modifier (0x65). * @brief The instruction has the GS segment modifier (0x65).
*/ */
#define ZYDIS_ATTRIB_HAS_SEGMENT_GS 0x0000000400000000 #define ZYDIS_ATTRIB_HAS_SEGMENT_GS 0x0000000200000000 // (1 << 33)
/** /**
* @brief The instruction has the operand-size prefix (0x66). * @brief The instruction has the operand-size prefix (0x66).
*/ */
#define ZYDIS_ATTRIB_HAS_OPERANDSIZE 0x0000000800000000 #define ZYDIS_ATTRIB_HAS_OPERANDSIZE 0x0000000400000000 // (1 << 34)
/** /**
* @brief The instruction has the address-size prefix (0x67). * @brief The instruction has the address-size prefix (0x67).
*/ */
#define ZYDIS_ATTRIB_HAS_ADDRESSSIZE 0x0000001000000000 #define ZYDIS_ATTRIB_HAS_ADDRESSSIZE 0x0000000800000000 // (1 << 35)
/* ---------------------------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------------------------------- */
/* R/E/FLAGS info */ /* R/E/FLAGS info */

View File

@ -592,7 +592,7 @@ static ZydisStatus ZydisDecodeMVEX(ZydisDecoderContext* context,
ZYDIS_ASSERT(instruction); ZYDIS_ASSERT(instruction);
ZYDIS_ASSERT(data[0] == 0x62); ZYDIS_ASSERT(data[0] == 0x62);
instruction->attributes |= ZYDIS_ATTRIB_HAS_EVEX; instruction->attributes |= ZYDIS_ATTRIB_HAS_MVEX;
instruction->raw.mvex.isDecoded = ZYDIS_TRUE; instruction->raw.mvex.isDecoded = ZYDIS_TRUE;
instruction->raw.mvex.data[0] = 0x62; instruction->raw.mvex.data[0] = 0x62;
instruction->raw.mvex.data[1] = data[1]; instruction->raw.mvex.data[1] = data[1];
@ -4282,7 +4282,7 @@ static ZydisStatus ZydisDecodeInstruction(ZydisDecoderContext* context,
instruction->meta.isaExt = definition->isaExt; instruction->meta.isaExt = definition->isaExt;
instruction->meta.exceptionClass = definition->exceptionClass; instruction->meta.exceptionClass = definition->exceptionClass;
if (context->decoder->decodeGranularity == ZYDIS_DECODE_GRANULARITY_FULL) if (context->decoder->granularity == ZYDIS_DECODE_GRANULARITY_FULL)
{ {
ZydisSetAttributes(context, instruction, definition); ZydisSetAttributes(context, instruction, definition);
switch (instruction->encoding) switch (instruction->encoding)
@ -4328,12 +4328,12 @@ ZydisStatus ZydisDecoderInit(ZydisDecoder* decoder, ZydisMachineMode machineMode
} }
ZydisStatus ZydisDecoderInitEx(ZydisDecoder* decoder, ZydisMachineMode machineMode, ZydisStatus ZydisDecoderInitEx(ZydisDecoder* decoder, ZydisMachineMode machineMode,
ZydisAddressWidth addressWidth, ZydisDecodeGranularity decodeGranularity) ZydisAddressWidth addressWidth, ZydisDecodeGranularity granularity)
{ {
if (!decoder || ((machineMode != 16) && (machineMode != 32) && (machineMode != 64)) || if (!decoder || ((machineMode != 16) && (machineMode != 32) && (machineMode != 64)) ||
((decodeGranularity != ZYDIS_DECODE_GRANULARITY_DEFAULT) && ((granularity != ZYDIS_DECODE_GRANULARITY_DEFAULT) &&
(decodeGranularity != ZYDIS_DECODE_GRANULARITY_MINIMAL) && (granularity != ZYDIS_DECODE_GRANULARITY_MINIMAL) &&
(decodeGranularity != ZYDIS_DECODE_GRANULARITY_FULL))) (granularity != ZYDIS_DECODE_GRANULARITY_FULL)))
{ {
return ZYDIS_STATUS_INVALID_PARAMETER; return ZYDIS_STATUS_INVALID_PARAMETER;
} }
@ -4350,14 +4350,14 @@ ZydisStatus ZydisDecoderInitEx(ZydisDecoder* decoder, ZydisMachineMode machineMo
return ZYDIS_STATUS_INVALID_PARAMETER; return ZYDIS_STATUS_INVALID_PARAMETER;
} }
} }
if (decodeGranularity == ZYDIS_DECODE_GRANULARITY_DEFAULT) if (granularity == ZYDIS_DECODE_GRANULARITY_DEFAULT)
{ {
decodeGranularity = ZYDIS_DECODE_GRANULARITY_FULL; granularity = ZYDIS_DECODE_GRANULARITY_FULL;
} }
decoder->machineMode = machineMode; decoder->machineMode = machineMode;
decoder->addressWidth = addressWidth; decoder->addressWidth = addressWidth;
decoder->decodeGranularity = decodeGranularity; decoder->granularity = granularity;
return ZYDIS_STATUS_SUCCESS; return ZYDIS_STATUS_SUCCESS;
} }