diff options
author | Gleb Natapov <gleb@redhat.com> | 2013-04-11 13:30:01 +0400 |
---|---|---|
committer | Gleb Natapov <gleb@redhat.com> | 2013-04-14 10:44:17 +0400 |
commit | 1146a78b8d88fc0e0ca2ab9c549821242e289432 (patch) | |
tree | 396cf7dd64c7f38b7c50250e545b46b29e4134cc | |
parent | 991eebf9f8e523e7ff1e4d31ac80641582b2e57a (diff) | |
download | linux-1146a78b8d88fc0e0ca2ab9c549821242e289432.tar.xz |
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>
-rw-r--r-- | arch/x86/kvm/emulate.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index ab6fda4eb98f..77b56d5be3e1 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c @@ -4383,7 +4383,7 @@ done_prefixes: ctxt->intercept = opcode.intercept; /* Unrecognised? */ - if (ctxt->d == 0 || (ctxt->d & NotImpl) || (ctxt->d & Undefined)) + if (ctxt->d == 0 || (ctxt->d & NotImpl)) return EMULATION_FAILED; 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; - 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); goto done; } |