Merge branch 'next' into test2
diff --git a/arch/X86/X86DisassemblerDecoder.c b/arch/X86/X86DisassemblerDecoder.c index 2dccd40..51bbf8e 100644 --- a/arch/X86/X86DisassemblerDecoder.c +++ b/arch/X86/X86DisassemblerDecoder.c
@@ -407,60 +407,59 @@ * * @param insn - The instruction to be queried. * @param prefix - The prefix. - * @param location - The location to query. * @return - Whether the prefix is at that location. */ -static bool isPrefixAtLocation(struct InternalInstruction *insn, uint8_t prefix, - uint64_t location) +static bool isPrefixAtLocation(struct InternalInstruction *insn, uint8_t prefix) { switch (prefix) { case 0x26: - if (insn->isPrefix26 && insn->prefix26 == location) + if (insn->isPrefix26) return true; break; case 0x2e: - if (insn->isPrefix2e && insn->prefix2e == location) + if (insn->isPrefix2e) return true; break; case 0x36: - if (insn->isPrefix36 && insn->prefix36 == location) + if (insn->isPrefix36) return true; break; case 0x3e: - if (insn->isPrefix3e && insn->prefix3e == location) + if (insn->isPrefix3e) return true; break; case 0x64: - if (insn->isPrefix64 && insn->prefix64 == location) + if (insn->isPrefix64) return true; break; case 0x65: - if (insn->isPrefix65 && insn->prefix65 == location) + if (insn->isPrefix65) return true; break; case 0x66: - if (insn->isPrefix66 && insn->prefix66 == location) + if (insn->isPrefix66) return true; break; case 0x67: - if (insn->isPrefix67 && insn->prefix67 == location) + if (insn->isPrefix67) return true; break; case 0xf0: - if (insn->isPrefixf0 && insn->prefixf0 == location) + if (insn->isPrefixf0) return true; break; case 0xf2: - if (insn->isPrefixf2 && insn->prefixf2 == location) + if (insn->isPrefixf2) return true; break; case 0xf3: - if (insn->isPrefixf3 && insn->prefixf3 == location) + if (insn->isPrefixf3) return true; break; default: break; } + return false; } @@ -697,7 +696,6 @@ } else { unconsumeByte(insn); /* unconsume byte1 */ unconsumeByte(insn); /* unconsume byte */ - insn->necessaryPrefixLocation = insn->readerCursor - 2; } if (insn->vectorExtensionType == TYPE_EVEX) { @@ -742,10 +740,8 @@ if (insn->mode == MODE_64BIT || (byte1 & 0xc0) == 0xc0) { insn->vectorExtensionType = TYPE_VEX_3B; - insn->necessaryPrefixLocation = insn->readerCursor - 1; } else { unconsumeByte(insn); - insn->necessaryPrefixLocation = insn->readerCursor - 1; } if (insn->vectorExtensionType == TYPE_VEX_3B) { @@ -807,10 +803,8 @@ if ((byte1 & 0x38) != 0x0) { /* 0 in these 3 bits is a POP instruction. */ insn->vectorExtensionType = TYPE_XOP; - insn->necessaryPrefixLocation = insn->readerCursor - 1; } else { unconsumeByte(insn); - insn->necessaryPrefixLocation = insn->readerCursor - 1; } if (insn->vectorExtensionType == TYPE_XOP) { @@ -854,15 +848,12 @@ } insn->rexPrefix = byte; - insn->necessaryPrefixLocation = insn->readerCursor - 2; // dbgprintf(insn, "Found REX prefix 0x%hhx", byte); } else { unconsumeByte(insn); - insn->necessaryPrefixLocation = insn->readerCursor - 1; } } else { unconsumeByte(insn); - insn->necessaryPrefixLocation = insn->readerCursor - 1; } } @@ -917,7 +908,7 @@ /* Determine the length of the primary opcode */ uint8_t current; - // printf(">>> readOpcode() = %x\n", insn->readerCursor); + //printf(">>> readOpcode() = %llx\n", insn->readerCursor); insn->opcodeType = ONEBYTE; insn->firstByte = 0x00; @@ -1242,13 +1233,13 @@ return -1; } } else { - if (insn->mode != MODE_16BIT && isPrefixAtLocation(insn, 0x66, insn->necessaryPrefixLocation)) { + if (insn->mode != MODE_16BIT && isPrefixAtLocation(insn, 0x66)) { attrMask |= ATTR_OPSIZE; - } else if (isPrefixAtLocation(insn, 0x67, insn->necessaryPrefixLocation)) { + } else if (isPrefixAtLocation(insn, 0x67)) { attrMask |= ATTR_ADSIZE; - } else if (insn->mode != MODE_16BIT && isPrefixAtLocation(insn, 0xf3, insn->necessaryPrefixLocation)) { + } else if (insn->mode != MODE_16BIT && isPrefixAtLocation(insn, 0xf3)) { attrMask |= ATTR_XS; - } else if (insn->mode != MODE_16BIT && isPrefixAtLocation(insn, 0xf2, insn->necessaryPrefixLocation)) { + } else if (insn->mode != MODE_16BIT && isPrefixAtLocation(insn, 0xf2)) { attrMask |= ATTR_XD; } }
diff --git a/arch/X86/X86DisassemblerDecoder.h b/arch/X86/X86DisassemblerDecoder.h index 8b3e5ba..7309d13 100644 --- a/arch/X86/X86DisassemblerDecoder.h +++ b/arch/X86/X86DisassemblerDecoder.h
@@ -639,10 +639,6 @@ /* The type of the vector extension prefix */ VectorExtensionType vectorExtensionType; - /* The location where a mandatory prefix would have to be (i.e., right before - the opcode, or right before the REX prefix if one is present) */ - uint64_t necessaryPrefixLocation; - /* Sizes of various critical pieces of data, in bytes */ uint8_t registerSize; uint8_t addressSize;