linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Sean Christopherson <seanjc@google.com>,
	Dave Hansen <dave.hansen@linux.intel.com>,
	Andy Lutomirski <luto@kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Wei Huang <wei.huang2@amd.com>
Cc: Vitaly Kuznetsov <vkuznets@redhat.com>,
	Wanpeng Li <wanpengli@tencent.com>,
	Jim Mattson <jmattson@google.com>, Joerg Roedel <joro@8bytes.org>,
	kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
	Borislav Petkov <bp@suse.de>,
	Tom Lendacky <thomas.lendacky@amd.com>,
	Brijesh Singh <brijesh.singh@amd.com>
Subject: Re: [PATCH v5 03/15] KVM: SVM: Disable SEV/SEV-ES if NPT is disabled
Date: Thu, 22 Apr 2021 09:14:26 +0200	[thread overview]
Message-ID: <5e8a2d7d-67de-eef4-ab19-33294920f50c@redhat.com> (raw)
In-Reply-To: <20210422021125.3417167-4-seanjc@google.com>

On 22/04/21 04:11, Sean Christopherson wrote:
> Disable SEV and SEV-ES if NPT is disabled.  While the APM doesn't clearly
> state that NPT is mandatory, it's alluded to by:
> 
>    The guest page tables, managed by the guest, may mark data memory pages
>    as either private or shared, thus allowing selected pages to be shared
>    outside the guest.
> 
> And practically speaking, shadow paging can't work since KVM can't read
> the guest's page tables.
> 
> Fixes: e9df09428996 ("KVM: SVM: Add sev module_param")
> Cc: Brijesh Singh <brijesh.singh@amd.com
> Cc: Tom Lendacky <thomas.lendacky@amd.com>
> Signed-off-by: Sean Christopherson <seanjc@google.com>
> ---
>   arch/x86/kvm/svm/svm.c | 30 +++++++++++++++---------------
>   1 file changed, 15 insertions(+), 15 deletions(-)
> 
> diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
> index fed153314aef..0e8489908216 100644
> --- a/arch/x86/kvm/svm/svm.c
> +++ b/arch/x86/kvm/svm/svm.c
> @@ -970,7 +970,21 @@ static __init int svm_hardware_setup(void)
>   		kvm_enable_efer_bits(EFER_SVME | EFER_LMSLE);
>   	}
>   
> -	if (IS_ENABLED(CONFIG_KVM_AMD_SEV) && sev) {
> +	/*
> +	 * KVM's MMU doesn't support using 2-level paging for itself, and thus
> +	 * NPT isn't supported if the host is using 2-level paging since host
> +	 * CR4 is unchanged on VMRUN.
> +	 */
> +	if (!IS_ENABLED(CONFIG_X86_64) && !IS_ENABLED(CONFIG_X86_PAE))
> +		npt_enabled = false;

Unrelated, but since you're moving this code: should we be pre-scient 
and tackle host 5-level paging as well?

Support for 5-level page tables on NPT is not hard to fix and could be 
tested by patching QEMU.  However, the !NPT case would also have to be 
fixed by extending the PDP and PML4 stacking trick to a PML5.

However, without real hardware to test on I'd be a bit wary to do it. 
Looking at 5-level EPT there might be other issues (e.g. what's the 
guest MAXPHYADDR) and I would prefer to see what AMD comes up with 
exactly in the APM.  So I would just block loading KVM on hypothetical 
AMD hosts with CR4.LA57=1.

Paolo

> +	if (!boot_cpu_has(X86_FEATURE_NPT))
> +		npt_enabled = false;
> +
> +	kvm_configure_mmu(npt_enabled, get_max_npt_level(), PG_LEVEL_1G);
> +	pr_info("kvm: Nested Paging %sabled\n", npt_enabled ? "en" : "dis");
> +
> +	if (IS_ENABLED(CONFIG_KVM_AMD_SEV) && sev && npt_enabled) {
>   		sev_hardware_setup();
>   	} else {
>   		sev = false;
> @@ -985,20 +999,6 @@ static __init int svm_hardware_setup(void)
>   			goto err;
>   	}
>   
> -	/*
> -	 * KVM's MMU doesn't support using 2-level paging for itself, and thus
> -	 * NPT isn't supported if the host is using 2-level paging since host
> -	 * CR4 is unchanged on VMRUN.
> -	 */
> -	if (!IS_ENABLED(CONFIG_X86_64) && !IS_ENABLED(CONFIG_X86_PAE))
> -		npt_enabled = false;
> -
> -	if (!boot_cpu_has(X86_FEATURE_NPT))
> -		npt_enabled = false;
> -
> -	kvm_configure_mmu(npt_enabled, get_max_npt_level(), PG_LEVEL_1G);
> -	pr_info("kvm: Nested Paging %sabled\n", npt_enabled ? "en" : "dis");
> -
>   	if (nrips) {
>   		if (!boot_cpu_has(X86_FEATURE_NRIPS))
>   			nrips = false;
> 


  reply	other threads:[~2021-04-22  7:14 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-22  2:11 [PATCH v5 00/15] KVM: SVM: Misc SEV cleanups Sean Christopherson
2021-04-22  2:11 ` [PATCH v5 01/15] KVM: SVM: Zero out the VMCB array used to track SEV ASID association Sean Christopherson
2021-04-22  2:11 ` [PATCH v5 02/15] KVM: SVM: Free sev_asid_bitmap during init if SEV setup fails Sean Christopherson
2021-04-22 19:34   ` Tom Lendacky
2021-04-22  2:11 ` [PATCH v5 03/15] KVM: SVM: Disable SEV/SEV-ES if NPT is disabled Sean Christopherson
2021-04-22  7:14   ` Paolo Bonzini [this message]
2021-04-22 16:15     ` Sean Christopherson
2021-04-22 17:08       ` Paolo Bonzini
2021-04-22 18:11         ` Sean Christopherson
2021-04-23  7:08           ` Paolo Bonzini
2021-04-22  2:11 ` [PATCH v5 04/15] KVM: SVM: Move SEV module params/variables to sev.c Sean Christopherson
2021-04-22  2:11 ` [PATCH v5 05/15] KVM: SEV: Mask CPUID[0x8000001F].eax according to supported features Sean Christopherson
2021-04-22  2:11 ` [PATCH v5 06/15] x86/sev: Drop redundant and potentially misleading 'sev_enabled' Sean Christopherson
2021-04-22 12:05   ` Paolo Bonzini
2021-04-22 12:18     ` Borislav Petkov
2021-04-22 12:16   ` Borislav Petkov
2021-04-22  2:11 ` [PATCH v5 07/15] KVM: SVM: Append "_enabled" to module-scoped SEV/SEV-ES control variables Sean Christopherson
2021-04-22  2:11 ` [PATCH v5 08/15] KVM: SVM: Condition sev_enabled and sev_es_enabled on CONFIG_KVM_AMD_SEV=y Sean Christopherson
2021-04-22  2:11 ` [PATCH v5 09/15] KVM: SVM: Enable SEV/SEV-ES functionality by default (when supported) Sean Christopherson
2021-04-22  2:11 ` [PATCH v5 10/15] KVM: SVM: Unconditionally invoke sev_hardware_teardown() Sean Christopherson
2021-04-22  2:11 ` [PATCH v5 11/15] KVM: SVM: Explicitly check max SEV ASID during sev_hardware_setup() Sean Christopherson
2021-04-22  2:11 ` [PATCH v5 12/15] KVM: SVM: Move SEV VMCB tracking allocation to sev.c Sean Christopherson
2021-04-22  2:11 ` [PATCH v5 13/15] KVM: SVM: Drop redundant svm_sev_enabled() helper Sean Christopherson
2021-04-22  2:11 ` [PATCH v5 14/15] KVM: SVM: Remove an unnecessary prototype declaration of sev_flush_asids() Sean Christopherson
2021-04-22  2:11 ` [PATCH v5 15/15] KVM: SVM: Skip SEV cache flush if no ASIDs have been used Sean Christopherson
2021-04-22  7:30   ` Paolo Bonzini
2021-04-22  7:30 ` [PATCH v5 00/15] KVM: SVM: Misc SEV cleanups Paolo Bonzini
2021-04-22 16:02   ` Sean Christopherson
2021-04-22 17:08     ` Paolo Bonzini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5e8a2d7d-67de-eef4-ab19-33294920f50c@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=bp@suse.de \
    --cc=brijesh.singh@amd.com \
    --cc=dave.hansen@linux.intel.com \
    --cc=jmattson@google.com \
    --cc=joro@8bytes.org \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@kernel.org \
    --cc=peterz@infradead.org \
    --cc=seanjc@google.com \
    --cc=thomas.lendacky@amd.com \
    --cc=vkuznets@redhat.com \
    --cc=wanpengli@tencent.com \
    --cc=wei.huang2@amd.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).