KVM: nVMX: Do not inherit quadrant and invalid for the root shadow EPT
authorSean Christopherson <sean.j.christopherson@intel.com>
Thu, 7 Mar 2019 23:27:43 +0000 (15:27 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 4 May 2019 07:21:20 +0000 (09:21 +0200)
[ Upstream commit 552c69b1dc714854a5f4e27d37a43c6d797adf7d ]

Explicitly zero out quadrant and invalid instead of inheriting them from
the root_mmu.  Functionally, this patch is a nop as we (should) never
set quadrant for a direct mapped (EPT) root_mmu and nested EPT is only
allowed if EPT is used for L1, and the root_mmu will never be invalid at
this point.

Explicitly setting flags sets the stage for repurposing the legacy
paging bits in role, e.g. nxe, cr0_wp, and sm{a,e}p_andnot_wp, at which
point 'smm' would be the only flag to be inherited from root_mmu.

Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Sasha Levin (Microsoft) <sashal@kernel.org>
arch/x86/kvm/mmu.c

index 9ab33cab948664cdf4217583ed574d73f6cea4f8..acab95dcffb68cf54b1265e37967598961008a63 100644 (file)
@@ -4915,11 +4915,15 @@ static union kvm_mmu_role
 kvm_calc_shadow_ept_root_page_role(struct kvm_vcpu *vcpu, bool accessed_dirty,
                                   bool execonly)
 {
-       union kvm_mmu_role role;
+       union kvm_mmu_role role = {0};
+       union kvm_mmu_page_role root_base = vcpu->arch.root_mmu.mmu_role.base;
 
-       /* Base role is inherited from root_mmu */
-       role.base.word = vcpu->arch.root_mmu.mmu_role.base.word;
-       role.ext = kvm_calc_mmu_role_ext(vcpu);
+       /* Legacy paging and SMM flags are inherited from root_mmu */
+       role.base.smm = root_base.smm;
+       role.base.nxe = root_base.nxe;
+       role.base.cr0_wp = root_base.cr0_wp;
+       role.base.smep_andnot_wp = root_base.smep_andnot_wp;
+       role.base.smap_andnot_wp = root_base.smap_andnot_wp;
 
        role.base.level = PT64_ROOT_4LEVEL;
        role.base.direct = false;
@@ -4927,6 +4931,7 @@ kvm_calc_shadow_ept_root_page_role(struct kvm_vcpu *vcpu, bool accessed_dirty,
        role.base.guest_mode = true;
        role.base.access = ACC_ALL;
 
+       role.ext = kvm_calc_mmu_role_ext(vcpu);
        role.ext.execonly = execonly;
 
        return role;