Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 202248
b: refs/heads/master
c: c3cd7ff
h: refs/heads/master
v: v3
  • Loading branch information
Gleb Natapov authored and Avi Kivity committed Aug 1, 2010
1 parent 0750cc8 commit 23e7e37
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 19 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 411c35b7ef02aefb91e166ffeffad0891d955fcb
refs/heads/master: c3cd7ffaf57ae6ead5b394cebaeb76164059a57f
1 change: 1 addition & 0 deletions trunk/arch/x86/include/asm/kvm_emulate.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ struct x86_emulate_ctxt;
#define X86EMUL_PROPAGATE_FAULT 2 /* propagate a generated fault to guest */
#define X86EMUL_RETRY_INSTR 3 /* retry the instruction for some reason */
#define X86EMUL_CMPXCHG_FAILED 4 /* cmpxchg did not see expected value */
#define X86EMUL_IO_NEEDED 5 /* IO is needed to complete emulation */

struct x86_emulate_ops {
/*
Expand Down
36 changes: 18 additions & 18 deletions trunk/arch/x86/kvm/x86.c
Original file line number Diff line number Diff line change
Expand Up @@ -3275,7 +3275,7 @@ static int kvm_read_guest_virt_helper(gva_t addr, void *val, unsigned int bytes,
}
ret = kvm_read_guest(vcpu->kvm, gpa, data, toread);
if (ret < 0) {
r = X86EMUL_UNHANDLEABLE;
r = X86EMUL_IO_NEEDED;
goto out;
}

Expand Down Expand Up @@ -3331,7 +3331,7 @@ static int kvm_write_guest_virt_system(gva_t addr, void *val,
}
ret = kvm_write_guest(vcpu->kvm, gpa, data, towrite);
if (ret < 0) {
r = X86EMUL_UNHANDLEABLE;
r = X86EMUL_IO_NEEDED;
goto out;
}

Expand Down Expand Up @@ -3391,7 +3391,7 @@ static int emulator_read_emulated(unsigned long addr,
vcpu->run->mmio.len = vcpu->mmio_size = bytes;
vcpu->run->mmio.is_write = vcpu->mmio_is_write = 0;

return X86EMUL_UNHANDLEABLE;
return X86EMUL_IO_NEEDED;
}

int emulator_write_phys(struct kvm_vcpu *vcpu, gpa_t gpa,
Expand Down Expand Up @@ -3863,8 +3863,6 @@ int emulate_instruction(struct kvm_vcpu *vcpu,
*/
cache_all_regs(vcpu);

vcpu->mmio_is_write = 0;

if (!(emulation_type & EMULTYPE_NO_DECODE)) {
int cs_db, cs_l;
kvm_x86_ops->get_cs_db_l_bits(vcpu, &cs_db, &cs_l);
Expand Down Expand Up @@ -3938,24 +3936,26 @@ int emulate_instruction(struct kvm_vcpu *vcpu,
return EMULATE_DO_MMIO;
}

if (r) {
if (kvm_mmu_unprotect_page_virt(vcpu, cr2))
goto done;
if (!vcpu->mmio_needed) {
++vcpu->stat.insn_emulation_fail;
trace_kvm_emulate_insn_failed(vcpu);
kvm_report_emulation_failure(vcpu, "mmio");
return EMULATE_FAIL;
}
if (vcpu->mmio_needed) {
if (vcpu->mmio_is_write)
vcpu->mmio_needed = 0;
return EMULATE_DO_MMIO;
}

if (vcpu->mmio_is_write) {
vcpu->mmio_needed = 0;
return EMULATE_DO_MMIO;
if (r) { /* emulation failed */
/*
* if emulation was due to access to shadowed page table
* and it failed try to unshadow page and re-entetr the
* guest to let CPU execute the instruction.
*/
if (kvm_mmu_unprotect_page_virt(vcpu, cr2))
return EMULATE_DONE;

trace_kvm_emulate_insn_failed(vcpu);
kvm_report_emulation_failure(vcpu, "mmio");
return EMULATE_FAIL;
}

done:
if (vcpu->arch.exception.pending)
vcpu->arch.emulate_ctxt.restart = false;

Expand Down

0 comments on commit 23e7e37

Please sign in to comment.