mirror of
https://github.com/asmjit/asmjit.git
synced 2025-12-17 04:24:37 +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:
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user