Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 202413
b: refs/heads/master
c: 5991b33
h: refs/heads/master
i:
  202411: 82ee1b6
v: v3
  • Loading branch information
Avi Kivity committed Aug 2, 2010
1 parent 1cead56 commit bd2907f
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 10 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: 0b3c933302262d83018dd5f69656bca9f28a0cd3
refs/heads/master: 5991b33237b7fc7dd9f62ae04998c42217d444a7
33 changes: 24 additions & 9 deletions trunk/arch/x86/kvm/paging_tmpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -319,10 +319,11 @@ static u64 *FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr,
int *ptwrite, pfn_t pfn)
{
unsigned access = gw->pt_access;
struct kvm_mmu_page *sp;
struct kvm_mmu_page *sp = NULL;
u64 *sptep = NULL;
int uninitialized_var(level);
bool dirty = is_dirty_gpte(gw->ptes[gw->level - 1]);
int top_level;
unsigned direct_access;
struct kvm_shadow_walk_iterator iterator;

Expand All @@ -333,6 +334,18 @@ static u64 *FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr,
if (!dirty)
direct_access &= ~ACC_WRITE_MASK;

top_level = vcpu->arch.mmu.root_level;
if (top_level == PT32E_ROOT_LEVEL)
top_level = PT32_ROOT_LEVEL;
/*
* Verify that the top-level gpte is still there. Since the page
* is a root page, it is either write protected (and cannot be
* changed from now on) or it is invalid (in which case, we don't
* really care if it changes underneath us after this point).
*/
if (FNAME(gpte_changed)(vcpu, gw, top_level))
goto out_gpte_changed;

for (shadow_walk_init(&iterator, vcpu, addr);
shadow_walk_okay(&iterator) && iterator.level > gw->level;
shadow_walk_next(&iterator)) {
Expand All @@ -343,12 +356,12 @@ static u64 *FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr,

drop_large_spte(vcpu, sptep);

if (is_shadow_present_pte(*sptep))
continue;

table_gfn = gw->table_gfn[level - 2];
sp = kvm_mmu_get_page(vcpu, table_gfn, addr, level-1,
false, access, sptep);
sp = NULL;
if (!is_shadow_present_pte(*sptep)) {
table_gfn = gw->table_gfn[level - 2];
sp = kvm_mmu_get_page(vcpu, table_gfn, addr, level-1,
false, access, sptep);
}

/*
* Verify that the gpte in the page we've just write
Expand All @@ -357,7 +370,8 @@ static u64 *FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr,
if (FNAME(gpte_changed)(vcpu, gw, level - 1))
goto out_gpte_changed;

link_shadow_page(sptep, sp);
if (sp)
link_shadow_page(sptep, sp);
}

for (;
Expand Down Expand Up @@ -392,7 +406,8 @@ static u64 *FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr,
return sptep;

out_gpte_changed:
kvm_mmu_put_page(sp, sptep);
if (sp)
kvm_mmu_put_page(sp, sptep);
kvm_release_pfn_clean(pfn);
return NULL;
}
Expand Down

0 comments on commit bd2907f

Please sign in to comment.