Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 356860
b: refs/heads/master
c: 95b3cf6
h: refs/heads/master
v: v3
  • Loading branch information
Xiao Guangrong authored and Marcelo Tosatti committed Jan 22, 2013
1 parent e8718f1 commit 77c77ea
Show file tree
Hide file tree
Showing 2 changed files with 44 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: 22368028febf81f5c6d1e9fdd737d50543219b00
refs/heads/master: 95b3cf69bdf8b27a02d878e24ca353cebb4e009e
61 changes: 43 additions & 18 deletions trunk/arch/x86/kvm/x86.c
Original file line number Diff line number Diff line change
Expand Up @@ -4751,25 +4751,25 @@ static int handle_emulation_failure(struct kvm_vcpu *vcpu)
return r;
}

static bool reexecute_instruction(struct kvm_vcpu *vcpu, gva_t gva)
static bool reexecute_instruction(struct kvm_vcpu *vcpu, gva_t cr2)
{
gpa_t gpa;
gpa_t gpa = cr2;
pfn_t pfn;

if (tdp_enabled)
return false;

gpa = kvm_mmu_gva_to_gpa_system(vcpu, gva, NULL);
if (gpa == UNMAPPED_GVA)
return true; /* let cpu generate fault */
if (!vcpu->arch.mmu.direct_map) {
/*
* Write permission should be allowed since only
* write access need to be emulated.
*/
gpa = kvm_mmu_gva_to_gpa_write(vcpu, cr2, NULL);

/*
* if emulation was due to access to shadowed page table
* and it failed try to unshadow page and re-enter the
* guest to let CPU execute the instruction.
*/
if (kvm_mmu_unprotect_page(vcpu->kvm, gpa_to_gfn(gpa)))
return true;
/*
* If the mapping is invalid in guest, let cpu retry
* it to generate fault.
*/
if (gpa == UNMAPPED_GVA)
return true;
}

/*
* Do not retry the unhandleable instruction if it faults on the
Expand All @@ -4778,12 +4778,37 @@ static bool reexecute_instruction(struct kvm_vcpu *vcpu, gva_t gva)
* instruction -> ...
*/
pfn = gfn_to_pfn(vcpu->kvm, gpa_to_gfn(gpa));
if (!is_error_noslot_pfn(pfn)) {
kvm_release_pfn_clean(pfn);

/*
* If the instruction failed on the error pfn, it can not be fixed,
* report the error to userspace.
*/
if (is_error_noslot_pfn(pfn))
return false;

kvm_release_pfn_clean(pfn);

/* The instructions are well-emulated on direct mmu. */
if (vcpu->arch.mmu.direct_map) {
unsigned int indirect_shadow_pages;

spin_lock(&vcpu->kvm->mmu_lock);
indirect_shadow_pages = vcpu->kvm->arch.indirect_shadow_pages;
spin_unlock(&vcpu->kvm->mmu_lock);

if (indirect_shadow_pages)
kvm_mmu_unprotect_page(vcpu->kvm, gpa_to_gfn(gpa));

return true;
}

return false;
/*
* if emulation was due to access to shadowed page table
* and it failed try to unshadow page and re-enter the
* guest to let CPU execute the instruction.
*/
kvm_mmu_unprotect_page(vcpu->kvm, gpa_to_gfn(gpa));
return true;
}

static bool retry_instruction(struct x86_emulate_ctxt *ctxt,
Expand Down

0 comments on commit 77c77ea

Please sign in to comment.