KVM: x86 emulator: cleanup grp3 return value
When x86_emulate_insn() does not know how to emulate instruction it exits via cannot_emulate label in all cases except when emulating grp3. Fix that. Signed-off-by: Gleb Natapov <gleb@redhat.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
This commit is contained in:
parent
a41ffb7540
commit
aca06a8307
|
@ -1397,7 +1397,6 @@ static inline int emulate_grp3(struct x86_emulate_ctxt *ctxt,
|
||||||
struct x86_emulate_ops *ops)
|
struct x86_emulate_ops *ops)
|
||||||
{
|
{
|
||||||
struct decode_cache *c = &ctxt->decode;
|
struct decode_cache *c = &ctxt->decode;
|
||||||
int rc = X86EMUL_CONTINUE;
|
|
||||||
|
|
||||||
switch (c->modrm_reg) {
|
switch (c->modrm_reg) {
|
||||||
case 0 ... 1: /* test */
|
case 0 ... 1: /* test */
|
||||||
|
@ -1410,11 +1409,9 @@ static inline int emulate_grp3(struct x86_emulate_ctxt *ctxt,
|
||||||
emulate_1op("neg", c->dst, ctxt->eflags);
|
emulate_1op("neg", c->dst, ctxt->eflags);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
DPRINTF("Cannot emulate %02x\n", c->b);
|
return 0;
|
||||||
rc = X86EMUL_UNHANDLEABLE;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
return rc;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int emulate_grp45(struct x86_emulate_ctxt *ctxt,
|
static inline int emulate_grp45(struct x86_emulate_ctxt *ctxt,
|
||||||
|
@ -2374,9 +2371,8 @@ special_insn:
|
||||||
c->dst.type = OP_NONE; /* Disable writeback. */
|
c->dst.type = OP_NONE; /* Disable writeback. */
|
||||||
break;
|
break;
|
||||||
case 0xf6 ... 0xf7: /* Grp3 */
|
case 0xf6 ... 0xf7: /* Grp3 */
|
||||||
rc = emulate_grp3(ctxt, ops);
|
if (!emulate_grp3(ctxt, ops))
|
||||||
if (rc != X86EMUL_CONTINUE)
|
goto cannot_emulate;
|
||||||
goto done;
|
|
||||||
break;
|
break;
|
||||||
case 0xf8: /* clc */
|
case 0xf8: /* clc */
|
||||||
ctxt->eflags &= ~EFLG_CF;
|
ctxt->eflags &= ~EFLG_CF;
|
||||||
|
|
Loading…
Reference in New Issue