diff options
| -rw-r--r-- | arch/x86/kvm/mmu.c | 4 | ||||
| -rw-r--r-- | arch/x86/kvm/paging_tmpl.h | 11 | 
2 files changed, 4 insertions, 11 deletions
| diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 892ffc603ff9..9cafbb499813 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -1983,6 +1983,8 @@ static int set_spte(struct kvm_vcpu *vcpu, u64 *sptep,  	if (host_writable)  		spte |= SPTE_HOST_WRITEABLE; +	else +		pte_access &= ~ACC_WRITE_MASK;  	spte |= (u64)pfn << PAGE_SHIFT; @@ -2222,8 +2224,6 @@ static int __direct_map(struct kvm_vcpu *vcpu, gpa_t v, int write,  		if (iterator.level == level) {  			unsigned pte_access = ACC_ALL; -			if (!map_writable) -				pte_access &= ~ACC_WRITE_MASK;  			mmu_set_spte(vcpu, iterator.sptep, ACC_ALL, pte_access,  				     0, write, 1, &pt_write,  				     level, gfn, pfn, prefault, map_writable); diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h index 5ca9426389b5..53210f1e94c2 100644 --- a/arch/x86/kvm/paging_tmpl.h +++ b/arch/x86/kvm/paging_tmpl.h @@ -511,9 +511,6 @@ static u64 *FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr,  		link_shadow_page(it.sptep, sp);  	} -	if (!map_writable) -		access &= ~ACC_WRITE_MASK; -  	mmu_set_spte(vcpu, it.sptep, access, gw->pte_access & access,  		     user_fault, write_fault, dirty, ptwrite, it.level,  		     gw->gfn, pfn, prefault, map_writable); @@ -809,12 +806,8 @@ static int FNAME(sync_page)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp)  		nr_present++;  		pte_access = sp->role.access & FNAME(gpte_access)(vcpu, gpte); -		if (!(sp->spt[i] & SPTE_HOST_WRITEABLE)) { -			pte_access &= ~ACC_WRITE_MASK; -			host_writable = 0; -		} else { -			host_writable = 1; -		} +		host_writable = sp->spt[i] & SPTE_HOST_WRITEABLE; +  		set_spte(vcpu, &sp->spt[i], pte_access, 0, 0,  			 is_dirty_gpte(gpte), PT_PAGE_TABLE_LEVEL, gfn,  			 spte_to_pfn(sp->spt[i]), true, false, | 
