From: Sean Christopherson <sean.j.christopherson@intel.com>
To: Yang Weijiang <weijiang.yang@intel.com>
Cc: pbonzini@redhat.com, rkrcmar@redhat.com, jmattson@google.com,
linux-kernel@vger.kernel.org, kvm@vger.kernel.org,
mst@redhat.com, yu-cheng.yu@intel.com
Subject: Re: [PATCH v3 8/8] KVM:X86: Add user-space read/write interface for CET MSRs.
Date: Thu, 28 Feb 2019 08:32:49 -0800 [thread overview]
Message-ID: <20190228163249.GH6166@linux.intel.com> (raw)
In-Reply-To: <20190225132716.6982-9-weijiang.yang@intel.com>
On Mon, Feb 25, 2019 at 09:27:16PM +0800, Yang Weijiang wrote:
> The Guest MSRs are stored in fpu storage area, they are
> operated by XSAVES/XRSTORS, so use kvm_load_guest_fpu
> to restore them is a convenient way to let KVM access
> them. After finish operation, need to restore Host MSR
> contents by kvm_put_guest_fpu.
>
> Signed-off-by: Yang Weijiang <weijiang.yang@intel.com>
> ---
> arch/x86/kvm/x86.c | 46 +++++++++++++++++++++++++++++++++++++++++++---
> 1 file changed, 43 insertions(+), 3 deletions(-)
>
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index a0f8b71b2132..a4bdbef3a712 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -75,6 +75,8 @@
>
> #define MAX_IO_MSRS 256
> #define KVM_MAX_MCE_BANKS 32
> +#define MAX_GUEST_CET_MSRS 5
> +
> u64 __read_mostly kvm_mce_cap_supported = MCG_CTL_P | MCG_SER_P;
> EXPORT_SYMBOL_GPL(kvm_mce_cap_supported);
>
> @@ -214,6 +216,8 @@ struct kvm_stats_debugfs_item debugfs_entries[] = {
> u64 __read_mostly host_xcr0;
>
> static int emulator_fix_hypercall(struct x86_emulate_ctxt *ctxt);
> +static void kvm_load_guest_fpu(struct kvm_vcpu *vcpu);
> +static void kvm_put_guest_fpu(struct kvm_vcpu *vcpu);
>
> static inline void kvm_async_pf_hash_reset(struct kvm_vcpu *vcpu)
> {
> @@ -2889,21 +2893,57 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
> }
> EXPORT_SYMBOL_GPL(kvm_get_msr_common);
>
> +static int do_cet_msrs(struct kvm_vcpu *vcpu, int entry_num,
> + struct kvm_msr_entry *entries, bool read)
> +{
> + int i = entry_num;
> + int j = MAX_GUEST_CET_MSRS;
> + bool has_cet;
> +
> + has_cet = guest_cpuid_has(vcpu, X86_FEATURE_SHSTK) |
> + guest_cpuid_has(vcpu, X86_FEATURE_IBT);
> + /*
> + * Guest CET MSRs are saved by XSAVES, so need to restore
> + * them first, then read out or update the contents and
> + * restore Host ones.
> + */
> + if (has_cet) {
> + kvm_load_guest_fpu(vcpu);
> +
> + if (read) {
> + for (j = 0; j < MAX_GUEST_CET_MSRS; j++, i++)
> + rdmsrl(entries[i].index, entries[i].data);
> + } else {
> + for (j = 0; j < MAX_GUEST_CET_MSRS; j++, i++)
> + wrmsrl(entries[i].index, entries[i].data);
> + }
> +
> + kvm_put_guest_fpu(vcpu);
> + }
> + return j;
> +}
> /*
> * Read or write a bunch of msrs. All parameters are kernel addresses.
> *
> * @return number of msrs set successfully.
> */
> static int __msr_io(struct kvm_vcpu *vcpu, struct kvm_msrs *msrs,
> - struct kvm_msr_entry *entries,
> + struct kvm_msr_entry *entries, bool read,
> int (*do_msr)(struct kvm_vcpu *vcpu,
> unsigned index, u64 *data))
> {
> int i;
>
> - for (i = 0; i < msrs->nmsrs; ++i)
> + for (i = 0; i < msrs->nmsrs; ++i) {
> + /* If it comes to CET related MSRs, read them together. */
> + if (entries[i].index == MSR_IA32_U_CET) {
> + i += do_cet_msrs(vcpu, i, entries, read) - 1;
This wrong, not to mention horribly buggy. The correct way to handle
MSRs that are switched via the VMCS is to read/write the VMCS in
vmx_{get,set}_msr() as needed, e.g. vmcs_writel(GUEST_GS_BASE, data).
> + continue;
> + }
> +
> if (do_msr(vcpu, entries[i].index, &entries[i].data))
> break;
> + }
>
> return i;
> }
> @@ -2938,7 +2978,7 @@ static int msr_io(struct kvm_vcpu *vcpu, struct kvm_msrs __user *user_msrs,
> goto out;
> }
>
> - r = n = __msr_io(vcpu, &msrs, entries, do_msr);
> + r = n = __msr_io(vcpu, &msrs, entries, !!writeback, do_msr);
> if (r < 0)
> goto out_free;
>
> --
> 2.17.1
>
next prev parent reply other threads:[~2019-02-28 16:32 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-02-25 13:27 [PATCH v3 0/8] This patch-set is to enable Guest CET support Yang Weijiang
2019-02-25 13:27 ` [PATCH v3 1/8] KVM:VMX: Define CET VMCS fields and bits Yang Weijiang
2019-02-26 19:31 ` Jim Mattson
2019-02-26 7:52 ` Yang Weijiang
2019-02-28 15:53 ` Sean Christopherson
2019-02-28 9:51 ` Yang Weijiang
2019-02-25 13:27 ` [PATCH v3 2/8] KVM:CPUID: Define CET CPUID bits and CR4.CET master enable bit Yang Weijiang
2019-02-26 19:48 ` Jim Mattson
2019-02-26 7:57 ` Yang Weijiang
2019-03-01 2:15 ` Xiaoyao Li
2019-02-28 16:04 ` Sean Christopherson
2019-02-28 8:10 ` Yang Weijiang
2019-02-25 13:27 ` [PATCH v3 3/8] KVM:CPUID: Add CPUID support for Guest CET Yang Weijiang
2019-02-28 15:59 ` Sean Christopherson
2019-02-28 8:28 ` Yang Weijiang
2019-03-01 14:53 ` Sean Christopherson
2019-03-03 9:36 ` Yang Weijiang
2019-03-04 18:28 ` Sean Christopherson
2019-03-04 12:17 ` Yang Weijiang
2019-03-04 18:47 ` Sean Christopherson
2019-03-04 10:01 ` Yang Weijiang
2019-03-04 18:54 ` Sean Christopherson
2019-03-04 10:11 ` Yang Weijiang
2019-03-08 11:32 ` Paolo Bonzini
2019-03-10 12:18 ` Yang Weijiang
2019-02-25 13:27 ` [PATCH v3 4/8] KVM:CPUID: Fix xsaves area size calculation for CPUID.(EAX=0xD,ECX=1) Yang Weijiang
2019-02-25 13:27 ` [PATCH v3 5/8] KVM:VMX: Pass through host CET related MSRs to Guest Yang Weijiang
2019-03-04 18:53 ` Sean Christopherson
2019-03-04 10:07 ` Yang Weijiang
2019-03-05 3:21 ` Sean Christopherson
2019-02-25 13:27 ` [PATCH v3 6/8] KVM:VMX: Load Guest CET via VMCS when CET is enabled in Guest Yang Weijiang
2019-02-28 16:17 ` Sean Christopherson
2019-02-28 8:38 ` Yang Weijiang
2019-03-01 14:58 ` Sean Christopherson
2019-03-03 12:26 ` Yang Weijiang
2019-03-04 18:43 ` Sean Christopherson
2019-03-04 9:56 ` Yang Weijiang
2019-03-05 3:12 ` Sean Christopherson
2019-03-04 12:36 ` Yang Weijiang
2019-03-08 16:28 ` Sean Christopherson
2019-03-08 16:36 ` Paolo Bonzini
2019-02-25 13:27 ` [PATCH v3 7/8] KVM:X86: Add XSS bit 11 and 12 support for CET xsaves/xrstors Yang Weijiang
2019-02-28 16:25 ` Sean Christopherson
2019-02-28 8:44 ` Yang Weijiang
2019-03-08 11:32 ` Paolo Bonzini
2019-03-10 12:20 ` Yang Weijiang
2019-03-10 13:35 ` Yang Weijiang
2019-03-11 15:32 ` Paolo Bonzini
2019-03-12 14:30 ` Yang Weijiang
2019-03-08 10:49 ` Paolo Bonzini
2019-03-11 1:29 ` Kang, Luwei
2019-02-25 13:27 ` [PATCH v3 8/8] KVM:X86: Add user-space read/write interface for CET MSRs Yang Weijiang
2019-02-28 16:32 ` Sean Christopherson [this message]
2019-02-28 9:41 ` Yang Weijiang
2019-03-08 17:30 ` Sean Christopherson
2019-03-08 17:30 ` Sean Christopherson
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=20190228163249.GH6166@linux.intel.com \
--to=sean.j.christopherson@intel.com \
--cc=jmattson@google.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=rkrcmar@redhat.com \
--cc=weijiang.yang@intel.com \
--cc=yu-cheng.yu@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.