forked from Minki/linux
KVM: x86 emulator: push segment override out of decode_modrm()
Let it compute modrm_seg instead, and have the caller apply it. Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
parent
dbe7758482
commit
09ee57cdae
@ -198,6 +198,7 @@ struct decode_cache {
|
|||||||
u8 modrm_mod;
|
u8 modrm_mod;
|
||||||
u8 modrm_reg;
|
u8 modrm_reg;
|
||||||
u8 modrm_rm;
|
u8 modrm_rm;
|
||||||
|
u8 modrm_seg;
|
||||||
u8 use_modrm_ea;
|
u8 use_modrm_ea;
|
||||||
bool rip_relative;
|
bool rip_relative;
|
||||||
unsigned long modrm_ea;
|
unsigned long modrm_ea;
|
||||||
|
@ -593,6 +593,7 @@ static int decode_modrm(struct x86_emulate_ctxt *ctxt,
|
|||||||
c->modrm_rm |= (c->modrm & 0x07);
|
c->modrm_rm |= (c->modrm & 0x07);
|
||||||
c->modrm_ea = 0;
|
c->modrm_ea = 0;
|
||||||
c->use_modrm_ea = 1;
|
c->use_modrm_ea = 1;
|
||||||
|
c->modrm_seg = VCPU_SREG_DS;
|
||||||
|
|
||||||
if (c->modrm_mod == 3) {
|
if (c->modrm_mod == 3) {
|
||||||
c->modrm_ptr = decode_register(c->modrm_rm,
|
c->modrm_ptr = decode_register(c->modrm_rm,
|
||||||
@ -649,8 +650,7 @@ static int decode_modrm(struct x86_emulate_ctxt *ctxt,
|
|||||||
}
|
}
|
||||||
if (c->modrm_rm == 2 || c->modrm_rm == 3 ||
|
if (c->modrm_rm == 2 || c->modrm_rm == 3 ||
|
||||||
(c->modrm_rm == 6 && c->modrm_mod != 0))
|
(c->modrm_rm == 6 && c->modrm_mod != 0))
|
||||||
if (!c->has_seg_override)
|
c->modrm_seg = VCPU_SREG_SS;
|
||||||
set_seg_override(c, VCPU_SREG_SS);
|
|
||||||
c->modrm_ea = (u16)c->modrm_ea;
|
c->modrm_ea = (u16)c->modrm_ea;
|
||||||
} else {
|
} else {
|
||||||
/* 32/64-bit ModR/M decode. */
|
/* 32/64-bit ModR/M decode. */
|
||||||
@ -2405,9 +2405,11 @@ done_prefixes:
|
|||||||
c->op_bytes = 8;
|
c->op_bytes = 8;
|
||||||
|
|
||||||
/* ModRM and SIB bytes. */
|
/* ModRM and SIB bytes. */
|
||||||
if (c->d & ModRM)
|
if (c->d & ModRM) {
|
||||||
rc = decode_modrm(ctxt, ops);
|
rc = decode_modrm(ctxt, ops);
|
||||||
else if (c->d & MemAbs)
|
if (!c->has_seg_override)
|
||||||
|
set_seg_override(c, c->modrm_seg);
|
||||||
|
} else if (c->d & MemAbs)
|
||||||
rc = decode_abs(ctxt, ops);
|
rc = decode_abs(ctxt, ops);
|
||||||
if (rc != X86EMUL_CONTINUE)
|
if (rc != X86EMUL_CONTINUE)
|
||||||
goto done;
|
goto done;
|
||||||
|
Loading…
Reference in New Issue
Block a user