KVM: emulator: Do not fail on emulation of undefined opcode
Emulation of undefined opcode should inject #UD instead of causing emulation failure. Do that by moving Undefined flag check to emulation stage and injection #UD there. Signed-off-by: Gleb Natapov <gleb@redhat.com>
This commit is contained in:
parent
991eebf9f8
commit
1146a78b8d
@ -4383,7 +4383,7 @@ done_prefixes:
|
|||||||
ctxt->intercept = opcode.intercept;
|
ctxt->intercept = opcode.intercept;
|
||||||
|
|
||||||
/* Unrecognised? */
|
/* Unrecognised? */
|
||||||
if (ctxt->d == 0 || (ctxt->d & NotImpl) || (ctxt->d & Undefined))
|
if (ctxt->d == 0 || (ctxt->d & NotImpl))
|
||||||
return EMULATION_FAILED;
|
return EMULATION_FAILED;
|
||||||
|
|
||||||
if (!(ctxt->d & VendorSpecific) && ctxt->only_vendor_specific_insn)
|
if (!(ctxt->d & VendorSpecific) && ctxt->only_vendor_specific_insn)
|
||||||
@ -4521,7 +4521,8 @@ int x86_emulate_insn(struct x86_emulate_ctxt *ctxt)
|
|||||||
|
|
||||||
ctxt->mem_read.pos = 0;
|
ctxt->mem_read.pos = 0;
|
||||||
|
|
||||||
if (ctxt->mode == X86EMUL_MODE_PROT64 && (ctxt->d & No64)) {
|
if ((ctxt->mode == X86EMUL_MODE_PROT64 && (ctxt->d & No64)) ||
|
||||||
|
(ctxt->d & Undefined)) {
|
||||||
rc = emulate_ud(ctxt);
|
rc = emulate_ud(ctxt);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user