summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Vivier <Laurent.Vivier@bull.net>2007-09-24 17:00:58 +0200
committerAvi Kivity <avi@qumranet.com>2008-01-30 16:52:49 +0100
commita22436b7b8ec9b14a0451d9ac0fdc9d370bd7800 (patch)
treeb96486abefb623cde2c0af4b82c459b9d811865f
parentKVM: x86_emulator: no writeback for bt (diff)
downloadlinux-a22436b7b8ec9b14a0451d9ac0fdc9d370bd7800.tar.xz
linux-a22436b7b8ec9b14a0451d9ac0fdc9d370bd7800.zip
KVM: Purify x86_decode_insn() error case management
The only valid case is on protected page access, other cases are errors. Signed-off-by: Laurent Vivier <Laurent.Vivier@bull.net> Signed-off-by: Avi Kivity <avi@qumranet.com>
-rw-r--r--drivers/kvm/kvm_main.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c
index 2d55bab41634..888b0924c17b 100644
--- a/drivers/kvm/kvm_main.c
+++ b/drivers/kvm/kvm_main.c
@@ -1251,7 +1251,7 @@ int emulate_instruction(struct kvm_vcpu *vcpu,
u16 error_code,
int no_decode)
{
- int r = 0;
+ int r;
vcpu->mmio_fault_cr2 = cr2;
kvm_x86_ops->cache_regs(vcpu);
@@ -1294,10 +1294,14 @@ int emulate_instruction(struct kvm_vcpu *vcpu,
get_segment_base(vcpu, VCPU_SREG_FS);
r = x86_decode_insn(&vcpu->emulate_ctxt, &emulate_ops);
+ if (r) {
+ if (kvm_mmu_unprotect_page_virt(vcpu, cr2))
+ return EMULATE_DONE;
+ return EMULATE_FAIL;
+ }
}
- if (r == 0)
- r = x86_emulate_insn(&vcpu->emulate_ctxt, &emulate_ops);
+ r = x86_emulate_insn(&vcpu->emulate_ctxt, &emulate_ops);
if (vcpu->pio.string)
return EMULATE_DO_MMIO;