@@ -567,9 +567,9 @@ static u64 mmu_spte_clear_track_bits(struct kvm *kvm, u64 *sptep)
567567
568568 if (!is_shadow_present_pte (old_spte ) ||
569569 !spte_has_volatile_bits (old_spte ))
570- __update_clear_spte_fast (sptep , 0ull );
570+ __update_clear_spte_fast (sptep , SHADOW_NONPRESENT_VALUE );
571571 else
572- old_spte = __update_clear_spte_slow (sptep , 0ull );
572+ old_spte = __update_clear_spte_slow (sptep , SHADOW_NONPRESENT_VALUE );
573573
574574 if (!is_shadow_present_pte (old_spte ))
575575 return old_spte ;
@@ -603,7 +603,7 @@ static u64 mmu_spte_clear_track_bits(struct kvm *kvm, u64 *sptep)
603603 */
604604static void mmu_spte_clear_no_track (u64 * sptep )
605605{
606- __update_clear_spte_fast (sptep , 0ull );
606+ __update_clear_spte_fast (sptep , SHADOW_NONPRESENT_VALUE );
607607}
608608
609609static u64 mmu_spte_get_lockless (u64 * sptep )
@@ -1897,7 +1897,8 @@ static bool kvm_sync_page_check(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp)
18971897
18981898static int kvm_sync_spte (struct kvm_vcpu * vcpu , struct kvm_mmu_page * sp , int i )
18991899{
1900- if (!sp -> spt [i ])
1900+ /* sp->spt[i] has initial value of shadow page table allocation */
1901+ if (sp -> spt [i ] == SHADOW_NONPRESENT_VALUE )
19011902 return 0 ;
19021903
19031904 return vcpu -> arch .mmu -> sync_spte (vcpu , sp , i );
@@ -2461,7 +2462,7 @@ static int mmu_page_zap_pte(struct kvm *kvm, struct kvm_mmu_page *sp,
24612462 return kvm_mmu_prepare_zap_page (kvm , child ,
24622463 invalid_list );
24632464 }
2464- } else if (is_mmio_spte (pte )) {
2465+ } else if (is_mmio_spte (kvm , pte )) {
24652466 mmu_spte_clear_no_track (spte );
24662467 }
24672468 return 0 ;
@@ -4143,7 +4144,7 @@ static int handle_mmio_page_fault(struct kvm_vcpu *vcpu, u64 addr, bool direct)
41434144 if (WARN_ON_ONCE (reserved ))
41444145 return - EINVAL ;
41454146
4146- if (is_mmio_spte (spte )) {
4147+ if (is_mmio_spte (vcpu -> kvm , spte )) {
41474148 gfn_t gfn = get_mmio_spte_gfn (spte );
41484149 unsigned int access = get_mmio_spte_access (spte );
41494150
@@ -4759,7 +4760,7 @@ EXPORT_SYMBOL_GPL(kvm_mmu_new_pgd);
47594760static bool sync_mmio_spte (struct kvm_vcpu * vcpu , u64 * sptep , gfn_t gfn ,
47604761 unsigned int access )
47614762{
4762- if (unlikely (is_mmio_spte (* sptep ))) {
4763+ if (unlikely (is_mmio_spte (vcpu -> kvm , * sptep ))) {
47634764 if (gfn != get_mmio_spte_gfn (* sptep )) {
47644765 mmu_spte_clear_no_track (sptep );
47654766 return true;
@@ -6120,7 +6121,10 @@ int kvm_mmu_create(struct kvm_vcpu *vcpu)
61206121 vcpu -> arch .mmu_page_header_cache .kmem_cache = mmu_page_header_cache ;
61216122 vcpu -> arch .mmu_page_header_cache .gfp_zero = __GFP_ZERO ;
61226123
6123- vcpu -> arch .mmu_shadow_page_cache .gfp_zero = __GFP_ZERO ;
6124+ vcpu -> arch .mmu_shadow_page_cache .init_value =
6125+ SHADOW_NONPRESENT_VALUE ;
6126+ if (!vcpu -> arch .mmu_shadow_page_cache .init_value )
6127+ vcpu -> arch .mmu_shadow_page_cache .gfp_zero = __GFP_ZERO ;
61246128
61256129 vcpu -> arch .mmu = & vcpu -> arch .root_mmu ;
61266130 vcpu -> arch .walk_mmu = & vcpu -> arch .root_mmu ;
@@ -6263,6 +6267,7 @@ static bool kvm_has_zapped_obsolete_pages(struct kvm *kvm)
62636267
62646268void kvm_mmu_init_vm (struct kvm * kvm )
62656269{
6270+ kvm -> arch .shadow_mmio_value = shadow_mmio_value ;
62666271 INIT_LIST_HEAD (& kvm -> arch .active_mmu_pages );
62676272 INIT_LIST_HEAD (& kvm -> arch .zapped_obsolete_pages );
62686273 INIT_LIST_HEAD (& kvm -> arch .possible_nx_huge_pages );
0 commit comments