KVM: x86 emulator: Avoid pushing back ModRM byte fetched for group decoding
Although ModRM byte is fetched for group decoding, it is soon pushed back to make decode_modrm() fetch it later again. Now that ModRM flag can be found in the top level opcode tables, fetch ModRM byte before group decoding to make the code simpler. Signed-off-by: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp> Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
parent
1c2545be05
commit
9f4260e73a
@ -972,7 +972,6 @@ static int decode_modrm(struct x86_emulate_ctxt *ctxt,
|
|||||||
ctxt->modrm_rm = base_reg = (ctxt->rex_prefix & 1) << 3; /* REG.B */
|
ctxt->modrm_rm = base_reg = (ctxt->rex_prefix & 1) << 3; /* REG.B */
|
||||||
}
|
}
|
||||||
|
|
||||||
ctxt->modrm = insn_fetch(u8, ctxt);
|
|
||||||
ctxt->modrm_mod |= (ctxt->modrm & 0xc0) >> 6;
|
ctxt->modrm_mod |= (ctxt->modrm & 0xc0) >> 6;
|
||||||
ctxt->modrm_reg |= (ctxt->modrm & 0x38) >> 3;
|
ctxt->modrm_reg |= (ctxt->modrm & 0x38) >> 3;
|
||||||
ctxt->modrm_rm |= (ctxt->modrm & 0x07);
|
ctxt->modrm_rm |= (ctxt->modrm & 0x07);
|
||||||
@ -3976,17 +3975,16 @@ done_prefixes:
|
|||||||
}
|
}
|
||||||
ctxt->d = opcode.flags;
|
ctxt->d = opcode.flags;
|
||||||
|
|
||||||
|
if (ctxt->d & ModRM)
|
||||||
|
ctxt->modrm = insn_fetch(u8, ctxt);
|
||||||
|
|
||||||
while (ctxt->d & GroupMask) {
|
while (ctxt->d & GroupMask) {
|
||||||
switch (ctxt->d & GroupMask) {
|
switch (ctxt->d & GroupMask) {
|
||||||
case Group:
|
case Group:
|
||||||
ctxt->modrm = insn_fetch(u8, ctxt);
|
|
||||||
--ctxt->_eip;
|
|
||||||
goffset = (ctxt->modrm >> 3) & 7;
|
goffset = (ctxt->modrm >> 3) & 7;
|
||||||
opcode = opcode.u.group[goffset];
|
opcode = opcode.u.group[goffset];
|
||||||
break;
|
break;
|
||||||
case GroupDual:
|
case GroupDual:
|
||||||
ctxt->modrm = insn_fetch(u8, ctxt);
|
|
||||||
--ctxt->_eip;
|
|
||||||
goffset = (ctxt->modrm >> 3) & 7;
|
goffset = (ctxt->modrm >> 3) & 7;
|
||||||
if ((ctxt->modrm >> 6) == 3)
|
if ((ctxt->modrm >> 6) == 3)
|
||||||
opcode = opcode.u.gdual->mod3[goffset];
|
opcode = opcode.u.gdual->mod3[goffset];
|
||||||
|
Loading…
Reference in New Issue
Block a user