Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 80668
b: refs/heads/master
c: 9647c14
h: refs/heads/master
v: v3
  • Loading branch information
Izik Eidus authored and Avi Kivity committed Jan 30, 2008
1 parent edf7958 commit 09d5cee
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 13 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: 98348e9507ace5fda95432ff8ca23f13e7f66176
refs/heads/master: 9647c14c98687d0abf5197e74b9d1448ab6ebb95
23 changes: 11 additions & 12 deletions trunk/drivers/kvm/mmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -211,8 +211,8 @@ static int is_io_pte(unsigned long pte)

static int is_rmap_pte(u64 pte)
{
return (pte & (PT_WRITABLE_MASK | PT_PRESENT_MASK))
== (PT_WRITABLE_MASK | PT_PRESENT_MASK);
return pte != shadow_trap_nonpresent_pte
&& pte != shadow_notrap_nonpresent_pte;
}

static void set_shadow_pte(u64 *sptep, u64 spte)
Expand Down Expand Up @@ -488,7 +488,6 @@ static void rmap_write_protect(struct kvm *kvm, u64 gfn)
{
unsigned long *rmapp;
u64 *spte;
u64 *prev_spte;

gfn = unalias_gfn(kvm, gfn);
rmapp = gfn_to_rmap(kvm, gfn);
Expand All @@ -497,13 +496,11 @@ static void rmap_write_protect(struct kvm *kvm, u64 gfn)
while (spte) {
BUG_ON(!spte);
BUG_ON(!(*spte & PT_PRESENT_MASK));
BUG_ON(!(*spte & PT_WRITABLE_MASK));
rmap_printk("rmap_write_protect: spte %p %llx\n", spte, *spte);
prev_spte = spte;
spte = rmap_next(kvm, rmapp, spte);
rmap_remove(kvm, prev_spte);
set_shadow_pte(prev_spte, *prev_spte & ~PT_WRITABLE_MASK);
if (is_writeble_pte(*spte))
set_shadow_pte(spte, *spte & ~PT_WRITABLE_MASK);
kvm_flush_remote_tlbs(kvm);
spte = rmap_next(kvm, rmapp, spte);
}
}

Expand Down Expand Up @@ -908,14 +905,18 @@ static int nonpaging_map(struct kvm_vcpu *vcpu, gva_t v, hpa_t p)
table = __va(table_addr);

if (level == 1) {
int was_rmapped;

pte = table[index];
was_rmapped = is_rmap_pte(pte);
if (is_shadow_present_pte(pte) && is_writeble_pte(pte))
return 0;
mark_page_dirty(vcpu->kvm, v >> PAGE_SHIFT);
page_header_update_slot(vcpu->kvm, table, v);
table[index] = p | PT_PRESENT_MASK | PT_WRITABLE_MASK |
PT_USER_MASK;
rmap_add(vcpu, &table[index], v >> PAGE_SHIFT);
if (!was_rmapped)
rmap_add(vcpu, &table[index], v >> PAGE_SHIFT);
return 0;
}

Expand Down Expand Up @@ -1424,10 +1425,8 @@ void kvm_mmu_slot_remove_write_access(struct kvm *kvm, int slot)
pt = page->spt;
for (i = 0; i < PT64_ENT_PER_PAGE; ++i)
/* avoid RMW */
if (pt[i] & PT_WRITABLE_MASK) {
rmap_remove(kvm, &pt[i]);
if (pt[i] & PT_WRITABLE_MASK)
pt[i] &= ~PT_WRITABLE_MASK;
}
}
}

Expand Down

0 comments on commit 09d5cee

Please sign in to comment.