Commit 09ee57cd authored by Avi Kivity's avatar Avi Kivity

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: default avatarAvi Kivity <avi@redhat.com>
parent dbe77584
...@@ -198,6 +198,7 @@ struct decode_cache { ...@@ -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, ...@@ -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, ...@@ -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 @@ x86_decode_insn(struct x86_emulate_ctxt *ctxt) ...@@ -2405,9 +2405,11 @@ x86_decode_insn(struct x86_emulate_ctxt *ctxt)
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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment