|
@@ -338,30 +338,15 @@ static u64 *FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr,
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- if (is_shadow_present_pte(*sptep) && !is_large_pte(*sptep)) {
|
|
|
- struct kvm_mmu_page *child;
|
|
|
-
|
|
|
- if (level != gw->level)
|
|
|
- continue;
|
|
|
-
|
|
|
- /*
|
|
|
- * For the direct sp, if the guest pte's dirty bit
|
|
|
- * changed form clean to dirty, it will corrupt the
|
|
|
- * sp's access: allow writable in the read-only sp,
|
|
|
- * so we should update the spte at this point to get
|
|
|
- * a new sp with the correct access.
|
|
|
- */
|
|
|
- child = page_header(*sptep & PT64_BASE_ADDR_MASK);
|
|
|
- if (child->role.access == direct_access)
|
|
|
- continue;
|
|
|
-
|
|
|
- mmu_page_remove_parent_pte(child, sptep);
|
|
|
- __set_spte(sptep, shadow_trap_nonpresent_pte);
|
|
|
- kvm_flush_remote_tlbs(vcpu->kvm);
|
|
|
- }
|
|
|
+ if (is_shadow_present_pte(*sptep) && !is_large_pte(*sptep)
|
|
|
+ && level == gw->level)
|
|
|
+ validate_direct_spte(vcpu, sptep, direct_access);
|
|
|
|
|
|
drop_large_spte(vcpu, sptep);
|
|
|
|
|
|
+ if (is_shadow_present_pte(*sptep))
|
|
|
+ continue;
|
|
|
+
|
|
|
if (level <= gw->level) {
|
|
|
direct = 1;
|
|
|
access = direct_access;
|