mirror of
https://github.com/asmjit/asmjit.git
synced 2025-12-17 12:34:35 +03:00
Minor, catch VSIB{rip+xxx} in x86 validator as well
This commit is contained in:
@@ -3861,7 +3861,7 @@ EmitModSib_LabelRip_X86:
|
|||||||
EmitModVSib:
|
EmitModVSib:
|
||||||
rxReg &= 0x7;
|
rxReg &= 0x7;
|
||||||
|
|
||||||
// ==========|> [BASE + INDEX + DISP8|DISP16|DISP32].
|
// ==========|> [BASE + INDEX + DISP8|DISP32].
|
||||||
if (rmInfo & kX86MemInfo_BaseGp) {
|
if (rmInfo & kX86MemInfo_BaseGp) {
|
||||||
rbReg &= 0x7;
|
rbReg &= 0x7;
|
||||||
relOffset = rmRel->as<X86Mem>().getOffsetLo32();
|
relOffset = rmRel->as<X86Mem>().getOffsetLo32();
|
||||||
@@ -3885,14 +3885,14 @@ EmitModVSib:
|
|||||||
EMIT_BYTE(cdOffset);
|
EMIT_BYTE(cdOffset);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// [BASE + INDEX << SHIFT + DISP16|DISP32].
|
// [BASE + INDEX << SHIFT + DISP32].
|
||||||
EMIT_BYTE(mod + 0x80); // <- MOD(2, opReg, 4).
|
EMIT_BYTE(mod + 0x80); // <- MOD(2, opReg, 4).
|
||||||
EMIT_BYTE(sib);
|
EMIT_BYTE(sib);
|
||||||
EMIT_32(relOffset);
|
EMIT_32(relOffset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ==========|> [INDEX + DISP16|DISP32].
|
// ==========|> [INDEX + DISP32].
|
||||||
else if (!(rmInfo & (kX86MemInfo_BaseLabel | kX86MemInfo_BaseRip))) {
|
else if (!(rmInfo & (kX86MemInfo_BaseLabel | kX86MemInfo_BaseRip))) {
|
||||||
// [INDEX << SHIFT + DISP32].
|
// [INDEX << SHIFT + DISP32].
|
||||||
EMIT_BYTE(x86EncodeMod(0, opReg, 4));
|
EMIT_BYTE(x86EncodeMod(0, opReg, 4));
|
||||||
@@ -3909,6 +3909,7 @@ EmitModVSib:
|
|||||||
goto EmitModSib_LabelRip_X86;
|
goto EmitModSib_LabelRip_X86;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
// NOTE: This also handles VSIB+RIP, which is not allowed in 64-bit mode.
|
||||||
goto InvalidAddress;
|
goto InvalidAddress;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3947,6 +3947,10 @@ ASMJIT_FAVOR_SIZE Error X86Inst::validate(
|
|||||||
memFlags |= X86Inst::kMemOpMib;
|
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();
|
uint32_t indexId = m.getIndexId();
|
||||||
if (indexId < Operand::kPackedIdMin)
|
if (indexId < Operand::kPackedIdMin)
|
||||||
combinedRegMask |= Utils::mask(indexId);
|
combinedRegMask |= Utils::mask(indexId);
|
||||||
|
|||||||
Reference in New Issue
Block a user