From: "Huang, Kai" <kai.huang@intel.com>
To: "kvm@vger.kernel.org" <kvm@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"binbin.wu@linux.intel.com" <binbin.wu@linux.intel.com>
Cc: "robert.hu@linux.intel.com" <robert.hu@linux.intel.com>,
"pbonzini@redhat.com" <pbonzini@redhat.com>, "Christopherson,,
Sean" <seanjc@google.com>, "Gao, Chao" <chao.gao@intel.com>
Subject: Re: [PATCH v8 3/6] KVM: x86: Virtualize CR3.LAM_{U48,U57}
Date: Wed, 10 May 2023 11:59:50 +0000 [thread overview]
Message-ID: <1c47677bfde89d05264bf874286a899ff644986b.camel@intel.com> (raw)
In-Reply-To: <20230510060611.12950-4-binbin.wu@linux.intel.com>
On Wed, 2023-05-10 at 14:06 +0800, Binbin Wu wrote:
> From: Robert Hoo <robert.hu@linux.intel.com>
>
> Add support to allow guests to set two new CR3 non-address control bits for
> guests to enable the new Intel CPU feature Linear Address Masking (LAM) on user
> pointers.
>
> LAM modifies the checking that is applied to 64-bit linear addresses, allowing
> software to use of the untranslated address bits for metadata and masks the
> metadata bits before using them as linear addresses to access memory. LAM uses
> two new CR3 non-address bits LAM_U48 (bit 62) and AM_U57 (bit 61) to configure
> LAM for user pointers. LAM also changes VMENTER to allow both bits to be set in
> VMCS's HOST_CR3 and GUEST_CR3 for virtualization.
>
> When EPT is on, CR3 is not trapped by KVM and it's up to the guest to set any of
> the two LAM control bits. However, when EPT is off, the actual CR3 used by the
> guest is generated from the shadow MMU root which is different from the CR3 that
> is *set* by the guest, and KVM needs to manually apply any active control bits
> to VMCS's GUEST_CR3 based on the cached CR3 *seen* by the guest.
>
> KVM manually checks guest's CR3 to make sure it points to a valid guest physical
> address (i.e. to support smaller MAXPHYSADDR in the guest). Extend this check
> to allow the two LAM control bits to be set. And to make such check generic,
> introduce a new field 'cr3_ctrl_bits' to vcpu to record all feature control bits
> that are allowed to be set by the guest. After check, non-address bits of guest
> CR3 will be stripped off to extract guest physical address.
>
> In case of nested, for a guest which supports LAM, both VMCS12's HOST_CR3 and
> GUEST_CR3 are allowed to have the new LAM control bits set, i.e. when L0 enters
> L1 to emulate a VMEXIT from L2 to L1 or when L0 enters L2 directly. KVM also
> manually checks VMCS12's HOST_CR3 and GUEST_CR3 being valid physical address.
> Extend such check to allow the new LAM control bits too.
>
> Note, LAM doesn't have a global control bit to turn on/off LAM completely, but
> purely depends on hardware's CPUID to determine it can be enabled or not. That
> means, when EPT is on, even when KVM doesn't expose LAM to guest, the guest can
> still set LAM control bits in CR3 w/o causing problem. This is an unfortunate
> virtualization hole. KVM could choose to intercept CR3 in this case and inject
> fault but this would hurt performance when running a normal VM w/o LAM support.
> This is undesirable. Just choose to let the guest do such illegal thing as the
> worst case is guest being killed when KVM eventually find out such illegal
> behaviour and that is the guest to blame.
>
> Opportunistically use GENMASK_ULL() to define __PT_BASE_ADDR_MASK.
> Opportunistically use kvm_vcpu_is_legal_cr3() to check CR3 in SVM nested code,
> to provide a clear distinction b/t CR3 and GPA checks.
>
> Suggested-by: Sean Christopherson <seanjc@google.com>
> Signed-off-by: Robert Hoo <robert.hu@linux.intel.com>
> Co-developed-by: Binbin Wu <binbin.wu@linux.intel.com>
> Signed-off-by: Binbin Wu <binbin.wu@linux.intel.com>
> Tested-by: Xuelian Guo <xuelian.guo@intel.com>
>
[...]
> --- a/arch/x86/kvm/mmu/mmu.c
> +++ b/arch/x86/kvm/mmu/mmu.c
> @@ -3812,7 +3812,13 @@ static int mmu_alloc_shadow_roots(struct kvm_vcpu *vcpu)
> hpa_t root;
>
> root_pgd = kvm_mmu_get_guest_pgd(vcpu, mmu);
> - root_gfn = root_pgd >> PAGE_SHIFT;
> + /*
> + * Guest PGD can be CR3 or EPTP (for nested EPT case). CR3 may contain
> + * additional control bits (e.g. LAM control bits). To be generic,
> + * unconditionally strip non-address bits when computing the GFN since
> + * the guest PGD has already been checked for validity.
> + */
> + root_gfn = (root_pgd & __PT_BASE_ADDR_MASK) >> PAGE_SHIFT;
Looks it's better to mask off non-address bits based on guest's invalid physical
address bits, for instance, based on vcpu->arch.resereved_gpa_bits. But looking
at the old discussion it appears Sean suggested this way:
https://lore.kernel.org/all/ZAuPPv8PUDX2RBQa@google.com/
So anyway:
Reviewed-by: Kai Huang <kai.huang@intel.com>
next prev parent reply other threads:[~2023-05-10 12:00 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-10 6:06 [PATCH v8 0/6] Linear Address Masking (LAM) KVM Enabling Binbin Wu
2023-05-10 6:06 ` [PATCH v8 1/6] KVM: x86: Consolidate flags for __linearize() Binbin Wu
2023-05-10 7:42 ` Chao Gao
2023-05-11 1:25 ` Binbin Wu
2023-05-11 9:58 ` David Laight
2023-05-12 1:35 ` Binbin Wu
2023-05-10 12:41 ` Huang, Kai
2023-05-11 1:30 ` Binbin Wu
2023-05-10 6:06 ` [PATCH v8 2/6] KVM: x86: Virtualize CR4.LAM_SUP Binbin Wu
2023-05-11 12:50 ` Huang, Kai
2023-05-12 1:33 ` Binbin Wu
2023-05-12 10:49 ` Huang, Kai
2023-05-18 4:01 ` Binbin Wu
2023-05-10 6:06 ` [PATCH v8 3/6] KVM: x86: Virtualize CR3.LAM_{U48,U57} Binbin Wu
2023-05-10 8:58 ` Chao Gao
2023-05-11 1:27 ` Binbin Wu
2023-05-10 11:59 ` Huang, Kai [this message]
2023-05-10 6:06 ` [PATCH v8 4/6] KVM: x86: Introduce untag_addr() in kvm_x86_ops Binbin Wu
2023-05-11 6:03 ` Chao Gao
2023-05-11 9:18 ` Binbin Wu
2023-05-11 10:37 ` Chao Gao
2023-05-10 6:06 ` [PATCH v8 5/6] KVM: x86: Untag address when LAM applicable Binbin Wu
2023-05-11 6:28 ` Chao Gao
2023-05-10 6:06 ` [PATCH v8 6/6] KVM: x86: Expose LAM feature to userspace VMM Binbin Wu
2023-05-12 12:49 ` Huang, Kai
2023-05-16 3:30 ` Binbin Wu
2023-05-25 2:08 ` [PATCH v8 0/6] Linear Address Masking (LAM) KVM Enabling Binbin Wu
2023-05-25 15:59 ` Sean Christopherson
2023-06-06 9:26 ` Binbin Wu
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=1c47677bfde89d05264bf874286a899ff644986b.camel@intel.com \
--to=kai.huang@intel.com \
--cc=binbin.wu@linux.intel.com \
--cc=chao.gao@intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=robert.hu@linux.intel.com \
--cc=seanjc@google.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
Powered by JetHome