提交 140bad89 编写于 作者: N Nadav Amit 提交者: Paolo Bonzini

KVM: x86: emulation of dword cmov on long-mode should clear [63:32]

Even if the condition of cmov is not satisfied, bits[63:32] should be cleared.
This is clearly stated in Intel's CMOVcc documentation.  The solution is to
reassign the destination onto itself if the condition is unsatisfied.  For that
matter the original destination value needs to be read.
Signed-off-by: NNadav Amit <namit@cs.technion.ac.il>
Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
上级 9e8919ae
...@@ -3923,7 +3923,7 @@ static const struct opcode twobyte_table[256] = { ...@@ -3923,7 +3923,7 @@ static const struct opcode twobyte_table[256] = {
N, N, N, N,
N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N,
/* 0x40 - 0x4F */ /* 0x40 - 0x4F */
X16(D(DstReg | SrcMem | ModRM | Mov)), X16(D(DstReg | SrcMem | ModRM)),
/* 0x50 - 0x5F */ /* 0x50 - 0x5F */
N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N,
/* 0x60 - 0x6F */ /* 0x60 - 0x6F */
...@@ -4824,8 +4824,10 @@ int x86_emulate_insn(struct x86_emulate_ctxt *ctxt) ...@@ -4824,8 +4824,10 @@ int x86_emulate_insn(struct x86_emulate_ctxt *ctxt)
ops->get_dr(ctxt, ctxt->modrm_reg, &ctxt->dst.val); ops->get_dr(ctxt, ctxt->modrm_reg, &ctxt->dst.val);
break; break;
case 0x40 ... 0x4f: /* cmov */ case 0x40 ... 0x4f: /* cmov */
ctxt->dst.val = ctxt->dst.orig_val = ctxt->src.val; if (test_cc(ctxt->b, ctxt->eflags))
if (!test_cc(ctxt->b, ctxt->eflags)) ctxt->dst.val = ctxt->src.val;
else if (ctxt->mode != X86EMUL_MODE_PROT64 ||
ctxt->op_bytes != 4)
ctxt->dst.type = OP_NONE; /* no writeback */ ctxt->dst.type = OP_NONE; /* no writeback */
break; break;
case 0x80 ... 0x8f: /* jnz rel, etc*/ case 0x80 ... 0x8f: /* jnz rel, etc*/
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册