Received: by 2002:ac0:aed5:0:0:0:0:0 with SMTP id t21csp909665imb; Fri, 1 Mar 2019 18:54:00 -0800 (PST) X-Google-Smtp-Source: AHgI3IZk7VaekmJb0nG2F1ur9a1xAV/SeTqZWSOxDYC39e5mey9DYbY3yewmgrIslRZcB0hXV/tk X-Received: by 2002:a62:f5d7:: with SMTP id b84mr8939396pfm.36.1551495240337; Fri, 01 Mar 2019 18:54:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1551495240; cv=none; d=google.com; s=arc-20160816; b=eoQJHraZ7CS/IBV4kaxUsy7KFHVVliJ9aei4HAm4E6sH5b7FPjrlXHtVCnm4JYNxrl muZNL/FdxSdFi1RRTnwg5pzZ0iJrj0GXMvZ9EMRxbZv2xD3Hva65KFHB58taR8U4eUWY ikP7HczvPzgTMIlTzHHiN62GjQZMuwVW0XFeNPlAKz15kssO9TTg/HeI63CZpKgrsm1L gPvz9Z9gMEn6DbnN9A022Jls8vkWvSa3uuI4nuLu7gvoadIo7A3pyl4kF0wNpT7uAtoP c8gzIBeO9vFea+bMO/xCHEqR8VSsK4KQbWMgkZ61RoVsJP0wx/AiAsFddkuCLQSGDuVi 27rA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=3lkefrqpAVnQmi8GoXKII2VbM/IAN1r0yq7NwqKBHME=; b=BZi3OQarORx0buw2Cm17fyvbpacNgSQpykCOzpwnlrr0jBOHkmQY5eshfV4K4Cdj65 GmapWOH1j9LTnYzVcO4+5Lqp1F3TzKY3Sr9oabrP28zA+vUOtbXnAnuq61x6wkBHsWqA sMxU0ey8mJZvUCdaHDuQ0U0PDspYrWsD7N0RcpKycBjw4bYecCPUaXenluOdUX+m9uF2 u6Qpq8F89jle9Xiv9/d89k8ponAr31z5I4IzPpNxwOQ5RDsQcv+cv8+RpFlcLSCiQaIm rfwr96GWyGtP+qmHi943/v7RZg7+W7+JgFGALHyb4EA+8hA+WJrtUXAP+PNKkoDb6Bep iZ9w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id l16si21933896pgh.509.2019.03.01.18.53.30; Fri, 01 Mar 2019 18:54:00 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727977AbfCBCwl (ORCPT + 99 others); Fri, 1 Mar 2019 21:52:41 -0500 Received: from mga04.intel.com ([192.55.52.120]:49771 "EHLO mga04.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727900AbfCBCwe (ORCPT ); Fri, 1 Mar 2019 21:52:34 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 01 Mar 2019 18:52:29 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.58,430,1544515200"; d="scan'208";a="148572634" Received: from romley-ivt3.sc.intel.com ([172.25.110.60]) by fmsmga004.fm.intel.com with ESMTP; 01 Mar 2019 18:52:29 -0800 From: Fenghua Yu To: "Thomas Gleixner" , "Ingo Molnar" , "Borislav Petkov" , "H Peter Anvin" , "Paolo Bonzini" , "Dave Hansen" , "Ashok Raj" , "Peter Zijlstra" , "Ravi V Shankar" , "Xiaoyao Li " Cc: "linux-kernel" , "x86" , kvm@vger.kernel.org, Xiaoyao Li , Fenghua Yu Subject: [PATCH v4 16/17] kvm: x86: Add support IA32_CORE_CAPABILITY MSR Date: Fri, 1 Mar 2019 18:45:10 -0800 Message-Id: <1551494711-213533-17-git-send-email-fenghua.yu@intel.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1551494711-213533-1-git-send-email-fenghua.yu@intel.com> References: <1551494711-213533-1-git-send-email-fenghua.yu@intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Xiaoyao Li MSR IA32_CORE_CAPABILITY is a feature-enumerating MSR, bit 5 of which reports the capability of enabling detection of split locks (will be supported on future processors based on Tremont microarchitecture and later). Please check the latest Intel Architecture Instruction Set Extensions and Future Features Programming Reference for more detailed information on the MSR and the split lock bit. 1. Expose it to user space as a feature-enumerating MSR, so that user space can query it. 2. Emualte MSR_IA32_CORE_CAPABILITY with vmx->core_capability. And add the get and set handler of MSR_IA32_CORE_CAPABILITY. For uesrspace, it can set this MSR when customizing features of guest, also it can read the value of this MSR of guest. For guest, as it's a feature-enumerating MSR, guest only can read it. Signed-off-by: Xiaoyao Li Signed-off-by: Fenghua Yu --- arch/x86/include/asm/kvm_host.h | 1 + arch/x86/kvm/vmx/vmx.c | 23 +++++++++++++++++++++++ arch/x86/kvm/vmx/vmx.h | 1 + arch/x86/kvm/x86.c | 17 ++++++++++++++++- 4 files changed, 41 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 180373360e34..208f15570d17 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1527,6 +1527,7 @@ int kvm_pv_send_ipi(struct kvm *kvm, unsigned long ipi_bitmap_low, unsigned long icr, int op_64_bit); u64 kvm_get_arch_capabilities(void); +u64 kvm_get_core_capability(void); void kvm_define_shared_msr(unsigned index, u32 msr); int kvm_set_shared_msr(unsigned index, u64 val, u64 mask); diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index 30a6bcd735ec..3e03c6e1e558 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -1679,6 +1679,12 @@ static int vmx_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) msr_info->data = to_vmx(vcpu)->spec_ctrl; break; + case MSR_IA32_CORE_CAPABILITY: + if (!msr_info->host_initiated && + !guest_cpuid_has(vcpu, X86_FEATURE_CORE_CAPABILITY)) + return 1; + msr_info->data = vmx->core_capability; + break; case MSR_IA32_ARCH_CAPABILITIES: if (!msr_info->host_initiated && !guest_cpuid_has(vcpu, X86_FEATURE_ARCH_CAPABILITIES)) @@ -1891,6 +1897,21 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) vmx_disable_intercept_for_msr(vmx->vmcs01.msr_bitmap, MSR_IA32_PRED_CMD, MSR_TYPE_W); break; + case MSR_IA32_CORE_CAPABILITY: + if (!msr_info->host_initiated) + return 1; + if (data & ~CORE_CAP_SPLIT_LOCK_DETECT) + return 1; + + /* + * Since AC split lock is a hardware feature, and there is no + * software emulation yet, we cannot enable it for guest if + * host hardware doesn't support it. + */ + if (!boot_cpu_has(X86_FEATURE_SPLIT_LOCK_DETECT)) + data &= ~CORE_CAP_SPLIT_LOCK_DETECT; + vmx->core_capability = data; + break; case MSR_IA32_ARCH_CAPABILITIES: if (!msr_info->host_initiated) return 1; @@ -4083,6 +4104,8 @@ static void vmx_vcpu_setup(struct vcpu_vmx *vmx) ++vmx->nmsrs; } + vmx->core_capability = kvm_get_core_capability(); + vmx->arch_capabilities = kvm_get_arch_capabilities(); vm_exit_controls_init(vmx, vmx_vmexit_ctrl()); diff --git a/arch/x86/kvm/vmx/vmx.h b/arch/x86/kvm/vmx/vmx.h index 0ac0a64c7790..cc22379991f3 100644 --- a/arch/x86/kvm/vmx/vmx.h +++ b/arch/x86/kvm/vmx/vmx.h @@ -191,6 +191,7 @@ struct vcpu_vmx { u64 msr_guest_kernel_gs_base; #endif + u64 core_capability; u64 arch_capabilities; u64 spec_ctrl; diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 941f932373d0..c3c9e3f2d08a 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -1125,7 +1125,8 @@ static u32 msrs_to_save[] = { #endif MSR_IA32_TSC, MSR_IA32_CR_PAT, MSR_VM_HSAVE_PA, MSR_IA32_FEATURE_CONTROL, MSR_IA32_BNDCFGS, MSR_TSC_AUX, - MSR_IA32_SPEC_CTRL, MSR_IA32_ARCH_CAPABILITIES, + MSR_IA32_SPEC_CTRL, MSR_IA32_CORE_CAPABILITY, + MSR_IA32_ARCH_CAPABILITIES, MSR_IA32_RTIT_CTL, MSR_IA32_RTIT_STATUS, MSR_IA32_RTIT_CR3_MATCH, MSR_IA32_RTIT_OUTPUT_BASE, MSR_IA32_RTIT_OUTPUT_MASK, MSR_IA32_RTIT_ADDR0_A, MSR_IA32_RTIT_ADDR0_B, @@ -1197,11 +1198,22 @@ static u32 msr_based_features[] = { MSR_F10H_DECFG, MSR_IA32_UCODE_REV, + MSR_IA32_CORE_CAPABILITY, MSR_IA32_ARCH_CAPABILITIES, }; static unsigned int num_msr_based_features; +u64 kvm_get_core_capability(void) +{ + u64 data; + + rdmsrl_safe(MSR_IA32_CORE_CAPABILITY, &data); + + return data; +} +EXPORT_SYMBOL_GPL(kvm_get_core_capability); + u64 kvm_get_arch_capabilities(void) { u64 data; @@ -1227,6 +1239,9 @@ EXPORT_SYMBOL_GPL(kvm_get_arch_capabilities); static int kvm_get_msr_feature(struct kvm_msr_entry *msr) { switch (msr->index) { + case MSR_IA32_CORE_CAPABILITY: + msr->data = kvm_get_core_capability(); + break; case MSR_IA32_ARCH_CAPABILITIES: msr->data = kvm_get_arch_capabilities(); break; -- 2.7.4