| From a3322d5cd87fef5ec0037fd1b14068a533f9a60f Mon Sep 17 00:00:00 2001 |
| From: Sean Christopherson <seanjc@google.com> |
| Date: Thu, 4 Mar 2021 17:10:45 -0800 |
| Subject: KVM: nSVM: Set the shadow root level to the TDP level for nested NPT |
| |
| From: Sean Christopherson <seanjc@google.com> |
| |
| commit a3322d5cd87fef5ec0037fd1b14068a533f9a60f upstream. |
| |
| Override the shadow root level in the MMU context when configuring |
| NPT for shadowing nested NPT. The level is always tied to the TDP level |
| of the host, not whatever level the guest happens to be using. |
| |
| Fixes: 096586fda522 ("KVM: nSVM: Correctly set the shadow NPT root level in its MMU role") |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Sean Christopherson <seanjc@google.com> |
| Message-Id: <20210305011101.3597423-2-seanjc@google.com> |
| Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/x86/kvm/mmu/mmu.c | 11 ++++++++--- |
| 1 file changed, 8 insertions(+), 3 deletions(-) |
| |
| --- a/arch/x86/kvm/mmu/mmu.c |
| +++ b/arch/x86/kvm/mmu/mmu.c |
| @@ -4630,12 +4630,17 @@ void kvm_init_shadow_npt_mmu(struct kvm_ |
| struct kvm_mmu *context = &vcpu->arch.guest_mmu; |
| union kvm_mmu_role new_role = kvm_calc_shadow_npt_root_page_role(vcpu); |
| |
| - context->shadow_root_level = new_role.base.level; |
| - |
| __kvm_mmu_new_pgd(vcpu, nested_cr3, new_role.base, false, false); |
| |
| - if (new_role.as_u64 != context->mmu_role.as_u64) |
| + if (new_role.as_u64 != context->mmu_role.as_u64) { |
| shadow_mmu_init_context(vcpu, context, cr0, cr4, efer, new_role); |
| + |
| + /* |
| + * Override the level set by the common init helper, nested TDP |
| + * always uses the host's TDP configuration. |
| + */ |
| + context->shadow_root_level = new_role.base.level; |
| + } |
| } |
| EXPORT_SYMBOL_GPL(kvm_init_shadow_npt_mmu); |
| |