aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kvm/mmu.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index 23752ef0839c..731e6fe9cb07 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -1180,11 +1180,16 @@ static int set_spte(struct kvm_vcpu *vcpu, u64 *shadow_pte,
1180 || (write_fault && !is_write_protection(vcpu) && !user_fault)) { 1180 || (write_fault && !is_write_protection(vcpu) && !user_fault)) {
1181 struct kvm_mmu_page *shadow; 1181 struct kvm_mmu_page *shadow;
1182 1182
1183 if (largepage && has_wrprotected_page(vcpu->kvm, gfn)) {
1184 ret = 1;
1185 spte = shadow_trap_nonpresent_pte;
1186 goto set_pte;
1187 }
1188
1183 spte |= PT_WRITABLE_MASK; 1189 spte |= PT_WRITABLE_MASK;
1184 1190
1185 shadow = kvm_mmu_lookup_page(vcpu->kvm, gfn); 1191 shadow = kvm_mmu_lookup_page(vcpu->kvm, gfn);
1186 if (shadow || 1192 if (shadow) {
1187 (largepage && has_wrprotected_page(vcpu->kvm, gfn))) {
1188 pgprintk("%s: found shadow page for %lx, marking ro\n", 1193 pgprintk("%s: found shadow page for %lx, marking ro\n",
1189 __func__, gfn); 1194 __func__, gfn);
1190 ret = 1; 1195 ret = 1;
@@ -1197,6 +1202,7 @@ static int set_spte(struct kvm_vcpu *vcpu, u64 *shadow_pte,
1197 if (pte_access & ACC_WRITE_MASK) 1202 if (pte_access & ACC_WRITE_MASK)
1198 mark_page_dirty(vcpu->kvm, gfn); 1203 mark_page_dirty(vcpu->kvm, gfn);
1199 1204
1205set_pte:
1200 set_shadow_pte(shadow_pte, spte); 1206 set_shadow_pte(shadow_pte, spte);
1201 return ret; 1207 return ret;
1202} 1208}