KVM: MMU: fix Dirty bit missed if CR0.WP = 0
authorXiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
Tue, 8 Jan 2013 06:36:04 +0000 (14:36 +0800)
committerMarcelo Tosatti <mtosatti@redhat.com>
Thu, 10 Jan 2013 17:28:08 +0000 (15:28 -0200)
commitc22885050e651c2f5d2a1706cdc2eb38698db968
treef3d7038088a6d06e897c0d71c3d55aed690105a0
parentb26ba22bb4f12289f9d5eb878c490e674934a197
KVM: MMU: fix Dirty bit missed if CR0.WP = 0

If the write-fault access is from supervisor and CR0.WP is not set on the
vcpu, kvm will fix it by adjusting pte access - it sets the W bit on pte
and clears U bit. This is the chance that kvm can change pte access from
readonly to writable

Unfortunately, the pte access is the access of 'direct' shadow page table,
means direct sp.role.access = pte_access, then we will create a writable
spte entry on the readonly shadow page table. It will cause Dirty bit is
not tracked when two guest ptes point to the same large page. Note, it
does not have other impact except Dirty bit since cr0.wp is encoded into
sp.role

It can be fixed by adjusting pte access before establishing shadow page
table. Also, after that, no mmu specified code exists in the common function
and drop two parameters in set_spte

Signed-off-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
arch/x86/kvm/mmu.c
arch/x86/kvm/paging_tmpl.h