Minor, catch VSIB{rip+xxx} in x86 validator as well

This commit is contained in:
kobalicek
2017-03-06 18:54:52 +01:00
parent 35ba2ad83a
commit 528951ab9a
2 changed files with 8 additions and 3 deletions

View File

@@ -3861,7 +3861,7 @@ EmitModSib_LabelRip_X86:
EmitModVSib:
rxReg &= 0x7;
// ==========|> [BASE + INDEX + DISP8|DISP16|DISP32].
// ==========|> [BASE + INDEX + DISP8|DISP32].
if (rmInfo & kX86MemInfo_BaseGp) {
rbReg &= 0x7;
relOffset = rmRel->as<X86Mem>().getOffsetLo32();
@@ -3885,14 +3885,14 @@ EmitModVSib:
EMIT_BYTE(cdOffset);
}
else {
// [BASE + INDEX << SHIFT + DISP16|DISP32].
// [BASE + INDEX << SHIFT + DISP32].
EMIT_BYTE(mod + 0x80); // <- MOD(2, opReg, 4).
EMIT_BYTE(sib);
EMIT_32(relOffset);
}
}
}
// ==========|> [INDEX + DISP16|DISP32].
// ==========|> [INDEX + DISP32].
else if (!(rmInfo & (kX86MemInfo_BaseLabel | kX86MemInfo_BaseRip))) {
// [INDEX << SHIFT + DISP32].
EMIT_BYTE(x86EncodeMod(0, opReg, 4));
@@ -3909,6 +3909,7 @@ EmitModVSib:
goto EmitModSib_LabelRip_X86;
}
else {
// NOTE: This also handles VSIB+RIP, which is not allowed in 64-bit mode.
goto InvalidAddress;
}
}

View File

@@ -3947,6 +3947,10 @@ ASMJIT_FAVOR_SIZE Error X86Inst::validate(
memFlags |= X86Inst::kMemOpMib;
}
// [RIP + {XMM|YMM|ZMM}] is not allowed.
if (baseType == X86Reg::kRegRip && (opFlags & X86Inst::kOpVm))
return DebugUtils::errored(kErrorInvalidAddress);
uint32_t indexId = m.getIndexId();
if (indexId < Operand::kPackedIdMin)
combinedRegMask |= Utils::mask(indexId);