From: Chao Gao <chao.gao@intel.com>
To: Robert Hoo <robert.hu@linux.intel.com>
Cc: <seanjc@google.com>, <pbonzini@redhat.com>,
<yu.c.zhang@linux.intel.com>, <yuan.yao@linux.intel.com>,
<jingqi.liu@intel.com>, <weijiang.yang@intel.com>,
<isaku.yamahata@intel.com>, <kirill.shutemov@linux.intel.com>,
<kvm@vger.kernel.org>
Subject: Re: [PATCH v4 5/9] KVM: x86: Untag LAM bits when applicable
Date: Fri, 10 Feb 2023 23:04:54 +0800 [thread overview]
Message-ID: <Y+ZdFtr1fJkdCtRL@gao-cwp> (raw)
In-Reply-To: <20230209024022.3371768-6-robert.hu@linux.intel.com>
On Thu, Feb 09, 2023 at 10:40:18AM +0800, Robert Hoo wrote:
>Define kvm_untagged_addr() per LAM feature spec: Address high bits are sign
>extended, from highest effective address bit.
>Note that LAM_U48 and LA57 has some effective bits overlap. This patch
>gives a WARN() on that case.
Why emit a WARN()? the behavior is undefined or something KVM cannot
emulated?
>
>Signed-off-by: Robert Hoo <robert.hu@linux.intel.com>
>Reviewed-by: Jingqi Liu <jingqi.liu@intel.com>
>---
> arch/x86/kvm/vmx/vmx.c | 3 +++
> arch/x86/kvm/x86.c | 4 ++++
> arch/x86/kvm/x86.h | 32 ++++++++++++++++++++++++++++++++
> 3 files changed, 39 insertions(+)
>
>diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
>index 66edd091f145..e4f14d1bdd2f 100644
>--- a/arch/x86/kvm/vmx/vmx.c
>+++ b/arch/x86/kvm/vmx/vmx.c
>@@ -2163,6 +2163,9 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
> (!msr_info->host_initiated &&
> !guest_cpuid_has(vcpu, X86_FEATURE_MPX)))
> return 1;
>+
>+ data = kvm_untagged_addr(data, vcpu);
This is a MSR write, so LAM masking isn't performed on this write
according to LAM spec. Am I misunderstanding something?
>+
> if (is_noncanonical_address(data & PAGE_MASK, vcpu) ||
> (data & MSR_IA32_BNDCFGS_RSVD))
> return 1;
>diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
>index 312aea1854ae..1bdc8c0c80c0 100644
>--- a/arch/x86/kvm/x86.c
>+++ b/arch/x86/kvm/x86.c
>@@ -1809,6 +1809,10 @@ static int __kvm_set_msr(struct kvm_vcpu *vcpu, u32 index, u64 data,
> case MSR_KERNEL_GS_BASE:
> case MSR_CSTAR:
> case MSR_LSTAR:
>+ /*
>+ * The strict canonical checking still applies to MSR
>+ * writing even LAM is enabled.
>+ */
> if (is_noncanonical_address(data, vcpu))
LAM spec says:
Processors that support LAM continue to require the addresses written to
control registers or MSRs be 57-bit canonical if the processor supports
5-level paging or 48-bit canonical if it supports only 4-level paging
My understanding is 57-bit canonical checking is performed if the processor
__supports__ 5-level paging. Then the is_noncanonical_address() here is
arguably wrong. Could you double-confirm and fix it?
> return 1;
> break;
>diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h
>index 8ec5cc983062..7228895d4a6f 100644
>--- a/arch/x86/kvm/x86.h
>+++ b/arch/x86/kvm/x86.h
>@@ -201,6 +201,38 @@ static inline bool is_noncanonical_address(u64 la, struct kvm_vcpu *vcpu)
> return !__is_canonical_address(la, vcpu_virt_addr_bits(vcpu));
> }
>
>+#ifdef CONFIG_X86_64
I don't get the purpose of the #ifdef. Shouldn't you check if the vcpu
is in 64-bit long mode?
>+/* untag addr for guest, according to vCPU CR3 and CR4 settings */
>+static inline u64 kvm_untagged_addr(u64 addr, struct kvm_vcpu *vcpu)
>+{
>+ if (addr >> 63 == 0) {
>+ /* User pointers */
>+ if (kvm_read_cr3(vcpu) & X86_CR3_LAM_U57)
>+ addr = __canonical_address(addr, 57);
braces are missing.
https://www.kernel.org/doc/html/latest/process/coding-style.html#placing-braces-and-spaces
>+ else if (kvm_read_cr3(vcpu) & X86_CR3_LAM_U48) {
>+ /*
>+ * If guest enabled 5-level paging and LAM_U48,
>+ * bit 47 should be 0, bit 48:56 contains meta data
>+ * although bit 47:56 are valid 5-level address
>+ * bits.
>+ * If LAM_U48 and 4-level paging, bit47 is 0.
>+ */
>+ WARN_ON(addr & _BITUL(47));
>+ addr = __canonical_address(addr, 48);
>+ }
>+ } else if (kvm_read_cr4(vcpu) & X86_CR4_LAM_SUP) { /* Supervisor pointers */
>+ if (kvm_read_cr4(vcpu) & X86_CR4_LA57)
use kvm_read_cr4_bits here to save potential VMCS_READs.
>+ addr = __canonical_address(addr, 57);
>+ else
>+ addr = __canonical_address(addr, 48);
>+ }
>+
>+ return addr;
>+}
>+#else
>+#define kvm_untagged_addr(addr, vcpu) (addr)
>+#endif
>+
> static inline void vcpu_cache_mmio_info(struct kvm_vcpu *vcpu,
> gva_t gva, gfn_t gfn, unsigned access)
> {
>--
>2.31.1
>
next prev parent reply other threads:[~2023-02-10 15:06 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-09 2:40 [PATCH v4 0/9] Linear Address Masking (LAM) KVM Enabling Robert Hoo
2023-02-09 2:40 ` [PATCH v4 1/9] KVM: x86: Intercept CR4.LAM_SUP when LAM feature is enabled in guest Robert Hoo
2023-02-09 9:21 ` Chao Gao
2023-02-09 12:48 ` Robert Hoo
2023-02-10 3:29 ` Yang, Weijiang
2023-02-10 5:02 ` Robert Hoo
2023-02-10 16:30 ` Sean Christopherson
2023-02-14 1:27 ` Binbin Wu
2023-02-14 6:11 ` Robert Hoo
2023-02-14 9:00 ` Binbin Wu
2023-02-14 12:24 ` Robert Hoo
2023-02-14 12:36 ` Robert Hoo
2023-02-16 5:31 ` Binbin Wu
2023-02-16 5:54 ` Robert Hoo
2023-02-09 2:40 ` [PATCH v4 2/9] KVM: x86: MMU: Clear CR3 LAM bits when allocate shadow root Robert Hoo
2023-02-09 9:55 ` Chao Gao
2023-02-09 13:02 ` Robert Hoo
2023-02-14 2:55 ` Binbin Wu
2023-02-15 1:17 ` Robert Hoo
2023-02-16 2:14 ` Robert Hoo
2023-02-10 3:38 ` Yang, Weijiang
2023-02-11 3:12 ` Robert Hoo
2023-02-09 2:40 ` [PATCH v4 3/9] KVM: x86: MMU: Commets update Robert Hoo
2023-02-10 6:59 ` Chao Gao
2023-02-10 7:55 ` Robert Hoo
2023-02-10 16:54 ` Sean Christopherson
2023-02-09 2:40 ` [PATCH v4 4/9] KVM: x86: MMU: Integrate LAM bits when build guest CR3 Robert Hoo
2023-02-10 14:04 ` Chao Gao
2023-02-11 6:24 ` Robert Hoo
2023-02-11 6:29 ` Robert Hoo
2023-02-09 2:40 ` [PATCH v4 5/9] KVM: x86: Untag LAM bits when applicable Robert Hoo
2023-02-10 15:04 ` Chao Gao [this message]
2023-02-11 5:57 ` Robert Hoo
2023-02-16 6:37 ` Binbin Wu
2023-02-09 2:40 ` [PATCH v4 6/9] KVM: x86: When KVM judges CR3 valid or not, consider LAM bits Robert Hoo
2023-02-13 2:01 ` Chao Gao
2023-02-13 13:25 ` Robert Hoo
2023-02-14 6:18 ` Chao Gao
2023-02-14 7:00 ` Chao Gao
2023-02-18 5:44 ` Robert Hoo
2023-02-09 2:40 ` [PATCH v4 7/9] KVM: x86: When guest set CR3, handle LAM bits semantics Robert Hoo
2023-02-13 3:31 ` Chao Gao
2023-02-14 5:28 ` Robert Hoo
2023-02-14 6:48 ` Chao Gao
2023-02-09 2:40 ` [PATCH v4 8/9] KVM: x86: emulation: Apply LAM when emulating data access Robert Hoo
2023-02-13 3:53 ` Chao Gao
2023-02-14 5:38 ` Robert Hoo
2023-02-09 2:40 ` [PATCH v4 9/9] KVM: x86: LAM: Expose LAM CPUID to user space VMM Robert Hoo
2023-02-21 5:47 ` Binbin Wu
2023-02-21 7:26 ` Robert Hoo
2023-02-21 8:26 ` Binbin Wu
2023-02-21 11:13 ` Yu Zhang
2023-02-21 13:18 ` Binbin Wu
2023-02-21 14:36 ` Robert Hoo
2023-02-09 6:15 ` [PATCH v4 0/9] Linear Address Masking (LAM) KVM Enabling Chao Gao
2023-02-09 12:25 ` Robert Hoo
2023-02-09 17:27 ` Sean Christopherson
2023-02-10 2:07 ` Robert Hoo
2023-02-10 3:17 ` Chao Gao
2023-02-10 8:41 ` Robert Hoo
2023-02-10 8:39 ` Robert Hoo
2023-02-10 9:22 ` Chao Gao
2023-02-13 9:02 ` Binbin Wu
2023-02-13 13:16 ` Robert Hoo
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=Y+ZdFtr1fJkdCtRL@gao-cwp \
--to=chao.gao@intel.com \
--cc=isaku.yamahata@intel.com \
--cc=jingqi.liu@intel.com \
--cc=kirill.shutemov@linux.intel.com \
--cc=kvm@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=robert.hu@linux.intel.com \
--cc=seanjc@google.com \
--cc=weijiang.yang@intel.com \
--cc=yu.c.zhang@linux.intel.com \
--cc=yuan.yao@linux.intel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.